Add abspath construction variable modifier and variable (Anthony Roach)
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Thu, 11 Apr 2002 05:04:42 +0000 (05:04 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Thu, 11 Apr 2002 05:04:42 +0000 (05:04 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@326 fdb21ef1-2011-0410-befe-b5e4ea1792b1

doc/man/scons.1
src/CHANGES.txt
src/engine/SCons/Action.py
src/engine/SCons/ActionTests.py
src/engine/SCons/Util.py
src/engine/SCons/UtilTests.py

index ed7978f64336da9b6642fb40ad301baf66b72bf1..b3ed1413f796a4a37af1ced22e5874196c262f11 100644 (file)
@@ -1553,8 +1553,13 @@ target if multiple targets are being built.
 .IP TARGETS
 The file names of all targets being built.
 
+.IP SOURCE
+The file name of the source of the build command, or the file name of the
+first source if multiple sources are being built.
+
 .IP SOURCES
 The file names of the sources of the build command.
+
 .LP 
 For example, given the construction variable CC='cc', targets=['foo'], and
 sources=['foo.c', 'bar.c']:
@@ -1603,6 +1608,9 @@ and minus the directory.
 .IP suffix
 Just the file suffix.
 
+.IP abspath
+The absolute path name of the file.
+
 .LP
 For example, the specified target will
 expand as follows for the corresponding modifiers:
@@ -1614,6 +1622,7 @@ ${TARGET.dir}        => sub/dir
 ${TARGET.file}       => file.x
 ${TARGET.filebase}   => file
 ${TARGET.suffix}     => .x
+${TARGET.abspath}    => /top/dir/sub/dir/file.x
 .EE
 
 .LP
index 173fea64356356ded870b7a342a85287d6ceb575..5fb3c0095c87a9fa3cb47468b81cf149754d2725 100644 (file)
@@ -35,6 +35,13 @@ RELEASE 0.07 -
   - Implemented caching of content signatures, plus added --max-drift
     option to control caching.
 
+  - Implemented caching of dependency signatures, enabled by new
+    --implicit-cache option.
+
+  - Added abspath construction variable modifier.
+
+  - Added $SOURCE variable as a synonym for $SOURCES[0].
+
 
 
 RELEASE 0.06 - Thu, 28 Mar 2002 01:24:29 -0600
index 3ed3d73521c8822e1e08f51b4369e3d6a8bd4002..3d52142e1e9e83f1e9d37568461a08fd29576825 100644 (file)
@@ -216,8 +216,8 @@ class ActionBase:
                      construction variables
 
             source - the source (object or array of objects),
-                     used to generate the SOURCES construction
-                     variable
+                     used to generate the SOURCES and SOURCE 
+                     construction variables
 
         Any other keyword arguments are copied into the
         dictionary."""
@@ -253,6 +253,8 @@ class ActionBase:
             if not SCons.Util.is_List(s):
                 s = [s]
             dict['SOURCES'] = SCons.Util.PathList(map(os.path.normpath, map(str, s)))
+            if dict['SOURCES']:
+                dict['SOURCE'] = dict['SOURCES'][0]
 
         dict.update(kw)
 
index c7cad2d6aa9a107f1479b0faab4b741528d0bd4c..1a0596f74e59c69b2091ba1016c78dafa27d4b82 100644 (file)
@@ -88,6 +88,8 @@ class ActionBaseTestCase(unittest.TestCase):
         assert str(d['TARGETS']) == 't', d['TARGETS']
         assert str(d['TARGET']) == 't', d['TARGET']
         assert str(d['SOURCES']) == 's', d['SOURCES']
+        assert str(d['SOURCE']) == 's', d['SOURCE']
+
 
         d = a.subst_dict(target = ['t1', 't2'], source = ['s1', 's2'])
         TARGETS = map(lambda x: str(x), d['TARGETS'])
@@ -97,6 +99,7 @@ class ActionBaseTestCase(unittest.TestCase):
         SOURCES = map(lambda x: str(x), d['SOURCES'])
         SOURCES.sort()
         assert SOURCES == ['s1', 's2'], d['SOURCES']
+        assert str(d['SOURCE']) == 's1', d['SOURCE']
 
 class CommandActionTestCase(unittest.TestCase):
 
index e31b1b081cda7914afe36af87a40f5ac222b2a3e..3612b9ae2ed3edb1aed70cd92afebfbcddb74ea8 100644 (file)
@@ -116,11 +116,16 @@ class PathList(UserList.UserList):
         """Return the file name with path and suffix stripped."""
         return self.__getFileName().__splitPath(os.path.splitext)[0]
 
+    def __getAbsPath(self):
+        """Return the absolute path"""
+        return map(os.path.abspath, self.data)
+
     dictSpecialAttrs = { "file" : __getFileName,
                          "base" : __getBasePath,
                          "filebase" : __getBase,
                          "dir" : __getDir,
-                         "suffix" : __getSuffix }
+                         "suffix" : __getSuffix,
+                         "abspath" : __getAbsPath}
     
     def __str__(self):
         return string.join(self.data)
index 60d7d4d282909d3d83e8f67bd0d3bbe045b323d3..8be22f89b972e1841bccfbf0fd0c947dcc14fca7 100644 (file)
@@ -46,6 +46,7 @@ class UtilTestCase(unittest.TestCase):
         loc['SOURCES'] = PathList(map(os.path.normpath, [ "./foo/blah.cpp",
                                                           "/bar/ack.cpp",
                                                           "../foo/ack.c" ]))
+        loc['SOURCE'] = loc['SOURCES'][0]
         loc['xxx'] = None
         loc['zero'] = 0
         loc['one'] = 1
@@ -70,7 +71,7 @@ class UtilTestCase(unittest.TestCase):
         newcom = scons_subst("test $TARGET", loc, {})
         assert newcom == cvt("test foo/bar.exe")
 
-        newcom = scons_subst("test $TARGET$SOURCE[0]", loc, {})
+        newcom = scons_subst("test $TARGET$FOO[0]", loc, {})
         assert newcom == cvt("test foo/bar.exe[0]")
 
         newcom = scons_subst("test ${TARGET.file}", loc, {})
@@ -88,6 +89,15 @@ class UtilTestCase(unittest.TestCase):
         newcom = scons_subst("test ${TARGET.dir}", loc, {})
         assert newcom == cvt("test foo")
 
+        newcom = scons_subst("test ${TARGET.abspath}", loc, {})
+        assert newcom == cvt("test %s/foo/bar.exe"%os.getcwd()), newcom
+
+        newcom = scons_subst("test ${SOURCES.abspath}", loc, {})
+        assert newcom == cvt("test %s/foo/blah.cpp /bar/ack.cpp %s/foo/ack.c"%(os.getcwd(),os.path.normpath(os.getcwd()+"/.."))), newcom
+
+        newcom = scons_subst("test ${SOURCE.abspath}", loc, {})
+        assert newcom == cvt("test %s/foo/blah.cpp"%os.getcwd()), newcom
+
         newcom = scons_subst("test $xxx", loc, {})
         assert newcom == cvt("test"), newcom