diff options
Diffstat (limited to 'src/engine/SCons/Defaults.py')
| -rw-r--r-- | src/engine/SCons/Defaults.py | 100 |
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() |
