from buildutils import *

Import('env', 'build', 'install', 'libraryTargets')
localenv = env.Clone()

license_files = [('Cantera', '#License.txt'),
                 ('Libexecstream', 'libexecstream/doc/license.txt')]

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_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)
    if not env['system_fmt']:
        license_files.append(('fmtlib', 'fmt/LICENSE.rst'))
        for name in ('format.h', 'ostream.h'):
            build(localenv.Command("#include/cantera/ext/fmt/" + name,
                                   "#ext/fmt/fmt/" + name,
                                    Copy('$TARGET', '$SOURCE')))
    return localenv

# each element of libs is: (subdir, (file extensions), prepfunction)
libs = [('libexecstream', ['cpp'], prep_default),
        ('fmt/fmt', ['cc'], prep_fmt)]

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'))
    license_files.append(('Sundials', 'sundials/LICENSE'))

    # Generate sundials_config.h
    sundials_configh = {}
    if env['OS'] != 'Windows':
        sundials_configh['SUNDIALS_USE_GENERIC_MATH'] = 1
    if env['use_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
    exclude = ['_klu', '_superlumt']
    if not env['use_lapack']:
        exclude.append('_lapack')
    for subdir in ('sundials', 'nvec_ser', 'cvodes', 'ida'):
        libraryTargets.extend(localenv.SharedObject(
            [f for f in mglob(localenv, 'sundials/src/'+subdir, 'c')
             if not any(pattern in f.name for pattern in exclude)]))

if not env['system_eigen']:
    license_files.append(('Eigen', 'eigen/COPYING.MPL2'))
    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']))

# Create license file containing licenses for Cantera and all included packages
def generate_license(target, source, env):
    stars = '*'*50 + '\n' + '*'*50 + '\n'
    tpl = stars + 'The following license applies to {}\n' + stars + '\n{}\n'

    license = []
    for (package,_),filename in zip(license_files, source):
        license.append(tpl.format(package, open(filename.path).read().strip()))

    license = '\n'.join(license)
    if target[0].path.endswith('.rtf'):
        license = license.replace('\\', '\\\\').replace('{', '\\{').replace('}', '\\}')
        license = license.replace('\n', ' \\par\n')
        license = r'{\rtf1\ansi{\fonttbl\f0\fswiss Arial;}\f0\pard\fs16 ' + license + '}'

    open(target[0].path, 'w').write(license)

license = build(localenv.Command('LICENSE.txt', [x[1] for x in license_files],
                                 generate_license))
install('$inst_docdir', license)

if env['OS'] == 'Windows':
    # RTF version is required for Windows installer
    build(localenv.Command('LICENSE.rtf', [x[1] for x in license_files],
                           generate_license))
