| Index: scons-2.0.1/engine/SCons/Tool/dmd.py | 
| =================================================================== | 
| --- scons-2.0.1/engine/SCons/Tool/dmd.py	(revision 0) | 
| +++ scons-2.0.1/engine/SCons/Tool/dmd.py	(revision 0) | 
| @@ -0,0 +1,223 @@ | 
| +"""SCons.Tool.dmd | 
| + | 
| +Tool-specific initialization for the Digital Mars D compiler. | 
| +(http://digitalmars.com/d) | 
| + | 
| +Coded by Andy Friesen (andy@ikagames.com) | 
| +15 November 2003 | 
| + | 
| +There are a number of problems with this script at this point in time. | 
| +The one that irritates me the most is the Windows linker setup.  The D | 
| +linker doesn't have a way to add lib paths on the commandline, as far | 
| +as I can see.  You have to specify paths relative to the SConscript or | 
| +use absolute paths.  To hack around it, add '#/blah'.  This will link | 
| +blah.lib from the directory where SConstruct resides. | 
| + | 
| +Compiler variables: | 
| +    DC - The name of the D compiler to use.  Defaults to dmd or gdmd, | 
| +    whichever is found. | 
| +    DPATH - List of paths to search for import modules. | 
| +    DVERSIONS - List of version tags to enable when compiling. | 
| +    DDEBUG - List of debug tags to enable when compiling. | 
| + | 
| +Linker related variables: | 
| +    LIBS - List of library files to link in. | 
| +    DLINK - Name of the linker to use.  Defaults to dmd or gdmd. | 
| +    DLINKFLAGS - List of linker flags. | 
| + | 
| +Lib tool variables: | 
| +    DLIB - Name of the lib tool to use.  Defaults to lib. | 
| +    DLIBFLAGS - List of flags to pass to the lib tool. | 
| +    LIBS - Same as for the linker. (libraries to pull into the .lib) | 
| +""" | 
| + | 
| +# | 
| +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation | 
| +# | 
| +# Permission is hereby granted, free of charge, to any person obtaining | 
| +# a copy of this software and associated documentation files (the | 
| +# "Software"), to deal in the Software without restriction, including | 
| +# without limitation the rights to use, copy, modify, merge, publish, | 
| +# distribute, sublicense, and/or sell copies of the Software, and to | 
| +# permit persons to whom the Software is furnished to do so, subject to | 
| +# the following conditions: | 
| +# | 
| +# The above copyright notice and this permission notice shall be included | 
| +# in all copies or substantial portions of the Software. | 
| +# | 
| +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY | 
| +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE | 
| +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | 
| +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE | 
| +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | 
| +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | 
| +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | 
| +# | 
| + | 
| +__revision__ = "src/engine/SCons/Tool/dmd.py 5134 2010/08/16 23:02:40 bdeegan" | 
| + | 
| +import os | 
| + | 
| +import SCons.Action | 
| +import SCons.Builder | 
| +import SCons.Defaults | 
| +import SCons.Scanner.D | 
| +import SCons.Tool | 
| + | 
| +# Adapted from c++.py | 
| +def isD(source): | 
| +    if not source: | 
| +        return 0 | 
| + | 
| +    for s in source: | 
| +        if s.sources: | 
| +            ext = os.path.splitext(str(s.sources[0]))[1] | 
| +            if ext == '.d': | 
| +                return 1 | 
| +    return 0 | 
| + | 
| +smart_link = {} | 
| + | 
| +smart_lib = {} | 
| + | 
| +def generate(env): | 
| +    global smart_link | 
| +    global smart_lib | 
| + | 
| +    static_obj, shared_obj = SCons.Tool.createObjBuilders(env) | 
| + | 
| +    DAction = SCons.Action.Action('$DCOM', '$DCOMSTR') | 
| + | 
| +    static_obj.add_action('.d', DAction) | 
| +    shared_obj.add_action('.d', DAction) | 
| +    static_obj.add_emitter('.d', SCons.Defaults.StaticObjectEmitter) | 
| +    shared_obj.add_emitter('.d', SCons.Defaults.SharedObjectEmitter) | 
| + | 
| +    dc = env.Detect(['dmd', 'gdmd']) | 
| +    env['DC'] = dc | 
| +    env['DCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -of$TARGET $SOURCES' | 
| +    env['_DINCFLAGS'] = '$( ${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, TARGET, SOURCE)}  $)' | 
| +    env['_DVERFLAGS'] = '$( ${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)}  $)' | 
| +    env['_DDEBUGFLAGS'] = '$( ${_concat(DDEBUGPREFIX, DDEBUG, DDEBUGSUFFIX, __env__)} $)' | 
| +    env['_DFLAGS'] = '$( ${_concat(DFLAGPREFIX, DFLAGS, DFLAGSUFFIX, __env__)} $)' | 
| + | 
| +    env['DPATH'] = ['#/'] | 
| +    env['DFLAGS'] = [] | 
| +    env['DVERSIONS'] = [] | 
| +    env['DDEBUG'] = [] | 
| + | 
| +    if dc: | 
| +        # Add the path to the standard library. | 
| +        # This is merely for the convenience of the dependency scanner. | 
| +        dmd_path = env.WhereIs(dc) | 
| +        if dmd_path: | 
| +            x = dmd_path.rindex(dc) | 
| +            phobosDir = dmd_path[:x] + '/../src/phobos' | 
| +            if os.path.isdir(phobosDir): | 
| +                env.Append(DPATH = [phobosDir]) | 
| + | 
| +    env['DINCPREFIX'] = '-I' | 
| +    env['DINCSUFFIX'] = '' | 
| +    env['DVERPREFIX'] = '-version=' | 
| +    env['DVERSUFFIX'] = '' | 
| +    env['DDEBUGPREFIX'] = '-debug=' | 
| +    env['DDEBUGSUFFIX'] = '' | 
| +    env['DFLAGPREFIX'] = '-' | 
| +    env['DFLAGSUFFIX'] = '' | 
| +    env['DFILESUFFIX'] = '.d' | 
| + | 
| +    # Need to use the Digital Mars linker/lib on windows. | 
| +    # *nix can just use GNU link. | 
| +    if env['PLATFORM'] == 'win32': | 
| +        env['DLINK'] = '$DC' | 
| +        env['DLINKCOM'] = '$DLINK -of$TARGET $SOURCES $DFLAGS $DLINKFLAGS $_DLINKLIBFLAGS' | 
| +        env['DLIB'] = 'lib' | 
| +        env['DLIBCOM'] = '$DLIB $_DLIBFLAGS -c $TARGET $SOURCES $_DLINKLIBFLAGS' | 
| + | 
| +        env['_DLINKLIBFLAGS'] = '$( ${_concat(DLIBLINKPREFIX, LIBS, DLIBLINKSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)' | 
| +        env['_DLIBFLAGS'] = '$( ${_concat(DLIBFLAGPREFIX, DLIBFLAGS, DLIBFLAGSUFFIX, __env__)} $)' | 
| +        env['DLINKFLAGS'] = [] | 
| +        env['DLIBLINKPREFIX'] = '' | 
| +        env['DLIBLINKSUFFIX'] = '.lib' | 
| +        env['DLIBFLAGPREFIX'] = '-' | 
| +        env['DLIBFLAGSUFFIX'] = '' | 
| +        env['DLINKFLAGPREFIX'] = '-' | 
| +        env['DLINKFLAGSUFFIX'] = '' | 
| + | 
| +        SCons.Tool.createStaticLibBuilder(env) | 
| + | 
| +        # Basically, we hijack the link and ar builders with our own. | 
| +        # these builders check for the presence of D source, and swap out | 
| +        # the system's defaults for the Digital Mars tools.  If there's no D | 
| +        # source, then we silently return the previous settings. | 
| +        linkcom = env.get('LINKCOM') | 
| +        try: | 
| +            env['SMART_LINKCOM'] = smart_link[linkcom] | 
| +        except KeyError: | 
| +            def _smartLink(source, target, env, for_signature, | 
| +                           defaultLinker=linkcom): | 
| +                if isD(source): | 
| +                    # XXX I'm not sure how to add a $DLINKCOMSTR variable | 
| +                    # so that it works with this _smartLink() logic, | 
| +                    # and I don't have a D compiler/linker to try it out, | 
| +                    # so we'll leave it alone for now. | 
| +                    return '$DLINKCOM' | 
| +                else: | 
| +                    return defaultLinker | 
| +            env['SMART_LINKCOM'] = smart_link[linkcom] = _smartLink | 
| + | 
| +        arcom = env.get('ARCOM') | 
| +        try: | 
| +            env['SMART_ARCOM'] = smart_lib[arcom] | 
| +        except KeyError: | 
| +            def _smartLib(source, target, env, for_signature, | 
| +                         defaultLib=arcom): | 
| +                if isD(source): | 
| +                    # XXX I'm not sure how to add a $DLIBCOMSTR variable | 
| +                    # so that it works with this _smartLib() logic, and | 
| +                    # I don't have a D compiler/archiver to try it out, | 
| +                    # so we'll leave it alone for now. | 
| +                    return '$DLIBCOM' | 
| +                else: | 
| +                    return defaultLib | 
| +            env['SMART_ARCOM'] = smart_lib[arcom] = _smartLib | 
| + | 
| +        # It is worth noting that the final space in these strings is | 
| +        # absolutely pivotal.  SCons sees these as actions and not generators | 
| +        # if it is not there. (very bad) | 
| +        env['ARCOM'] = '$SMART_ARCOM ' | 
| +        env['LINKCOM'] = '$SMART_LINKCOM ' | 
| +    else: # assuming linux | 
| +        linkcom = env.get('LINKCOM') | 
| +        try: | 
| +            env['SMART_LINKCOM'] = smart_link[linkcom] | 
| +        except KeyError: | 
| +            def _smartLink(source, target, env, for_signature, | 
| +                           defaultLinker=linkcom, dc=dc): | 
| +                if isD(source): | 
| +                    try: | 
| +                        libs = env['LIBS'] | 
| +                    except KeyError: | 
| +                        libs = [] | 
| +                    if 'phobos' not in libs and 'gphobos' not in libs: | 
| +                        if dc is 'dmd': | 
| +                            env.Append(LIBS = ['phobos']) | 
| +                        elif dc is 'gdmd': | 
| +                            env.Append(LIBS = ['gphobos']) | 
| +                    if 'pthread' not in libs: | 
| +                        env.Append(LIBS = ['pthread']) | 
| +                    if 'm' not in libs: | 
| +                        env.Append(LIBS = ['m']) | 
| +                return defaultLinker | 
| +            env['SMART_LINKCOM'] = smart_link[linkcom] = _smartLink | 
| + | 
| +        env['LINKCOM'] = '$SMART_LINKCOM ' | 
| + | 
| +def exists(env): | 
| +    return env.Detect(['dmd', 'gdmd']) | 
| + | 
| +# Local Variables: | 
| +# tab-width:4 | 
| +# indent-tabs-mode:nil | 
| +# End: | 
| +# vim: set expandtab tabstop=4 shiftwidth=4: | 
|  | 
| Property changes on: scons-2.0.1/engine/SCons/Tool/dmd.py | 
| ___________________________________________________________________ | 
| Added: svn:eol-style | 
| + LF | 
|  | 
|  |