#! /usr/bin/env python
# Part of the A-A-P recipe executive: The main function.

# Copyright (C) 2002 Stichting NLnet Labs
# Permission to copy and use this file is specified in the file COPYING.
# If this file is missing you can find it here: http://www.a-a-p.org/COPYING

# Main Python code that executes an A-A-P recipe

import sys
from traceback import print_exc

# Each phase of executing a recipe is done by one module
from DoAddDef import doadddef
from DoArgs import doargs
from DoBuild import dobuild
from DoRead import doread

from Cache import dump_cache
from Error import *
from Sign import sign_write_all
from Util import *
import Global
from Message import *

# Globals
exit_status = 0             # exit status, default is zero (success)

def error_msg(msg):
   """print an error message and set the exit status to one"""
   global exit_status
   msg_error(msg)
   if exit_status == 0:
       exit_status = 1


def main():
   """
   The main function to execute an A-A-P recipe.
   """
   # We require Python 1.5 or later.
   if sys.version[0] == '1' and string.atoi(sys.version[2]) < 5:
       print "A-A-P requires Python version 1.5 or later."
       sys.exit(1)

   # When started with a relative path and changing directories we still need
   # to be able to find our modules.
   if not os.path.isabs(sys.argv[0]):
       dir, tail = os.path.split(os.path.abspath(sys.argv[0]))
       sys.path.append(dir)

   # Internationalisation inits: setlocale and gettext.
   i18n_init()

   #
   # Do the main work.
   #
   global exit_status

   try:
       # 1. Process the command line arguments.
       Global.cmd_args = doargs()
       if Global.cmd_args.has_option("verbose"):
           Global.cmd_args.printit()

       # 2. Read the recipe and included recipes.  Assignments and commands
       #    are executed directly, rules and dependencies are stored.
       #    "work" is a Work object with collected items from the recipe.
       work = doread()

       # 3. Add the default rules and dependencies
       doadddef(work)

       # 4. Build each target.
       dobuild(work)

   except SystemExit, r:
       exit_status = r
   except KeyboardInterrupt:
       error_msg(_("Interrupted"))
   except UserError, e:
       error_msg(e.args)
   except SyntaxError, e:
       error_msg(_("Syntax error:") + str(e))
       print_exc()
   except:
       error_msg(_("Internal Error"))
       print_exc()

   # Dump entries for the downloaded files.
   dump_cache()

   # Dump the sign files.
   sign_write_all()

   sys.exit(exit_status)


# When executed directly, call the main function.
if __name__ == '__main__':
   main()

# vim: set sw=4 sts=4 tw=79 fo+=l: