| 
									
										
										
										
											1999-03-22 14:52:19 +00:00
										 |  |  | """distutils.core
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The only module that needs to be imported to use the Distutils; provides | 
					
						
							| 
									
										
										
										
											2000-04-04 01:40:52 +00:00
										 |  |  | the 'setup' function (which is to be called from the setup script).  Also | 
					
						
							|  |  |  | indirectly provides the Distribution and Command classes, although they are | 
					
						
							| 
									
										
										
										
											2000-06-02 00:44:53 +00:00
										 |  |  | really defined in distutils.dist and distutils.cmd. | 
					
						
							|  |  |  | """
 | 
					
						
							| 
									
										
										
										
											1999-03-22 14:52:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-19 13:12:28 +00:00
										 |  |  | # This module should be kept compatible with Python 1.5.2. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-03-02 01:49:45 +00:00
										 |  |  | __revision__ = "$Id$" | 
					
						
							| 
									
										
										
										
											1999-03-22 14:52:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-04-22 03:20:49 +00:00
										 |  |  | import sys, os | 
					
						
							| 
									
										
										
										
											1999-08-29 18:20:32 +00:00
										 |  |  | from types import * | 
					
						
							| 
									
										
										
										
											2002-06-04 21:05:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-11 16:31:53 +00:00
										 |  |  | from distutils.debug import DEBUG | 
					
						
							| 
									
										
										
										
											1999-03-22 14:52:19 +00:00
										 |  |  | from distutils.errors import * | 
					
						
							| 
									
										
										
										
											2000-06-21 02:59:14 +00:00
										 |  |  | from distutils.util import grok_environment_error | 
					
						
							| 
									
										
										
										
											2000-05-31 01:11:20 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # Mainly import these so setup scripts can "from distutils.core import" them. | 
					
						
							| 
									
										
										
										
											2000-04-04 01:40:52 +00:00
										 |  |  | from distutils.dist import Distribution | 
					
						
							|  |  |  | from distutils.cmd import Command | 
					
						
							| 
									
										
										
										
											2000-05-31 01:11:20 +00:00
										 |  |  | from distutils.extension import Extension | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-02-18 00:26:23 +00:00
										 |  |  | # This is a barebones help message generated displayed when the user | 
					
						
							|  |  |  | # runs the setup script with no arguments at all.  More useful help | 
					
						
							|  |  |  | # is generated with various --help options: global help, list commands, | 
					
						
							|  |  |  | # and per-command help. | 
					
						
							| 
									
										
										
										
											2000-08-29 01:15:18 +00:00
										 |  |  | USAGE = """\
 | 
					
						
							|  |  |  | usage: %(script)s [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...] | 
					
						
							|  |  |  |    or: %(script)s --help [cmd1 cmd2 ...] | 
					
						
							|  |  |  |    or: %(script)s --help-commands | 
					
						
							|  |  |  |    or: %(script)s cmd --help | 
					
						
							|  |  |  | """
 | 
					
						
							| 
									
										
										
										
											1999-03-22 14:52:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-08-29 01:15:18 +00:00
										 |  |  | def gen_usage (script_name): | 
					
						
							|  |  |  |     script = os.path.basename(script_name) | 
					
						
							|  |  |  |     return USAGE % vars() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-05-26 00:54:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-01 00:52:45 +00:00
										 |  |  | # Some mild magic to control the behaviour of 'setup()' from 'run_setup()'. | 
					
						
							|  |  |  | _setup_stop_after = None | 
					
						
							|  |  |  | _setup_distribution = None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-27 16:30:36 +00:00
										 |  |  | # Legal keyword arguments for the setup() function | 
					
						
							|  |  |  | setup_keywords = ('distclass', 'script_name', 'script_args', 'options', | 
					
						
							|  |  |  |                   'name', 'version', 'author', 'author_email', | 
					
						
							|  |  |  |                   'maintainer', 'maintainer_email', 'url', 'license', | 
					
						
							|  |  |  |                   'description', 'long_description', 'keywords', | 
					
						
							| 
									
										
										
										
											2004-03-22 22:22:05 +00:00
										 |  |  |                   'platforms', 'classifiers', 'download_url', | 
					
						
							|  |  |  |                   'provides', 'requires', ) | 
					
						
							| 
									
										
										
										
											2003-01-27 16:30:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # Legal keyword arguments for the Extension constructor | 
					
						
							|  |  |  | extension_keywords = ('name', 'sources', 'include_dirs', | 
					
						
							|  |  |  |                       'define_macros', 'undef_macros', | 
					
						
							|  |  |  |                       'library_dirs', 'libraries', 'runtime_library_dirs', | 
					
						
							|  |  |  |                       'extra_objects', 'extra_compile_args', 'extra_link_args', | 
					
						
							|  |  |  |                       'export_symbols', 'depends', 'language') | 
					
						
							| 
									
										
										
										
											2000-09-01 00:52:45 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-03-22 14:52:19 +00:00
										 |  |  | def setup (**attrs): | 
					
						
							| 
									
										
										
										
											2000-06-02 00:44:53 +00:00
										 |  |  |     """The gateway to the Distutils: do everything your setup script needs
 | 
					
						
							|  |  |  |     to do, in a highly flexible and user-driven way.  Briefly: create a | 
					
						
							|  |  |  |     Distribution instance; find and parse config files; parse the command | 
					
						
							| 
									
										
										
										
											2000-08-29 01:15:18 +00:00
										 |  |  |     line; run each Distutils command found there, customized by the options | 
					
						
							|  |  |  |     supplied to 'setup()' (as keyword arguments), in config files, and on | 
					
						
							|  |  |  |     the command line. | 
					
						
							| 
									
										
										
										
											2000-06-02 00:44:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     The Distribution instance might be an instance of a class supplied via | 
					
						
							|  |  |  |     the 'distclass' keyword argument to 'setup'; if no such class is | 
					
						
							|  |  |  |     supplied, then the Distribution class (in dist.py) is instantiated. | 
					
						
							|  |  |  |     All other arguments to 'setup' (except for 'cmdclass') are used to set | 
					
						
							|  |  |  |     attributes of the Distribution instance. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The 'cmdclass' argument, if supplied, is a dictionary mapping command | 
					
						
							|  |  |  |     names to command classes.  Each command encountered on the command line | 
					
						
							|  |  |  |     will be turned into a command class, which is in turn instantiated; any | 
					
						
							|  |  |  |     class found in 'cmdclass' is used in place of the default, which is | 
					
						
							|  |  |  |     (for command 'foo_bar') class 'foo_bar' in module | 
					
						
							|  |  |  |     'distutils.command.foo_bar'.  The command class must provide a | 
					
						
							|  |  |  |     'user_options' attribute which is a list of option specifiers for | 
					
						
							|  |  |  |     'distutils.fancy_getopt'.  Any command-line options between the current | 
					
						
							|  |  |  |     and the next command are used to set attributes of the current command | 
					
						
							|  |  |  |     object. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     When the entire command-line has been successfully parsed, calls the | 
					
						
							|  |  |  |     'run()' method on each command object in turn.  This method will be | 
					
						
							|  |  |  |     driven entirely by the Distribution object (which each command object | 
					
						
							|  |  |  |     has a reference to, thanks to its constructor), and the | 
					
						
							|  |  |  |     command-specific options that became attributes of each command | 
					
						
							|  |  |  |     object. | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											1999-03-22 14:52:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-01 00:52:45 +00:00
										 |  |  |     global _setup_stop_after, _setup_distribution | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-03-22 14:52:19 +00:00
										 |  |  |     # Determine the distribution class -- either caller-supplied or | 
					
						
							|  |  |  |     # our Distribution (see below). | 
					
						
							| 
									
										
										
										
											2000-09-26 01:56:15 +00:00
										 |  |  |     klass = attrs.get('distclass') | 
					
						
							| 
									
										
										
										
											1999-03-22 14:52:19 +00:00
										 |  |  |     if klass: | 
					
						
							|  |  |  |         del attrs['distclass'] | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         klass = Distribution | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-08-29 01:15:18 +00:00
										 |  |  |     if not attrs.has_key('script_name'): | 
					
						
							| 
									
										
										
										
											2002-11-07 16:41:38 +00:00
										 |  |  |         attrs['script_name'] = os.path.basename(sys.argv[0]) | 
					
						
							| 
									
										
										
										
											2000-08-29 01:15:18 +00:00
										 |  |  |     if not attrs.has_key('script_args'): | 
					
						
							|  |  |  |         attrs['script_args'] = sys.argv[1:] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-03-22 14:52:19 +00:00
										 |  |  |     # Create the Distribution instance, using the remaining arguments | 
					
						
							|  |  |  |     # (ie. everything except distclass) to initialize it | 
					
						
							| 
									
										
										
										
											2000-06-03 01:02:06 +00:00
										 |  |  |     try: | 
					
						
							| 
									
										
										
										
											2000-09-26 01:56:15 +00:00
										 |  |  |         _setup_distribution = dist = klass(attrs) | 
					
						
							| 
									
										
										
										
											2000-06-03 01:02:06 +00:00
										 |  |  |     except DistutilsSetupError, msg: | 
					
						
							| 
									
										
										
										
											2002-06-04 20:14:43 +00:00
										 |  |  |         if attrs.has_key('name'): | 
					
						
							|  |  |  |             raise SystemExit, "error in %s setup command: %s" % \ | 
					
						
							|  |  |  |                   (attrs['name'], msg) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             raise SystemExit, "error in setup command: %s" % msg | 
					
						
							| 
									
										
										
										
											1999-03-22 14:52:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-01 00:52:45 +00:00
										 |  |  |     if _setup_stop_after == "init": | 
					
						
							|  |  |  |         return dist | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-05-12 00:42:19 +00:00
										 |  |  |     # Find and parse the config file(s): they will override options from | 
					
						
							|  |  |  |     # the setup script, but be overridden by the command line. | 
					
						
							|  |  |  |     dist.parse_config_files() | 
					
						
							| 
									
										
										
										
											2001-12-06 20:51:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-06-02 01:55:36 +00:00
										 |  |  |     if DEBUG: | 
					
						
							|  |  |  |         print "options (after parsing config files):" | 
					
						
							|  |  |  |         dist.dump_option_dicts() | 
					
						
							| 
									
										
										
										
											2000-05-23 03:54:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-01 00:52:45 +00:00
										 |  |  |     if _setup_stop_after == "config": | 
					
						
							|  |  |  |         return dist | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-05-12 00:42:19 +00:00
										 |  |  |     # Parse the command line; any command-line errors are the end user's | 
					
						
							| 
									
										
										
										
											1999-09-08 02:41:09 +00:00
										 |  |  |     # fault, so turn them into SystemExit to suppress tracebacks. | 
					
						
							| 
									
										
										
										
											1999-03-22 14:52:19 +00:00
										 |  |  |     try: | 
					
						
							| 
									
										
										
										
											2000-08-29 01:15:18 +00:00
										 |  |  |         ok = dist.parse_command_line() | 
					
						
							| 
									
										
										
										
											1999-03-22 14:52:19 +00:00
										 |  |  |     except DistutilsArgError, msg: | 
					
						
							| 
									
										
										
										
											2002-06-04 20:26:44 +00:00
										 |  |  |         raise SystemExit, gen_usage(dist.script_name) + "\nerror: %s" % msg | 
					
						
							| 
									
										
										
										
											1999-03-22 14:52:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-06-02 01:55:36 +00:00
										 |  |  |     if DEBUG: | 
					
						
							|  |  |  |         print "options (after parsing command line):" | 
					
						
							|  |  |  |         dist.dump_option_dicts() | 
					
						
							| 
									
										
										
										
											2000-05-23 03:54:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-01 00:52:45 +00:00
										 |  |  |     if _setup_stop_after == "commandline": | 
					
						
							|  |  |  |         return dist | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-03-22 14:52:19 +00:00
										 |  |  |     # And finally, run all the commands found on the command line. | 
					
						
							| 
									
										
										
										
											1999-12-12 16:51:44 +00:00
										 |  |  |     if ok: | 
					
						
							|  |  |  |         try: | 
					
						
							| 
									
										
										
										
											2000-09-26 01:56:15 +00:00
										 |  |  |             dist.run_commands() | 
					
						
							| 
									
										
										
										
											1999-12-12 16:51:44 +00:00
										 |  |  |         except KeyboardInterrupt: | 
					
						
							|  |  |  |             raise SystemExit, "interrupted" | 
					
						
							| 
									
										
										
										
											2000-04-22 03:20:49 +00:00
										 |  |  |         except (IOError, os.error), exc: | 
					
						
							| 
									
										
										
										
											2000-06-17 02:17:45 +00:00
										 |  |  |             error = grok_environment_error(exc) | 
					
						
							| 
									
										
										
										
											2000-05-26 00:54:52 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if DEBUG: | 
					
						
							|  |  |  |                 sys.stderr.write(error + "\n") | 
					
						
							|  |  |  |                 raise | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 raise SystemExit, error | 
					
						
							| 
									
										
										
										
											2001-12-06 20:51:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-08 16:18:24 +00:00
										 |  |  |         except (DistutilsError, | 
					
						
							| 
									
										
										
										
											2000-05-30 02:04:29 +00:00
										 |  |  |                 CCompilerError), msg: | 
					
						
							| 
									
										
										
										
											2000-05-26 00:54:52 +00:00
										 |  |  |             if DEBUG: | 
					
						
							|  |  |  |                 raise | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 raise SystemExit, "error: " + str(msg) | 
					
						
							| 
									
										
										
										
											1999-03-22 14:52:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-01 00:52:45 +00:00
										 |  |  |     return dist | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-03-22 14:52:19 +00:00
										 |  |  | # setup () | 
					
						
							| 
									
										
										
										
											2000-09-01 00:52:45 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def run_setup (script_name, script_args=None, stop_after="run"): | 
					
						
							|  |  |  |     """Run a setup script in a somewhat controlled environment, and
 | 
					
						
							|  |  |  |     return the Distribution instance that drives things.  This is useful | 
					
						
							|  |  |  |     if you need to find out the distribution meta-data (passed as | 
					
						
							|  |  |  |     keyword args from 'script' to 'setup()', or the contents of the | 
					
						
							|  |  |  |     config files or command-line. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     'script_name' is a file that will be run with 'execfile()'; | 
					
						
							|  |  |  |     'sys.argv[0]' will be replaced with 'script' for the duration of the | 
					
						
							|  |  |  |     call.  'script_args' is a list of strings; if supplied, | 
					
						
							|  |  |  |     'sys.argv[1:]' will be replaced by 'script_args' for the duration of | 
					
						
							|  |  |  |     the call. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     'stop_after' tells 'setup()' when to stop processing; possible | 
					
						
							|  |  |  |     values: | 
					
						
							|  |  |  |       init | 
					
						
							|  |  |  |         stop after the Distribution instance has been created and | 
					
						
							|  |  |  |         populated with the keyword arguments to 'setup()' | 
					
						
							|  |  |  |       config | 
					
						
							|  |  |  |         stop after config files have been parsed (and their data | 
					
						
							|  |  |  |         stored in the Distribution instance) | 
					
						
							|  |  |  |       commandline | 
					
						
							|  |  |  |         stop after the command-line ('sys.argv[1:]' or 'script_args') | 
					
						
							|  |  |  |         have been parsed (and the data stored in the Distribution) | 
					
						
							|  |  |  |       run [default] | 
					
						
							|  |  |  |         stop after all commands have been run (the same as if 'setup()' | 
					
						
							|  |  |  |         had been called in the usual way | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Returns the Distribution instance, which provides all information | 
					
						
							|  |  |  |     used to drive the Distutils. | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     if stop_after not in ('init', 'config', 'commandline', 'run'): | 
					
						
							| 
									
										
										
										
											2004-02-12 17:35:32 +00:00
										 |  |  |         raise ValueError, "invalid value for 'stop_after': %r" % (stop_after,) | 
					
						
							| 
									
										
										
										
											2000-09-01 00:52:45 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     global _setup_stop_after, _setup_distribution | 
					
						
							|  |  |  |     _setup_stop_after = stop_after | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     save_argv = sys.argv | 
					
						
							|  |  |  |     g = {} | 
					
						
							|  |  |  |     l = {} | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             sys.argv[0] = script_name | 
					
						
							|  |  |  |             if script_args is not None: | 
					
						
							|  |  |  |                 sys.argv[1:] = script_args | 
					
						
							|  |  |  |             execfile(script_name, g, l) | 
					
						
							|  |  |  |         finally: | 
					
						
							|  |  |  |             sys.argv = save_argv | 
					
						
							|  |  |  |             _setup_stop_after = None | 
					
						
							|  |  |  |     except SystemExit: | 
					
						
							|  |  |  |         # Hmm, should we do something if exiting with a non-zero code | 
					
						
							|  |  |  |         # (ie. error)? | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  |     except: | 
					
						
							|  |  |  |         raise | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if _setup_distribution is None: | 
					
						
							|  |  |  |         raise RuntimeError, \ | 
					
						
							|  |  |  |               ("'distutils.core.setup()' was never called -- " | 
					
						
							|  |  |  |                "perhaps '%s' is not a Distutils setup script?") % \ | 
					
						
							|  |  |  |               script_name | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # I wonder if the setup script's namespace -- g and l -- would be of | 
					
						
							|  |  |  |     # any interest to callers? | 
					
						
							|  |  |  |     #print "_setup_distribution:", _setup_distribution | 
					
						
							|  |  |  |     return _setup_distribution | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # run_setup () |