Added possibility of running bibtex for tech notes.
[barrelfish] / tools / run-pdflatex.sh
1 ##########################################################################
2 # Copyright (c) 2010, ETH Zurich.
3 # All rights reserved.
4 #
5 # This file is distributed under the terms in the attached LICENSE file.
6 # If you do not find this file, copies can be found by writing to:
7 # ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
8 ##########################################################################
9 #
10 # run-pdflatex.sh: helper script to build Barrelfish technical notes
11
12 # This script wraps up pdflatex into something that can be entirely
13 # controlled by command-line options, making it considerably easier to
14 # invoke from a Makefile or Hakefile.
15
16 # In some ways this is a poor relation to rubber, but it doesn't
17 # require any support packages (not even Python), and is specifically
18 # tailored to the kinds of filesystem naming games that Hake likes to
19 # play.  That said, it's completely independent of Hake, and usable
20 # standalone.
21
22 #
23 # Usage summary
24 #
25 usage () {
26     cat >&1 <<EOF
27 Usage: $0 <options>
28         --input-tex <filename>
29         --working-dir <dir>
30         --output-pdf <filename>
31         (--texinput <dir>)*
32         (--bininput <dir>)*
33         [--has-bib]
34 EOF
35     exit 1
36 }
37
38
39 # Shorthand for running pdflatex.  This is nicer than using a single
40 # shell variable as it always gets the quoting right.
41 #
42 run_latex () {
43 #    echo "dirs: $WORKING_DIR, $JOB_NAME, $INPUT_TEX, $TEXINPUTS, $BIBINPUTS" \
44     pdflatex \
45         -interaction=nonstopmode \
46         -file-line-error \
47         -output-directory "$WORKING_DIR" \
48         -jobname "$JOB_NAME" \
49         "$INPUT_TEX" || exit
50 }
51
52 #
53 # Work out how to construct TEXINPUTS and BIBINPUTS paths, according
54 # to Cygwin or not.
55 #
56 case "`which pdflatex`" in
57     /cygdrive/*) _ISCYGWIN=Yes ;;
58 esac
59
60 cons_inputs() {
61     if [ -z "$_ISCYGWIN" ] ; then
62         echo "${1}${2}//:" 
63     else
64         echo "${1}${2}//\\;"
65     fi
66 }
67
68
69 # Initial values for input arguments
70 #
71 if [ -z "$TEXINPUTS" ]; then
72     TEXINPUTS=`cons_inputs "" "."`
73 else
74     TEXINPUTS=`cons_inputs "$TEXINPUTS" "."`
75 fi
76
77 # echo "TEXinputs is $TEXINPUTS"
78 # exit
79
80 BIBINPUTS=`cons_inputs "" "."`
81 INPUT_TEX=
82 WORKING_DIR=
83 OUTPUT_PDF=
84 HAS_BIB=
85 HAS_GLO=
86
87 #
88 # Argument processing.
89 #
90 while [ -n "$*" ]; do 
91     case $1 in
92         --input-tex)
93             shift; INPUT_TEX=$1 ;;
94         --output-pdf)
95             shift; OUTPUT_PDF="$1" ;;
96         --working-dir)
97             shift; WORKING_DIR="$1" ;;
98         --texinput)
99             shift; TEXINPUTS=`cons_inputs "$TEXINPUTS" "$1"` ;;
100         --bibinput)
101             shift; BIBINPUTS=`cons_inputs "$BIBINPUTS" "$1"` ;;
102         --has-bib)
103             HAS_BIB=Yes ;;
104         --has-glo)
105             HAS_GLO=Yes ;;
106         *)
107             usage ;;
108     esac
109     shift
110 done
111 if [ -z "$INPUT_TEX" ] ; then usage ; fi
112 if [ -z "$WORKING_DIR" ] ; then usage ; fi
113 if [ -z "$OUTPUT_PDF" ] ; then usage ; fi
114
115 #
116 # Calculate all the other stuff we need.
117 #
118 INPUT_DIR=`dirname "$INPUT_TEX"`
119 INPUT_BASE=`basename "$INPUT_TEX" .tex`
120 TEXINPUTS=`cons_inputs "$TEXINPUTS" "$INPUT_DIR"`
121 BIBINPUTS=`cons_inputs "$BIBINPUTS" "$INPUT_DIR"`
122 export TEXINPUTS
123 export BIBINPUTS
124
125
126 # We use a different jobname due to parallel Make paranoia: it's a
127 # good idea if the output file that we really care out only appears as
128 # the last step of the build.  This also allows us to specify
129 # different directories for the final PDF file and the intermediate
130 # working files, something (apparently) not possible within pdflatex.
131 #
132 JOB_NAME="${INPUT_BASE}.tmp"
133 # the man page for bibtex specifically reads
134 # "the filename on the command line must be given without the .aux extension"
135 AUX_FILE_WITHOUT_AUX="$WORKING_DIR/${JOB_NAME}"
136 AUX_FILE="$WORKING_DIR/${JOB_NAME}.aux"
137 HST_FILE="$WORKING_DIR/${JOB_NAME}.hst"
138 LOG_FILE="$WORKING_DIR/${JOB_NAME}.log"
139 TOC_FILE="$WORKING_DIR/${JOB_NAME}.toc"
140 BBL_FILE="$WORKING_DIR/${JOB_NAME}.bbl"
141 BLG_FILE="$WORKING_DIR/${JOB_NAME}.blg"
142 VER_FILE="$WORKING_DIR/${JOB_NAME}.ver"
143 GLO_FILE="$WORKING_DIR/${JOB_NAME}.glo"
144 ACN_FILE="$WORKING_DIR/${JOB_NAME}.acn"
145 IST_FILE="$WORKING_DIR/${JOB_NAME}.ist"
146 PDF_FILE="$WORKING_DIR/${JOB_NAME}.pdf"
147
148 #
149 # And, finally, do what the old Makefile used to do. 
150 #
151 # bibtex on cygwin can be miktex which always 0 exit code
152 run_latex
153 if [ -n "$HAS_BIB" ]; then (bibtex $AUX_FILE_WITHOUT_AUX && test -r $BBL_FILE)  || exit; echo run_latex; fi
154 if [ -n "$HAS_GLO" ]; then (makeglossaries -s $IST_FILE $GLO_FILE && makeglossaries -s $IST_FILE $ACN_FILE && test -r $GLO_FILE)  || exit; echo run_latex; fi
155 if [ -e "$TOC_FILE" -o -e "$BBL_FILE" -o -e "$VER_FILE" -o -e "$GLO_FILE" -o -e "$ACN_FILE" ]; then run_latex; fi
156 while egrep Rerun "$LOG_FILE"; do run_latex; done
157 rm -f "$AUX_FILE" "$HST_FILE" "$LOG_FILE" "$TOC_FILE" "$BBL_FILE" 
158 rm -f "$BLG_FILE" "$VER_FILE" 
159 rm -f "$GLO_FILE" "$ACN_FILE" "$IST_FILE"
160 mv "$PDF_FILE" "$OUTPUT_PDF"
161 echo "Output file is in $OUTPUT_PDF"