#!/usr/bin/python3

import os,sys,math
import subprocess
import shutil
from shutil import copytree

from amsbuildlib4 import *

libname = "amscimglib4.mingw64" #static library name to generate
binname = "tests" #create this executable when compiling main.c or main.cpp
commondir = "../../winx64" #common directory to pul libraries and includes from
depdir = "./dependencies/winx64" #local pre-compiled dependency libraries and their includes
installdir = "../../winx64" #directory to install to when finished
builddir = "./build_mingw64"

doinstall = False   #copies the build_output to the install dir when finished
cc = "x86_64-w64-mingw32-gcc" #compiler
cflags = "-fPIC -O3 -DEXPORT_AMSCIMGLIB4"
libraries = "-l{} -ljpeg -lpng -lz -lm".format(libname)
libdirs = "-L{} -L{}/lib -L{}/lib".format(builddir,commondir,depdir)
linkerflags = "-shared -Wl,-rpath=. -Wl,--out-implib={}/lib{}.a".format(builddir,libname)
srcexts = [".c",".cpp"]
binsrc = ["main.c","main.cpp"] #ignore these files when compiling the static library

#keyword list to control the compilers/linkers
kwargs = dict()
include = "-I./include -I{}/include -I{}/include".format(commondir, depdir)
kwargs["include"] = include
kwargs["flags"] = cflags
kwargs["libdir"] = libdirs
kwargs["libflags"] = libraries
kwargs["linkerflags"] = linkerflags
kwargs["recurse"] = True
kwargs["objstore"] = "{}/objstore".format(builddir)
kwargs["searchincdirs"] = "./include"

#Find all source files, except the main project files
srcfiles = flist('./src',exts = srcexts, recurse=True)
srcfiles = except_contains(srcfiles,binsrc)

#compile all the source files in the list
#gs_compile_list(cc,files,**kwargs)
gs_incremental_compile_list(cc,srcfiles,**kwargs)

#Link the resulting object files and compile to a dynamic link library
objlist = flist(kwargs['objstore'],exts='.o',recurse=True)
sobjlist = list_to_sss(objlist)
gs_link_list(cc,sobjlist,"{}/lib{}.dll".format(builddir,libname),**kwargs)

#Strip - call the strip command to remove exposed symbols in the dll
callproc("x86_64-w64-mingw32-strip --strip-all --discard-all {}/lib{}.dll".format(builddir,libname))

if(doinstall):
    #Push any libraries to the common lib folder
    shutil.copy(
        '{}/lib{}.lib'.format(builddir,libname),
        "{}/lib".format(installdir)
    )

    shutil.copy(
        '{}/lib{}.dll'.format(builddir,libname),
        "{}/lib".format(installdir)
    )

    #Copy include files to the common include folder
    copytree('./include/',installdir+'/include/',dirs_exist_ok=True)
