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.Append(CPPPATH='#include/cantera/base') # for config.h
    return localenv

def prep_f2c(env):
    localenv = env.Clone()

    localenv.Append(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.Append(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.Append(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)
    # objects = localenv.SharedObject(mglob(localenv, subdir, *extensions))
    # libraryTargets.extend(objects)
    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

    #
    # Build the static library
    #
    slTargets = []

    objects = localenv.SharedObject(mglob(localenv, subdir, *extensions))
    slTargets.extend(objects)
    # ttarget =  pjoin('..', 'lib', libName)
    ss =  pjoin('..', 'lib', libName)
    lib = build(localenv.StaticLibrary(ss, slTargets, SPAWN=getSpawn(localenv)))
    #lib = build(localenv.StaticLibrary('../lib/cantera', libraryTargets,
    #                                   SPAWN=getSpawn(localenv)))

    install('$inst_libdir', lib)
    #
    # Build the shared library
    #
    liby = build(localenv.SharedLibrary(target = pjoin('..', 'lib', sharedLibName), source = mglob(localenv, subdir, *extensions)))
    #liby = build(localenv.SharedLibrary(target = pjoin('..', 'lib', sharedLibName), source = mglob(localenv, subdir, *extensions),
    #                                   SPAWN=getSpawn(localenv)))
    install('$inst_libdir', liby)


localenv = env.Clone()
localenv.Append(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']))



