Fix the -U behavior (broken when we made BUILD_TARGETS modifiable).
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Wed, 17 Aug 2005 03:40:34 +0000 (03:40 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Wed, 17 Aug 2005 03:40:34 +0000 (03:40 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@1335 fdb21ef1-2011-0410-befe-b5e4ea1792b1

src/engine/SCons/Script/Main.py
src/engine/SCons/Script/__init__.py
test/option--U.py

index 81562085ae5a2e5713b718063382d4d8e9a59571..e5a8cb2d5414545b11e869578adb72bf64aac9f0 100644 (file)
@@ -1080,10 +1080,11 @@ def _main(args, parser):
     fs.set_max_drift(ssoptions.get('max_drift'))
 
     lookup_top = None
-    if SCons.Script.BUILD_TARGETS:
-        # They specified targets on the command line, so if they
-        # used -u, -U or -D, we have to look up targets relative
-        # to the top, but we build whatever they specified.
+    if targets or SCons.Script.BUILD_TARGETS != SCons.Script._build_plus_default:
+        # They specified targets on the command line or modified
+        # BUILD_TARGETS in the SConscript file(s), so if they used -u,
+        # -U or -D, we have to look up targets relative to the top,
+        # but we build whatever they specified.
         if target_top:
             lookup_top = fs.Dir(target_top)
             target_top = None
index 734ce3f2646de44fdc40074fe9deffd11f5e4660..f8f46f7ee2089301b66a72c33eb4f550bc8b84ab 100644 (file)
@@ -175,6 +175,17 @@ BUILD_TARGETS           = TargetList()
 COMMAND_LINE_TARGETS    = []
 DEFAULT_TARGETS         = []
 
+# BUILD_TARGETS can be modified in the SConscript files.  If so, we
+# want to treat the modified BUILD_TARGETS list as if they specified
+# targets on the command line.  To do that, though, we need to know if
+# BUILD_TARGETS was modified through "official" APIs or by hand.  We do
+# this by updating two lists in parallel, the documented BUILD_TARGETS
+# list, above, and this internal _build_plus_default targets list which
+# should only have "official" API changes.  Then Script/Main.py can
+# compare these two afterwards to figure out if the user added their
+# own targets to BUILD_TARGETS.
+_build_plus_default = TargetList()
+
 def _Add_Arguments(alist):
     for arg in alist:
         a, b = string.split(arg, '=', 1)
@@ -187,6 +198,9 @@ def _Add_Targets(tlist):
         BUILD_TARGETS.extend(tlist)
         BUILD_TARGETS._add_Default = BUILD_TARGETS._do_nothing
         BUILD_TARGETS._clear = BUILD_TARGETS._do_nothing
+        _build_plus_default.extend(tlist)
+        _build_plus_default._add_Default = _build_plus_default._do_nothing
+        _build_plus_default._clear = _build_plus_default._do_nothing
 
 def _Set_Default_Targets_Has_Been_Called(d, fs):
     return DEFAULT_TARGETS
@@ -209,13 +223,16 @@ def _Set_Default_Targets(env, tlist):
             # variables will still point to the same object we point to.
             del DEFAULT_TARGETS[:]
             BUILD_TARGETS._clear()
+            _build_plus_default._clear()
         elif isinstance(t, SCons.Node.Node):
             DEFAULT_TARGETS.append(t)
             BUILD_TARGETS._add_Default([t])
+            _build_plus_default._add_Default([t])
         else:
             nodes = env.arg2nodes(t, env.fs.Entry)
             DEFAULT_TARGETS.extend(nodes)
             BUILD_TARGETS._add_Default(nodes)
+            _build_plus_default._add_Default(nodes)
 
 #
 help_text = None
index 45ba97c3e60c34586e88e23f85f755b85c9430c0..db6532e4f6c6c6959cd3a1a7919508de706a8129 100644 (file)
@@ -75,12 +75,12 @@ test.write('xxx.in', "xxx.in\n")
 test.write('SConscript', """assert GetLaunchDir() == r'%s'\n"""%test.workpath('sub1'))
 test.run(arguments = '-U foo.out', chdir = 'sub1')
 
-test.fail_test(not os.path.exists(test.workpath('sub1', 'foo.out')))
-test.fail_test(os.path.exists(test.workpath('sub2', 'bar.out')))
-test.fail_test(os.path.exists(test.workpath('sub2b', 'bar.out')))
-test.fail_test(os.path.exists(test.workpath('sub3', 'baz.out')))
-test.fail_test(os.path.exists(test.workpath('bar.out')))
-test.fail_test(os.path.exists(test.workpath('sub2/xxx.out')))
+test.must_exist(test.workpath('sub1', 'foo.out'))
+test.must_not_exist(test.workpath('sub2', 'bar.out'))
+test.must_not_exist(test.workpath('sub2b', 'bar.out'))
+test.must_not_exist(test.workpath('sub3', 'baz.out'))
+test.must_not_exist(test.workpath('bar.out'))
+test.must_not_exist(test.workpath('sub2/xxx.out'))
 
 test.unlink(['sub1', 'foo.out'])
 
@@ -92,26 +92,26 @@ test.run(arguments = '-U',
          chdir = 'sub1',
          stderr = "scons: *** No targets specified and no Default() targets found.  Stop.\n",
          status = 2)
-test.fail_test(os.path.exists(test.workpath('sub1', 'foo.out')))
-test.fail_test(os.path.exists(test.workpath('sub2', 'bar.out')))
-test.fail_test(os.path.exists(test.workpath('sub2b', 'bar.out')))
-test.fail_test(os.path.exists(test.workpath('sub3', 'baz.out')))
-test.fail_test(os.path.exists(test.workpath('bar.out')))
-test.fail_test(os.path.exists(test.workpath('sub2/xxx.out')))
+test.must_not_exist(test.workpath('sub1', 'foo.out'))
+test.must_not_exist(test.workpath('sub2', 'bar.out'))
+test.must_not_exist(test.workpath('sub2b', 'bar.out'))
+test.must_not_exist(test.workpath('sub3', 'baz.out'))
+test.must_not_exist(test.workpath('bar.out'))
+test.must_not_exist(test.workpath('sub2/xxx.out'))
 
 
 if sys.platform == 'win32':
-    test.write('SConscript', """assert GetLaunchDir() == r'%s'"""%test.workpath('SUB2'))
-    test.run(chdir = 'SUB2', arguments = '-U')
+    sub2 = 'SUB2'
 else:
-    test.write('SConscript', """assert GetLaunchDir() == r'%s'"""%test.workpath('sub2'))
-    test.run(chdir = 'sub2', arguments = '-U')
-test.fail_test(os.path.exists(test.workpath('sub1', 'foo.out')))
-test.fail_test(not os.path.exists(test.workpath('sub2', 'bar.out')))
-test.fail_test(not os.path.exists(test.workpath('sub2b', 'bar.out')))
-test.fail_test(os.path.exists(test.workpath('sub3', 'baz.out')))
-test.fail_test(not os.path.exists(test.workpath('bar.out')))
-test.fail_test(os.path.exists(test.workpath('sub2/xxx.out')))
+    sub2 = 'sub2'
+test.write('SConscript', """assert GetLaunchDir() == r'%s'"""%test.workpath(sub2))
+test.run(chdir = sub2, arguments = '-U')
+test.must_not_exist(test.workpath('sub1', 'foo.out'))
+test.must_exist(test.workpath('sub2', 'bar.out'))
+test.must_exist(test.workpath('sub2b', 'bar.out'))
+test.must_not_exist(test.workpath('sub3', 'baz.out'))
+test.must_exist(test.workpath('bar.out'))
+test.must_not_exist(test.workpath('sub2/xxx.out'))
 
 test.unlink(['sub2', 'bar.out'])
 test.unlink(['sub2b', 'bar.out'])
@@ -119,12 +119,12 @@ test.unlink('bar.out')
 
 test.write('SConscript', """assert GetLaunchDir() == r'%s'"""%test.workpath())
 test.run(arguments='-U')
-test.fail_test(not os.path.exists(test.workpath('sub1', 'foo.out')))
-test.fail_test(os.path.exists(test.workpath('sub2', 'bar.out')))
-test.fail_test(os.path.exists(test.workpath('sub2b', 'bar.out')))
-test.fail_test(not os.path.exists(test.workpath('sub3', 'baz.out')))
-test.fail_test(os.path.exists(test.workpath('bar.out')))
-test.fail_test(not os.path.exists(test.workpath('sub2/xxx.out')))
+test.must_exist(test.workpath('sub1', 'foo.out'))
+test.must_not_exist(test.workpath('sub2', 'bar.out'))
+test.must_not_exist(test.workpath('sub2b', 'bar.out'))
+test.must_exist(test.workpath('sub3', 'baz.out'))
+test.must_not_exist(test.workpath('bar.out'))
+test.must_exist(test.workpath('sub2/xxx.out'))
 
 test.unlink(['sub1', 'foo.out'])
 test.unlink(['sub3', 'baz.out'])
@@ -132,12 +132,12 @@ test.unlink(['sub2', 'xxx.out'])
 
 test.write('SConscript', """assert GetLaunchDir() == r'%s'"""%test.workpath('sub3'))
 test.run(chdir = 'sub3', arguments='-U bar')
-test.fail_test(os.path.exists(test.workpath('sub1', 'foo.out')))
-test.fail_test(not os.path.exists(test.workpath('sub2', 'bar.out')))
-test.fail_test(not os.path.exists(test.workpath('sub2b', 'bar.out')))
-test.fail_test(os.path.exists(test.workpath('sub3', 'baz.out')))
-test.fail_test(os.path.exists(test.workpath('bar.out')))
-test.fail_test(os.path.exists(test.workpath('sub2/xxx.out')))
+test.must_not_exist(test.workpath('sub1', 'foo.out'))
+test.must_exist(test.workpath('sub2', 'bar.out'))
+test.must_exist(test.workpath('sub2b', 'bar.out'))
+test.must_not_exist(test.workpath('sub3', 'baz.out'))
+test.must_not_exist(test.workpath('bar.out'))
+test.must_not_exist(test.workpath('sub2/xxx.out'))
 
 # Make sure that a Default() directory doesn't cause an exception.
 test.subdir('sub4')
@@ -195,7 +195,7 @@ test.write(['sub6', 'dir', 'bar.in'], "bar.in\n")
 
 test.run(chdir = 'sub6/dir', arguments = '-U ../foo.out')
 
-test.fail_test(not os.path.exists(test.workpath('sub6', 'foo.out')))
-test.fail_test(os.path.exists(test.workpath('sub6', 'dir', 'bar.out')))
+test.must_exist(test.workpath('sub6', 'foo.out'))
+test.must_not_exist(test.workpath('sub6', 'dir', 'bar.out'))
 
 test.pass_test()