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