From 815fd42ff563da2b188200db897edd809905df8d Mon Sep 17 00:00:00 2001 From: Steven Knight Date: Tue, 12 Mar 2002 04:25:03 +0000 Subject: Implement the -U option. (Steve Leblanc) --- doc/man/scons.1 | 13 ++++++- src/CHANGES.txt | 4 ++ src/engine/SCons/Script/__init__.py | 18 +++++++-- test/option--U.py | 74 +++++++++++++++++++++++++++++++++++++ 4 files changed, 104 insertions(+), 5 deletions(-) create mode 100644 test/option--U.py diff --git a/doc/man/scons.1 b/doc/man/scons.1 index b1e7b66..1991cc7 100644 --- a/doc/man/scons.1 +++ b/doc/man/scons.1 @@ -483,17 +483,26 @@ appear up-to-date is unnecessary when using .BR scons .) .TP --u +-u, --up, --search-up Walks up the directory structure until an .I SConstruct , .I Sconstruct or .I sconstruct file is found, and uses that -as the top of the directory tree. Only targets at or below the +as the top of the directory tree. Only targets at or below the current directory will be built. .TP +-U +Works exactly the same way as the +.B -u +option except for the way default targets are handled. +When this option is used and no targets are specified on the command line, +all default targets are built, whether or not they are below the current +directory. + +.TP -v, --version Print the .B scons diff --git a/src/CHANGES.txt b/src/CHANGES.txt index fff6014..07465a6 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -35,6 +35,10 @@ RELEASE 0.06 - - Fixed an exception when CPPPATH or LIBPATH is a null string. (Bug reported by Richard Kiss.) + From Steve Leblanc: + + - Add support for the -U option. + RELEASE 0.05 - Thu, 21 Feb 2002 16:50:03 -0600 diff --git a/src/engine/SCons/Script/__init__.py b/src/engine/SCons/Script/__init__.py index 84882f4..0be6653 100644 --- a/src/engine/SCons/Script/__init__.py +++ b/src/engine/SCons/Script/__init__.py @@ -542,6 +542,14 @@ def options_init(): short = 'u', long = ['up', 'search-up'], help = "Search up directory tree for SConstruct.") + def opt_U(opt, arg): + global climb_up + climb_up = 2 + + Option(func = opt_U, + short = 'U', + help = "Search up directory tree for SConstruct.") + def option_v(opt, arg): import SCons print "SCons by Steven Knight et al.:" @@ -721,12 +729,16 @@ def _main(): print UsageString() sys.exit(0) + if target_top: + if climb_up == 2 and not targets: + # -U with default targets + target_top = None + else: + target_top = SCons.Node.FS.default_fs.Dir(target_top) + if not targets: targets = SCons.Script.SConscript.default_targets - if target_top: - target_top = SCons.Node.FS.default_fs.Dir(target_top) - def Entry(x, top = target_top): if isinstance(x, SCons.Node.Node): node = x diff --git a/test/option--U.py b/test/option--U.py new file mode 100644 index 0000000..b2e9b44 --- /dev/null +++ b/test/option--U.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python +# +# Copyright (c) 2001, 2002 Steven Knight +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" + +import sys +import TestSCons + +python = sys.executable + +test = TestSCons.TestSCons() + +test.subdir('sub1', 'sub2') + +test.write('build.py', r""" +import sys +contents = open(sys.argv[2], 'rb').read() +file = open(sys.argv[1], 'wb') +file.write(contents) +file.close() +""") + +test.write('SConstruct', """ +B = Builder(name='B', action='%s build.py $TARGET $SOURCES') +env = Environment(BUILDERS = [B]) +env.B(target = 'sub1/foo.out', source = 'sub1/foo.in') +Export('env') +SConscript('sub1/SConscript') +SConscript('sub2/SConscript') +""" % python) + +test.write(['sub1', 'SConscript'], """ +Import('env') +env.B(target = 'foo.out', source = 'foo.in') +Default('.') +""") + +test.write(['sub1', 'foo.in'], "sub1/foo.in") + +test.write(['sub2', 'SConscript'], """ +Import('env') +env.B(target = 'bar.out', source = 'bar.in') +Default('.') +""") + +test.write(['sub2', 'bar.in'], "sub2/bar.in") + +test.run(arguments = '-U', chdir = 'sub1') + +test.fail_test(test.read(['sub1', 'foo.out']) != "sub1/foo.in") +test.fail_test(test.read(['sub2', 'bar.out']) != "sub2/bar.in") + +test.pass_test() -- cgit v0.12