cantera/ext/SConscript
Ray Speth c092bbaede Fixed the order of include and library directories when compiling
Include directories in the Cantera source tree should be listed first so that
they take precedence over headers from other installed copies of Cantera that
might end up on the include search path. This was potentially a problem when
Cantera was installed in the same location (e.g. /usr/local) as one of its
dependencies (e.g. Sundials).

The same logic applies to directories on the library link path.
2012-08-10 21:03:06 +00:00

142 lines
4.5 KiB
Python

from buildutils import *
Import('env', 'build', 'install', 'libraryTargets')
localenv = env.Clone()
def prep_default(env):
return env.Clone()
def prep_fortran(env):
localenv = env.Clone()
localenv.Prepend(CPPPATH='#include/cantera/base') # for config.h
return localenv
def prep_f2c(env):
localenv = env.Clone()
localenv.Prepend(CPPPATH=Dir('#ext/f2c_libs'))
if not localenv['HAS_TIMES_H']:
localenv.Append(CPPDEFINES=['USE_CLOCK'])
if not localenv['HAS_UNISTD_H']:
localenv.Append(CPPDEFINES=['MSDOS'])
# The F2C code generates a lot of warnings designed to catch
# programmer errors, but since this is autogenerated code, those
# warnings are irrelevant.
if '-Wall' in localenv['CCFLAGS']:
localenv['CCFLAGS'].remove('-Wall')
localenv['CCFLAGS'].append('-Wno-format-security')
elif '/W3' in localenv['CCFLAGS']:
localenv['CCFLAGS'].remove('/W3')
elif '-Wcheck' in localenv['CCFLAGS']:
localenv['CCFLAGS'].remove('-Wcheck')
if localenv['CC'] == 'clang':
localenv['CCFLAGS'].append('-w')
return localenv
def prep_sundials(env):
localenv = env.Clone()
localenv.Prepend(CPPPATH=Dir('#ext/cvode/include'))
# Suppress warnings from external code
if '-Wall' in localenv['CCFLAGS']:
localenv['CCFLAGS'].append('-Wno-format')
return localenv
def prep_gtest(env):
localenv = env.Clone()
localenv.Prepend(CPPPATH=[Dir('#ext/gtest'),
Dir('#ext/gtest/include')],
CPPDEFINES={'GTEST_HAS_PTHREAD': 0})
return localenv
# (subdir, (file extensions), prepfunction)
libs = [('libexecstream', ['cpp'], prep_default)]
if env['build_with_f2c']:
libs.append(('f2c_math', ['cpp','c'], prep_f2c))
# Create arith.h using the arithchk program
if not os.path.exists('arith.h'):
arithenv = prep_f2c(env)
# TODO: make link flag more general
arithenv.Append(CPPFLAGS='-DNO_FPINIT')
arithenv.Program('f2c_libs/arithchk/arithchk', source='f2c_libs/arithchk/arithchk.c',
LIBS=env['LIBM'])
arithenv.Command('#ext/f2c_libs/arith.h', 'f2c_libs/arithchk/arithchk$PROGSUFFIX',
'$SOURCE > $TARGET')
headerenv = prep_f2c(env)
# Possibly system-dependent headers
headerenv.Command('#ext/f2c_libs/signal1.h', 'f2c_libs/signal1.h0',
Copy('$TARGET', '$SOURCE'))
headerenv.Command('#ext/f2c_libs/sysdep1.h', 'f2c_libs/sysdep1.h0',
Copy('$TARGET', '$SOURCE'))
libs.append(('f2c_libs', 'c', prep_f2c))
if env['BUILD_BLAS_LAPACK']:
libs.append(('f2c_blas', ['c'], prep_f2c))
libs.append(('f2c_lapack', ['c'], prep_f2c))
else:
libs.append(('math', ['cpp','c','f'], prep_fortran))
if env['BUILD_BLAS_LAPACK']:
libs.append(('blas', ['f'], prep_default))
libs.append(('lapack', ['f'], prep_default))
if env['use_sundials'] == 'n':
libs.append(('cvode/source', ['c'], prep_sundials))
for subdir, extensions, prepFunction in libs:
localenv = prepFunction(env)
if localenv['single_library']:
objects = localenv.SharedObject(mglob(localenv, subdir, *extensions))
libraryTargets.extend(objects)
else:
libName = 'ct' + subdir
if libName == 'ctf2c_blas':
libName = 'ctblas'
if libName == 'ctf2c_lapack':
libName = 'ctlapack'
if libName == 'ctf2c_math' :
libName = 'ctmath'
if libName == 'ctcvode/source' :
libName = 'cvode'
if libName == 'ctlibexecstream' :
libName = 'execstream'
if libName == 'ctf2c_libs':
libName = 'ctf2c'
if localenv['renamed_shared_libraries'] :
sharedLibName = libName + '_shared'
else:
sharedLibName = libName
objects = localenv.SharedObject(mglob(localenv, subdir, *extensions))
# Build the static library
lib = build(localenv.StaticLibrary(pjoin('..', 'lib', libName), objects))
install('$inst_libdir', lib)
# Build the shared library
liby = build(localenv.SharedLibrary(pjoin('..', 'lib', sharedLibName), objects))
install('$inst_libdir', liby)
localenv = env.Clone()
localenv.Prepend(CPPPATH=[Dir('#ext/gtest'),
Dir('#ext/gtest/include')],
CPPDEFINES={'GTEST_HAS_PTHREAD': 0})
build(localenv.Library(pjoin('../lib', 'gtest'),
source=['gtest/src/gtest-all.cc']))