Factorise common bits of Remakefile in tools/ocamldriver.sh
[tatoo.git] / tools / ocamldriver.sh
diff --git a/tools/ocamldriver.sh b/tools/ocamldriver.sh
new file mode 100644 (file)
index 0000000..2425147
--- /dev/null
@@ -0,0 +1,52 @@
+#!/bin/sh
+EXT=${target%?}
+dirname=${base%/*}
+
+if test -f "$dirname".pack; then
+    #we are below a pack directory
+    PACKDIR=`basename $dirname`
+    PACKINCLUDE="-I $dirname"
+elif test -f ${base}.pack -a -d ${base}; then
+    $REMAKE ${base}.pack
+    PACKINCLUDE="-I ${base}"
+    PACKDIR=`basename ${base}`
+    DOPACK=1
+fi
+if test "$PACKDIR"; then
+    PACKNAME=`echo $PACKDIR | cut -b1 | tr a-z A-Z`${PACKDIR#?}
+    if test "$NATIVE"; then
+        FORPACK="-for-pack $PACKNAME"
+    fi
+fi
+
+if test "$DOPACK"; then
+    modules=`cat ${base}.pack`
+    objects=`echo $modules | xargs tools/ocamlmoduledep.sh $NATIVE $PACKINCLUDE -I $SRC `
+else
+    $REMAKE ${base}.ml
+    modules=`$OCAMLDEP -modules ${base}.ml | cut -f 2- -d ':'`
+    objects=`tools/ocamlmoduledep.sh $NATIVE $PACKINCLUDE -I $SRC $modules`
+fi
+
+$REMAKE $objects
+
+deps=`echo $objects | sed "s/[.]cm[i${EXT}]/.dep/g"`
+rm -f ${base}.dep; touch ${base}.dep
+$REMAKE $deps
+for f in $deps; do
+    for g in `cat $f`; do
+       if grep -q $g ${base}.dep; then continue; fi
+       echo $g >> ${base}.dep
+    done
+    if grep -q $f ${base}.dep; then continue; fi
+    echo $f >> ${base}.dep
+done
+if test -f ${base}.mli; then $REMAKE -v PACKINCLUDE="$PACKINCLUDE" ${base}.cmi; fi
+if test "$DOPACK"; then
+    sorted_objects=`cat ${base}.dep | grep "$PACKDIR" | sed "s/[.]dep/.cm${EXT}/" | xargs`
+    cat ${base}.dep | grep -v "$PACKDIR" > ${base}.tmp
+    mv ${base}.tmp ${base}.dep
+    $COMPILE  -o ${target} -pack $sorted_objects
+else
+    $COMPILE  -o ${target} $FORPACK -c $PACKINCLUDE ${base}.ml
+fi