0a84c8f6dfd521197862145d5a56af87b21ad5ec
[msc-thesis1617.git] / build.sh
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 recompile(){
19 for dep in $(deps "$1"); do
20 [ "$dep" -nt "$2" ] && return 0
21 done
22 return 1
23 }
24
25 preamble(){
26 pdflatex $LATEXFLAGS -ini -jobname="$2" "&pdflatex $1\dump"
27 rm -f $2.pdf
28 }
29
30 compile(){
31 pdflatex $LATEXFLAGS $1
32 grep -q '^\\bibdata{' $1.aux && bibtex $1
33 grep -q '\@istfilename' $1.aux && makeglossaries $1
34 [ -f $1.idx ] && makeindex $1
35 tmpf=$(mktemp)
36 trap RETURN rm -v $tmpf
37 pdflatex $LATEXFLAGS $1 | tee $tmpf
38 grep -Fiq "Rerun" $tmpf && pdflatex $LATEXFLAGS $1
39 rm -vf $tmpf
40 }
41
42 pipeline(){
43 log "Processing $1"
44 if [ ! -f $1.tex ]; then
45 log "Skipping $1, no tex available"
46 else
47 # Check for preamble
48 [ -f preamble.tex ] && pre=preamble.tex
49 [ -f $1.pre ] && pre=$1.pre
50
51 if [ ! -z $pre ]; then
52 log "preamble found"
53 recompile $pre $1.fmt\
54 && preamble $pre $1\
55 || log "preamble up to date"
56 fi
57
58 # Compile document
59 recompile "$1.tex" "$1.pdf"\
60 && compile $1\
61 || log "document up to date"
62 fi
63 }
64
65 clean(){
66 while [ $# -ne 0 ]; do
67 log "Clean $1"
68 rm -fv $1.{acn,acr,alg,aux,bbl,blg,idl,idx,ilg,ind,fmt,glg,glo,gls,\
69 ist,loa,lof,log,lol,lot,nav,out,pdf,snm,tdo,toc}
70 shift
71 done
72 }
73
74 if [ $# -eq 0 ]; then
75 for doc in "${docs[@]}"; do
76 pipeline $doc
77 log ""
78 done
79 else
80 while [ $# -ne 0 ]; do
81 if [ $1 = "clean" ]; then
82 if [ $# -eq 2 ];
83 then clean $d
84 else clean "${docs[@]}"
85 fi
86 else
87 pipeline $1
88 fi
89 shift
90 done
91 fi
92