mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	svn+ssh://pythondev@svn.python.org/python/trunk ........ r62998 | andrew.kuchling | 2008-05-10 15:51:55 -0400 (Sat, 10 May 2008) | 7 lines #1858 from Tarek Ziade: Allow multiple repositories in .pypirc; see http://wiki.python.org/moin/EnhancedPyPI for discussion. The patch is slightly revised from Tarek's last patch: I've simplified the PyPIRCCommand.finalize_options() method to not look at sys.argv. Tests still pass. ........ r63000 | alexandre.vassalotti | 2008-05-10 15:59:16 -0400 (Sat, 10 May 2008) | 5 lines Cleaned up io._BytesIO.write(). I am amazed that the old code, for inserting null-bytes, actually worked. Who wrote that thing? Oh, it is me... doh. ........ r63002 | brett.cannon | 2008-05-10 16:52:01 -0400 (Sat, 10 May 2008) | 2 lines Revert r62998 as it broke the build (seems distutils.config is missing). ........ r63014 | andrew.kuchling | 2008-05-10 18:12:38 -0400 (Sat, 10 May 2008) | 1 line #1858: add distutils.config module ........ r63027 | brett.cannon | 2008-05-10 21:09:32 -0400 (Sat, 10 May 2008) | 2 lines Flesh out the 3.0 deprecation to suggest using the ctypes module. ........ r63028 | skip.montanaro | 2008-05-10 22:59:30 -0400 (Sat, 10 May 2008) | 4 lines Copied two versions of the example from the interactive session. Delete one. ........ r63037 | georg.brandl | 2008-05-11 03:02:17 -0400 (Sun, 11 May 2008) | 2 lines reload() takes the module itself. ........ r63038 | alexandre.vassalotti | 2008-05-11 03:06:04 -0400 (Sun, 11 May 2008) | 4 lines Added test framework for handling module renames. Factored the import guard in test_py3kwarn.TestStdlibRemovals into a context manager, namely test_support.CleanImport. ........ r63039 | georg.brandl | 2008-05-11 03:06:05 -0400 (Sun, 11 May 2008) | 2 lines #2742: ``''`` is not converted to NULL in getaddrinfo. ........ r63040 | alexandre.vassalotti | 2008-05-11 03:08:12 -0400 (Sun, 11 May 2008) | 2 lines Fixed typo in a comment of test_support.CleanImport. ........ r63041 | alexandre.vassalotti | 2008-05-11 03:10:25 -0400 (Sun, 11 May 2008) | 2 lines Removed a dead line of code. ........ r63043 | georg.brandl | 2008-05-11 04:47:53 -0400 (Sun, 11 May 2008) | 2 lines #2812: document property.getter/setter/deleter. ........ r63049 | georg.brandl | 2008-05-11 05:06:30 -0400 (Sun, 11 May 2008) | 2 lines #1153769: document PEP 237 changes to string formatting. ........ r63050 | georg.brandl | 2008-05-11 05:11:40 -0400 (Sun, 11 May 2008) | 2 lines #2809: elaborate str.split docstring a bit. ........ r63051 | georg.brandl | 2008-05-11 06:13:59 -0400 (Sun, 11 May 2008) | 2 lines Fix typo. ........ r63052 | georg.brandl | 2008-05-11 06:33:27 -0400 (Sun, 11 May 2008) | 2 lines #2709: clarification. ........ r63053 | georg.brandl | 2008-05-11 06:42:28 -0400 (Sun, 11 May 2008) | 2 lines #2659: add ``break_on_hyphens`` to TextWrapper. ........ r63057 | georg.brandl | 2008-05-11 06:59:39 -0400 (Sun, 11 May 2008) | 2 lines #2741: clarification of value range for address_family. ........ r63058 | georg.brandl | 2008-05-11 07:09:35 -0400 (Sun, 11 May 2008) | 2 lines #2452: timeout is used for all blocking operations. ........ r63059 | andrew.kuchling | 2008-05-11 09:33:56 -0400 (Sun, 11 May 2008) | 2 lines #1792: Improve performance of marshal.dumps() on large objects by increasing the size of the buffer more quickly. ........ r63060 | andrew.kuchling | 2008-05-11 10:00:00 -0400 (Sun, 11 May 2008) | 1 line #1858: re-apply patch for this, adding the missing files ........ r63061 | benjamin.peterson | 2008-05-11 10:13:25 -0400 (Sun, 11 May 2008) | 2 lines Add the "until" command to pdb ........ r63062 | georg.brandl | 2008-05-11 10:17:13 -0400 (Sun, 11 May 2008) | 2 lines Add some sentence endings. ........
		
			
				
	
	
		
			239 lines
		
	
	
	
		
			8.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			239 lines
		
	
	
	
		
			8.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""distutils.core
 | 
						|
 | 
						|
The only module that needs to be imported to use the Distutils; provides
 | 
						|
the 'setup' function (which is to be called from the setup script).  Also
 | 
						|
indirectly provides the Distribution and Command classes, although they are
 | 
						|
really defined in distutils.dist and distutils.cmd.
 | 
						|
