Add the remake and configure infrastructure.
[tatoo.git] / tools / odeps.sh
diff --git a/tools/odeps.sh b/tools/odeps.sh
new file mode 100755 (executable)
index 0000000..2443c21
--- /dev/null
@@ -0,0 +1,87 @@
+#!/bin/sh
+#Save the parameters
+
+PROG="$0"
+CMDLINE="$*"
+usage() {
+    echo "$PROG [ocamldep ... ]"
+}
+
+OPTIONS=""
+INCLUDES=""
+ARGS=""
+NATIVE=0
+while true; do
+    case $1 in
+        -ppopt)
+            OPTIONS="$OPTIONS $1 $2"
+            shift
+            ;;
+        -I)
+            OPTIONS="$OPTIONS $1 $2"
+            INCLUDES="$INCLUDES $2"
+            shift
+            ;;
+        -native)
+            NATIVE=1
+            OPTIONS="$OPTIONS $1"
+            ;;
+        *.ml*)
+            ARGS="$ARGS $1"
+            ;;
+        *)
+            OPTIONS="$OPTIONS $1"
+            ;;
+    esac
+    if test "$#" -eq 0; then break; else shift; fi
+done
+
+if test "$NATIVE" -eq 1; then
+    OEXT="cmx"
+else
+    OEXT="cmo"
+fi
+IEXT="cmi"
+
+for src in $ARGS; do
+    $OPTIONS -modules "$src" | while read file deps; do
+        if test -z "$file"; then continue; fi
+        file=${file%:}
+        if test "$file" != "${file%.mli}"; then
+            ext="$IEXT"
+            base="${file%.mli}"
+            src_ext="mli"
+        else
+            ext="$OEXT"
+            base="${file%.ml}"
+            src_ext="ml"
+        fi
+        dependencies=""
+        for dep in $deps; do
+            modbase=$(echo $dep | sed 's/\(.*\)/\l\1/')
+            for dir in $INCLUDES; do
+                dir=${dir%/} #remove trailing slash, if any
+                #Interfaces or bytecode objects depends on other compile interfaces
+                #if they exists, otherwise they depend on the object
+                if test \( "$ext" = "cmi" -o "$ext" = "cmo" \) -a -f "$dir"/"$modbase".mli ; then
+                    dependencies="$dependencies $dir/$modbase".cmi
+                    break
+                elif test -f "$dir"/"$modbase".ml -o -f "$dir"/"$modbase".mly -o -f "$dir"/"$modbase".mll -o -d "$dir"/"$modbase"; then
+                    dependencies="$dependencies $dir/$modbase"."$ext"
+                    break
+                fi
+            done
+        done
+        #finally add the cmi as dependency of the cmo/cmx,
+        #if the .mli exists
+        if test "$ext" != "cmi" -a -f "$base".mli ; then
+            dependencies=" ${base}.cmi${dependencies}"
+        fi
+        #output a phony dependency between the cmi and the cmx/cmo if there is no .mli
+        if test "$ext" != "cmi" -a ! -f "$base".mli; then
+            echo "${base}.cmi: ${base}.${ext}"
+        fi
+        echo "${base}.${ext}:${dependencies}"
+    done
+
+done