Example #1
0
def _get_python_include(env):
    global pythoninclude
    """Get the directory containing Python.h"""
    if env['pythoninclude']:
        return env['pythoninclude']
    elif env['wine']:
        return '/usr/lib/w32comp/w32python/2.6/include/'
    elif pythoninclude:
        return pythoninclude
    else:
        pythoninclude=utility.get_python_result(env, "import distutils.sysconfig",
                                      "distutils.sysconfig.get_python_inc()")
        #print "include", pythoninclude
        return pythoninclude
Example #2
0
def _add_platform_flags(env):
    """Add compiler flags for release builds, if requested"""
    if not env['IMP_USE_PLATFORM_FLAGS']:
        raise ValueError("platform flags is false")

    #make sure they are all there
    env.Append(CPPPATH=[])
    env.Append(CXXFLAGS=[])
    env.Append(LINKFLAGS=[])
    env.Append(LIBPATH=[])

    if not env.get('wine', None):
        #from distutils.sysconfig import get_config_vars
        # The compile and link programs used by python must both produce outputs
        # that are compatible with the compiler we are already using as well
        # as much take all command line options we are already using. As a
        # result, we might as well used the same compiler as before. It would
        # be great to check if they match, but that is kind of hard.
        #(oopt, ocflags, oso) = get_config_vars('OPT', 'BASECFLAGS', 'SO')
        opt=utility.get_python_result(env, "import distutils.sysconfig",
                                      "' '.join([x for x in distutils.sysconfig.get_config_vars('OPT')])")
        cflags=utility.get_python_result(env, "import distutils.sysconfig",
                                      "' '.join([x for x in distutils.sysconfig.get_config_vars('BASECFLAGS')])")
        so=utility.get_python_result(env, "import distutils.sysconfig",
                                      "' '.join([x for x in distutils.sysconfig.get_config_vars('SO')])")
        #print opt
        #print cflags
        #print so
        #print oopt
        ##print ocflags
        #print oso
        env['IMP_PYTHON_SO']=so
        includepath=[]
        if dependency.gcc.get_is_gcc_like(env):
            basecflags=[x for x in opt.split()+cflags.split() \
                        if x not in ['-Werror', '-Wall', '-Wextra',
                                     '-O2', '-O3', '-O1', '-Os',
                                     '-fstack-protector', '-Wstrict-prototypes',
                                     '-g', '-dynamic', '-DNDEBUG',
                                     "-fwrapv", "-fno-strict-aliasing"]\
                        and not x.startswith('-I')]
                    #total.append(v)
            # Using _FORTIFY_SOURCE without -O flags triggers a warning on
            # newer systems, so remove it
            basecflags = [x for x in basecflags \
                          if '_FORTIFY_SOURCE' not in x]
            includepath=[x[2:] for x in opt.split()+cflags.split()\
                         if x.startswith('-I')]
        else:
            basecflags= opt.split()+cflags.split()
        for p in includepath:
            utility.add_to_include_path(env, p)
        env.Append(CXXFLAGS=basecflags)

    if env['PLATFORM'] == 'darwin':
        env.Append(IMP_PYTHON_LINKFLAGS=
                ['-bundle', '-flat_namespace', '-undefined', 'suppress'])

    if env.get('cppcoverage', 'no') != 'no':
        if not dependency.gcc.get_is_gcc_like(env):
            raise ValueError("C coverage testing currently only works with gcc")
        env.Append(CXXFLAGS=["-fprofile-arcs", "-ftest-coverage"])
        env.Append(LINKFLAGS=["-fprofile-arcs", "-ftest-coverage"])
        if env['build'] == 'debug':
            # gcc info page recommends disabling optimization for optimal
            # coverage reporting
            env.Append(CXXFLAGS=["-O0"])
        else:
            print "Warning: It is recommended to build in 'debug' mode " \
                  "when doing C++ coverage testing"

    if dependency.gcc.get_is_gcc_like(env):
        # "-Werror",  "-Wno-uninitialized"
        env.Append(CXXFLAGS=["-Wall", "-Wextra",  "-Wno-deprecated",
                             "-Winit-self", "-Wstrict-aliasing=2",
                             "-Wcast-align", "-fno-operator-names",])
        if dependency.gcc.get_version(env)>= 4.2:
            if sys.platform == 'darwin':
                env.Append(CXXFLAGS=["-Wmissing-prototypes"])
            else:
                env.Append(CXXFLAGS=["-Wmissing-declarations"])
        if env['cxx11'] != 'no':
            if dependency.gcc.get_version(env)>= 4.6:
                env.Append(CXXFLAGS=["-Wno-c++0x-compat"])
            if dependency.gcc.get_version(env) >= 4.3 and \
                    dependency.gcc.get_version(env) < 4.7:
                env.Append(CXXFLAGS=["-std=gnu++0x"])
            elif dependency.gcc.get_version(env) >= 4.7:
                env.Append(CXXFLAGS=["-std=c++11"])
        #if dependency.gcc.get_version(env)>= 4.3:
        #    env.Append(CXXFLAGS=["-Wunsafe-loop-optimizations"])
        # gcc 4.0 on Mac doesn't like -isystem, so we don't use it there.
        # But without -isystem, -Wundef throws up lots of Boost warnings.
        if sys.platform != 'darwin' or dependency.gcc.get_version(env) > 4.0:
            env.Append(CXXFLAGS=["-Wundef"])
        #-Werror=
        if dependency.gcc.get_version(env)>= 4.3:
            # we can turn off individual warnings as needed
            #env.Append(CXXFLAGS='-Werror')
            pass
        env.Append(CXXFLAGS=["-Woverloaded-virtual"])
        if env['build'] == 'fast':
            env.Append(CXXFLAGS=["-O3", "-fexpensive-optimizations",
                                 "-ffast-math", "-ftree-vectorize",
                                 '-ffinite-math-only',
                                 '-fstrict-aliasing',
                                 '-fno-trapping-math',
                                 '-fno-signaling-nans',
                                 '-fno-float-store', '-Wno-unused',
                                 '-funsafe-loop-optimizations',
                                 '--param','inline-unit-growth=200',
                                 '-fearly-inlining',])
            if dependency.gcc.get_version(env)>= 4.3:
                env.Append(CXXFLAGS=['-fno-signed-zeros',
                                     '-freciprocal-math',
                                     '-fassociative-math'])
        elif env['build'] == 'release':
            env.Append(CXXFLAGS=["-O2", "-g"])
        elif env['build'] == 'compile':
            pass
        elif env['build'] == 'debug':
            env.Append(CXXFLAGS=["-g"])
            env.Append(LINKFLAGS=["-g"])
        try:
            env['SHLINKFLAGS'] = [ x.replace('-no_archive', '') for x in env['SHLINKFLAGS']]
        except ValueError:
            pass
        env.Replace(IMP_PYTHON_CXXFLAGS=[x for x in env['IMP_PYTHON_CXXFLAGS']+env['CXXFLAGS']
                                     if x not in ['-Wall', '-Wextra', '-Wformat',
                                                  '-Wstrict-aliasing=2',
                                                  '-O3', '-O2',"-Wmissing-prototypes",
                                                  "-Wmissing-declarations"]])
        env.Append(IMP_BIN_CXXFLAGS=[x for x in env['CXXFLAGS']
                                     if x not in ["-Wmissing-prototypes", "-Wmissing-declarations"]])
        #env.Prepend(LIBLINKFLAGS=['-Wl,-rpath-link,'+Dir(envi["builddir"]+"/lib").abspath])
    env.Prepend(IMP_BIN_LINKFLAGS=env['IMP_LINKFLAGS'])
    env.Prepend(IMP_BIN_LINKFLAGS=env['LINKFLAGS'])
    env.Prepend(IMP_SHLIB_LINKFLAGS=env['IMP_LINKFLAGS'])
    env.Prepend(IMP_SHLIB_LINKFLAGS=env['SHLINKFLAGS'])
    if env['IMP_BUILD_STATIC']:
        env.Prepend(IMP_ARLIB_LINKFLAGS=env['IMP_LINKFLAGS'])
        env.Prepend(IMP_ARLIB_LINKFLAGS=env['LINKFLAGS'])
        env.Append(IMP_BIN_LINKFLAGS=['-static'])
    env.Prepend(IMP_PYTHON_LINKFLAGS=env['IMP_LINKFLAGS'])
    env.Prepend(IMP_PYTHON_LINKFLAGS=env['LDMODULEFLAGS'])
    if env['PLATFORM'] == 'darwin':
        env.Append(IMP_SHLIB_LINKFLAGS=['-headerpad_max_install_names'])
        env.Append(IMP_PYTHON_LINKFLAGS=['-headerpad_max_install_names'])
        env.Append(IMP_BIN_LINKFLAGS=['-headerpad_max_install_names'])