"""
 | 
						|
 | 
						|
__revision__ = "$Id$"
 | 
						|
 | 
						|
import sys, os
 | 
						|
 | 
						|
from distutils.debug import DEBUG
 | 
						|
from distutils.errors import *
 | 
						|
from distutils.util import grok_environment_error
 | 
						|
 | 
						|
# Mainly import these so setup scripts can "from distutils.core import" them.
 | 
						|
from distutils.dist import Distribution
 | 
						|
from distutils.cmd import Command
 | 
						|
from distutils.config import PyPIRCCommand
 | 
						|
from distutils.extension import Extension
 | 
						|
 | 
						|
# 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.
 | 
						|
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
 | 
						|
"""
 | 
						|
 | 
						|
def gen_usage (script_name):
 | 
						|
    script = os.path.basename(script_name)
 | 
						|
    return USAGE % vars()
 | 
						|
 | 
						|
 | 
						|
# Some mild magic to control the behaviour of 'setup()' from 'run_setup()'.
 | 
						|
_setup_stop_after = None
 | 
						|
_setup_distribution = None
 | 
						|
 | 
						|
# 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',
 | 
						|
                  'platforms', 'classifiers', 'download_url',
 | 
						|
                  'requires', 'provides', 'obsoletes',
 | 
						|
                  )
 | 
						|
 | 
						|
# 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',
 | 
						|
                      'swig_opts', 'export_symbols', 'depends', 'language')
 | 
						|
 | 
						|
def setup (**attrs):
 | 
						|
    """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
 | 
						|
    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.
 | 
						|
 | 
						|
    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.
 | 
						|
    """
 | 
						|
 | 
						|
    global _setup_stop_after, _setup_distribution
 | 
						|
 | 
						|
    # Determine the distribution class -- either caller-supplied or
 | 
						|
    # our Distribution (see below).
 | 
						|
    klass = attrs.get('distclass')
 | 
						|
    if klass:
 | 
						|
        del attrs['distclass']
 | 
						|
    else:
 | 
						|
        klass = Distribution
 | 
						|
 | 
						|
    if 'script_name' not in attrs:
 | 
						|
        attrs['script_name'] = os.path.basename(sys.argv[0])
 | 
						|
    if 'script_args'  not in attrs:
 | 
						|
        attrs['script_args'] = sys.argv[1:]
 | 
						|
 | 
						|
    # Create the Distribution instance, using the remaining arguments
 | 
						|
    # (ie. everything except distclass) to initialize it
 | 
						|
    try:
 | 
						|
        _setup_distribution = dist = klass(attrs)
 | 
						|
    except DistutilsSetupError as msg:
 | 
						|
        if 'name' not in attrs:
 | 
						|
            raise SystemExit("error in setup command: %s" % msg)
 | 
						|
        else:
 | 
						|
            raise SystemExit("error in %s setup command: %s" % \
 | 
						|
                  (attrs['name'], msg))
 | 
						|
 | 
						|
    if _setup_stop_after == "init":
 | 
						|
        return dist
 | 
						|
 | 
						|
    # 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()
 | 
						|
 | 
						|
    if DEBUG:
 | 
						|
        print("options (after parsing config files):")
 | 
						|
        dist.dump_option_dicts()
 | 
						|
 | 
						|
    if _setup_stop_after == "config":
 | 
						|
        return dist
 | 
						|
 | 
						|
    # Parse the command line; any command-line errors are the end user's
 | 
						|
    # fault, so turn them into SystemExit to suppress tracebacks.
 | 
						|
    try:
 | 
						|
        ok = dist.parse_command_line()
 | 
						|
    except DistutilsArgError as msg:
 | 
						|
        raise SystemExit(gen_usage(dist.script_name) + "\nerror: %s" % msg)
 | 
						|
 | 
						|
    if DEBUG:
 | 
						|
        print("options (after parsing command line):")
 | 
						|
        dist.dump_option_dicts()
 | 
						|
 | 
						|
    if _setup_stop_after == "commandline":
 | 
						|
        return dist
 | 
						|
 | 
						|
    # And finally, run all the commands found on the command line.
 | 
						|
    if ok:
 | 
						|
        try:
 | 
						|
            dist.run_commands()
 | 
						|
        except KeyboardInterrupt:
 | 
						|
            raise SystemExit("interrupted")
 | 
						|
        except (IOError, os.error) as exc:
 | 
						|
            error = grok_environment_error(exc)
 | 
						|
 | 
						|
            if DEBUG:
 | 
						|
                sys.stderr.write(error + "\n")
 | 
						|
                raise
 | 
						|
            else:
 | 
						|
                raise SystemExit(error)
 | 
						|
 | 
						|
        except (DistutilsError,
 | 
						|
                CCompilerError) as msg:
 | 
						|
            if DEBUG:
 | 
						|
                raise
 | 
						|
            else:
 | 
						|
                raise SystemExit("error: " + str(msg))
 | 
						|
 | 
						|
    return dist
 | 
						|
 | 
						|
# setup ()
 | 
						|
 | 
						|
 | 
						|
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 read and run with 'exec()';
 | 
						|
    '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'):
 | 
						|
        raise ValueError("invalid value for 'stop_after': %r" % (stop_after,))
 | 
						|
 | 
						|
    global _setup_stop_after, _setup_distribution
 | 
						|
    _setup_stop_after = stop_after
 | 
						|
 | 
						|
    save_argv = sys.argv
 | 
						|
    g = {'__file__': script_name}
 | 
						|
    l = {}
 | 
						|
    try:
 | 
						|
        try:
 | 
						|
            sys.argv[0] = script_name
 | 
						|
            if script_args is not None:
 | 
						|
                sys.argv[1:] = script_args
 | 
						|
            exec(open(script_name).read(), 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 ()
 |