For me zsh's -x output is much easier to parse
[llpp.git] / build.sh
blob510d1194fe0067c8d9ad58a5310ca325593addba
1 #!/bin/sh
2 set -e
4 vecho=${vecho-:}
6 command -v shasum >/dev/null && alias sum=shasum
8 date --version | grep -q "GNU" && {
9 dfmt="%s%N"
10 scle=1000000000
11 } || {
12 dfmt="%s"
13 scle=1
15 now() { date +$dfmt; }
17 tstart=$(now)
19 partmsg() {
20 test $? -eq 0 && msg="ok" || msg="ko"
21 echo "$msg $(echo "scale=3; ($(now) - $tstart) / $scle" | bc -l) sec"
24 die() {
25 echo "$*" >&2
26 exit 111
29 trap 'partmsg' EXIT
31 test -n "$1" || die "usage: $0 build-directory"
33 outd=$1
34 srcd=$PWD
36 isfresh() {
37 test -e "$1" && test -r "$1.past" && {
38 . "$1.past"
39 eval 'test "$k"="$2"'
43 bocaml1() {
44 eval ocamlc -depend -bytecode -one-line $incs $s | {
45 read _ _ depl
46 test -z "$depl" || {
47 for d in $(eval echo $depl); do
48 d=${d#$srcd/}
49 bocaml $d $((n+1))
50 done
53 cmd="ocamlc $incs -c -o $o $s"
54 keycmd="sum $o $s"
55 grep -q "$o" $outd/ordered || echo "$o" >>$outd/ordered
56 isfresh "$o" '$cmd$keymd' || {
57 printf "%*.s%s -> %s\n" $n '' "${s#$srcd/}" "$o"
58 eval "$cmd"
59 echo "k='$cmd$(eval $keycmd)'" >$o.past
60 } && $vecho "fresh '$o'"
63 bocaml() (
64 o="$1"
65 n="$2"
66 wocmi="${o%.cmi}"
67 test ${wocmi%help.cmo} != $wocmi && {
68 s=$outd/help.ml
69 o=$outd/help.cmo
70 } || {
71 test "$o" = "$wocmi" && s=${o%.cmo}.ml || s=$wocmi.mli
72 s=$srcd/$s
73 o=$outd/$o
75 incs="-I lablGL -I $outd/lablGL -I wsi/x11 -I $outd/wsi/x11 -I $outd"
76 bocaml1 "$s" "$o"
79 bocamlc() {
80 o=$outd/$1
81 s=$srcd/${1%.o}.c
82 mudir=$srcd/mupdf
83 muinc="-I $mudir/include -I $mudir/thirdparty/freetype/include"
84 cmd="ocamlc -ccopt \"-O2 $muinc -o $o\" $s"
85 keycmd="sum $o $s 2>/dev/null"
86 isfresh "$o" '$cmd$keycmd' || {
87 printf "%s -> %s\n" "${s#$srcd/}" "$o"
88 eval "$cmd"
89 echo "k='$cmd$(eval $keycmd)'" >$o.past
93 mkdir -p $outd/wsi/x11
94 mkdir -p $outd/lablGL
95 :>$outd/ordered
97 mkhelp() {
98 ocaml str.cma -stdin $srcd/KEYS <<EOF
99 let fixup = let open Str in
100 let dash = regexp {|\([^ ]*\) +- +\(.*\)|}
101 and head = regexp {|-----\(.*\)-----|} in fun s ->
102 String.escaped s |> global_replace dash {|\1\t\2|}
103 |> global_replace head {|\xc2\xb7\1|};;
104 let rec iter ic = match input_line ic with
105 | s -> Printf.printf "\"%s\";\\n" @@ fixup s; iter ic
106 | exception End_of_file -> ();;
107 Printf.printf "let keys = [\\n";
108 iter @@ open_in Sys.argv.(1);;
109 Printf.printf "] and version = \"$ver\"";;
113 ver=$(cd $srcd && git describe --tags) || echo unknown
114 cmd="mkhelp >$outd/help.ml"
115 keycmd="sum $srcd/KEYS"
116 isfresh "$outd/help.ml" '$cmd$keycmd$ver' || {
117 eval $cmd
118 echo "k='$cmd$(eval $keycmd)$ver'" >$outd/help.ml.past
121 for m in lablGL/glMisc.cmo lablGL/glTex.cmo wsi/x11/wsi.cmo main.cmo; do
122 bocaml $m 0
123 done
124 bocamlc link.o
126 libs="str.cma unix.cma"
127 clibs="-lGL -lX11 -L$mudir/build/native -lmupdf -lmupdfthird -lpthread"
128 globjs=
129 for f in ml_gl ml_glarray ml_raw; do
130 bocamlc lablGL/$f.o
131 globjs="$globjs $outd/lablGL/$f.o"
132 done
134 ord=$(echo $(eval grep -v \.cmi $outd/ordered))
135 cmd="ocamlc -custom $libs -o $outd/llpp $ord"
136 cmd="$cmd $globjs $outd/link.o -cclib \"$clibs\""
137 keycmd='sum $outd/llpp $ord'
138 isfresh "$outd/llpp" '$cmd$keycmd' || {
139 echo linking $outd/llpp
140 eval $cmd
141 echo "k='$cmd$(eval $keycmd)'" >$outd/llpp.past