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