cantera/ext/SConscript
Ray Speth bf67cce25f [SCons] Make Eigen available to Cantera
Check for a system copy of Eigen, and if that is not found, install
Eigen's headers with the Cantera headers. Add the header 'eigen_dense.h'
to provide a single header to include from other locations.
2016-05-14 21:56:17 -04:00

122 lines
4.4 KiB
Python

from buildutils import *
Import('env', 'build', 'install', 'libraryTargets')
localenv = env.Clone()
def prep_default(env):
localenv = env.Clone()
# Suppress warnings from external code and auto-generated code
if 'g++' in localenv['CXX'] or 'clang' in localenv['CXX']:
localenv.Append(CCFLAGS='-w')
return localenv
def prep_fortran(env):
localenv = prep_default(env)
localenv.Prepend(CPPPATH='#include/cantera/base') # for config.h
return localenv
def prep_f2c(env):
localenv = prep_default(env)
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'])
if env['VERBOSE']:
print "INFO 2: prep_f2c: adding MSDOS to CPPDEFINES"
print "INFO 2: CPPDEFINES ", localenv['CPPDEFINES']
return localenv
def prep_gtest(env):
localenv = prep_default(env)
localenv.Prepend(CPPPATH=[Dir('#ext/googletest'),
Dir('#ext/googletest/include')],
CPPDEFINES={'GTEST_HAS_PTHREAD': 0})
return localenv
def prep_fmt(env):
localenv = prep_default(env)
build(localenv.Command("#include/cantera/ext/format.h",
"#ext/fmt/fmt/format.h",
Copy('$TARGET', '$SOURCE')))
return localenv
# each element of libs is: (subdir, (file extensions), prepfunction)
libs = [('libexecstream', ['cpp'], prep_default),
('fmt/fmt', ['cc'], prep_fmt)]
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')
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))
for subdir, extensions, prepFunction in libs:
localenv = prepFunction(env)
objects = localenv.SharedObject(mglob(localenv, subdir, *extensions))
libraryTargets.extend(objects)
if env['system_sundials'] == 'n':
localenv = prep_default(env)
localenv.Prepend(CPPPATH=Dir('#include/cantera/ext'))
# Generate sundials_config.h
sundials_configh = {}
if env['OS'] != 'Windows':
sundials_configh['SUNDIALS_USE_GENERIC_MATH'] = 1
if not env['BUILD_BLAS_LAPACK']:
sundials_configh['SUNDIALS_BLAS_LAPACK'] = 1
localenv.AlwaysBuild(env.Command('#include/cantera/ext/sundials/sundials_config.h',
'sundials_config.h.in',
ConfigBuilder(sundials_configh)))
# Copy sundials header files into common include directory
for subdir in ('sundials', 'nvector', 'cvodes', 'ida'):
for header in mglob(env, 'sundials/include/'+subdir, 'h'):
build(localenv.Command('#include/cantera/ext/%s/%s' % (subdir, header.name),
'#ext/sundials/include/%s/%s' % (subdir, header.name),
Copy('$TARGET', '$SOURCE')))
# Compile Sundials source files
for subdir in ('sundials', 'nvec_ser', 'cvodes', 'ida'):
libraryTargets.extend(localenv.SharedObject(
[f for f in mglob(localenv, 'sundials/src/'+subdir, 'c')
if '_klu' not in f.name and '_superlumt' not in f.name]))
if not env['system_eigen']:
build(localenv.Command('#include/cantera/ext/Eigen', '#ext/eigen/Eigen',
Copy('$TARGET', '$SOURCE')))
# Google Test: Used internally for Cantera unit tests.
if not env['system_googletest']:
localenv = prep_gtest(env)
gtest = build(localenv.Library('../lib/gtest',
source=['googletest/src/gtest-all.cc']))