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.
142 lines
4.5 KiB
Python
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']))
|
|
|
|
|
|
|