c99 (w/o _GNU_SOURCE)
[llpp.git] / build.sh
blob186e25dc58c0e44b7231f520ab67466d551829d5
1 #!/bin/sh
2 set -eu
4 date --version | grep -q "GNU" && dfmt="%s.%N" || dfmt="%s"
5 now() { date +$dfmt; }
7 tstart=$(now)
8 vecho=${vecho-:}
9 command -v md5sum >/dev/null && alias sum='md5sum 2>/dev/null'
11 partmsg() {
12 test $? -eq 0 && msg="ok" || msg="ko"
13 echo "$msg $(echo "scale=3; ($(now) - $tstart)/1" | bc -l) sec"
16 die() {
17 echo "$*" >&2
18 exit 111
21 trap 'partmsg' EXIT
23 test -n "$1" || die "usage: $0 build-directory"
25 outd=$1
26 srcd=$PWD
27 mudir=$srcd/mupdf
28 muinc="-I $mudir/include -I $mudir/thirdparty/freetype/include"
30 isfresh() {
31 test -e "$1" && test -r "$1.past" && {
32 . "$1.past"
33 test "$k" = "$2"
37 oflags() {
38 case "${1#$outd/}" in
39 main.cmo|utils.cmo|config.cmo|parser.cmo|wsi.cmi|wsi/x11/wsi.cmo)
40 f="-g -strict-sequence -strict-formats -warn-error a";;
41 *) f="-g";;
42 esac
43 echo "-I lablGL -I $outd/lablGL -I wsi/x11 -I $outd/wsi/x11 -I $outd $f"
46 cflags() {
47 case "${1#$outd/}" in
48 link.o)
49 echo "-g -std=c99 -O2 $muinc -Wall -Werror -pedantic-errors";;
50 *) echo "-g -O2";;
51 esac
54 bocaml1() {
55 eval ocamlc -depend -bytecode -one-line $incs $s | {
56 read _ _ depl
57 for d in $(eval echo $depl); do
58 bocaml ${d#$srcd/} $((n+1))
59 done
61 cmd="ocamlc $(oflags $o) -c -o $o $s"
62 keycmd="sum $o $s"
63 grep -q "$o" $outd/ordered || {
64 echo "$o" >>$outd/ordered
65 isfresh "$o" "$cmd$(eval $keycmd)" || {
66 printf "%*.s%s -> %s\n" $n '' "${s#$srcd/}" "$o"
67 eval "$cmd"
68 echo "k='$cmd$(eval $keycmd)'" >$o.past
69 } && $vecho "fresh '$o'"
73 bocaml() (
74 o="$1"
75 n="$2"
76 wocmi="${o%.cmi}"
77 test ${wocmi%help.cmo} != $wocmi && {
78 s=$outd/help.ml
79 o=$outd/help.cmo
80 } || {
81 test "$o" = "$wocmi" && s=$srcd/${o%.cmo}.ml || s=$srcd/$wocmi.mli
82 o=$outd/$o
84 incs="-I lablGL -I $outd/lablGL -I wsi/x11 -I $outd/wsi/x11 -I $outd"
85 bocaml1 "$s" "$o"
88 bocamlc() {
89 o=$outd/$1
90 s=$srcd/${1%.o}.c
91 cmd="ocamlc -ccopt \"$(cflags $o) -MMD -MF $o.dep -MT_ -o $o\" $s"
92 test -r $o.dep && read _ d <$o.dep || d=
93 keycmd='sum $o $d'
94 isfresh "$o" "$cmd$(eval $keycmd)" || {
95 printf "%s -> %s\n" "${s#$srcd/}" "$o"
96 eval "$cmd"
97 read _ d <$o.dep
98 echo "k='$cmd$(eval $keycmd)'" >$o.past
102 mkdir -p $outd/wsi/x11
103 mkdir -p $outd/lablGL
104 :>$outd/ordered
106 mkhelp() {
107 ocaml str.cma -stdin $srcd/KEYS <<EOF
108 let fixup = let open Str in
109 let dash = regexp {|\([^ ]*\) +- +\(.*\)|}
110 and head = regexp {|-----\(.*\)-----|} in fun s ->
111 String.escaped s |> global_replace dash {|\1\t\2|}
112 |> global_replace head {|\xc2\xb7\1|};;
113 let rec iter ic = match input_line ic with
114 | s -> Printf.printf "\"%s\";\\n" @@ fixup s; iter ic
115 | exception End_of_file -> ();;
116 Printf.printf "let keys = [\\n";
117 iter @@ open_in Sys.argv.(1);;
118 Printf.printf "] and version = \"$ver\";;"
122 ver=$(cd $srcd && git describe --tags) || echo unknown
123 cmd="mkhelp >$outd/help.ml"
124 keycmd="sum $srcd/KEYS; echo $ver"
125 isfresh "$outd/help.ml" '$cmd$(eval keycmd)$ver' || {
126 eval $cmd
127 echo "k='$cmd$(eval $keycmd)$ver'" >$outd/help.ml.past
130 for m in lablGL/glMisc.cmo lablGL/glTex.cmo wsi/x11/wsi.cmo main.cmo; do
131 bocaml $m 0
132 done
133 bocamlc link.o
135 libs="str.cma unix.cma"
136 clibs="-lGL -lX11 -L$mudir/build/native -lmupdf -lmupdfthird -lpthread"
137 globjs=
138 for f in ml_gl ml_glarray ml_raw; do
139 bocamlc lablGL/$f.o
140 globjs="$globjs $outd/lablGL/$f.o"
141 done
143 ord=$(echo $(eval grep -v \.cmi $outd/ordered))
144 cmd="ocamlc -custom $libs -o $outd/llpp $ord"
145 cmd="$cmd $globjs $outd/link.o -cclib \"$clibs\""
146 keycmd="sum $outd/llpp $ord"
147 isfresh "$outd/llpp" "$cmd$(eval $keycmd)" || {
148 echo linking $outd/llpp
149 eval $cmd
150 echo "k='$cmd$(eval $keycmd)'" >$outd/llpp.past