Nanoseconds
[llpp.git] / build.sh
blobe356d97cd2b32b741a70a4e0d950a59231886d98
1 #!/bin/sh
2 set -eu
4 now() { date +$dfmt; }
5 unameN=$(uname)
6 test "$unameN" = Darwin && {
7 darwin=true
8 wsi="wsi/osx"
9 dfmt="%s"
10 } || {
11 darwin=false
12 wsi="wsi/x11"
13 dfmt="%s.%N"
16 tstart=$(now)
17 vecho=${vecho-:}
18 command -v md5sum >/dev/null || {
19 alias sum='sum 2>/dev/null'
20 } && alias sum='md5sum 2>/dev/null'
22 partmsg() {
23 test $? -eq 0 && msg="ok" || msg="ko"
24 echo "$msg $(echo "scale=3; ($(now) - $tstart)/1" | bc -l) sec"
27 die() {
28 echo "$*" >&2
29 exit 111
32 trap 'partmsg' EXIT
34 test -n "$1" || die "usage: $0 build-directory"
36 outd=$1
37 srcd=$PWD
38 mudir=$srcd/mupdf
39 muinc="-I $mudir/include -I $mudir/thirdparty/freetype/include"
41 isfresh() {
42 test -e "$1" && test -r "$1.past" && {
43 . "$1.past"
44 test "$k" = "$2"
48 oflags() {
49 case "${1#$outd/}" in
50 main.cmo|utils.cmo|config.cmo|parser.cmo|wsi.cmi|$wsi/wsi.cmo)
51 f="-g -strict-sequence -strict-formats -warn-error a";;
52 *) f="-g";;
53 esac
54 echo "-I lablGL -I $outd/lablGL -I $wsi -I $outd/$wsi -I $outd $f"
57 cflags() {
58 case "${1#$outd/}" in
59 link.o)
60 f="-g -std=c99 -O2 $muinc -Wall -Werror -pedantic-errors"
61 $darwin && echo "$f -D__COCOA__" || echo $f;;
62 */ml_gl.o) echo "-g -Wno-pointer-sign -O2";;
63 *) echo "-g -O2";;
64 esac
67 mflags() { echo "-I $(ocamlc -where) -g -O2"; }
69 bocaml1() {
70 eval ocamlc -depend -bytecode -one-line $incs $s | {
71 read _ _ depl
72 for d in $(eval echo $depl); do
73 bocaml ${d#$srcd/} $((n+1))
74 done
76 cmd="ocamlc $(oflags $o) -c -o $o $s"
77 keycmd="sum $o $s"
78 grep -q "$o" $outd/ordered || {
79 echo "$o" >>$outd/ordered
80 isfresh "$o" "$cmd$(eval $keycmd)" || {
81 printf "%*.s%s -> %s\n" $n '' "${s#$srcd/}" "$o"
82 eval "$cmd"
83 echo "k='$cmd$(eval $keycmd)'" >$o.past
84 } && $vecho "fresh '$o'"
88 bocaml() (
89 o="$1"
90 n="$2"
91 wocmi="${o%.cmi}"
92 test ${wocmi%help.cmo} != $wocmi && {
93 s=$outd/help.ml
94 o=$outd/help.cmo
95 } || {
96 test "$o" = "$wocmi" && s=$srcd/${o%.cmo}.ml || s=$srcd/$wocmi.mli
97 o=$outd/$o
99 incs="-I lablGL -I $outd/lablGL -I $wsi -I $outd/$wsi -I $outd"
100 bocaml1 "$s" "$o"
103 bocamlc() {
104 o=$outd/$1
105 s=$srcd/${1%.o}.c
106 cmd="ocamlc -ccopt \"$(cflags $o) -MMD -MF $o.dep -MT_ -o $o\" $s"
107 test -r $o.dep && read _ d <$o.dep || d=
108 keycmd='sum $o $d'
109 isfresh "$o" "$cmd$(eval $keycmd)" || {
110 printf "%s -> %s\n" "${s#$srcd/}" "$o"
111 eval "$cmd"
112 read _ d <$o.dep
113 echo "k='$cmd$(eval $keycmd)'" >$o.past
117 bobjc() {
118 o=$outd/$1
119 s=$srcd/${1%.o}.m
120 cmd="$mcomp $(mflags $o) -MMD -MF $o.dep -MT_ -c -o $o $s"
121 test -r $o.dep && read _ d <$o.dep || d=
122 keycmd='sum $o $d'
123 isfresh "$o" "$cmd$(eval $keycmd)" || {
124 printf "%s -> %s\n" "${s#$srcd/}" "$o"
125 eval "$cmd"
126 read _ d <$o.dep
127 echo "k='$cmd$(eval $keycmd)'" >$o.past
131 mkdir -p $outd/$wsi
132 mkdir -p $outd/lablGL
133 :>$outd/ordered
135 mkhelp() {
136 ocaml str.cma -stdin $srcd/KEYS <<EOF
137 let fixup = let open Str in
138 let dash = regexp {|\([^ ]*\) +- +\(.*\)|}
139 and head = regexp {|-----\(.*\)-----|} in fun s ->
140 String.escaped s |> global_replace dash {|\1\t\2|}
141 |> global_replace head {|\xc2\xb7\1|};;
142 let rec iter ic = match input_line ic with
143 | s -> Printf.printf "\"%s\";\\n" @@ fixup s; iter ic
144 | exception End_of_file -> ();;
145 Printf.printf "let keys = [\\n";
146 iter @@ open_in Sys.argv.(1);;
147 Printf.printf "] and version = \"$ver\";;"
151 ver=$(cd $srcd && git describe --tags) || echo unknown
152 cmd="mkhelp >$outd/help.ml"
153 keycmd="sum $srcd/KEYS; echo $ver"
154 isfresh "$outd/help.ml" '$cmd$(eval keycmd)$ver' || {
155 eval $cmd
156 echo "k='$cmd$(eval $keycmd)$ver'" >$outd/help.ml.past
159 for m in lablGL/glMisc.cmo lablGL/glTex.cmo $wsi/wsi.cmo main.cmo; do
160 bocaml $m 0
161 done
162 bocamlc link.o
163 cobjs="$outd/link.o"
165 libs="str.cma unix.cma"
166 clibs="-L$mudir/build/native -lmupdf -lmupdfthird -lpthread"
167 if $darwin; then
168 mcomp=$(ocamlc -config | grep bytecomp_c_co | { read _ c; echo $c; })
169 clibs="$clibs -framework Cocoa -framework OpenGL"
170 bobjc main_osx.o
171 cobjs="$cobjs $outd/main_osx.o"
172 else
173 clibs="$clibs -lGL -lX11"
176 globjs=
177 for f in ml_gl ml_glarray ml_raw; do
178 bocamlc lablGL/$f.o
179 globjs="$globjs $outd/lablGL/$f.o"
180 done
182 ord=$(echo $(eval grep -v \.cmi $outd/ordered))
183 cmd="ocamlc -custom $libs -o $outd/llpp $cobjs $ord"
184 cmd="$cmd $globjs -cclib \"$clibs\""
185 keycmd="sum $outd/llpp $outd/link.o $ord"
186 isfresh "$outd/llpp" "$cmd$(eval $keycmd)" || {
187 echo linking $outd/llpp
188 eval $cmd || echo "$cmd failed"
189 echo "k='$cmd$(eval $keycmd)'" >$outd/llpp.past