summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2011-08-25 16:50:56 -0600
committerBrian Paul <[email protected]>2011-08-26 08:05:36 -0600
commitcdb7396390b0afffc0d33c9aba2898012802e6d0 (patch)
tree2cb735b00ff543b3d09c9d32b75c6b61e7b79f28
parent3d1af78fdc4319b04f9cf324106f127b498b962d (diff)
scons: don't compile some files with -gstabs if using mingw32
Compiling some (large) files with i686-pc-mingw32-gcc 4.2.2 (at least) and the -gstabs option triggers a compiler error. Use this work-around to simply compile the effected files without -gstabs.
-rw-r--r--scons/crossmingw.py38
-rw-r--r--src/gallium/auxiliary/SConscript4
-rw-r--r--src/mapi/glapi/SConscript5
3 files changed, 47 insertions, 0 deletions
diff --git a/scons/crossmingw.py b/scons/crossmingw.py
index cc046229e2c..4a695a440d6 100644
--- a/scons/crossmingw.py
+++ b/scons/crossmingw.py
@@ -128,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)
@@ -197,5 +233,7 @@ def generate(env):
# Avoid depending on gcc runtime DLLs
env.AppendUnique(LINKFLAGS = ['-static-libgcc'])
+ env.AddMethod(compile_without_gstabs, 'compile_without_gstabs')
+
def exists(env):
return find(env)
diff --git a/src/gallium/auxiliary/SConscript b/src/gallium/auxiliary/SConscript
index e00040d97ab..07c420e138d 100644
--- a/src/gallium/auxiliary/SConscript
+++ b/src/gallium/auxiliary/SConscript
@@ -58,6 +58,10 @@ if env['llvm']:
'GALLIVM_CPP_SOURCES'
])
+ if env['toolchain'] == 'crossmingw':
+ # compile lp_bld_misc.cpp without -gstabs option
+ source = env.compile_without_gstabs(source, "gallivm/lp_bld_misc.cpp")
+
gallium = env.ConvenienceLibrary(
target = 'gallium',
source = source,
diff --git a/src/mapi/glapi/SConscript b/src/mapi/glapi/SConscript
index a7764745eda..fdd65790013 100644
--- a/src/mapi/glapi/SConscript
+++ b/src/mapi/glapi/SConscript
@@ -74,6 +74,11 @@ if env['platform'] != 'winddk':
else:
pass
+ if env['toolchain'] == 'crossmingw':
+ # compile these files without -gstabs option
+ glapi_sources = env.compile_without_gstabs(glapi_sources, "glapi_dispatch.c")
+ glapi_sources = env.compile_without_gstabs(glapi_sources, "glapi_getproc.c")
+
glapi = env.ConvenienceLibrary(
target = 'glapi',
source = glapi_sources,