Smileys
[llpp.git] / build.sh
blob41a725261dfd26dde23a2987b778ed45275603c7
1 #!/bin/sh
2 set -e
4 vecho=${vecho-:}
6 date --version | grep -q "GNU date with working +%N" && {
7 now() { date +%N; }
8 scl=1000000000.0
9 } || {
10 now() { date +%s; }
11 scl=1
14 tstart=$(now)
16 partmsg() {
17 test $? -eq 0 && msg="ok" || msg="ko"
18 echo "$msg $(echo "scale=3; ($(now) - $tstart) / $scl" | bc -l) sec"
21 die() {
22 echo "$*" >&2
23 exit 111
26 trap 'partmsg' EXIT
28 test -n "$1" || die "usage: $0 build-directory"
30 outd=$1
31 srcd=$PWD
33 isfresh() {
34 test -e "$1" && test -r "$1.past" && {
35 . "$1.past"
36 eval 'test "$k"="$2"'
40 bocaml1() {
41 eval ocamlc -depend -bytecode -one-line $incs $s | {
42 read _ _ depl
43 test -z "$depl" || {
44 for d in $(eval echo $depl); do
45 d=${d#$srcd/}
46 bocaml $d $((n+1))
47 done
50 cmd="ocamlc $incs -c -o $o $s"
51 keycmd="stat -c %Y $o $s"
52 grep -q "$o" $outd/ordered || echo "$o" >>$outd/ordered
53 isfresh "$o" '$cmd$keymd' || {
54 printf "%*.s%s -> %s\n" $n '' "${s#$srcd/}" "$o"
55 eval "$cmd"
56 echo "k='$cmd$(eval $keycmd)'" >$o.past
57 } && $vecho "fresh '$o'"
60 bocaml() (
61 o="$1"
62 n="$2"
63 wocmi="${o%.cmi}"
64 test ${wocmi%help.cmo} != $wocmi && {
65 s=$outd/help.ml
66 o=$outd/help.cmo
67 } || {
68 test "$o" = "$wocmi" && s=${o%.cmo}.ml || s=$wocmi.mli
69 s=$srcd/$s
70 o=$outd/$o
72 incs="-I lablGL -I $outd/lablGL -I wsi/x11 -I $outd/wsi/x11 -I $outd"
73 bocaml1 "$s" "$o"
76 bocamlc() {
77 o=$outd/$1
78 s=$srcd/${1%.o}.c
79 mudir=$srcd/mupdf
80 muinc="-I $mudir/include -I $mudir/thirdparty/freetype/include"
81 cmd="ocamlc -ccopt \"-O2 $muinc -o $o\" $s"
82 keycmd="stat -c %Y $o $s 2>/dev/null"
83 isfresh "$o" '$cmd$keycmd' || {
84 printf "%s -> %s\n" "${s#$srcd/}" "$o"
85 eval "$cmd"
86 echo "k='$cmd$(eval $keycmd)'" >$o.past
90 mkdir -p $outd/wsi/x11
91 mkdir -p $outd/lablGL
92 :>$outd/ordered
94 mkhelp() {
95 ocaml str.cma -stdin $srcd/KEYS <<EOF
96 let fixup = let open Str in
97 let dash = regexp {|\([^ ]*\) +- +\(.*\)|}
98 and head = regexp {|-----\(.*\)-----|} in fun s ->
99 String.escaped s |> global_replace dash {|\1\t\2|}
100 |> global_replace head {|\xc2\xb7\1|};;
101 let rec iter ic = match input_line ic with
102 | s -> Printf.printf "\"%s\";\\n" @@ fixup s; iter ic
103 | exception End_of_file -> ();;
104 Printf.printf "let keys = [\\n";
105 iter @@ open_in Sys.argv.(1);;
106 Printf.printf "] and version = \"$ver\"";;
110 ver=$(cd $srcd && git describe --tags || echo unknown)
111 cmd="mkhelp >$outd/help.ml"
112 keycmd="stat -c %Y $srcd/KEYS"
113 isfresh "$outd/help.ml" '$cmd$keycmd$ver' || {
114 eval $cmd
115 echo "k='$cmd$(eval $keycmd)$ver'" >$outd/help.ml.past
118 for m in lablGL/glMisc.cmo lablGL/glTex.cmo wsi/x11/wsi.cmo main.cmo; do
119 bocaml $m 0
120 done
121 bocamlc link.o
123 libs="str.cma unix.cma"
124 clibs="-lGL -lX11 -L$mudir/build/native -lmupdf -lmupdfthird -lpthread"
125 globjs=
126 for f in ml_gl ml_glarray ml_raw; do
127 bocamlc lablGL/$f.o
128 globjs="$globjs $outd/lablGL/$f.o"
129 done
131 ord=$(echo $(eval grep -v \.cmi $outd/ordered))
132 cmd="ocamlc -custom $libs -o $outd/llpp $ord"
133 cmd="$cmd $globjs $outd/link.o -cclib \"$clibs\""
134 keycmd='sum $outd/llpp $ord'
135 isfresh "$outd/llpp" '$cmd$keycmd' || {
136 echo linking $outd/llpp
137 eval $cmd
138 echo "k='$cmd$(eval $keycmd)'" >$outd/llpp.past