scons: Move MinGW flags from crossmingw.py to gallium.py
[mesa.git] / scons / crossmingw.py
index 9533b2b362c31cdce9aa7bf76b646b4673d39b73..893002f64a99c157aaa1904884e4eb9592f29351 100644 (file)
@@ -42,7 +42,7 @@ import SCons.Tool
 import SCons.Util
 
 # This is what we search for to find mingw:
-prefixes = SCons.Util.Split("""
+prefixes32 = SCons.Util.Split("""
     mingw32-
     mingw32msvc-
     i386-mingw32-
@@ -54,9 +54,20 @@ prefixes = SCons.Util.Split("""
     i586-mingw32msvc-
     i686-mingw32msvc-
     i686-pc-mingw32-
+    i686-w64-mingw32-
+""")
+prefixes64 = SCons.Util.Split("""
+    x86_64-w64-mingw32-
+    amd64-mingw32-
+    amd64-mingw32msvc-
+    amd64-pc-mingw32-
 """)
 
 def find(env):
+    if env['machine'] == 'x86_64':
+        prefixes = prefixes64
+    else:
+        prefixes = prefixes32
     for prefix in prefixes:
         # First search in the SCons path and then the OS path:
         if env.WhereIs(prefix + 'gcc') or SCons.Util.WhereIs(prefix + 'gcc'):
@@ -117,6 +128,42 @@ res_builder = SCons.Builder.Builder(action=res_action, suffix='.o',
                                     source_scanner=SCons.Tool.SourceFileScanner)
 SCons.Tool.SourceFileScanner.add_scanner('.rc', SCons.Defaults.CScan)
 
+
+
+def compile_without_gstabs(env, sources, c_file):
+    '''This is a hack used to compile some source files without the
+    -gstabs option.
+
+    It seems that some versions of mingw32's gcc (4.4.2 at least) die
+    when compiling large files with the -gstabs option.  -gstabs is
+    related to debug symbols and can be omitted from the effected
+    files.
+
+    This function compiles the given c_file without -gstabs, removes
+    the c_file from the sources list, then appends the new .o file to
+    sources.  Then return the new sources list.
+    '''
+
+    # Modify CCFLAGS to not have -gstabs option:
+    env2 = env.Clone()
+    flags = str(env2['CCFLAGS'])
+    flags = flags.replace("-gstabs", "")
+    env2['CCFLAGS'] = SCons.Util.CLVar(flags)
+    
+    # Build the special-case files:
+    obj_file = env2.SharedObject(c_file)
+
+    # Replace ".cpp" or ".c" with ".o"
+    o_file = c_file.replace(".cpp", ".o")
+    o_file = o_file.replace(".c", ".o")
+
+    # Replace the .c files with the specially-compiled .o file
+    sources.remove(c_file)
+    sources.append(o_file)
+
+    return sources
+
+
 def generate(env):
     mingw_prefix = find(env)
 
@@ -178,10 +225,7 @@ def generate(env):
     # default in recent gcc versions
     env.AppendUnique(CCFLAGS = ['-gstabs'])
 
-    env.AppendUnique(CPPDEFINES = [('__MSVCRT_VERSION__', '0x0700')])
-    #env.AppendUnique(LIBS = ['iberty'])
-    env.AppendUnique(SHLINKFLAGS = ['-Wl,--enable-stdcall-fixup'])
-    #env.AppendUnique(SHLINKFLAGS = ['-Wl,--kill-at'])
+    env.AddMethod(compile_without_gstabs, 'compile_without_gstabs')
 
 def exists(env):
     return find(env)