import os.path, sys
from distutils import sysconfig
from scons import *

# XXX: ccache requires that the HOME environment variable is accessible
env = Environment(ENV={"PATH": os.environ["PATH"], "HOME": os.environ["HOME"]})

def pathValidator(key, val, env):
    """ Silence SCons with regard to non-existent paths """
    pass

def PathOption(dir, explanation, default):
    """ Define PathOption that works the same across old and new (0.96.9*) SCons, i.e. new SCons
    adds a restrictive path validator by default. """
    return (dir, "%s ( /path/to/%s )" % (explanation, dir), default, pathValidator)

options = [
        PathOption("prefix", "Installation prefix", "/usr/local"),
        PathOption("binDir", "Executable installation directory", "$prefix/bin"),
        PathOption("libDir", "Library installation directory", "$prefix/lib"),
        PathOption("includeDir", "C/C++ header installation directory", "$prefix/include"),
        PathOption("pythonModuleDir", "Python module installation directory", sysconfig.get_python_lib(prefix="$prefix")),
        PathOption("pythonExtDir", "Python extension module installation directory", sysconfig.get_python_lib(
            prefix="$prefix", plat_specific=True)),
        BoolOption("enableDebug", "Build with debug information", 1),
        BoolOption("enableOptimize", "Compile with optimization", 0),
        ("Cxx", "Set C++ compiler"),
        ("customCxxFlags", "Customize compilation of C++ code", ""),
        BoolOption("cacheOptions", "Cache command-line options for later invocations", 1),
        ]
# This Configure class handles both command-line options (which are merged into the environment) and
# autoconf-style tests. A special feature is that it remembers configuration parameters (options and
# results from tests) between invocations so that they are re-used when cleaning after a previous build.
configure = Configure(env, ARGUMENTS, options)
configure.finish()
try: env["CXX"] = env["Cxx"]
except KeyError: pass

cflags = "-Wall -pipe"
if env["enableDebug"]:
    cflags += " -g"
if env["enableOptimize"]:
    cflags += " -O3"
if env["customCxxFlags"]:
    cflags += " " + env["customCxxFlags"]
env["CXXFLAGS"] = cflags

# Store all signatures in one file, otherwise .sconsign files will get installed along with our own files
env.SConsignFile(os.path.join("scons", ".sconsign"))

try:
    ginacIncludeDirs, ginacLibDirs, ginacLibs = pkgconfigIncludeDirs("ginac"), pkgconfigLibDirs("ginac"), \
        pkgconfigLibs("ginac")
except PkgconfigError, err:
    sys.stderr.write("%s\n" % err)
    Exit(1)

env.Append(CPPPATH=ginacIncludeDirs, LIBPATH=ginacLibDirs)
env.SConscript(os.path.join("syfi", "SConscript"), exports=["env", "ginacLibs"])
env.SConscript(os.path.join("python", "SConscript"), exports=["env"])
