from scons import *
import glob 

Import("env", "ginacLibs")

VerMajor, VerMinor, VerMicro = 0, 4, 0
libFname = "libsyfi.so"
libFnameMajor = libFname + ".%d" % VerMajor
libFnameMinor = libFnameMajor + ".%d" % VerMinor
libFnameMicro = libFnameMinor + ".%d" % VerMicro
shlibEnv = env.Copy()
# Add soname to library, this is so a reference is made to the versioned library in client programs
shlibEnv.AppendUnique(SHLINKFLAGS="-Wl,-soname=%s" % libFnameMajor)
shlibEnv.Append(LIBS=ginacLibs)
cppfiles = glob.glob("*.cpp") 
shlib = shlibEnv.SharedLibrary("syfi", cppfiles ,
        SHLIBSUFFIX=".so.%d.%d.%d" % (VerMajor, VerMinor, VerMicro))
# Build this by default
env.Default(shlib)

def symlink(env, target, source):
    trgt = str(target[0])
    src = str(source[0])
    if os.path.islink(trgt) or os.path.exists(trgt):
        os.remove(trgt)
    os.symlink(os.path.basename(src), trgt)

symlink0 = env.Command(libFnameMajor, libFnameMicro, symlink)
symlink1 = env.Command(libFname, libFnameMajor, symlink)
env.Default(symlink0, symlink1)

libDir = env.subst(env["libDir"])
env.Install(libDir, shlib)
# Install the symlinks as well
env.Install(libDir, [symlink0, symlink1])

env.Alias("install", libDir)

includeDir = env.subst(env["includeDir"])
headerfiles = glob.glob("*.h") 
env.Install(includeDir, headerfiles )
env.Alias("install", includeDir)

# Install pkg-config file

def generatePkgconfig(env, target, source):
    global includeDir, libDir, VerMajor, VerMinor, VerMicro
    tgt = str(target[0])
    src = str(source[0])
    f = open(tgt, "w")
    try:
        f.write("""includedir=%s
libdir=%s

Name: SyFi
Description: C++ library for symbolic calculations
Version: %d.%d.%d
Requires: ginac
Cflags: -I${includedir}
Libs: -L${libdir} -lsyfi
""" % (includeDir, libDir, VerMajor, VerMinor, VerMicro))
    finally:
        f.close()

pkgconfigDir = os.path.join(libDir, "pkgconfig")
env.Command(os.path.join(pkgconfigDir, "syfi-%d.pc" % VerMajor), shlib, generatePkgconfig)
env.Alias("install", pkgconfigDir)
