1# 2# Copyright 2014, General Dynamics C4 Systems 3# 4# This software may be distributed and modified according to the terms of 5# the GNU General Public License version 2. Note that NO WARRANTY is provided. 6# See "LICENSE_GPLv2.txt" for details. 7# 8# @TAG(GD_GPL) 9# 10 11# $Id: Makefile,v 1.26 2009-04-21 05:40:29 gernot Exp $ 12# 13# To create a LaTeX diff against the CVS HEAD revision, use the target 14# "diff" (or "viewdiff"). 15# To use a revision other than HEAD, speciff DIFF=x on the 16# make command line to choose the revision x. 17# 18 19# This Makefile contains bash'isms. 20SHELL=bash 21 22.PHONY: all 23 24BIBDIR ?= /home/disy/lib/BibTeX:../../../bibtex 25LaTeXEnv = TEXINPUTS=".:/home/disy/lib/TeX:/home/disy/lib/ps:${TEXINPUTS}:" 26BibTexEnv = BIBINPUTS=".:${BIBDIR}:${BIBINPUTS}:" 27BibFiles = defs,extra,combined,theses,os-other 28 29LaTeX = ${LaTeXEnv} pdflatex -interaction=nonstopmode 30BibTeX = ${BibTexEnv} bibtex 31Fig2Eps = fig2dev -L eps 32Dia2Eps = dia -t eps -e 33GnuPlot = gnuplot 34Eps2Pdf = epstopdf --outfile 35PdfView = xpdf 36#PdfView = open -a preview 37#PdfView = acroread 38Lpr = lpr 39mv = mv 40awk = awk 41R = R 42doxygen = doxygen 43PYTHON ?= python 44 45# To add a second target, simply append the basename of the .tex file here 46Targets = manual 47 48 49# CONFIGURATION OPTIONS 50# ===================== 51 52# Extra figures that aren't supplied as dia, gnuplot or fig sources 53# (eg figures already supplied in PDF, or supplied in EPS). 54# List with PDF extensions: 55ExtraFigs= #imgs/eps-fig.pdf 56 57# Any other stuff that may be needed 58 59# END CONFIGURATION OPTIONS 60# ========================= 61 62Optional = $(addsuffix -diff, $(Targets)) 63All = $(Targets) $(Optional) 64Diffopts=--type=BWUNDERLINE #-c .latexdiffconfig --append-safecmd="Comment" 65 66Perf_Sources = $(wildcard imgs/*.perf) 67Dia_Sources = $(wildcard imgs/*.dia) 68Fig_Sources = $(wildcard imgs/*.fig) 69Gnuplot_Sources = $(wildcard imgs/*.gnuplot) 70R_Sources = $(wildcard imgs/*.r) 71Figures = $(Perf_Sources:.perf=.pdf) $(Dia_Sources:.dia=.pdf) $(Fig_Sources:.fig=.pdf) $(Gnuplot_Sources:.gnuplot=.pdf) $(R_Sources:.r=.pdf) $(ExtraFigs) 72 73Pdf = $(addsuffix .pdf, $(Targets)) 74Bib = references.bib 75Tex = $(addsuffix .tex, $(Targets)) 76Diff_Pdf = $(addsuffix .pdf, $(Optional)) 77 78DoxygenOutput = doxygen-output 79DoxygenXml = $(DoxygenOutput)/xml 80Stage = stage 81Libsel4Dir = ../libsel4 82 83GeneratedLatexDir = generated 84GeneratedLatex = $(wildcard $(GeneratedLatexDir)/*.tex) 85 86GeneratedMarkdownDir = generated_markdown 87GeneratedMarkdown = $(wildcard $(GeneratedMarkdownDir)/*.md) 88 89GenerationTool = tools/parse_doxygen_xml.py 90 91GenerateObjectInvocationTool = tools/gen_invocations.py 92 93InterfaceDtd = $(Libsel4Dir)/tools/sel4_idl.dtd 94 95.PHONY: FORCE 96 97all: pdf 98diff: diff_pdf 99FORCE: 100ps: $(Ps) 101pdf: generated-latex $(Figures) Makefile $(Pdf) 102diff_pdf: $(Figures) Makefile $(Diff_Pdf) 103markdown: generated-markdown 104 105# Verbosity. 106ifeq (${V},1) 107Q:= 108else 109Q:=@ 110endif 111 112.PHONY: doxygen generated-headers generated-latex generated-markdown 113 114doxygen: generated-headers 115 ${Q}$(doxygen) 116 117# Xml files generated by doxygen 118${DoxygenXml}/%.xml: doxygen 119 @echo "====> Generating $@" 120 121# Latex files translated from doxygen-generated xml 122${GeneratedLatexDir}/%SystemCalls.tex: ${DoxygenXml}/group__%SystemCalls.xml 123 @echo "====> Generating $@" 124 ${Q}${PYTHON} ${GenerationTool} --level 3 --input $< --output $@ 125 126${GeneratedLatexDir}/%.tex: ${DoxygenXml}/group__%.xml 127 @echo "====> Generating $@" 128 ${Q}${PYTHON} ${GenerationTool} --level 2 --input $< --output $@ 129 130# Collect generated latex files into single rule 131generated-latex: ${GeneratedLatexDir}/GeneralSystemCalls.tex \ 132 ${GeneratedLatexDir}/DebuggingSystemCalls.tex \ 133 ${GeneratedLatexDir}/BenchmarkingSystemCalls.tex \ 134 ${GeneratedLatexDir}/X86SystemCalls.tex \ 135 ${GeneratedLatexDir}/ObjectApi.tex \ 136 ${GeneratedLatexDir}/ObjectApiX86.tex \ 137 ${GeneratedLatexDir}/ObjectApiArm.tex \ 138 ${GeneratedLatexDir}/ObjectApiAarch32.tex \ 139 ${GeneratedLatexDir}/ObjectApiAarch64.tex \ 140 ${GeneratedLatexDir}/ObjectApiIa32.tex \ 141 ${GeneratedLatexDir}/ObjectApiX64.tex \ 142 ${GeneratedLatexDir}/ObjectApiRISCV.tex 143 144# Markdown files translated from doxygen-generated xml 145${GeneratedMarkdownDir}/%.md: ${DoxygenXml}/group__%.xml Makefile 146 @echo "====> Generating $@" 147 ${Q}${PYTHON} ${GenerationTool} --format markdown --level 2 --input $< --output $@ 148 149# Collect generated markdown files into single rule 150generated-markdown: ${GeneratedMarkdownDir}/GeneralSystemCalls.md \ 151 ${GeneratedMarkdownDir}/DebuggingSystemCalls.md \ 152 ${GeneratedMarkdownDir}/BenchmarkingSystemCalls.md \ 153 ${GeneratedMarkdownDir}/X86SystemCalls.md \ 154 ${GeneratedMarkdownDir}/ObjectApi.md \ 155 ${GeneratedMarkdownDir}/ObjectApiX86.md \ 156 ${GeneratedMarkdownDir}/ObjectApiArm.md \ 157 ${GeneratedMarkdownDir}/ObjectApiAarch32.md \ 158 ${GeneratedMarkdownDir}/ObjectApiAarch64.md \ 159 ${GeneratedMarkdownDir}/ObjectApiIa32.md \ 160 ${GeneratedMarkdownDir}/ObjectApiX64.md \ 161 ${GeneratedMarkdownDir}/ObjectApiRISCV.md 162 163# Generate object invocation prototypes 164${Stage}/object_invocations.h: ${Libsel4Dir}/include/interfaces/sel4.xml \ 165 ${Libsel4Dir}/arch_include/x86/interfaces/sel4arch.xml \ 166 ${Libsel4Dir}/arch_include/arm/interfaces/sel4arch.xml \ 167 ${Libsel4Dir}/sel4_arch_include/aarch32/interfaces/sel4arch.xml \ 168 ${Libsel4Dir}/sel4_arch_include/aarch64/interfaces/sel4arch.xml \ 169 ${Libsel4Dir}/sel4_arch_include/ia32/interfaces/sel4arch.xml \ 170 ${Libsel4Dir}/sel4_arch_include/x86_64/interfaces/sel4arch.xml \ 171 ${Libsel4Dir}/arch_include/riscv/interfaces/sel4arch.xml 172 @echo "====> Generating documented object invocation header" 173 ${Q}${PYTHON} ${GenerateObjectInvocationTool} --dtd ${InterfaceDtd} --output $@ $^ 174 175# Collect generated headers into single rule 176generated-headers: ${Stage}/object_invocations.h 177 178# Fetch information from the environment that needs to go into the document. 179env.tex: FORCE 180 @echo 'ENV ->' $@ 181 ${Q}${PYTHON} tools/gen_env.py $@ 182 183manual.pdf: VERSION env.tex manual.tex parts/*.tex parts/api/*.tex 184 185%.pdf: %.perf tools/bargraph.pl 186 @echo $< '->' $@ 187 ${Q}${BarGraph} -pdf $< > $@ 188 189%.pdf: %.eps 190 @echo $< '->' $@ 191 ${Q}${Eps2Pdf} $@ $< 192 193%.pdf: %.ps 194 @echo $< '->' $@ 195 ${Q}${Eps2Pdf} $@ $< 196 197%.eps: %.dia 198 @echo $< '->' $@ 199 ${Q}${Dia2Eps} $@ $< 200 201%.eps: %.fig 202 @echo $< '->' $@ 203 ${Q}${Fig2Eps} $< $@ 204 205%.eps: %.gnuplot 206 @echo $< '->' $@ 207 ${Q}${GnuPlot} $< 208 209%.eps: %.r 210 @echo $< '->' $@ 211 ${Q}${R} --vanilla < $< 212 213view: pdf 214 ${Q}for i in $(Pdf); do \ 215 $(PdfView) $$i & \ 216 done 217 218viewdiff: diff 219 ${Q}for i in $(Diff_Pdf); do \ 220 $(PdfView) $$i & \ 221 done 222 223print: pdf 224 ${Q}for i in $(Pdf); do \ 225 $(Lpr) $$i \ 226 done 227 228clean: 229 rm -f *.aux *.toc *.bbl *.blg *.dvi *.log *.pstex* *.eps *.cb *.brf \ 230 *.out *.ps *-diff.tex *.mps .log *.pdf *.tgz *~ *.lof *.lot env.tex 231 rm -rf ${DoxygenOutput} ${GeneratedLatexDir} ${GeneratedMarkdownDir} 232 rm -rf ${Stage} 233 234tar: clean 235 ( p=`pwd` && d=`basename "$$p"` && cd .. && \ 236 tar cfz $$d.tgz $$d && \ 237 mv $$d.tgz $$d ) 238 239help: 240 @echo "Main targets: all diff view viewdiff print clean tar" 241 @echo "'make diff' will show changes to head revision" 242 @echo "'make DIFF=<rev> diff' will show changes to revision <rev>" 243 244############################################################################## 245 246DIFF ?= tip 247 248%-diff.dvi: %-diff.tex 249 250%-diff.tex: %.tex FORCE 251 @echo "====> Retrieving revision $(DIFF) of $<" 252 ${Q}hg cat -r $(DIFF) $< > $(@:-diff.tex=-$(DIFF)-diff.tex) 253 @echo "====> Creating diff of revision $(DIFF) of $<" 254 ${Q}./tools/latexdiff $(Diffopts) $(@:-diff.tex=-$(DIFF)-diff.tex) $< > $@ 255 256.PHONY: FORCE 257FORCE: 258 259# don't delete %.aux intermediates 260.SECONDARY: 261 262############################################################################## 263 264Rerun = '(There were undefined references|Rerun to get (cross-references|the bars) right)' 265Rerun_Bib = 'No file.*\.bbl|Citation.*undefined' 266Undefined = '((Reference|Citation).*undefined)|(Label.*multiply defined)' 267Error = '^! ' 268 269# combine citation commands from all targets into tmp.aux, generate references.bib from this 270references.bib: $(addsuffix .tex, $(Targets)) env.tex 271 @echo "====> Parsing targets for references"; 272 ${Q}for i in $(Targets); do \ 273 $(LaTeX) $$i.tex >>.log; \ 274 cat $$i.aux | grep -e "\(citation\|bibdata\|bibstyle\)" | sed 's/bibdata{references}/bibdata{$(BibFiles)}/g' >> all_refs.aux; \ 275 done 276 @echo "====> Removing duplicate bib entries"; 277 ${Q}cat all_refs.aux | uniq > tmp.aux; 278 ${Q}diff references.aux tmp.aux > references.diff 2> /dev/null; \ 279 if [ -s references.diff ] && [ -e references.bib ]; then \ 280 echo "====> Changed references:"; \ 281 cat references.diff | grep "citation"; \ 282 echo -n "These will cause changes to references.bib, do you want to rebuild this file? (yes/no): "; \ 283 read rebuild_refs; \ 284 fi; \ 285 if [ "$$rebuild_refs" == "yes" ] || [ \! -e references.bib ]; then \ 286 echo "====> Building references.bib"; \ 287 $(BibTexEnv) ./tools/bibexport.sh -t -o references.bib tmp.aux > /dev/null 2> /dev/null; \ 288 cp tmp.aux references.aux; \ 289 fi; 290 ${Q}rm all_refs.aux tmp.aux references.diff 291 292%.pdf: %.tex references.bib $(Figures) Makefile 293 ${Q}if ! test -e $*.bbl || test $(Bib) -nt $*.bbl; then rm -f $*.bbl; fi 294 @echo "====> LaTeX first pass: $(<)" 295 ${Q}$(LaTeX) $< >.log || if egrep -q $(Error) $*.log ; then cat .log; rm $@; false ; fi 296 ${Q}if egrep -q $(Rerun_Bib) $*.log ; then echo "====> BibTex" && $(BibTeX) $* > /dev/null && echo "====> LaTeX BibTeX pass" && $(LaTeX) >.log $< ; fi 297 ${Q}if egrep -q $(Rerun) $*.log ; then echo "====> LaTeX rerun" && $(LaTeX) >.log $<; fi 298 ${Q}if egrep -q $(Rerun) $*.log ; then echo "====> LaTeX rerun" && $(LaTeX) >.log $<; fi 299 ${Q}if egrep -q $(Rerun) $*.log ; then echo "====> LaTeX rerun" && $(LaTeX) >.log $<; fi 300 @echo "====> Undefined references and citations in $(<):" 301 ${Q}egrep -i $(Undefined) $*.log || echo "None." 302 @echo "====> Dimensions:" 303 ${Q}grep "dimension:" $*.log || echo "None." 304 305############################################################################## 306# Generate a list of FIXMEs 307fixmes: 308 ${Q}for i in $(Tex); do \ 309 echo "FIXMEs in $$i:"; \ 310 nl -b a $$i | grep "FIXME{" | nl -b a; \ 311 echo -n "Total FIXMES: " && grep "FIXME{" $$i | wc -l; \ 312 echo; \ 313 done 314