#!/bin/bash
./clean
make
./auto
#linux: n.b we had to copy libasmrun_pic.a to libasmrun.a here
#linux: n.b run shared with LD_LIBRARY_PATH=. ./cpdflibtest-shared
cfiles=(cpdflibwrapper)
finalcfile=cpdflibtest
libname=cpdf
mlfiles=(cpdflib)
mlifiles=(cpdflib)
mllibs=()
ocamlfind=ocamlfind
ocamlfind_packs=(camlpdf cpdf)
stubs=(camlpdf)

#Extract some information from ocamlc and set up basic parameters
echo ***EXTRACTING INFORMATION
ranlib="ranlib"
native_c_libraries=`ocamlc -config 2>/dev/null | grep native_c_libraries | sed 's/native_c_libraries: //'`
libdir=`ocamlc -where`
uname=`uname -s`
dllname="so"
link="cc"
exesuffix=""
if [ ${#mllibs[@]} -gt 0 ]; then
camllibs=$(printf "%s.cmxa " "${mllibs[@]}")
fi
if [ ${#mlfiles[@]} -gt 0 ]; then
camlcmx=$(printf "%s.cmx " "${mlfiles[@]}")
fi
if [ ${#mllibs[@]} -gt 0 ]; then
camllink=$(printf -- "-l%s " "${mllibs[@]}")
fi
if [ ${#ocamlfind_packs[@]} -gt 0 ]; then
camlpackages=$(printf -- "-package %s " "${ocamlfind_packs[@]}")
fi
if [ ${#ocamlfind_packs[@]} -gt 0 ]; then
camlpackcmxa=$(printf "%s.cmxa " "${ocamlfind_packs[@]}")
fi
if [ ${#cfiles[@]} -gt 0 ]; then
wrapperos=$(printf "%s.o" "${cfiles[@]}")
fi
echo ranlib: $ranlib
echo native_c_libraries: $native_c_libraries
echo libdir: $libdir
echo dllname: $dllname
echo uname: $uname
echo libdir: $libdir
echo link: $link
echo exesuffix: $exesuffix
echo camllibs: $camllibs
echo camlcmx: $camlcmx
echo camllink: $camllink
echo camlpackages: $camlpackages
echo camlpackcmxa: $camlpackcmxa
echo wrapperos: $wrapperos

#Process the .mli files
echo ***PROCESSING .mli files
for x in "${mlifiles[@]}"
do
$ocamlfind ocamlc $camlpackages ${x}.mli
done

#Process the .ml files
echo ***PROCESSING .ml files
for x in "${mlfiles[@]}"
do
$ocamlfind ocamlopt $camlpackages -c ${x}.ml
done

#Using -output-obj for static library
echo ***MAKING STATIC LIBRARY WITH -output-obj
$ocamlfind ocamlopt $camlpackages -output-obj -o impl.o $camllibs $camlpackcmxa $camlcmx

#Compile the .c files
echo ***PROCESSING .c files
for x in "${cfiles[@]}"
do
$ocamlfind ocamlc -c ${x}.c
done

#Build the static .a
echo ***BUILD static .a
rm -rf lib${libname}.a
ar rc lib${libname}.a impl.o
mkdir -p tmp_asmrun
asmrun_members=$(ar t ${libdir}/libasmrun.a | grep -v '__.*')
for stub in $stubs
do
thefile=`ocamlfind query ${stub}`
therest="/lib${stub}_stubs.a"
stub_members=$(ar t ${thefile}${therest} | grep -v '__.*')
( cd tmp_asmrun && ar x ${thefile}${therest} )
for mem in $stub_members; do ar rc lib${libname}.a tmp_asmrun/$mem; done
done
( cd tmp_asmrun && ar x ${libdir}/libasmrun.a )
for mem in $asmrun_members; do ar rc lib${libname}.a tmp_asmrun/$mem; done
for x in "${cfiles[o]}"
do
ar rc lib${libname}.a ${x}.o 
done
$ranlib lib${libname}.a
rm -rf tmp_asmrun

#Build an example executable, with static .a
echo ***BUILD example executable with static .a
$ocamlfind ocamlc -c ${finalcfile}.c
staticlinkflags="-L.. -L. -l${libname} -L$libdir $camllink $native_c_libraries"
echo "STATIC LINKER: "$link
echo "STATIC LINKER FLAGS: "$staticlinkflags
echo "STATIC LINKER CALL: "$link -o $finalcfile$exesuffix ${finalcfile}.o $staticlinkflags
$link -o $finalcfile$exesuffix ${finalcfile}.o $staticlinkflags

#Build the other examples
echo ***BUILD the other examples
cd examples
$ocamlfind ocamlc -c merge.c
$link -o merge$exesuffix merge.o $staticlinkflags
$ocamlfind ocamlc -c squeeze.c
$link -o squeeze$exesuffix squeeze.o $staticlinkflags
$ocamlfind ocamlc -c rde.c
$link -o rde$exesuffix rde.o $staticlinkflags
cd ..

#Using -output-obj for dynamic library (moved here so static build doesn't pick it up!)
echo ***MAKING DYNAMIC LIBRARY WITH -output-obj
echo $ocamlfind ocamlopt $camlpackages -output-obj -o lib${libname}.$dllname $wrapperos $camllibs $camlpackcmxa $camlcmx
$ocamlfind ocamlopt $camlpackages -output-obj -o lib${libname}.$dllname $wrapperos $camllibs $camlpackcmxa $camlcmx

#Build an example executable, with dynamic .so
echo ***BUILD example executable with dynamic .so
$ocamlfind ocamlc -c ${finalcfile}.c
linkflags="-L. lib${libname}.so -L$libdir $camllink $native_c_libraries"
echo "DYNAMIC LINKER: "$link
echo "DYNAMIC LINKER FLAGS: "$linkflags
echo "DYNAMIC LINKER CALL: "$link -o $finalcfile-withshared$exesuffix ${finalcfile}.o $linkflags
$link -o $finalcfile-withshared$exesuffix ${finalcfile}.o $linkflags
