Merge branch 'master' of git.martlubbers.net:msc-thesis1617
[msc-thesis1617.git] / build
1 #!/bin/bash
2 set -e
3 LATEXFLAGS="-file-line-error -halt-on-error"
4
5 docs=( thesis presentation )
6
7 log(){
8 echo $1 >&2
9 }
10
11 deps(){
12 [[ "$1" != *.tex && "$1" != *.pre ]] && fn="$1.tex" || fn="$1"
13 echo "$fn"
14 grep -Po '(?<=\\input{).*(?=})|(?<=\\include{).*(?=})' $fn |\
15 while read l; do deps "$l"; done
16 }
17
18 graphicdeps(){
19 grep -Pzo '\\includegraphics[%\t\n ]*(\[.*\])?[%\t\n ]*\{.*?\}' $1 |\
20 tr '\0' '\n' | grep -Po '(?<=\{).*?(?=\})' |\
21 while read l; do echo "$2/$l"; done
22 }
23
24 graphicspath(){
25 :
26 }
27
28 recompile(){
29 for dep in $(deps "$1"); do
30 if [ "$dep" -nt "$2" ]; then
31 log "$dep is newer than $2, thus recompiling"
32 return 0
33 fi
34 done
35 return 1
36 }
37
38 preamble(){
39 pdflatex $LATEXFLAGS -ini -jobname="$2" "&pdflatex $1\dump"
40 ret=$?
41 rm -f $2.pdf
42 [ $ret -ne 0 ] && exit 1
43 }
44
45 compile(){
46 pdflatex $LATEXFLAGS $1 || exit 1
47
48 if grep -q '^\\bibdata{' $1.aux
49 then bibtex $1 || exit 1
50 fi
51
52 if grep -q '\@istfilename' $1.aux
53 then makeglossaries $1 || exit 1
54 fi
55
56 if [ -f $1.idx ]
57 then makeindex $1 || exit 1
58 fi
59
60 tmpf=$(mktemp)
61 pdflatex $LATEXFLAGS $1 | tee $tmpf || exit 1
62
63 if grep -Fiq "Rerun" $tmpf
64 then pdflatex $LATEXFLAGS $1 || exit 1
65 fi
66
67 rm -vf $tmpf
68 }
69
70 pipeline(){
71 log "Processing $1"
72 if [ ! -f $1.tex ]; then
73 log "Skipping $1, no tex available"
74 else
75 # Check for preamble
76 [ -f preamble.tex ] && pre=preamble.tex
77 [ -f $1.pre ] && pre=$1.pre
78
79 if [ ! -z $pre ]; then
80 log "preamble found"
81 recompile $pre $1.fmt\
82 && preamble $pre $1\
83 || log "preamble up to date"
84 fi
85
86 # Compile document
87 recompile "$1.tex" "$1.pdf"\
88 && compile $1\
89 || log "document up to date"
90 fi
91 }
92
93 clean(){
94 while [ $# -ne 0 ]; do
95 log "Clean $1"
96 rm -fv $1.{acn,acr,alg,aux,bbl,blg,idl,idx,ilg,ind,fmt,glg,glo,gls,\
97 ist,loa,lof,log,lol,lot,nav,out,pdf,snm,tdo,toc,vrb}
98 shift
99 done
100 }
101
102 if [ $# -eq 0 ]; then
103 for doc in "${docs[@]}"; do
104 pipeline $doc
105 log ""
106 done
107 else
108 while [ $# -ne 0 ]; do
109 if [ $1 = "clean" ]; then
110 if [ $# -eq 2 ];
111 then clean $d
112 else clean "${docs[@]}"
113 fi
114 else
115 pipeline $1
116 fi
117 shift
118 done
119 fi
120