From 9821bf4e62bcb7d503aed782a8f6398e5de720af Mon Sep 17 00:00:00 2001 From: Greg Ward Date: Tue, 29 Aug 2000 01:15:18 +0000 Subject: Added 'script_name' and 'script_args' instance attributes to Distribution. Changed 'core.setup()' so it sets them to reasonable defaults. Tweaked how the "usage" string is generated: 'core' now provides 'gen_usage()', which is used instead of 'USAGE'. Modified "build_py" and "sdist" commands to refer to 'self.distribution.script_name' rather than 'sys.argv[0]'. --- Lib/distutils/command/build_py.py | 4 ++- Lib/distutils/command/sdist.py | 5 +++- Lib/distutils/core.py | 34 ++++++++++++++++--------- Lib/distutils/dist.py | 52 ++++++++++++++++++++++----------------- 4 files changed, 58 insertions(+), 37 deletions(-) diff --git a/Lib/distutils/command/build_py.py b/Lib/distutils/command/build_py.py index 87e3efa..66f5024 100644 --- a/Lib/distutils/command/build_py.py +++ b/Lib/distutils/command/build_py.py @@ -177,13 +177,15 @@ class build_py (Command): self.check_package (package, package_dir) module_files = glob (os.path.join (package_dir, "*.py")) modules = [] - setup_script = os.path.abspath (sys.argv[0]) + setup_script = os.path.abspath(self.distribution.script_name) for f in module_files: abs_f = os.path.abspath (f) if abs_f != setup_script: module = os.path.splitext (os.path.basename (f))[0] modules.append ((package, module, f)) + else: + self.debug_print("excluding %s" % setup_script) return modules diff --git a/Lib/distutils/command/sdist.py b/Lib/distutils/command/sdist.py index 2351ebb..06c8f1c 100644 --- a/Lib/distutils/command/sdist.py +++ b/Lib/distutils/command/sdist.py @@ -202,7 +202,10 @@ class sdist (Command): # manifest, but there's no template -- which will happen if the # developer elects to generate a manifest some other way -- then we # can't regenerate the manifest, so we don't.) - setup_newer = dep_util.newer(sys.argv[0], self.manifest) + self.debug_print("checking if %s newer than %s" % + (self.distribution.script_name, self.manifest)) + setup_newer = dep_util.newer(self.distribution.script_name, + self.manifest) # cases: # 1) no manifest, template exists: generate manifest diff --git a/Lib/distutils/core.py b/Lib/distutils/core.py index 4c982a0..39f1f54 100644 --- a/Lib/distutils/core.py +++ b/Lib/distutils/core.py @@ -25,26 +25,30 @@ from distutils.extension import Extension # 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: %s [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...] - or: %s --help [cmd1 cmd2 ...] - or: %s --help-commands - or: %s cmd --help -""" % ((os.path.basename(sys.argv[0]),) * 4) +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 +""" # If DISTUTILS_DEBUG is anything other than the empty string, we run in # debug mode. DEBUG = os.environ.get('DISTUTILS_DEBUG') +def gen_usage (script_name): + script = os.path.basename(script_name) + return USAGE % vars() + 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 of those commands using the options supplied to - 'setup()' (as keyword arguments), in config files, and on the command - line. + 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 @@ -79,6 +83,11 @@ def setup (**attrs): else: klass = Distribution + if not attrs.has_key('script_name'): + attrs['script_name'] = sys.argv[0] + if not attrs.has_key('script_args'): + attrs['script_args'] = sys.argv[1:] + # Create the Distribution instance, using the remaining arguments # (ie. everything except distclass) to initialize it try: @@ -97,10 +106,11 @@ def setup (**attrs): # 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 (sys.argv[1:]) + ok = dist.parse_command_line() except DistutilsArgError, msg: - sys.stderr.write (usage + "\n") - raise SystemExit, "error: %s" % msg + script = os.path.basename(dist.script_name) + raise SystemExit, \ + gen_usage(dist.script_name) + "\nerror: %s" % msg if DEBUG: print "options (after parsing command line):" diff --git a/Lib/distutils/dist.py b/Lib/distutils/dist.py index ed829fe..1552dc0 100644 --- a/Lib/distutils/dist.py +++ b/Lib/distutils/dist.py @@ -131,6 +131,12 @@ class Distribution: # for the setup script to override command classes self.cmdclass = {} + # 'script_name' and 'script_args' are usually set to sys.argv[0] + # and sys.argv[1:], but they can be overridden when the caller is + # not necessarily a setup script run from the command-line. + self.script_name = None + self.script_args = None + # 'command_options' is where we store command options between # parsing them (from config files, the command-line, etc.) and when # they are actually needed -- ie. when the command in question is @@ -326,24 +332,24 @@ class Distribution: # -- Command-line parsing methods ---------------------------------- - def parse_command_line (self, args): - """Parse the setup script's command line. 'args' must be a list - of command-line arguments, most likely 'sys.argv[1:]' (see the - 'setup()' function). This list is first processed for "global - options" -- options that set attributes of the Distribution - instance. Then, it is alternately scanned for Distutils - commands and options for that command. Each new command - terminates the options for the previous command. The allowed - options for a command are determined by the 'user_options' - attribute of the command class -- thus, we have to be able to - load command classes in order to parse the command line. Any - error in that 'options' attribute raises DistutilsGetoptError; - any error on the command-line raises DistutilsArgError. If no - Distutils commands were found on the command line, raises - DistutilsArgError. Return true if command-line were - successfully parsed and we should carry on with executing - commands; false if no errors but we shouldn't execute commands - (currently, this only happens if user asks for help). + def parse_command_line (self): + """Parse the setup script's command line, taken from the + 'script_args' instance attribute (which defaults to 'sys.argv[1:]' + -- see 'setup()' in core.py). This list is first processed for + "global options" -- options that set attributes of the Distribution + instance. Then, it is alternately scanned for Distutils commands + and options for that command. Each new command terminates the + options for the previous command. The allowed options for a + command are determined by the 'user_options' attribute of the + command class -- thus, we have to be able to load command classes + in order to parse the command line. Any error in that 'options' + attribute raises DistutilsGetoptError; any error on the + command-line raises DistutilsArgError. If no Distutils commands + were found on the command line, raises DistutilsArgError. Return + true if command-line were successfully parsed and we should carry + on with executing commands; false if no errors but we shouldn't + execute commands (currently, this only happens if user asks for + help). """ # We have to parse the command line a bit at a time -- global # options, then the first command, then its options, and so on -- @@ -356,7 +362,7 @@ class Distribution: parser = FancyGetopt (self.global_options + self.display_options) parser.set_negative_aliases (self.negative_opt) parser.set_aliases ({'license': 'licence'}) - args = parser.getopt (object=self) + args = parser.getopt (args=self.script_args, object=self) option_order = parser.get_option_order() # for display options we return immediately @@ -506,7 +512,7 @@ class Distribution: in 'commands'. """ # late import because of mutual dependence between these modules - from distutils.core import usage + from distutils.core import gen_usage from distutils.cmd import Command if global_options: @@ -535,7 +541,7 @@ class Distribution: parser.print_help ("Options for '%s' command:" % klass.__name__) print - print usage + print gen_usage(self.script_name) return # _show_help () @@ -547,7 +553,7 @@ class Distribution: line, display the requested info and return true; else return false. """ - from distutils.core import usage + from distutils.core import gen_usage # User just wants a list of commands -- we'll print it out and stop # processing now (ie. if they ran "setup --help-commands foo bar", @@ -555,7 +561,7 @@ class Distribution: if self.help_commands: self.print_commands () print - print usage + print gen_usage(self.script_name) return 1 # If user supplied any of the "display metadata" options, then -- cgit v0.12