Eliminate Executor's creation and use of a build_dict and a subst_dict, which were...
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Mon, 10 Jan 2005 13:45:00 +0000 (13:45 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Mon, 10 Jan 2005 13:45:00 +0000 (13:45 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@1212 fdb21ef1-2011-0410-befe-b5e4ea1792b1

23 files changed:
src/engine/SCons/Defaults.py
src/engine/SCons/Environment.py
src/engine/SCons/EnvironmentTests.py
src/engine/SCons/Executor.py
src/engine/SCons/Node/FS.py
src/engine/SCons/Node/FSTests.py
src/engine/SCons/Node/NodeTests.py
src/engine/SCons/Node/__init__.py
src/engine/SCons/Scanner/CTests.py
src/engine/SCons/Scanner/FortranTests.py
src/engine/SCons/Scanner/IDLTests.py
src/engine/SCons/Scanner/ProgTests.py
src/engine/SCons/Scanner/ScannerTests.py
src/engine/SCons/Scanner/__init__.py
src/engine/SCons/Script/SConscript.py
src/engine/SCons/Script/__init__.py
src/engine/SCons/Tool/dmd.py
src/engine/SCons/Tool/f77.py
src/engine/SCons/Tool/f90.py
src/engine/SCons/Tool/f95.py
src/engine/SCons/Tool/fortran.py
src/engine/SCons/Tool/mingw.py
src/engine/SCons/Util.py

index 644dadffc6cc3aca6a89b492e5456ea0db001870..26e22361d7bf23e85ff93d238fa32b85184f7074 100644 (file)
@@ -43,6 +43,7 @@ import stat
 import string
 import time
 import types
+import sys
 
 import SCons.Action
 import SCons.Builder
@@ -161,17 +162,6 @@ ActionFactory = SCons.Action.ActionFactory
 Chmod = ActionFactory(os.chmod,
                       lambda dest, mode: 'Chmod("%s", 0%o)' % (dest, mode))
 
-def Copy(dest, src):
-    def _copy_func(target, source, env, dest=dest, src=src):
-        dest = str(env.arg2nodes(dest, env.fs.Entry)[0])
-        src = str(env.arg2nodes(src, env.fs.Entry)[0])
-        shutil.copytree(src, dest, 1)
-    def _copy_str(target, source, env, dest=dest, src=src):
-        dest = str(env.arg2nodes(dest, env.fs.Entry)[0])
-        src = str(env.arg2nodes(src, env.fs.Entry)[0])
-        return 'Copy("%s", "%s")' % (dest, src)
-    return SCons.Action.Action(_copy_func, strfunction=_copy_str)
-
 def copy_func(dest, src):
     if os.path.isfile(src):
         return shutil.copy(src, dest)
@@ -221,7 +211,7 @@ def copyFunc(dest, source, env):
     os.chmod(dest, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)
     return 0
 
-def _concat(prefix, list, suffix, env, f=lambda x: x):
+def _concat(prefix, list, suffix, env, f=lambda x: x, target=None):
     """Creates a new list from 'list' by first interpolating each
     element in the list using the 'env' dictionary and then calling f
     on the list, and finally concatenating 'prefix' and 'suffix' onto
@@ -234,7 +224,7 @@ def _concat(prefix, list, suffix, env, f=lambda x: x):
 
     if SCons.Util.is_List(list):
         list = SCons.Util.flatten(list)
-    list = f(env.subst_path(list))
+    list = f(env.subst_path(list, target=target))
 
     result = []
 
@@ -341,24 +331,57 @@ class NullCmdGenerator:
     def __call__(self, target, source, env, for_signature=None):
         return self.cmd
 
+class Variable_Method_Caller:
+    """A class for finding a construction variable on the stack and
+    calling one of its methods.
+
+    We use this to support "construction variables" in our string
+    eval()s that actually stand in for methods--specifically, use
+    of "RDirs" in call to _concat that should actually execute the
+    "TARGET.RDirs" method.  (We used to support this by creating a little
+    "build dictionary" that mapped RDirs to the method, but this got in
+    the way of Memoizing construction environments, because we had to
+    create new environment objects to hold the variables.)
+    """
+    def __init__(self, variable, method):
+        self.variable = variable
+        self.method = method
+    def __call__(self, *args, **kw):
+        try: 1/0
+        except ZeroDivisionError: frame = sys.exc_info()[2].tb_frame
+        variable = None
+        while frame:
+            try:
+                variable = frame.f_locals[self.variable]
+            except KeyError:
+                pass
+            frame = frame.f_back
+        if variable is None:
+            return None
+        method = getattr(variable, self.method)
+        return apply(method, args, kw)
+
 ConstructionEnvironment = {
-    'BUILDERS'   : {},
-    'SCANNERS'   : [],
-    'CPPSUFFIXES': CSuffixes,
-    'DSUFFIXES'  : DSuffixes,
-    'IDLSUFFIXES': IDLSuffixes,
-    'PDFPREFIX'  : '',
-    'PDFSUFFIX'  : '.pdf',
-    'PSPREFIX'   : '',
-    'PSSUFFIX'   : '.ps',
-    'ENV'        : {},
-    'INSTALL'    : copyFunc,
-    '_concat'     : _concat,
-    '_defines'    : _defines,
-    '_stripixes'  : _stripixes,
-    '_LIBFLAGS'    : '${_concat(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, __env__)}',
-    '_LIBDIRFLAGS' : '$( ${_concat(LIBDIRPREFIX, LIBPATH, LIBDIRSUFFIX, __env__, RDirs)} $)',
-    '_CPPINCFLAGS' : '$( ${_concat(INCPREFIX, CPPPATH, INCSUFFIX, __env__, RDirs)} $)',
-    '_CPPDEFFLAGS' : '${_defines(CPPDEFPREFIX, CPPDEFINES, CPPDEFSUFFIX, __env__)}',
-    'TEMPFILE'     : NullCmdGenerator
-    }
+    'BUILDERS'      : {},
+    'SCANNERS'      : [],
+    'CPPSUFFIXES'   : CSuffixes,
+    'DSUFFIXES'     : DSuffixes,
+    'IDLSUFFIXES'   : IDLSuffixes,
+    'PDFPREFIX'     : '',
+    'PDFSUFFIX'     : '.pdf',
+    'PSPREFIX'      : '',
+    'PSSUFFIX'      : '.ps',
+    'ENV'           : {},
+    'INSTALL'       : copyFunc,
+    '_concat'       : _concat,
+    '_defines'      : _defines,
+    '_stripixes'    : _stripixes,
+    '_LIBFLAGS'     : '${_concat(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, __env__)}',
+    '_LIBDIRFLAGS'  : '$( ${_concat(LIBDIRPREFIX, LIBPATH, LIBDIRSUFFIX, __env__, RDirs, TARGET)} $)',
+    '_CPPINCFLAGS'  : '$( ${_concat(INCPREFIX, CPPPATH, INCSUFFIX, __env__, RDirs, TARGET)} $)',
+    '_CPPDEFFLAGS'  : '${_defines(CPPDEFPREFIX, CPPDEFINES, CPPDEFSUFFIX, __env__)}',
+    'TEMPFILE'      : NullCmdGenerator,
+    'Dir'           : Variable_Method_Caller('TARGET', 'Dir'),
+    'File'          : Variable_Method_Caller('TARGET', 'File'),
+    'RDirs'         : Variable_Method_Caller('TARGET', 'RDirs'),
+}
index fbc84541d2daa7e09b023c64c523fceb72c73292..c2d2e92c8c19423148faa34404f5566e236b8c4a 100644 (file)
@@ -372,7 +372,7 @@ class SubstitutionEnvironment:
         lvars['__env__'] = self
         return SCons.Util.scons_subst_list(string, self, raw, target, source, gvars, lvars, conv)
 
-    def subst_path(self, path):
+    def subst_path(self, path, target=None):
         """Substitute a path list, turning EntryProxies into Nodes
         and leaving Nodes (and other objects) as-is."""
 
@@ -397,7 +397,7 @@ class SubstitutionEnvironment:
         r = []
         for p in path:
             if SCons.Util.is_String(p):
-                p = self.subst(p, conv=s)
+                p = self.subst(p, target=target, conv=s)
                 if SCons.Util.is_List(p):
                     if len(p) == 1:
                         p = p[0]
index ad5a9b2ba026d90c813eb7561df9623181478d10..44dc81437636bca26c80206002645f193d0f0024 100644 (file)
@@ -484,6 +484,14 @@ class SubstitutionTestCase(unittest.TestCase):
             def get(self):
                 return self.val + '-proxy'
 
+        class MyNode:
+            def __init__(self, val):
+                self.val = val
+            def get_subst_proxy(self):
+                return self
+            def __str__(self):
+                return self.val
+
         class MyObj:
             pass
 
@@ -495,6 +503,12 @@ class SubstitutionTestCase(unittest.TestCase):
         r = env.subst_path(['$FOO', 'xxx', '$BAR'])
         assert r == ['foo', 'xxx', 'bar'], r
 
+        r = env.subst_path(['$FOO', '$TARGET', '$BAR'])
+        assert r == ['foo', '', 'bar'], r
+
+        r = env.subst_path(['$FOO', '$TARGET', '$BAR'], target=MyNode('yyy'))
+        assert map(str, r) == ['foo', 'yyy', 'bar'], r
+
         n = MyObj()
 
         r = env.subst_path(['$PROXY', MyProxy('my2'), n])
index 2a1917123c8749f63f08a34512386d2ed1e57bec..7bc847aa5edabfb75bd6ffb667a655b0c8959335 100644 (file)
@@ -70,27 +70,11 @@ class Executor:
         overrides = {}
         for odict in self.overridelist:
             overrides.update(odict)
-        try:
-            generate_build_dict = self.targets[0].generate_build_dict
-        except (AttributeError, IndexError):
-            pass
-        else:
-            overrides.update(generate_build_dict())
 
         import SCons.Defaults
         env = self.env or SCons.Defaults.DefaultEnvironment()
         build_env = env.Override(overrides)
 
-        # Update the overrides with the $TARGET/$SOURCE variables for
-        # this target+source pair, so that evaluations of arbitrary
-        # Python functions have them in the __env__ environment
-        # they're passed.  Note that the underlying substitution
-        # functions also override these with their own $TARGET/$SOURCE
-        # expansions, which is *usually* duplicated effort, but covers
-        # a corner case where an Action is called directly from within
-        # a function action with different target and source lists.
-        build_env._update(SCons.Util.subst_dict(self.targets, self.sources))
-
         return build_env
 
     def do_nothing(self, target, errfunc, kw):
index 1f2b0a860358900cd032ff75dc586273799cf188..50e3818dc1adf4195fad2828eee3d3a128c9dc5f 100644 (file)
@@ -1397,13 +1397,6 @@ class File(Base):
         return self.fs.Rsearchall(pathlist, clazz=Dir, must_exist=0,
                                   cwd=self.cwd)
 
-    def generate_build_dict(self):
-        """Return an appropriate dictionary of values for building
-        this File."""
-        return {'Dir' : self.Dir,
-                'File' : self.File,
-                'RDirs' : self.RDirs}
-
     def _morph(self):
         """Turn a file system node into a File object.  __cache_reset__"""
         self.scanner_paths = {}
@@ -1480,10 +1473,10 @@ class File(Base):
             try:
                 path = self.scanner_paths[scanner]
             except KeyError:
-                path = scanner.path(env, self.cwd)
+                path = scanner.path(env, self.cwd, target)
                 self.scanner_paths[scanner] = path
         except KeyError:
-            path = scanner.path(env, target.cwd)
+            path = scanner.path(env, target.cwd, target)
             target.scanner_paths[scanner] = path
 
         return scanner(self, env, path)
index e71093f66337552300d9242f6f95f1e163129907..e65c10b6581b51df3e754058f6e99b6e734e5755 100644 (file)
@@ -54,7 +54,7 @@ class Scanner:
         scanner_count = scanner_count + 1
         self.hash = scanner_count
         self.node = node
-    def path(self, env, target):
+    def path(self, env, dir, target=None):
         return ()
     def __call__(self, node, env, path):
         return [self.node]
index ee0e82b95540e9153dff0aaaa6167ddfc79a0502..3e5a9f096f2d897d35d764e3b51a7ffcc02c86b3 100644 (file)
@@ -1128,12 +1128,6 @@ class NodeTestCase(unittest.TestCase):
         s = n.get_suffix()
         assert s == '', s
 
-    def test_generate_build_dict(self):
-        """Test the base Node generate_build_dict() method"""
-        n = SCons.Node.Node()
-        dict = n.generate_build_dict()
-        assert dict == {}, dict
-
     def test_postprocess(self):
         """Test calling the base Node postprocess() method"""
         n = SCons.Node.Node()
index 7b443abcfae052c3d3c2e9a5f579cc6e83509cdf..7ffec0e85d0705ad1d74b49c838078b608858e94 100644 (file)
@@ -143,11 +143,6 @@ class Node:
     def get_suffix(self):
         return ''
 
-    def generate_build_dict(self):
-        """Return an appropriate dictionary of values for building
-        this Node."""
-        return {}
-
     def get_build_env(self):
         """Fetch the appropriate Environment to build this node.
         __cacheable__"""
index 5296f93c31eb1eba0c5fae4e2f64df9186f797a2..e3caa5f5bef185f986353681ca4524b83e7d2a5d 100644 (file)
@@ -188,7 +188,7 @@ class DummyEnvironment(UserDict.UserDict):
             return [self.data[strSubst[1:]]]
         return [[strSubst]]
 
-    def subst_path(self, path):
+    def subst_path(self, path, target=None):
         if type(path) != type([]):
             path = [path]
         return map(self.subst, path)
index ebf7b566d74f5e5292daf5281790bc4e7cb32b91..75264ac28dfa08d8d53004cceca49b76a58d30f5 100644 (file)
@@ -236,7 +236,7 @@ class DummyEnvironment:
             return self[arg[1:]]
         return arg
 
-    def subst_path(self, path):
+    def subst_path(self, path, target=None):
         if type(path) != type([]):
             path = [path]
         return map(self.subst, path)
index f8683b0c243c16b9f46e33921074707f612e01fd..31a40eac023a5303cf8d068327a2bde38776ec45 100644 (file)
@@ -201,7 +201,7 @@ class DummyEnvironment:
     def subst(self, arg):
         return arg
 
-    def subst_path(self, path):
+    def subst_path(self, path, target=None):
         if type(path) != type([]):
             path = [path]
         return map(self.subst, path)
index 7ab88f94720202eecfc4ee9adafd89920ea7e28e..7e33866a1dc1623829d4fab69fd39f8452944e5d 100644 (file)
@@ -78,7 +78,7 @@ class DummyEnvironment:
             return ''
         return s
 
-    def subst_path(self, path):
+    def subst_path(self, path, target=None):
         if type(path) != type([]):
             path = [path]
         return map(self.subst, path)
index e418c1778cfc01fefd0309f51118dbeca3a08b4b..493a330b68dbee8f124f68afe1576b5f075b29d1 100644 (file)
@@ -42,7 +42,7 @@ class DummyEnvironment(UserDict.UserDict):
         if strSubst[0] == '$':
             return [self.data[strSubst[1:]]]
         return [[strSubst]]
-    def subst_path(self, path):
+    def subst_path(self, path, target=None):
         if type(path) != type([]):
             path = [path]
         return map(self.subst, path)
index 1968a9e317ede3729d56e1cf36d84a72b7a0381f..1322fffa22f57704a974a1804aa243fd9c0bf9b6 100644 (file)
@@ -71,14 +71,15 @@ class FindPathDirs:
     def __init__(self, variable, fs):
         self.variable = variable
         self.fs = fs
-    def __call__(self, env, dir, argument=None):
+    def __call__(self, env, dir, target=None, argument=None):
         "__cacheable__"
         try:
             path = env[self.variable]
         except KeyError:
             return ()
 
-        path_tuple = tuple(self.fs.Rsearchall(env.subst_path(path),
+        path = env.subst_path(path, target=target)
+        path_tuple = tuple(self.fs.Rsearchall(path,
                                               must_exist = 0, #kwq!
                                               clazz = SCons.Node.FS.Dir,
                                               cwd = dir))
@@ -188,14 +189,14 @@ class Base:
         self.scan_check = scan_check
         self.recursive = recursive
 
-    def path(self, env, dir = None):
+    def path(self, env, dir=None, target=None):
         "__cacheable__"
         if not self.path_function:
             return ()
         if not self.argument is _null:
-            return self.path_function(env, dir, self.argument)
+            return self.path_function(env, dir, target, self.argument)
         else:
-            return self.path_function(env, dir)
+            return self.path_function(env, dir, target)
 
     def __call__(self, node, env, path = ()):
         """
index e30a97954dbff7d6d165047689650859b55894dc..2e8c9165dff86e48e47da956a5f7fcaacddac871 100644 (file)
@@ -522,11 +522,15 @@ class DefaultEnvironmentCall:
     thereby prevent expansion of construction variables (since from
     the user's point of view this was called as a global function,
     with no associated construction environment)."""
-    def __init__(self, method_name):
+    def __init__(self, method_name, subst=0):
         self.method_name = method_name
+        if subst:
+            self.factory = SCons.Defaults.DefaultEnvironment
+        else:
+            self.factory = get_DefaultEnvironmentProxy
     def __call__(self, *args, **kw):
-        proxy = get_DefaultEnvironmentProxy()
-        method = getattr(proxy, self.method_name)
+        env = self.factory()
+        method = getattr(env, self.method_name)
         return apply(method, args, kw)
 
 
index d6d49122e939557274580ec28f60584f320e6315..d94fee2c435e893be9cb3eb48739298d6835d41c 100644 (file)
@@ -191,7 +191,7 @@ GlobalDefaultEnvironmentFunctions = [
     'BuildDir',
     'CacheDir',
     'Clean',
-    'Command',
+    #The Command() method is handled separately, below.
     'Depends',
     'Dir',
     'Execute',
@@ -245,3 +245,21 @@ GlobalDefaultBuilders = [
 
 for name in GlobalDefaultEnvironmentFunctions + GlobalDefaultBuilders:
     exec "%s = _SConscript.DefaultEnvironmentCall(%s)" % (name, repr(name))
+
+# The global Command() function must be handled differently than the
+# global functions for other construction environment methods because
+# we want people to be able to use Actions that must expand $TARGET
+# and $SOURCE later, when (and if) the Action is invoked to build
+# the target(s).  We do this with the subst=1 argument, which creates
+# a DefaultEnvironmentCall instance that wraps up a normal default
+# construction environment that performs variable substitution, not a
+# proxy that doesn't.
+#
+# There's a flaw here, though, because any other $-variables on a command
+# line will *also* be expanded, each to a null string, but that should
+# only be a problem in the unusual case where someone was passing a '$'
+# on a command line and *expected* the $ to get through to the shell
+# because they were calling Command() and not env.Command()...  This is
+# unlikely enough that we're going to leave this as is and cross that
+# bridge if someone actually comes to it.
+Command = _SConscript.DefaultEnvironmentCall('Command', subst=1)
index 914129c66a0da595dee6aa3b10b5e0d009c6fa3c..13f58a105488466a8fc3b5bc6a1a830ac08fc4d2 100644 (file)
@@ -95,7 +95,7 @@ def generate(env):
 
     env['DC'] = 'dmd'
     env['DCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -of$TARGET $SOURCES'
-    env['_DINCFLAGS'] = '$( ${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs)}  $)'
+    env['_DINCFLAGS'] = '$( ${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, TARGET)}  $)'
     env['_DVERFLAGS'] = '$( ${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)}  $)'
     env['_DDEBUGFLAGS'] = '$( ${_concat(DDEBUGPREFIX, DDEBUG, DDEBUGSUFFIX, __env__)} $)'
     env['_DFLAGS'] = '$( ${_concat(DFLAGPREFIX, DFLAGS, DFLAGSUFFIX, __env__)} $)'
@@ -132,7 +132,7 @@ def generate(env):
         env['DLIB'] = 'lib'
         env['DLIBCOM'] = '$DLIB $_DLIBFLAGS -c $TARGET $SOURCES $_DLINKLIBFLAGS'
 
-        env['_DLINKLIBFLAGS'] = '$( ${_concat(DLIBLINKPREFIX, LIBS, DLIBLINKSUFFIX, __env__, RDirs)} $)'
+        env['_DLINKLIBFLAGS'] = '$( ${_concat(DLIBLINKPREFIX, LIBS, DLIBLINKSUFFIX, __env__, RDirs, TARGET)} $)'
         env['_DLIBFLAGS'] = '$( ${_concat(DLIBFLAGPREFIX, DLIBFLAGS, DLIBFLAGSUFFIX, __env__)} $)'
         env['DLINKFLAGS'] = []
         env['DLIBLINKPREFIX'] = ''
index 87c8c9ae175c65ec1a80bbfac718e34eafad78b0..5650e97b62e3787b149e1c821da12d52e9196eac 100644 (file)
@@ -111,7 +111,7 @@ def add_to_env(env):
     env['_SHF77COMSTRG']    = ShF77CommandStrGenerator
     env['_SHF77PPCOMSTRG']  = ShF77PPCommandStrGenerator
 
-    env['_F77INCFLAGS'] = '$( ${_concat(INCPREFIX, F77PATH, INCSUFFIX, __env__, RDirs)} $)'
+    env['_F77INCFLAGS'] = '$( ${_concat(INCPREFIX, F77PATH, INCSUFFIX, __env__, RDirs, TARGET)} $)'
 
     env['_F77COMD']     = '$_F77G $_F77FLAGSG $_F77INCFLAGS -c -o $TARGET $SOURCES'
     env['_F77PPCOMD']   = '$_F77G $_F77FLAGSG $CPPFLAGS $_CPPDEFFLAGS $_F77INCFLAGS -c -o $TARGET $SOURCES'
index 272f40e1a82bab75992782f81e2a60a45aebd194..9c3b0a3c105824cf0417add9daf8fa5103b3827a 100644 (file)
@@ -111,7 +111,7 @@ def add_to_env(env):
     env['_SHF90PPCOMG']     = ShF90PPCommandGenerator
     env['_SHF90PPCOMSTRG']  = ShF90PPCommandStrGenerator
 
-    env['_F90INCFLAGS'] = '$( ${_concat(INCPREFIX, F90PATH, INCSUFFIX, __env__, RDirs)} $)'
+    env['_F90INCFLAGS'] = '$( ${_concat(INCPREFIX, F90PATH, INCSUFFIX, __env__, RDirs, TARGET)} $)'
     env['_F90COMD']     = '$_F90G $_F90FLAGSG $_F90INCFLAGS $_FORTRANMODFLAG -c -o $TARGET $SOURCES'
     env['_F90PPCOMD']   = '$_F90G $_F90FLAGSG $CPPFLAGS $_CPPDEFFLAGS $_F90INCFLAGS $_FORTRANMODFLAG -c -o $TARGET $SOURCES'
     env['_SHF90COMD']   = '$_SHF90G $_SHF90FLAGSG $_F90INCFLAGS $_FORTRANMODFLAG -c -o $TARGET $SOURCES'
index 7121011d926a2dd11efd39d90afade1f2c50298e..2d5a0b5ea6b8b2d75ee4e4a09cf554a73164dea2 100644 (file)
@@ -110,7 +110,7 @@ def add_to_env(env):
     env['_SHF95PPCOMG']    = ShF95PPCommandGenerator
     env['_SHF95PPCOMSTRG'] = ShF95PPCommandStrGenerator
 
-    env['_F95INCFLAGS'] = '$( ${_concat(INCPREFIX, F95PATH, INCSUFFIX, __env__, RDirs)} $)'
+    env['_F95INCFLAGS'] = '$( ${_concat(INCPREFIX, F95PATH, INCSUFFIX, __env__, RDirs, TARGET)} $)'
 
     env['_F95COMD']     = '$_F95G $_F95FLAGSG $_F95INCFLAGS $_FORTRANMODFLAG -c -o $TARGET $SOURCES'
     env['_F95PPCOMD']   = '$_F95G $_F95FLAGSG $CPPFLAGS $_CPPDEFFLAGS $_F95INCFLAGS $_FORTRANMODFLAG -c -o $TARGET $SOURCES'
index 7f6a88b237f55e13f46ae0e4907cc1b30210249d..770a45eb6227c56792ce93e2250b1ab3bd986100 100644 (file)
@@ -137,7 +137,7 @@ def add_to_env(env):
     env['_SHFORTRANPPCOMG']     = ShFortranPPCommandGenerator
     env['_SHFORTRANPPCOMSTRG']  = ShFortranPPCommandStrGenerator
 
-    env['_FORTRANINCFLAGS'] = '$( ${_concat(INCPREFIX, FORTRANPATH, INCSUFFIX, __env__, RDirs)} $)'
+    env['_FORTRANINCFLAGS'] = '$( ${_concat(INCPREFIX, FORTRANPATH, INCSUFFIX, __env__, RDirs, TARGET)} $)'
 
     env['FORTRANMODPREFIX'] = ''     # like $LIBPREFIX
     env['FORTRANMODSUFFIX'] = '.mod' # like $LIBSUFFIX
index 99a5574c65a3480905ec1457029c395f30df9f1c..f1bc91ac20a80af5f19f6bba2407ef52d7923102 100644 (file)
@@ -139,7 +139,7 @@ def generate(env):
 
     env['RC'] = 'windres'
     env['RCFLAGS'] = SCons.Util.CLVar('')
-    env['RCINCFLAGS'] = '$( ${_concat(RCINCPREFIX, CPPPATH, RCINCSUFFIX, __env__, RDirs)} $)'
+    env['RCINCFLAGS'] = '$( ${_concat(RCINCPREFIX, CPPPATH, RCINCSUFFIX, __env__, RDirs, TARGET)} $)'
     env['RCINCPREFIX'] = '--include-dir '
     env['RCINCSUFFIX'] = ''
     env['RCCOM'] = '$RC $RCINCFLAGS $RCFLAGS -i $SOURCE -o $TARGET'
index 361b18c936ccc1f107564cb36cb0303066902ffa..2ca487f2a775fc0d08aa8fd16705ea685449b67a 100644 (file)
@@ -490,6 +490,9 @@ def subst_dict(target, source):
         tnl = NLWrapper(target, lambda x: x.get_subst_proxy())
         dict['TARGETS'] = Targets_or_Sources(tnl)
         dict['TARGET'] = Target_or_Source(tnl)
+    else:
+        dict['TARGETS'] = None
+        dict['TARGET'] = None
 
     if source:
         def get_src_subst_proxy(node):
@@ -503,6 +506,9 @@ def subst_dict(target, source):
         snl = NLWrapper(source, get_src_subst_proxy)
         dict['SOURCES'] = Targets_or_Sources(snl)
         dict['SOURCE'] = Target_or_Source(snl)
+    else:
+        dict['SOURCES'] = None
+        dict['SOURCE'] = None
 
     return dict