summaryrefslogtreecommitdiffstats
path: root/src/engine/SCons/Defaults.py
diff options
context:
space:
mode:
authorSteven Knight <knight@baldmt.com>2002-04-22 19:21:26 (GMT)
committerSteven Knight <knight@baldmt.com>2002-04-22 19:21:26 (GMT)
commit74f98d3083cfbb859bf032dba37ed14bbb5219dd (patch)
tree331e7f6b4cb4d8ec98a4cce203ab22f4ba893f9b /src/engine/SCons/Defaults.py
parent9afa958bb1b299c47b3197589ab7b9b89686cc6b (diff)
downloadSCons-74f98d3083cfbb859bf032dba37ed14bbb5219dd.zip
SCons-74f98d3083cfbb859bf032dba37ed14bbb5219dd.tar.gz
SCons-74f98d3083cfbb859bf032dba37ed14bbb5219dd.tar.bz2
Several bug fixes from Charles Crain.
Diffstat (limited to 'src/engine/SCons/Defaults.py')
-rw-r--r--src/engine/SCons/Defaults.py100
1 files changed, 51 insertions, 49 deletions
diff --git a/src/engine/SCons/Defaults.py b/src/engine/SCons/Defaults.py
index 8856db5..6acf4de 100644
--- a/src/engine/SCons/Defaults.py
+++ b/src/engine/SCons/Defaults.py
@@ -77,17 +77,28 @@ class SharedCmdGenerator:
return self.action_shared
else:
return self.action_static
-
+
+def yaccEmitter(target, source, env, **kw):
+ # Yacc can be configured to emit a .h file as well
+ # as a .c file. Append that as a target.
+ if len(source) and os.path.splitext(SCons.Util.to_String(source[0]))[1] in \
+ [ '.y', '.yy']:
+ target.append(os.path.splitext(SCons.Util.to_String(target[0]))[0] + \
+ '.h')
+ return (target, source)
+
CFile = SCons.Builder.Builder(name = 'CFile',
action = { '.l' : '$LEXCOM',
'.y' : '$YACCCOM',
},
+ emitter = yaccEmitter,
suffix = '$CFILESUFFIX')
CXXFile = SCons.Builder.Builder(name = 'CXXFile',
action = { '.ll' : '$LEXCOM',
'.yy' : '$YACCCOM',
},
+ emitter = yaccEmitter,
suffix = '$CXXFILESUFFIX')
CXXAction = SCons.Action.Action("$CXXCOM")
@@ -134,22 +145,33 @@ Object = SCons.Builder.Builder(name = 'Object',
src_suffix = static_obj.src_suffixes(),
src_builder = [CFile, CXXFile])
-def win32LinkGenerator(env, target, source, **kw):
- cmd = env.subst_list([ '$LINK', '$LINKFLAGS', '/OUT:' + str(target[0]) ])[0]
- cmd.extend(['$('] + env.subst_list('$_LIBDIRFLAGS')[0] + ['$)'])
- cmd.extend(env.subst_list('$_LIBFLAGS')[0])
- cmd.extend(map(lambda x: str(x), source))
+def win32TempFileMunge(env, cmd_list):
+ """Given a list of command line arguments, see if it is too
+ long to pass to the win32 command line interpreter. If so,
+ create a temp file, then pass "@tempfile" as the sole argument
+ to the supplied command (which is the first element of cmd_list).
+ Otherwise, just return [cmd_list]."""
+ cmd = env.subst_list(cmd_list)[0]
cmdlen = reduce(lambda x, y: x + len(y), cmd, 0) + len(cmd)
if cmdlen <= 2048:
- return [cmd]
+ return [cmd_list]
else:
import tempfile
- tmp = tempfile.mktemp()
- args = filter(lambda x: x != '$(' and x != '$)', cmd[1:])
- args = map(SCons.Util.quote_spaces, args)
+ # We do a normpath because mktemp() has what appears to be
+ # a bug in Win32 that will use a forward slash as a path
+ # delimiter. Win32's link mistakes that for a command line
+ # switch and barfs.
+ tmp = os.path.normpath(tempfile.mktemp())
+ args = map(SCons.Util.quote_spaces, cmd[1:])
open(tmp, 'w').write(string.join(args, " ") + "\n")
return [ [cmd[0], '@' + tmp],
['del', tmp] ]
+
+def win32LinkGenerator(env, target, source, **kw):
+ args = [ '$LINK', '$LINKFLAGS', '/OUT:%s' % target[0],
+ '$(', '$_LIBDIRFLAGS', '$)', '$_LIBFLAGS' ]
+ args.extend(map(SCons.Util.to_String, source))
+ return win32TempFileMunge(env, args)
kw = {
'name' : 'Program',
@@ -197,7 +219,7 @@ def win32LibGenerator(target, source, env, shared=1):
else:
# Just treat it as a generic source file.
listCmd.append(str(src))
- return [ listCmd ]
+ return win32TempFileMunge(env, listCmd)
def win32LibEmitter(target, source, env, shared=0):
if shared:
@@ -226,32 +248,19 @@ def win32LibEmitter(target, source, env, shared=0):
env.subst("$LIBSUFFIX")))
return (target, source)
-PosixLibrary = SCons.Builder.Builder(name = 'Library',
- generator = \
- SharedCmdGenerator(shared="$SHLINKCOM",
- static="$ARCOM"),
- prefix = \
- LibAffixGenerator(static='$LIBPREFIX',
- shared='$SHLIBPREFIX'),
- suffix = \
- LibAffixGenerator(static='$LIBSUFFIX',
- shared='$SHLIBSUFFIX'),
- src_suffix = '$OBJSUFFIX',
- src_builder = Object)
-
-Win32Library = SCons.Builder.Builder(name = 'Library',
- generator = \
- SharedCmdGenerator(shared=SCons.Action.CommandGeneratorAction(win32LibGenerator),
- static="$ARCOM"),
- emitter = win32LibEmitter,
- prefix = \
- LibAffixGenerator(static='$LIBPREFIX',
- shared='$SHLIBPREFIX'),
- suffix = \
- LibAffixGenerator(static='$LIBSUFFIX',
- shared='$SHLIBSUFFIX'),
- src_suffix = '$OBJSUFFIX',
- src_builder = Object)
+Library = SCons.Builder.Builder(name = 'Library',
+ generator = \
+ SharedCmdGenerator(shared="$SHLINKCOM",
+ static="$ARCOM"),
+ emitter="$LIBEMITTER",
+ prefix = \
+ LibAffixGenerator(static='$LIBPREFIX',
+ shared='$SHLIBPREFIX'),
+ suffix = \
+ LibAffixGenerator(static='$LIBSUFFIX',
+ shared='$SHLIBSUFFIX'),
+ src_suffix = '$OBJSUFFIX',
+ src_builder = Object)
LaTeXAction = SCons.Action.Action('$LATEXCOM')
@@ -414,14 +423,10 @@ def make_win32_env_from_paths(include, lib, path):
'SHF77PPCOM' : '$SHF77 $SHF77FLAGS $CPPFLAGS $_INCFLAGS /c $SOURCES /Fo$TARGET',
'LINK' : 'link',
'LINKFLAGS' : '/nologo',
- # XXX - We'd like to do this as follows, but '$LINKCOM' in
- # a Builder above gets expanded too soon to stick a function
- # right in the environment like this. Revisit this when this
- # capability has been added (cf. bug report #537058).
- #'LINKCOM' : win32Link,
+ 'LINKCOM' : SCons.Action.CommandGenerator(win32LinkGenerator),
'SHLINK' : '$LINK',
'SHLINKFLAGS': '$LINKFLAGS /dll',
- 'SHLINKCOM' : '$SHLINK $SHLINKFLAGS /OUT:$TARGET $_LIBDIRFLAGS $_LIBFLAGS $SOURCES',
+ 'SHLINKCOM' : SCons.Action.CommandGenerator(win32LibGenerator),
'AR' : 'lib',
'ARFLAGS' : '/nologo',
'ARCOM' : '$AR $ARFLAGS /OUT:$TARGET $SOURCES',
@@ -449,7 +454,7 @@ def make_win32_env_from_paths(include, lib, path):
'PSCOM' : '$DVIPS $DVIPSFLAGS -o $TARGET $SOURCES',
'PSPREFIX' : '',
'PSSUFFIX' : '.ps',
- 'BUILDERS' : [Alias, CFile, CXXFile, DVI, Win32Library, Object,
+ 'BUILDERS' : [Alias, CFile, CXXFile, DVI, Library, Object,
PDF, PostScript, Program],
'SCANNERS' : [CScan],
'OBJPREFIX' : '',
@@ -464,6 +469,7 @@ def make_win32_env_from_paths(include, lib, path):
'LIBDIRSUFFIX' : '',
'LIBLINKPREFIX' : '',
'LIBLINKSUFFIX' : '$LIBSUFFIX',
+ 'LIBEMITTER' : win32LibEmitter,
'INCPREFIX' : '/I',
'INCSUFFIX' : '',
'WIN32DEFPREFIX' : '/def:',
@@ -491,8 +497,6 @@ def make_win32_env(version):
if os.name == 'posix':
- Library = PosixLibrary
-
arcom = '$AR $ARFLAGS $TARGET $SOURCES'
ranlib = 'ranlib'
if SCons.Util.WhereIs(ranlib):
@@ -557,7 +561,7 @@ if os.name == 'posix':
'PSCOM' : '$DVIPS $DVIPSFLAGS -o $TARGET $SOURCES',
'PSPREFIX' : '',
'PSSUFFIX' : '.ps',
- 'BUILDERS' : [Alias, CFile, CXXFile, DVI, PosixLibrary, Object,
+ 'BUILDERS' : [Alias, CFile, CXXFile, DVI, Library, Object,
PDF, PostScript, Program],
'SCANNERS' : [CScan],
'OBJPREFIX' : '',
@@ -578,8 +582,6 @@ if os.name == 'posix':
}
elif os.name == 'nt':
- Library = Win32Library
-
versions = None
try:
versions = get_devstudio_versions()