import sys

Import("env")

cuba = "Cuba-4.2.1"
form = "form-4.2.1"
gsl = "gsl-2.5"
nauty = "nauty26r7"
cln = "cln-1.3.6"
ginac = "ginac-1.8.0"

contrib_extra_source = File(Split(f"""
    SConscript
    {cln}.list
    {ginac}.list
    {gsl}.list
"""))

contrib = []

contrib += \
    File(["__init__.py", "__main__.py"])

contrib += \
    Install("include", "qmc.hpp")

contrib += \
    Install("include/secdecutil", Glob("util/secdecutil/*hpp")) + \
    Install("include/secdecutil/integrators", Glob("util/secdecutil/integrators/*hpp"))

def ConfigureAndInstall(env, target, packagename, extension=".tar.gz", extra_sources=[], extra_commands="", extra_configure_args=""):
    return env.Command(target, [f"{packagename}{extension}"] + extra_sources, f"""
        cd pySecDecContrib && \
        tar -xf {packagename}{extension} && \
        cd {packagename} && \
        {extra_commands} \
        ./configure \
            --prefix="$$PWD/../install" \
            --libdir="$$PWD/../lib" \
            --includedir="$$PWD/../include" \
            --bindir="$$PWD/../bin" \
            {extra_configure_args} && \
        make && \
        make install && \
        cd .. && \
        rm -rf {packagename}
    """)

cuba_files = ["lib/libcuba.a", "include/cuba.h"]
contrib += \
    ConfigureAndInstall(env, cuba_files, cuba,
        extra_commands="""\
            sed -i.bak 's/mcc/false/g' configure && \
            sed -i.bak \
                -e 's/puts(s)/fputs(s,stderr); putc(10,stderr)/' \
                -e 's/stdout/stderr/g' src/common/stddecl.h && \
        """,
        extra_configure_args="CFLAGS='-O3 -fomit-frame-pointer -ffast-math -fno-finite-math-only -fexceptions -fcommon -fPIC'")

form_files = ["bin/form", "bin/tform"]
contrib += \
    ConfigureAndInstall(env, form_files, form,
        extra_configure_args="--without-gmp --without-zlib --enable-native=no")

gsl_files = open(f"{gsl}.list").read().splitlines()
contrib += \
    ConfigureAndInstall(env, gsl_files, gsl,
        extra_configure_args="--disable-shared --enable-static --with-pic")

nauty_files = ["bin/dreadnaut"]
contrib += \
    env.Command(nauty_files, [f"{nauty}.tar.gz"], f"""
        cd pySecDecContrib && \
        tar -xf {nauty}.tar.gz && \
        cd {nauty} && \
        ./configure --disable-popcnt --disable-clz && \
        make dreadnaut && \
        strip dreadnaut && \
        cp -a dreadnaut ../bin/dreadnaut && \
        cd .. && \
        rm -rf {nauty}
    """)

cln_files = open(f"{cln}.list").read().splitlines()
contrib += \
    ConfigureAndInstall(env, cln_files, cln, extension=".tar.bz2",
        extra_configure_args="--disable-shared --enable-static --with-pic --without-gmp")

ginac_files = open(f"{ginac}.list").read().splitlines()
contrib += \
    ConfigureAndInstall(env, ginac_files, ginac, extension=".tar.bz2",
        extra_sources = cln_files,
        extra_configure_args=f"--disable-shared --enable-static --with-pic --enable-excompiler=no CLN_CFLAGS=-I$$PWD/../include CLN_LIBS=\"-L$$PWD/../lib -lcln\" PYTHON='{sys.executable}'")

Return("contrib")
