Add tests and support for and .
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Fri, 12 Oct 2001 19:31:00 +0000 (19:31 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Fri, 12 Oct 2001 19:31:00 +0000 (19:31 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@97 fdb21ef1-2011-0410-befe-b5e4ea1792b1

src/engine/SCons/Builder.py
src/engine/SCons/BuilderTests.py
src/engine/SCons/Defaults.py
src/engine/SCons/Environment.py
src/engine/SCons/EnvironmentTests.py
src/engine/SCons/Node/NodeTests.py
src/engine/SCons/Node/__init__.py
test/CC.py
test/CCFLAGS.py

index ac24e7f4c1202ca722d1b49bae884bfb1168e39a..dc2566f824540e0e1357974cbd330c71db4a5b9b 100644 (file)
@@ -87,7 +87,6 @@ class BuilderBase:
                            f = f + suf
                ret.append(f)
            return ret
-           
 
        tlist = scons_str2nodes(adjustixes(target, self.prefix, self.suffix),
                                 self.node_factory)
@@ -223,10 +222,9 @@ class CommandAction(ActionBase):
                s = [s]
             loc['sources'] = PathList(map(os.path.normpath, s))
 
-       try:
-           glob = self.env.Dictionary()
-       except:
-           glob = {}
+       glob = {}
+       if kw.has_key('env'):
+           glob = kw['env']
 
        cmd = scons_subst(self.command, loc, glob)
        if print_actions:
@@ -238,10 +236,10 @@ class CommandAction(ActionBase):
                # Child process.
                args = string.split(cmd)
                try:
-                   ENV = kw['ENV']
+                   ENV = kw['env']['ENV']
                except:
                    import SCons.Defaults
-                   ENV = SCons.Defaults.ENV
+                   ENV = SCons.Defaults.ConstructionEnvironment['ENV']
                os.execvpe(args[0], args, ENV)
            else:
                # Parent process.
index 46e926c3b0a9d5543c5dd10cf20f212aafe0f8de..035289466916cfbd5a9473878a91af6e3f8a69a9 100644 (file)
@@ -42,6 +42,11 @@ test = TestCmd.TestCmd(workdir = '')
 test.write('act.py', """import os, string, sys
 f = open(sys.argv[1], 'w')
 f.write("act.py: " + string.join(sys.argv[2:]) + "\\n")
+try:
+    if sys.argv[3]:
+        f.write("act.py: " + os.environ[sys.argv[3]] + "\\n")
+except:
+    pass
 f.close()
 sys.exit(0)
 """)
@@ -147,6 +152,14 @@ class BuilderTestCase(unittest.TestCase):
        c = test.read(outfile, 'r')
        assert c == "act.py: three four\n", c
 
+       cmd5 = "python %s %s $target XYZZY" % (act_py, outfile)
+
+       builder = SCons.Builder.Builder(action = cmd5)
+       r = builder.execute(target = 'out5', env = {'ENV' : {'XYZZY' : 'xyzzy'}})
+       assert r == 0
+       c = test.read(outfile, 'r')
+       assert c == "act.py: out5 XYZZY\nact.py: xyzzy\n", c
+
        def function1(kw):
            open(kw['out'], 'w').write("function1\n")
            return 1
index 230f432ceda9ea5af21e5cd45bc0894fe6d9e539..af08fc28d67c2a95ea4cd71269e4bdb516a53e53 100644 (file)
@@ -38,12 +38,12 @@ import SCons.Builder
 
 
 Object = SCons.Builder.Builder(name = 'Object',
-                               action = 'cc -c -o $target $sources',
+                               action = '$CC $CCFLAGS -c -o $target $sources',
                                src_suffix='.c',
                                suffix='.o')
 
 Program = SCons.Builder.Builder(name = 'Program',
-                                action = 'cc -o $target $sources',
+                                action = '$CC -o $target $sources',
                                 builders = [ Object ])
 
 Library = SCons.Builder.Builder(name = 'Library',
@@ -52,6 +52,9 @@ Library = SCons.Builder.Builder(name = 'Library',
                                 suffix = '.a',
                                 builders = [ Object ])
 
-Builders = [Object, Program, Library]
-
-ENV = { 'PATH' : '/usr/local/bin:/bin:/usr/bin' }
+ConstructionEnvironment = {
+       'CC' : 'cc',
+       'CCFLAGS' : '',
+       'BUILDERS' : [Object, Program, Library],
+       'ENV' : { 'PATH' : '/usr/local/bin:/bin:/usr/bin' },
+}
index 468c9b4f5303371a00a18386402dee69ffa52447..dcac71605383bf9c9494fbb374168f3855b98a86 100644 (file)
@@ -72,17 +72,10 @@ class Environment:
     """
 
     def __init__(self, **kw):
-       self._dict = {}
-       if kw.has_key('BUILDERS'):
-           builders = kw['BUILDERS']
-           if not type(builders) is types.ListType:
-               kw['BUILDERS'] = [builders]
-       else:
-           import SCons.Defaults
-           kw['BUILDERS'] = SCons.Defaults.Builders[:]
-       if not kw.has_key('ENV'):
-           import SCons.Defaults
-           kw['ENV'] = SCons.Defaults.ENV.copy()
+       import SCons.Defaults
+       self._dict = copy.deepcopy(SCons.Defaults.ConstructionEnvironment)
+       if kw.has_key('BUILDERS') and type(kw['BUILDERS']) != type([]):
+               kw['BUILDERS'] = [kw['BUILDERS']]
        self._dict.update(copy.deepcopy(kw))
 
        class BuilderWrapper:
@@ -107,7 +100,7 @@ class Environment:
                kw['env'] = self
                apply(self.builder.execute, (), kw)
 
-       for b in kw['BUILDERS']:
+       for b in self._dict['BUILDERS']:
            setattr(self, b.name, BuilderWrapper(self, b))
 
 
index 07e84a4eee31f1191ea970e3f41c07af654d92d7..66d64a054cf02c08d21a48afdbf5c68f0fb23bf1 100644 (file)
@@ -117,6 +117,8 @@ class EnvironmentTestCase(unittest.TestCase):
        assert xxx == 'x'
        assert zzz == 'z'
        assert env.Dictionary().has_key('BUILDERS')
+       assert env.Dictionary().has_key('CC')
+       assert env.Dictionary().has_key('CCFLAGS')
        assert env.Dictionary().has_key('ENV')
 
     def test_ENV(self):
index febb95ac279ad42a7208eb2a295b5053c869c34d..017b7f28c54e8991660c8fe1b93326892fc08b07 100644 (file)
@@ -132,6 +132,8 @@ class NodeTestCase(unittest.TestCase):
        assert node.depends == ['one']
        node.add_dependency(['two', 'three'])
        assert node.depends == ['one', 'two', 'three']
+       node.add_dependency(['three', 'four', 'one'])
+       assert node.depends == ['one', 'two', 'three', 'four']
 
     def test_add_source(self):
        """Test adding sources to a Node's list.
@@ -146,6 +148,8 @@ class NodeTestCase(unittest.TestCase):
        assert node.sources == ['one']
        node.add_source(['two', 'three'])
        assert node.sources == ['one', 'two', 'three']
+       node.add_source(['three', 'four', 'one'])
+       assert node.sources == ['one', 'two', 'three', 'four']
 
     def test_children(self):
        """Test fetching the "children" of a Node.
index c0346cc51a4a8a0ced09091db027dfa103217d74..8334d2d727c7d10b61ca1cb32fbbfff4d534181f 100644 (file)
@@ -59,7 +59,7 @@ class Node:
        if not hasattr(self, "builder"):
            return None
        sources_str = string.join(map(lambda x: str(x), self.sources))
-       stat = self.builder.execute(ENV = self.env.Dictionary('ENV'),
+       stat = self.builder.execute(env = self.env.Dictionary(),
                                    target = str(self), source = sources_str)
        if stat != 0:
            raise BuildError(node = self, stat = stat)
@@ -84,13 +84,17 @@ class Node:
        """Adds dependencies. The depends argument must be a list."""
         if type(depend) is not type([]):
             raise TypeError("depend must be a list")
-       self.depends.extend(depend)
+       depend = filter(lambda x, d=self.depends: x not in d, depend)
+       if len(depend):
+           self.depends.extend(depend)
 
     def add_source(self, source):
        """Adds sources. The source argument must be a list."""
         if type(source) is not type([]):
             raise TypeError("source must be a list")
-       self.sources.extend(source)
+       source = filter(lambda x, s=self.sources: x not in s, source)
+       if len(source):
+           self.sources.extend(source)
 
     def children(self):
        return self.sources + self.depends
index dec523df6b4829bb6e563326332c07bf8b12f830..ce18047ab252fb0fa969bdca3e708ebd16be6caa 100644 (file)
 
 __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
 
+import os
 import TestSCons
 
 test = TestSCons.TestSCons()
 
-test.pass_test()       #XXX Short-circuit until this is implemented.
+test.write("ccwrapper.py",
+"""import os
+import string
+import sys
+open('%s', 'w').write("ccwrapper.py\\n")
+os.system(string.join(["cc"] + sys.argv[1:], " "))
+""" % test.workpath('ccwrapper.out'))
 
 test.write('SConstruct', """
+foo = Environment()
+bar = Environment(CC = 'python ccwrapper.py')
+foo.Program(target = 'foo', source = 'foo.c')
+bar.Program(target = 'bar', source = 'bar.c')
 """)
 
-test.run(arguments = '.')
+test.write('foo.c', """
+int
+main(int argc, char *argv[])
+{
+       argv[argc++] = "--";
+       printf("foo.c\n");
+       exit (0);
+}
+""")
+
+test.write('bar.c', """
+int
+main(int argc, char *argv[])
+{
+       argv[argc++] = "--";
+       printf("foo.c\n");
+       exit (0);
+}
+""")
+
+
+test.run(arguments = 'foo')
+
+test.fail_test(os.path.exists(test.workpath('ccwrapper.out')))
+
+test.run(arguments = 'bar')
+
+test.fail_test(test.read('ccwrapper.out') != "ccwrapper.py\n")
 
 test.pass_test()
index 12c93afb7bda0b46382300f3ceeecacbfa0a4f3d..cc6ad737d14669ebea831e65a8ff55b82d5e5772 100644 (file)
@@ -28,13 +28,13 @@ import TestSCons
 
 test = TestSCons.TestSCons()
 
-test.pass_test()       #XXX Short-circuit until this is implemented.
-
 test.write('SConstruct', """
 foo = Environment(CCFLAGS = '-DFOO')
 bar = Environment(CCFLAGS = '-DBAR')
-foo.Program(target = 'progfoo', source = 'prog.c')
-bar.Program(target = 'progbar', source = 'prog.c')
+foo.Object(target = 'foo.o', source = 'prog.c')
+bar.Object(target = 'bar.o', source = 'prog.c')
+foo.Program(target = 'foo', source = 'foo.o')
+bar.Program(target = 'bar', source = 'bar.o')
 """)
 
 test.write('prog.c', """
@@ -53,9 +53,9 @@ main(int argc, char *argv[])
 """)
 
 
-test.run(arguments = 'progfoo progbar')
+test.run(arguments = 'foo bar')
 
-test.run(program = test.workpath('progfoo'), stdout = "prog.c:  FOO\n")
-test.run(program = test.workpath('progbar'), stdout = "prog.c:  BAR\n")
+test.run(program = test.workpath('foo'), stdout = "prog.c:  FOO\n")
+test.run(program = test.workpath('bar'), stdout = "prog.c:  BAR\n")
 
 test.pass_test()