3 # Copyright The SCons Foundation
5 # Permission is hereby granted, free of charge, to any person obtaining
6 # a copy of this software and associated documentation files (the
7 # "Software"), to deal in the Software without restriction, including
8 # without limitation the rights to use, copy, modify, merge, publish,
9 # distribute, sublicense, and/or sell copies of the Software, and to
10 # permit persons to whom the Software is furnished to do so, subject to
11 # the following conditions:
13 # The above copyright notice and this permission notice shall be included
14 # in all copies or substantial portions of the Software.
16 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
17 # KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
18 # WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20 # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21 # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22 # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 Tool-specific initialization for the LDC compiler.
28 (https://github.com/ldc-developers/ldc)
30 Developed by Russel Winder (russel@winder.org.uk)
34 DC - The name of the D compiler to use. Defaults to ldc2.
35 DPATH - List of paths to search for import modules.
36 DVERSIONS - List of version tags to enable when compiling.
37 DDEBUG - List of debug tags to enable when compiling.
39 Linker related variables:
40 LIBS - List of library files to link in.
41 DLINK - Name of the linker to use. Defaults to ldc2.
42 DLINKFLAGS - List of linker flags.
45 DLIB - Name of the lib tool to use. Defaults to lib.
46 DLIBFLAGS - List of flags to pass to the lib tool.
47 LIBS - Same as for the linker. (libraries to pull into the .lib)
55 import SCons
.Scanner
.D
58 import SCons
.Tool
.DCommon
as DCommon
61 def generate(env
) -> None:
62 static_obj
, shared_obj
= SCons
.Tool
.createObjBuilders(env
)
64 static_obj
.add_action('.d', SCons
.Defaults
.DAction
)
65 shared_obj
.add_action('.d', SCons
.Defaults
.ShDAction
)
66 static_obj
.add_emitter('.d', DCommon
.DStaticObjectEmitter
)
67 shared_obj
.add_emitter('.d', DCommon
.DSharedObjectEmitter
)
69 env
['DC'] = env
.Detect('ldc2') or 'ldc2'
70 env
['DCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS $_DI_FLAGS -c -of=$TARGET $SOURCES'
71 env
['_DINCFLAGS'] = '${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, TARGET, SOURCE)}'
72 env
['_DVERFLAGS'] = '${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)}'
73 env
['_DDEBUGFLAGS'] = '${_concat(DDEBUGPREFIX, DDEBUG, DDEBUGSUFFIX, __env__)}'
75 env
['_DI_FLAGS'] = "${DI_FILE_DIR and DI_FILE_DIR_PREFIX+DI_FILE_DIR+DI_FILE_DIR_SUFFFIX}"
77 env
['_DFLAGS'] = '${_concat(DFLAGPREFIX, DFLAGS, DFLAGSUFFIX, __env__)}'
80 env
['SHDCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS $_DI_FLAGS -c -relocation-model=pic -of=$TARGET $SOURCES'
88 DCommon
.addDPATHToEnv(env
, env
['DC'])
90 env
['DINCPREFIX'] = '-I='
91 env
['DINCSUFFIX'] = ''
92 env
['DVERPREFIX'] = '-version='
93 env
['DVERSUFFIX'] = ''
94 env
['DDEBUGPREFIX'] = '-debug='
95 env
['DDEBUGSUFFIX'] = ''
96 env
['DFLAGPREFIX'] = '-'
97 env
['DFLAGSUFFIX'] = ''
98 env
['DFILESUFFIX'] = '.d'
100 env
['DI_FILE_DIR'] = ''
101 env
['DI_FILE_SUFFIX'] = '.di'
103 env
['DI_FILE_DIR_PREFIX'] = '-Hd='
104 env
['DI_FILE_DIR_SUFFFIX'] = ''
107 env
['DLINKFLAGS'] = SCons
.Util
.CLVar('')
108 env
['DLINKCOM'] = '$DLINK -of=$TARGET $DLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS'
110 env
['SHDLINK'] = '$DC'
111 env
['SHDLINKFLAGS'] = SCons
.Util
.CLVar('$DLINKFLAGS -shared -defaultlib=phobos2-ldc')
113 env
['SHDLINKCOM'] = '$DLINK -of=$TARGET $SHDLINKFLAGS $__SHDLIBVERSIONFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS -L-ldruntime-ldc'
115 env
['DLIBLINKPREFIX'] = '' if env
['PLATFORM'] == 'win32' else '-L-l'
116 env
['DLIBLINKSUFFIX'] = '.lib' if env
['PLATFORM'] == 'win32' else ''
117 # env['_DLIBFLAGS'] = '${_concat(DLIBLINKPREFIX, LIBS, DLIBLINKSUFFIX, __env__, RDirs, TARGET, SOURCE)}'
118 env
['_DLIBFLAGS'] = '${_stripixes(DLIBLINKPREFIX, LIBS, DLIBLINKSUFFIX, LIBPREFIXES, LIBSUFFIXES, __env__, LIBLITERALPREFIX)}'
120 env
['DLIBDIRPREFIX'] = '-L-L'
121 env
['DLIBDIRSUFFIX'] = ''
122 env
['_DLIBDIRFLAGS'] = '${_concat(DLIBDIRPREFIX, LIBPATH, DLIBDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)}'
124 env
['DLIB'] = 'lib' if env
['PLATFORM'] == 'win32' else 'ar cr'
125 env
['DLIBCOM'] = '$DLIB $_DLIBFLAGS {}$TARGET $SOURCES $_DLIBFLAGS'.format('-c ' if env
['PLATFORM'] == 'win32' else '')
127 # env['_DLIBFLAGS'] = '${_concat(DLIBFLAGPREFIX, DLIBFLAGS, DLIBFLAGSUFFIX, __env__)}'
129 env
['DLIBFLAGPREFIX'] = '-'
130 env
['DLIBFLAGSUFFIX'] = ''
132 # __RPATH is set to $_RPATH in the platform specification if that
133 # platform supports it.
134 env
['DRPATHPREFIX'] = '-L-Wl,-rpath,' if env
['PLATFORM'] == 'darwin' else '-L-rpath='
135 env
['DRPATHSUFFIX'] = ''
136 env
['_DRPATH'] = '${_concat(DRPATHPREFIX, RPATH, DRPATHSUFFIX, __env__)}'
138 # Support for versioned libraries
139 env
['_SHDLIBVERSIONFLAGS'] = '$SHDLIBVERSIONFLAGS -L-soname=$_SHLIBSONAME'
142 env
['BUILDERS']['ProgramAllAtOnce'] = SCons
.Builder
.Builder(
143 action
='$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -of=$TARGET $DLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS',
144 emitter
=DCommon
.allAtOnceEmitter
,
149 return env
.Detect('ldc2')
154 # indent-tabs-mode:nil
156 # vim: set expandtab tabstop=4 shiftwidth=4: