nvfx: expose GLSL
[mesa/mesa-lb.git] / scons / crossmingw.py
blob03bfbd7eb3c7af573e183e35ccc3718f47f2229f
1 """SCons.Tool.gcc
3 Tool-specific initialization for MinGW (http://www.mingw.org/)
5 There normally shouldn't be any need to import this module directly.
6 It will usually be imported through the generic SCons.Tool.Tool()
7 selection method.
9 See also http://www.scons.org/wiki/CrossCompilingMingw
10 """
13 # Copyright (c) 2001, 2002, 2003, 2004 The SCons Foundation
15 # Permission is hereby granted, free of charge, to any person obtaining
16 # a copy of this software and associated documentation files (the
17 # "Software"), to deal in the Software without restriction, including
18 # without limitation the rights to use, copy, modify, merge, publish,
19 # distribute, sublicense, and/or sell copies of the Software, and to
20 # permit persons to whom the Software is furnished to do so, subject to
21 # the following conditions:
23 # The above copyright notice and this permission notice shall be included
24 # in all copies or substantial portions of the Software.
26 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
27 # KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
28 # WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29 # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
30 # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
31 # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
32 # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
35 import os
36 import os.path
37 import string
39 import SCons.Action
40 import SCons.Builder
41 import SCons.Tool
42 import SCons.Util
44 # This is what we search for to find mingw:
45 prefixes = SCons.Util.Split("""
46 mingw32-
47 mingw32msvc-
48 i386-mingw32-
49 i486-mingw32-
50 i586-mingw32-
51 i686-mingw32-
52 i386-mingw32msvc-
53 i486-mingw32msvc-
54 i586-mingw32msvc-
55 i686-mingw32msvc-
56 i686-pc-mingw32-
57 """)
59 def find(env):
60 for prefix in prefixes:
61 # First search in the SCons path and then the OS path:
62 if env.WhereIs(prefix + 'gcc') or SCons.Util.WhereIs(prefix + 'gcc'):
63 return prefix
65 return ''
67 def shlib_generator(target, source, env, for_signature):
68 cmd = SCons.Util.CLVar(['$SHLINK', '$SHLINKFLAGS'])
70 dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
71 if dll: cmd.extend(['-o', dll])
73 cmd.extend(['$SOURCES', '$_LIBDIRFLAGS', '$_LIBFLAGS'])
75 implib = env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX')
76 if implib: cmd.append('-Wl,--out-implib,'+implib.get_string(for_signature))
78 def_target = env.FindIxes(target, 'WIN32DEFPREFIX', 'WIN32DEFSUFFIX')
79 if def_target: cmd.append('-Wl,--output-def,'+def_target.get_string(for_signature))
81 return [cmd]
83 def shlib_emitter(target, source, env):
84 dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
85 no_import_lib = env.get('no_import_lib', 0)
87 if not dll:
88 raise SCons.Errors.UserError, "A shared library should have exactly one target with the suffix: %s" % env.subst("$SHLIBSUFFIX")
90 if not no_import_lib and \
91 not env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX'):
93 # Append an import library to the list of targets.
94 target.append(env.ReplaceIxes(dll,
95 'SHLIBPREFIX', 'SHLIBSUFFIX',
96 'LIBPREFIX', 'LIBSUFFIX'))
98 # Append a def file target if there isn't already a def file target
99 # or a def file source. There is no option to disable def file
100 # target emitting, because I can't figure out why someone would ever
101 # want to turn it off.
102 def_source = env.FindIxes(source, 'WIN32DEFPREFIX', 'WIN32DEFSUFFIX')
103 def_target = env.FindIxes(target, 'WIN32DEFPREFIX', 'WIN32DEFSUFFIX')
104 if not def_source and not def_target:
105 target.append(env.ReplaceIxes(dll,
106 'SHLIBPREFIX', 'SHLIBSUFFIX',
107 'WIN32DEFPREFIX', 'WIN32DEFSUFFIX'))
109 return (target, source)
112 shlib_action = SCons.Action.Action(shlib_generator, '$SHLINKCOMSTR', generator=1)
114 res_action = SCons.Action.Action('$RCCOM', '$RCCOMSTR')
116 res_builder = SCons.Builder.Builder(action=res_action, suffix='.o',
117 source_scanner=SCons.Tool.SourceFileScanner)
118 SCons.Tool.SourceFileScanner.add_scanner('.rc', SCons.Defaults.CScan)
120 def generate(env):
121 mingw_prefix = find(env)
123 if mingw_prefix:
124 dir = os.path.dirname(env.WhereIs(mingw_prefix + 'gcc') or SCons.Util.WhereIs(mingw_prefix + 'gcc'))
126 # The mingw bin directory must be added to the path:
127 path = env['ENV'].get('PATH', [])
128 if not path:
129 path = []
130 if SCons.Util.is_String(path):
131 path = string.split(path, os.pathsep)
133 env['ENV']['PATH'] = string.join([dir] + path, os.pathsep)
135 # Most of mingw is the same as gcc and friends...
136 gnu_tools = ['gcc', 'g++', 'gnulink', 'ar', 'gas']
137 for tool in gnu_tools:
138 SCons.Tool.Tool(tool)(env)
140 #... but a few things differ:
141 env['CC'] = mingw_prefix + 'gcc'
142 env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
143 env['CXX'] = mingw_prefix + 'g++'
144 env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS')
145 env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared')
146 env['SHLINKCOM'] = shlib_action
147 env.Append(SHLIBEMITTER = [shlib_emitter])
148 env['LINK'] = mingw_prefix + 'g++'
149 env['AR'] = mingw_prefix + 'ar'
150 env['RANLIB'] = mingw_prefix + 'ranlib'
151 env['LINK'] = mingw_prefix + 'g++'
152 env['AS'] = mingw_prefix + 'as'
153 env['WIN32DEFPREFIX'] = ''
154 env['WIN32DEFSUFFIX'] = '.def'
155 env['SHOBJSUFFIX'] = '.o'
156 env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
158 env['RC'] = mingw_prefix + 'windres'
159 env['RCFLAGS'] = SCons.Util.CLVar('')
160 env['RCCOM'] = '$RC $_CPPDEFFLAGS $_CPPINCFLAGS ${INCPREFIX}${SOURCE.dir} $RCFLAGS -i $SOURCE -o $TARGET'
161 env['BUILDERS']['RES'] = res_builder
163 # Some setting from the platform also have to be overridden:
164 env['OBJPREFIX'] = ''
165 env['OBJSUFFIX'] = '.o'
166 env['SHOBJPREFIX'] = '$OBJPREFIX'
167 env['SHOBJSUFFIX'] = '$OBJSUFFIX'
168 env['PROGPREFIX'] = ''
169 env['PROGSUFFIX'] = '.exe'
170 env['LIBPREFIX'] = 'lib'
171 env['LIBSUFFIX'] = '.a'
172 env['SHLIBPREFIX'] = ''
173 env['SHLIBSUFFIX'] = '.dll'
174 env['LIBPREFIXES'] = [ 'lib', '' ]
175 env['LIBSUFFIXES'] = [ '.a', '.lib' ]
177 # MinGW port of gdb does not handle well dwarf debug info which is the
178 # default in recent gcc versions
179 env.AppendUnique(CFLAGS = ['-gstabs'])
181 env.AppendUnique(CPPDEFINES = [('__MSVCRT_VERSION__', '0x0700')])
182 #env.AppendUnique(LIBS = ['iberty'])
183 env.AppendUnique(SHLINKFLAGS = ['-Wl,--enable-stdcall-fixup'])
184 #env.AppendUnique(SHLINKFLAGS = ['-Wl,--kill-at'])
186 def exists(env):
187 return find(env)