scons: Unify the flags shared by gcc and clang
This patch restructures and unifies the flags used by gcc and clang as they are largely the same. The common parts are now dealt with in a shared block of code, and the few bits and pieces that are specifically affecting either gcc or clang are done separately.
This commit is contained in:
parent
5eddb63877
commit
08a5fd328b
2 changed files with 63 additions and 29 deletions
59
SConstruct
59
SConstruct
|
@ -515,6 +515,38 @@ if main['GCC'] + main['CLANG'] > 1:
|
||||||
Exit(1)
|
Exit(1)
|
||||||
|
|
||||||
# Set up default C++ compiler flags
|
# Set up default C++ compiler flags
|
||||||
|
if main['GCC'] or main['CLANG']:
|
||||||
|
# As gcc and clang share many flags, do the common parts here
|
||||||
|
main.Append(CCFLAGS=['-pipe'])
|
||||||
|
main.Append(CCFLAGS=['-fno-strict-aliasing'])
|
||||||
|
# Enable -Wall and then disable the few warnings that we
|
||||||
|
# consistently violate
|
||||||
|
main.Append(CCFLAGS=['-Wall', '-Wno-sign-compare', '-Wundef'])
|
||||||
|
# We always compile using C++11, but only gcc >= 4.7 and clang 3.1
|
||||||
|
# actually use that name, so we stick with c++0x
|
||||||
|
main.Append(CXXFLAGS=['-std=c++0x'])
|
||||||
|
# Add selected sanity checks from -Wextra
|
||||||
|
main.Append(CXXFLAGS=['-Wmissing-field-initializers',
|
||||||
|
'-Woverloaded-virtual'])
|
||||||
|
else:
|
||||||
|
print termcap.Yellow + termcap.Bold + 'Error' + termcap.Normal,
|
||||||
|
print "Don't know what compiler options to use for your compiler."
|
||||||
|
print termcap.Yellow + ' compiler:' + termcap.Normal, main['CXX']
|
||||||
|
print termcap.Yellow + ' version:' + termcap.Normal,
|
||||||
|
if not CXX_version:
|
||||||
|
print termcap.Yellow + termcap.Bold + "COMMAND NOT FOUND!" +\
|
||||||
|
termcap.Normal
|
||||||
|
else:
|
||||||
|
print CXX_version.replace('\n', '<nl>')
|
||||||
|
print " If you're trying to use a compiler other than GCC"
|
||||||
|
print " or clang, there appears to be something wrong with your"
|
||||||
|
print " environment."
|
||||||
|
print " "
|
||||||
|
print " If you are trying to use a compiler other than those listed"
|
||||||
|
print " above you will need to ease fix SConstruct and "
|
||||||
|
print " src/SConscript to support that compiler."
|
||||||
|
Exit(1)
|
||||||
|
|
||||||
if main['GCC']:
|
if main['GCC']:
|
||||||
# Check for a supported version of gcc, >= 4.4 is needed for c++0x
|
# Check for a supported version of gcc, >= 4.4 is needed for c++0x
|
||||||
# support. See http://gcc.gnu.org/projects/cxx0x.html for details
|
# support. See http://gcc.gnu.org/projects/cxx0x.html for details
|
||||||
|
@ -525,12 +557,6 @@ if main['GCC']:
|
||||||
Exit(1)
|
Exit(1)
|
||||||
|
|
||||||
main['GCC_VERSION'] = gcc_version
|
main['GCC_VERSION'] = gcc_version
|
||||||
main.Append(CCFLAGS=['-pipe'])
|
|
||||||
main.Append(CCFLAGS=['-fno-strict-aliasing'])
|
|
||||||
main.Append(CCFLAGS=['-Wall', '-Wno-sign-compare', '-Wundef'])
|
|
||||||
main.Append(CXXFLAGS=['-Wmissing-field-initializers',
|
|
||||||
'-Woverloaded-virtual'])
|
|
||||||
main.Append(CXXFLAGS=['-std=c++0x'])
|
|
||||||
|
|
||||||
# Check for versions with bugs
|
# Check for versions with bugs
|
||||||
if not compareVersions(gcc_version, '4.4.1') or \
|
if not compareVersions(gcc_version, '4.4.1') or \
|
||||||
|
@ -571,17 +597,16 @@ elif main['CLANG']:
|
||||||
print 'Error: Unable to determine clang version.'
|
print 'Error: Unable to determine clang version.'
|
||||||
Exit(1)
|
Exit(1)
|
||||||
|
|
||||||
main.Append(CCFLAGS=['-pipe'])
|
# clang has a few additional warnings that we disable,
|
||||||
main.Append(CCFLAGS=['-fno-strict-aliasing'])
|
# tautological comparisons are allowed due to unsigned integers
|
||||||
main.Append(CCFLAGS=['-Wall', '-Wno-sign-compare', '-Wundef'])
|
# being compared to constants that happen to be 0, and extraneous
|
||||||
main.Append(CCFLAGS=['-Wno-tautological-compare'])
|
# parantheses are allowed due to Ruby's printing of the AST,
|
||||||
main.Append(CCFLAGS=['-Wno-self-assign'])
|
# finally self assignments are allowed as the generated CPU code
|
||||||
# Ruby makes frequent use of extraneous parantheses in the printing
|
# is relying on this
|
||||||
# of if-statements
|
main.Append(CCFLAGS=['-Wno-tautological-compare',
|
||||||
main.Append(CCFLAGS=['-Wno-parentheses'])
|
'-Wno-parentheses',
|
||||||
main.Append(CXXFLAGS=['-Wmissing-field-initializers',
|
'-Wno-self-assign'])
|
||||||
'-Woverloaded-virtual'])
|
|
||||||
main.Append(CXXFLAGS=['-std=c++0x'])
|
|
||||||
# On Mac OS X/Darwin we need to also use libc++ (part of XCode) as
|
# On Mac OS X/Darwin we need to also use libc++ (part of XCode) as
|
||||||
# opposed to libstdc++ to make the transition from TR1 to
|
# opposed to libstdc++ to make the transition from TR1 to
|
||||||
# C++11. See http://libcxx.llvm.org. However, clang has chosen a
|
# C++11. See http://libcxx.llvm.org. However, clang has chosen a
|
||||||
|
|
|
@ -893,25 +893,34 @@ def makeEnv(label, objsfx, strip = False, **kwargs):
|
||||||
|
|
||||||
swig_env = new_env.Clone()
|
swig_env = new_env.Clone()
|
||||||
swig_env.Append(CCFLAGS='-Werror')
|
swig_env.Append(CCFLAGS='-Werror')
|
||||||
|
|
||||||
|
# Both gcc and clang have issues with unused labels and values in
|
||||||
|
# the SWIG generated code
|
||||||
|
swig_env.Append(CCFLAGS=['-Wno-unused-label', '-Wno-unused-value'])
|
||||||
|
|
||||||
|
# Add additional warnings here that should not be applied to
|
||||||
|
# the SWIG generated code
|
||||||
|
new_env.Append(CXXFLAGS='-Wmissing-declarations')
|
||||||
|
|
||||||
if env['GCC']:
|
if env['GCC']:
|
||||||
swig_env.Append(CCFLAGS=['-Wno-uninitialized', '-Wno-sign-compare',
|
# Depending on the SWIG version, we also need to supress
|
||||||
'-Wno-parentheses', '-Wno-unused-label',
|
# warnings about missing field initializers.
|
||||||
'-Wno-unused-value'])
|
swig_env.Append(CCFLAGS='-Wno-missing-field-initializers')
|
||||||
|
|
||||||
if compareVersions(env['GCC_VERSION'], '4.6') >= 0:
|
if compareVersions(env['GCC_VERSION'], '4.6') >= 0:
|
||||||
swig_env.Append(CCFLAGS='-Wno-unused-but-set-variable')
|
swig_env.Append(CCFLAGS='-Wno-unused-but-set-variable')
|
||||||
|
|
||||||
# Add additional warnings here that should not be applied to
|
# If gcc supports it, also warn for deletion of derived
|
||||||
# the SWIG generated code
|
# classes with non-virtual desctructors. For gcc >= 4.7 we
|
||||||
new_env.Append(CXXFLAGS='-Wmissing-declarations')
|
# also have to disable warnings about the SWIG code having
|
||||||
|
# potentially uninitialized variables.
|
||||||
if compareVersions(env['GCC_VERSION'], '4.7') >= 0:
|
if compareVersions(env['GCC_VERSION'], '4.7') >= 0:
|
||||||
new_env.Append(CXXFLAGS='-Wdelete-non-virtual-dtor')
|
new_env.Append(CXXFLAGS='-Wdelete-non-virtual-dtor')
|
||||||
|
swig_env.Append(CCFLAGS='-Wno-maybe-uninitialized')
|
||||||
if env['CLANG']:
|
if env['CLANG']:
|
||||||
swig_env.Append(CCFLAGS=['-Wno-unused-label', '-Wno-unused-value'])
|
# Always enable the warning for deletion of derived classes
|
||||||
|
# with non-virtual destructors
|
||||||
# Add additional warnings here that should not be applied to
|
new_env.Append(CXXFLAGS=['-Wdelete-non-virtual-dtor'])
|
||||||
# the SWIG generated code
|
|
||||||
new_env.Append(CXXFLAGS=['-Wmissing-declarations',
|
|
||||||
'-Wdelete-non-virtual-dtor'])
|
|
||||||
|
|
||||||
werror_env = new_env.Clone()
|
werror_env = new_env.Clone()
|
||||||
werror_env.Append(CCFLAGS='-Werror')
|
werror_env.Append(CCFLAGS='-Werror')
|
||||||
|
|
Loading…
Reference in a new issue