6d8e39bceaa69ee1d7440bb08011c1835e289719
[tatoo.git] / tools / ocamldriver.sh
1 #!/bin/sh
2 EXT=${target#*.cm}
3 dirname=${base%/*}
4
5 if test -f "$dirname".pack; then
6     #we are below a pack directory
7     PACKDIR=`basename $dirname`
8     PACKINCLUDE="-I $dirname"
9 elif test -f ${base}.pack -a -d ${base}; then
10     $REMAKE ${base}.pack
11     PACKINCLUDE="-I ${base}"
12     PACKDIR=`basename ${base}`
13     DOPACK=1
14 fi
15 if test "$PACKDIR"; then
16     PACKNAME=`echo $PACKDIR | cut -b1 | tr a-z A-Z`${PACKDIR#?}
17     if test "$NATIVE"; then
18         FORPACK="-for-pack $PACKNAME"
19     fi
20 fi
21
22 if test "$EXT" = i; then
23     if test -f ${base}.mli; then
24         $REMAKE ${base}.mli;
25     fi
26
27     modules=`$OCAMLDEP -modules ${base}.mli | cut -f 2- -d ':'`
28     objects=`tools/ocamlmoduledep.sh -inter $NATIVE $PACKINCLUDE -I $SRC $modules`
29     $REMAKE $objects
30     $COMPILE  -o ${target} -c $PACKINCLUDE ${base}.mli
31     exit 0
32 fi
33
34 if test "$DOPACK"; then
35     modules=`cat ${base}.pack`
36     objects=`echo $modules | xargs tools/ocamlmoduledep.sh $NATIVE $PACKINCLUDE -I $SRC `
37 else
38     $REMAKE ${base}.ml
39     modules=`$OCAMLDEP -modules ${base}.ml | cut -f 2- -d ':'`
40     if test "$EXT" = "o"; then
41         INTER=-inter
42     fi
43     objects=`tools/ocamlmoduledep.sh $INTER $NATIVE $PACKINCLUDE -I $SRC $modules`
44 fi
45
46 $REMAKE $objects
47
48 deps=`echo $objects | sed "s/[.]cm[i${EXT}]/.$DEPEXT/g"`
49 rm -f ${base}.$DEPEXT; touch ${base}.$DEPEXT
50 $REMAKE $deps
51 for f in $deps; do
52     for g in `cat $f`; do
53         if grep -q $g ${base}.$DEPEXT; then continue; fi
54         echo $g >> ${base}.$DEPEXT
55     done
56     if grep -q $f ${base}.$DEPEXT; then continue; fi
57     echo $f >> ${base}.$DEPEXT
58 done
59 if test -f ${base}.mli; then $REMAKE PACKINCLUDE="$PACKINCLUDE" ${base}.cmi; fi
60 if test "$DOPACK"; then
61     sorted_objects=`cat ${base}.$DEPEXT | grep "$PACKDIR" | sed "s/[.]$DEPEXT/.cm${EXT}/" | xargs`
62     cat ${base}.$DEPEXT | grep -v "$PACKDIR" > ${base}.tmp
63     mv ${base}.tmp ${base}.$DEPEXT
64     $COMPILE  -o ${target} -pack $sorted_objects
65 else
66     $COMPILE  -o ${target} $FORPACK -c $PACKINCLUDE ${base}.ml
67 fi