blob: 29d7c99f15636079b744227f5077bd37191d01b8 [file] [log] [blame]
LATEX ?= pdflatex
WHICH = command -v
GITREFSTAGS := $(shell ls -d .git/refs/tags 2>/dev/null)
LATEXSOURCES = \
perfbook-lt.tex \
legal.tex \
summary.tex \
glossary.tex \
qqz.sty origpub.sty \
glsdict.tex indexsee.tex \
pfbook.cls \
ushyphex.tex pfhyphex.tex \
ack.tex \
*/*.tex \
*/*/*.tex
LST_SOURCES := $(wildcard CodeSamples/formal/promela/*.lst) \
$(wildcard appendix/styleguide/*.c)
SUB_QQZ := qqzhowto.tex qqzintro.tex qqzcpu.tex qqztoolsoftrade.tex \
qqzcount.tex qqzSMPdesign.tex qqzlocking.tex qqzowned.tex \
qqzdefer.tex qqzdatastruct.tex qqzdebugging.tex qqzformal.tex \
qqztogether.tex qqzadvsync.tex qqzmemorder.tex qqzeasy.tex \
qqzfuture.tex qqzquestions.tex qqztoyrcu.tex qqzwhymb.tex
LATEXGENERATED = autodate.tex qqz.tex contrib.tex origpub.tex sub_qqz
# Note: Empty target "sub_qqz" is used on behalf of $(SUB_QQZ) to prevent
# parallel runs of divideqqz.pl.
TWOCOLTARGETS := mstx msr msn msnt sf nq sfnq ix df
EBTARGETS := $(foreach v,nq sf sfnq ix df,eb$(v))
ABBREVTARGETS := lt hb a4 1c tcb msns mss eb $(TWOCOLTARGETS) $(foreach v,$(TWOCOLTARGETS),1c$(v)) $(EBTARGETS)
PDFTARGETS := perfbook.pdf $(foreach v,$(ABBREVTARGETS),perfbook-$(v).pdf)
GENERATED_MAIN := $(filter-out perfbook-lt.tex,$(foreach v,$(ABBREVTARGETS),perfbook-$(v).tex)) perfbook.tex
EPSSOURCES_FROM_TEX := \
SMPdesign/DiningPhilosopher5.eps \
SMPdesign/DiningPhilosopher5TB.eps \
SMPdesign/DiningPhilosopher4part-b.eps \
SMPdesign/DiningPhilosopher5PEM.eps
PDFTARGETS_OF_TEX := $(EPSSOURCES_FROM_TEX:%.eps=%.pdf)
DOTSOURCES := $(wildcard */*.dot)
EPSSOURCES_FROM_DOT := $(DOTSOURCES:%.dot=%.eps)
FIGSOURCES := $(wildcard */*.fig) $(wildcard */*/*.fig)
EPSSOURCES_FROM_FIG := $(FIGSOURCES:%.fig=%.eps)
SVGSOURCES_ALL := $(wildcard */*.svg)
SVG_EMERGENCY := $(wildcard */*.svg*.svg)
SVG_GENERATED := CodeSamples/formal/data/RCU-test-ratio.svg
SVGSOURCES := $(filter-out $(SVG_EMERGENCY) $(SVG_GENERATED),$(SVGSOURCES_ALL)) $(SVG_GENERATED)
FAKE_EPS_FROM_SVG := $(SVGSOURCES:%.svg=%.eps)
PDFTARGETS_OF_SVG := $(SVGSOURCES:%.svg=%.pdf)
PDFTARGETS_OF_SVG_CROP := CodeSamples/formal/data/RCU-test-ratio-crop.pdf
OBSOLETE_FILES = extraction $(FAKE_EPS_FROM_SVG) CodeSamples/snippets.mk
EPSSOURCES_DUP := \
$(wildcard */*.eps) \
$(wildcard */*/*.eps) \
$(wildcard */*/*/*.eps) \
$(wildcard */*/*/*/*.eps) \
$(wildcard */*/*/*/*/*.eps) \
$(EPSSOURCES_FROM_TEX) \
$(EPSSOURCES_FROM_DOT) \
$(EPSSOURCES_FROM_FIG)
EPSSOURCES_TMP := \
$(wildcard */*__.eps) \
$(wildcard */*/*__.eps) \
$(wildcard */*/*/*__.eps) \
$(wildcard */*/*/*/*__.eps) \
$(wildcard */*/*/*/*/*__.eps) \
EPSSOURCES_OLD := \
$(wildcard CodeSamples/*/*/OLD-*/*.eps) \
$(wildcard CodeSamples/*/*/OLD-*/*/*.eps) \
$(wildcard CodeSamples/*/*/*/OLD-*/*.eps) \
$(wildcard CodeSamples/*/*/*/OLD-*/*/*.eps)
EPSSOURCES := $(sort $(filter-out $(EPSSOURCES_OLD) $(OBSOLETE_FILES) $(EPSSOURCES_TMP),$(EPSSOURCES_DUP)))
PDFTARGETS_OF_EPS := $(EPSSOURCES:%.eps=%.pdf)
EPSORIGIN := $(filter-out $(EPSSOURCES_FROM_TEX) $(EPSSOURCES_FROM_DOT) $(EPSSOURCES_FROM_FIG),$(EPSSOURCES))
GNUPLOT_ORIG := $(shell grep -l gnuplot $(EPSORIGIN))
GNUPLOT_ORIG_NOFIXFONTS := $(shell grep -l '/FontMatrix' $(GNUPLOT_ORIG))
GNUPLOT_ORIG_NEEDFIXFONTS := $(filter-out $(GNUPLOT_ORIG_NOFIXFONTS),$(GNUPLOT_ORIG))
EPSORIG_NOFIXFONTS := $(filter-out $(GNUPLOT_ORIG_NEEDFIXFONTS),$(EPSORIGIN))
PDFTARGETS_OF_EPSORIG := $(EPSORIGIN:%.eps=%.pdf)
PDFTARGETS_OF_GNUPLOT_NEEDFIXFONTS := $(GNUPLOT_ORIG_NEEDFIXFONTS:%.eps=%.pdf)
PDFTARGETS_OF_EPSORIG_NOFIXFONTS := $(EPSORIG_NOFIXFONTS:%.eps=%.pdf)
PDFTARGETS_OF_EPSOTHER := $(filter-out $(PDFTARGETS_OF_EPSORIG) $(PDFTARGETS_OF_TEX),$(PDFTARGETS_OF_EPS))
BIBSOURCES := bib/*.bib alphapf.bst
# required commands
SED ?= sed
LATEX_CMD := $(shell $(WHICH) $(LATEX) 2>/dev/null)
DOT := $(shell $(WHICH) dot 2>/dev/null)
FIG2EPS := $(shell $(WHICH) fig2eps 2>/dev/null)
FIG2DEV := $(shell $(WHICH) fig2dev 2>/dev/null)
INKSCAPE := $(shell $(WHICH) inkscape 2>/dev/null)
ifdef INKSCAPE
INKSCAPE_ONE := $(shell inkscape --version 2>/dev/null | grep -c "Inkscape 1")
endif
# rsvg-convert is preferred to inkscape in SVG --> PDF conversion
RSVG_CONVERT := $(shell $(WHICH) rsvg-convert 2>/dev/null)
ifdef RSVG_CONVERT
RSVG_CONVERT_VER := $(shell rsvg-convert --version | $(SED) -e 's/rsvg-convert version //')
RSVG_CONVERT_VER_MINOR := $(shell echo $(RSVG_CONVERT_VER) | $(SED) -E -e 's/^([0-9]+\.[0-9]+).*/\1/')
RSVG_CONVERT_GOOD_VER ?= 2.57
RSVG_CONVERT_PDFFMT_VER := 2.57
RSVG_CONVERT_ACCEPTABLE_VER := 2.52
RSVG_CONVERT_GOOD := $(shell echo $(RSVG_CONVERT_VER_MINOR) $(RSVG_CONVERT_GOOD_VER) | awk '{if ($$1 >= $$2) print 1;}')
RSVG_CONVERT_ACCEPTABLE := $(shell echo $(RSVG_CONVERT_VER_MINOR) $(RSVG_CONVERT_ACCEPTABLE_VER) | awk '{if ($$1 == $$2) print 1;}')
ifeq ($(RSVG_CONVERT_ACCEPTABLE),1)
RSVG_CONVERT_GOOD := 1
endif
ifndef INKSCAPE
RSVG_CONVERT_GOOD := 1
endif
RSVG_CONVERT_PDFFMT := $(shell echo $(RSVG_CONVERT_VER_MINOR) $(RSVG_CONVERT_PDFFMT_VER) | awk '{if ($$1 >= $$2) print 1;}')
ifeq ($(RSVG_CONVERT_GOOD),1)
SVG_PDF_CONVERTER = (rsvg-convert v$(RSVG_CONVERT_VER))
else
SVG_PDF_CONVERTER = (inkscape)
endif
ifeq ($(RSVG_CONVERT_PDFFMT),1)
RSVG_FMT_OPT := --format=pdf1.5
else
RSVG_FMT_OPT := --format=pdf
endif
else
SVG_PDF_CONVERTER = (inkscape)
endif
LATEXPAND := $(shell $(WHICH) latexpand 2>/dev/null)
QPDF := $(shell $(WHICH) qpdf 2>/dev/null)
GNUPLOT := $(shell $(WHICH) gnuplot 2>/dev/null)
# required fonts
STEELFONT := $(shell fc-list | grep -c -i steel)
URWPS := $(shell fc-list | grep "Nimbus Mono PS" | wc -l)
# required font packages
FONTPACKAGES := $(shell kpsewhich newtxtext.sty nimbusmono.sty newtxtt.sty newtxsf.sty inconsolata.sty couriers.sty)
NEWTXTEXT := $(findstring newtxtext,$(FONTPACKAGES))
NIMBUSMONO := $(findstring nimbusmono,$(FONTPACKAGES))
NEWTXTT := $(findstring newtxtt,$(FONTPACKAGES))
COURIERS := $(findstring couriers,$(FONTPACKAGES))
NEWTXSF := $(findstring newtxsf,$(FONTPACKAGES))
INCONSOLATA := $(findstring inconsolata,$(FONTPACKAGES))
FREESANS := $(shell fc-list | grep FreeSans | wc -l)
DEJAVUSANS := $(shell fc-list | grep "DejaVu Sans" | grep -v "DejaVu Sans Mono" | wc -l)
DEJAVUMONO := $(shell fc-list | grep "DejaVu Sans Mono" | wc -l)
LIBERATIONSANS := $(shell fc-list | grep "Liberation Sans" | wc -l)
LIBERATINOMONO := $(shell fc-list | grep "Liberation Mono" | wc -l)
# for line break in error text
define n
endef
ifeq ($(URWPS),0)
FIXSVGFONTS = utilities/fixsvgfonts.sh
FIXANEPSFONTS = utilities/fixanepsfonts.sh
FIXFONTS = utilities/fixfonts.sh
else
FIXSVGFONTS = utilities/fixsvgfonts-urwps.sh
FIXANEPSFONTS = utilities/fixanepsfonts-urwps.sh
FIXFONTS = utilities/fixfonts-urwps.sh
endif
ifeq ($(FREESANS),0)
RECOMMEND_FREEFONT := 1
else
RECOMMEND_FREEFONT := 0
endif
ifeq ($(DEJAVUSANS),0)
RECOMMEND_DEJAVUSANS := 1
else
RECOMMEND_DEJAVUSANS := 0
endif
ifeq ($(DEJAVUMONO),0)
RECOMMEND_DEJAVUMONO := 1
else
RECOMMEND_DEJAVUMONO := 0
endif
ifeq ($(LIBERATIONSANS),0)
RECOMMEND_LIBERATIONSANS := 1
else
RECOMMEND_LIBERATIONSANS := 0
endif
ifeq ($(LIBERATIONMONO),0)
RECOMMEND_LIBERATIONMONO := 1
else
RECOMMEND_LIBERATIONMONO := 0
endif
STEELFONTID := $(shell fc-list | grep -i steel | grep -c Steel)
LINELABEL_ENV_BEGIN := $(shell grep -l -F '\begin{linelabel}' $(LATEXSOURCES))
LINELABEL_ENV_END := $(shell grep -l -F '\end{linelabel}' $(LATEXSOURCES))
LINEREF_ENV_BEGIN := $(shell grep -l -F '\begin{lineref}' $(LATEXSOURCES))
LINEREF_ENV_END := $(shell grep -l -F '\end{lineref}' $(LATEXSOURCES))
LINELABEL_ENV := $(sort $(LINELABEL_ENV_BEGIN) $(LINELABEL_ENV_END))
LINEREF_ENV := $(sort $(LINEREF_ENV_BEGIN) $(LINEREF_ENV_END))
SOURCES_OF_SNIPPET_ALL := $(shell grep -r -l -F '\begin{snippet}' CodeSamples)
SOURCES_OF_LITMUS := $(shell grep -r -l -F '\begin[snippet]' CodeSamples)
SOURCES_OF_LTMS := $(patsubst %.litmus,%.ltms,$(SOURCES_OF_LITMUS))
SOURCES_OF_SNIPPET := $(filter-out $(SOURCES_OF_LTMS),$(SOURCES_OF_SNIPPET_ALL)) $(SOURCES_OF_LITMUS)
GEN_SNIPPET_D = utilities/gen_snippet_d.pl utilities/gen_snippet_d.sh utilities/precheck.sh
default = $(PERFBOOK_DEFAULT)
ifeq ($(default),)
targ = perfbook.pdf
else
targ = $(default)
endif
chkpagegroup = $(PERFBOOK_CHKPAGEGROUP)
ifeq ($(PERFBOOK_PAPER),A4)
PERFBOOK_BASE = perfbook-a4.tex
else
ifeq ($(PERFBOOK_PAPER),HB)
PERFBOOK_BASE = perfbook-hb.tex
else
PERFBOOK_BASE = perfbook-lt.tex
endif
endif
BASE_DEPENDS := perfbook.tex $(foreach v,tcb 1c msns mss mstx msr msn msnt sf nq ix df,perfbook-$(v).tex)
.PHONY: all touchsvg clean distclean neatfreak 2c ls-unused $(ABBREVTARGETS)
.PHONY: mslm perfbook-mslm.pdf mslmmsg
.PHONY: qq perfbook-qq.pdf qqmsg
.PHONY: help help-official help-full help-semiofficial help-paper help-draft
.PHONY: help-experimental help-prefixed
.PHONY: paper-clean periodcheck punctcheck punctcheck-auto
.PHONY: cleanfigs cleanfigs-eps cleanfigs-svg figs precheck
all: punctcheck-auto
ifeq ($(MAKECMDGOALS),clean)
else ifeq ($(MAKECMDGOALS),distclean)
else ifeq ($(MAKECMDGOALS),neatfreak)
else ifeq ($(MAKECMDGOALS),precheck)
else
include CodeSamples/snippets.d
endif
2c: perfbook.pdf
mslm: perfbook-mslm.pdf
perfbook-mslm.pdf: mslmmsg
qq: perfbook-qq.pdf
perfbook-qq.pdf: qqmsg
mslmmsg: perfbook.pdf
@echo "perfbook-mslm.pdf is promoted to default target,"
@echo "built as perfbook.pdf."
qqmsg: perfbook.pdf
@echo "perfbook-qq.pdf is promoted to default target,"
@echo "built as perfbook.pdf."
$(PDFTARGETS): %.pdf: %.tex %.bbl
ifeq ($(LATEX_CMD),)
$(error LaTeX engine "$(LATEX)" not found.)
endif
LATEX=$(LATEX) sh utilities/runlatex.sh $(basename $@)
$(PDFTARGETS:.pdf=.bbl): %.bbl: %.aux $(BIBSOURCES)
bibtex $(basename $@)
$(PDFTARGETS:.pdf=.aux): %.aux: %.tex $(LATEXGENERATED)
ifeq ($(NEWTXTEXT),)
$(error Font package 'newtx' not found. See #9 in FAQ-BUILD.txt)
endif
ifeq ($(LATEX_CMD),)
$(error LaTeX engine "$(LATEX)" not found.)
endif
LATEX=$(LATEX) sh utilities/runfirstlatex.sh $(basename $@)
autodate.tex: $(LATEXSOURCES) $(BIBSOURCES) $(LST_SOURCES) \
$(PDFTARGETS_OF_EPS) $(PDFTARGETS_OF_SVG) $(PDFTARGETS_OF_SVG_CROP) \
$(FCVSNIPPETS) $(FCVSNIPPETS_VIA_LTMS) \
$(GITREFSTAGS) utilities/autodate.sh
sh utilities/autodate.sh
perfbook_flat.tex: autodate.tex
ifndef LATEXPAND
$(error --> $@: latexpand not found. Please install it)
endif
@if [ ! -z "$(LINELABEL_ENV)" -a "$(LINELABEL_ENV)" != " " ]; then \
echo "'linelabel' used as environment in $(LINELABEL_ENV)." ; \
echo "------" ; \
grep -n -B 2 -A 2 -F 'linelabel' $(LINELABEL_ENV) ; \
echo "------" ; \
echo "Substitute 'fcvlabel' for 'linelabel' in $(LINELABEL_ENV)." ; \
exit 1 ; \
fi
@if [ ! -z "$(LINEREF_ENV)" -a "$(LINEREF_ENV)" != " " ]; then \
echo "'lineref' used as environment in $(LINEREF_ENV)." ; \
echo "------" ; \
grep -n -B 2 -A 2 -F 'lineref' $(LINEREF_ENV) ; \
echo "------" ; \
echo "Substitute 'fcvref' for 'lineref' in $(LINEREF_ENV)." ; \
exit 1 ; \
fi
echo > qqz.tex
echo > contrib.tex
echo > origpub.tex
latexpand --empty-comments perfbook-lt.tex 1> $@ 2> /dev/null
qqz.tex: perfbook_flat.tex
sh utilities/extractqqz.sh < $< | perl utilities/qqzreorder.pl > $@
contrib.tex: perfbook_flat.tex qqz.tex
cat $^ | sh utilities/extractcontrib.sh > $@
origpub.tex: perfbook_flat.tex
sh utilities/extractorigpub.sh < $< > $@
# Empty target to generate $(SUB_QQZ) files
sub_qqz: qqz.tex
utilities/divideqqz.pl
@touch sub_qqz
perfbook.tex: $(PERFBOOK_BASE)
cp $< $@
perfbook-tcb.tex: $(PERFBOOK_BASE)
sed -e 's/{tblcptop}{true}/{tblcptop}{false}/' < $< > $@
perfbook-1c.tex: $(PERFBOOK_BASE)
sed -e 's/setboolean{twocolumn}{true}/setboolean{twocolumn}{false}/' < $< > $@
perfbook-hb.tex: perfbook-lt.tex
sed -e 's/setboolean{hardcover}{false}/setboolean{hardcover}{true}/' < $< > $@
perfbook-eb.tex: perfbook-lt.tex
sed -e 's/setboolean{ebooksize}{false}/setboolean{ebooksize}{true}/' \
-e 's/setboolean{twocolumn}{true}/setboolean{twocolumn}{false}/' < $< > $@
perfbook-msns.tex: $(PERFBOOK_BASE)
sed -e 's/%msfontstub/\\usepackage{courier}/' < $< > $@
perfbook-mss.tex: $(PERFBOOK_BASE)
ifeq ($(COURIERS),)
$(error Font package 'courier-scaled' not found. See #9 in FAQ-BUILD.txt)
endif
sed -e 's/%msfontstub/\\usepackage[scaled=.94]{couriers}/' < $< > $@
perfbook-mstx.tex: $(PERFBOOK_BASE)
perfbook-1cmstx.tex: perfbook-1c.tex
perfbook-mstx.tex perfbook-1cmstx.tex:
sed -e 's/%msfontstub/\\renewcommand*\\ttdefault{txtt}/' < $< > $@
perfbook-msr.tex: $(PERFBOOK_BASE)
perfbook-1cmsr.tex: perfbook-1c.tex
perfbook-msr.tex perfbook-1cmsr.tex:
ifeq ($(NIMBUSMONO),)
$(error Font package 'nimbus15' not found. See #9 in FAQ-BUILD.txt)
endif
sed -e 's/%msfontstub/\\usepackage[scaled=.94]{nimbusmono}/' \
-e 's/{nimbusavail}{false}/{nimbusavail}{true}/' < $< > $@
perfbook-msn.tex: $(PERFBOOK_BASE)
perfbook-1cmsn.tex: perfbook-1c.tex
perfbook-msn.tex perfbook-1cmsn.tex:
ifeq ($(NIMBUSMONO),)
$(error Font package 'nimbus15' not found. See #9 in FAQ-BUILD.txt)
endif
sed -e 's/\\renewcommand\*\\ttdefault{lmtt}//' \
-e 's/{lmttforcode}{true}/{lmttforcode}{false}/' \
-e 's/{nimbusavail}{false}/{nimbusavail}{true}/' < $< > $@
perfbook-msnt.tex: $(PERFBOOK_BASE)
perfbook-1cmsnt.tex: perfbook-1c.tex
perfbook-msnt.tex perfbook-1cmsnt.tex:
ifeq ($(NEWTXTT),)
$(error Font package 'newtxtt' not found.$nInstall it or try 'make mstx' instead. See #9 in FAQ-BUILD.txt)
endif
ifeq ($(NIMBUSMONO),)
$(error Font package 'nimbus15' not found. See #9 in FAQ-BUILD.txt)
endif
sed -e 's/%msfontstub/\\usepackage[zerostyle=a]{newtxtt}/' \
-e 's/{qqzbg}{false}/{qqzbg}{true}/' \
-e 's/{nimbusavail}{false}/{nimbusavail}{true}/' < $< > $@
perfbook-sf.tex: $(PERFBOOK_BASE)
perfbook-1csf.tex: perfbook-1c.tex
perfbook-ebsf.tex: perfbook-eb.tex
perfbook-sf.tex perfbook-1csf.tex perfbook-ebsf.tex:
ifeq ($(NEWTXSF),)
$(error Font package 'newtxsf' not found. See #9 in FAQ-BUILD.txt)
endif
ifeq ($(INCONSOLATA),)
$(error Font package 'inconsolata' not found. See #9 in FAQ-BUILD.txt)
endif
ifeq ($(NIMBUSMONO),)
$(error Font package 'nimbus15' not found. See #9 in FAQ-BUILD.txt)
endif
sed -e 's/setboolean{sansserif}{false}/setboolean{sansserif}{true}/' \
-e 's/{nimbusavail}{false}/{nimbusavail}{true}/' \
-e 's/%msfontstub/\\usepackage[var0]{inconsolata}[2013\/07\/17]/' < $< > $@
perfbook-nq.tex: $(PERFBOOK_BASE)
perfbook-sfnq.tex: perfbook-sf.tex
perfbook-1cnq.tex: perfbook-1c.tex
perfbook-1csfnq.tex: perfbook-1csf.tex
perfbook-ebnq.tex: perfbook-eb.tex
perfbook-ebsfnq.tex: perfbook-ebsf.tex
perfbook-nq.tex perfbook-sfnq.tex perfbook-1cnq.tex perfbook-1csfnq.tex perfbook-ebnq.tex perfbook-ebsfnq.tex:
sed -e 's/setboolean{qqzbg}{true}/setboolean{qqzbg}{false}/' \
-e 's/setboolean{noqqz}{false}/setboolean{noqqz}{true}/' < $< > $@
perfbook-ix.tex: $(PERFBOOK_BASE)
perfbook-1cix.tex: perfbook-1c.tex
perfbook-ebix.tex: perfbook-eb.tex
perfbook-ix.tex perfbook-1cix.tex perfbook-ebix.tex:
sed -e 's/setboolean{qqzbg}{true}/setboolean{qqzbg}{false}/' \
-e 's/setboolean{indexhl}{false}/setboolean{indexhl}{true}/' < $< > $@
perfbook-df.tex: $(PERFBOOK_BASE)
perfbook-1cdf.tex: perfbook-1c.tex
perfbook-ebdf.tex: perfbook-eb.tex
perfbook-df.tex perfbook-1cdf.tex perfbook-ebdf.tex:
sed -e 's/setboolean{qqzbg}{true}/setboolean{qqzbg}{false}/' \
-e 's/setboolean{indexon}{true}/setboolean{indexon}{false}/' < $< > $@
perfbook-a4.tex: perfbook-lt.tex
perfbook-a4.tex:
sed -e 's/{afourpaper}{false}/{afourpaper}{true}/' < $< > $@
# Rules related to perfbook_html are removed as of May, 2016
$(EPSSOURCES_FROM_TEX): %.eps: %.tex
@echo "$< --> $(suffix $@)"
sh utilities/mpostcheck.sh
@latex -output-directory=$(shell dirname $<) $< > /dev/null 2>&1
@dvips -Pdownload35 -E $(patsubst %.tex,%.dvi,$<) -o $@ > /dev/null 2>&1
$(EPSSOURCES_FROM_DOT): $(FIXANEPSFONTS) $(FIXFONTS)
$(EPSSOURCES_FROM_DOT): %.eps: %.dot
@echo "$< --> $(suffix $@)"
ifndef DOT
$(error $< --> $@: dot not found. Please install graphviz)
endif
@dot -Tps -o $@ $<
@sh $(FIXANEPSFONTS) $@
$(EPSSOURCES_FROM_FIG): $(FIXANEPSFONTS) $(FIXFONTS)
$(EPSSOURCES_FROM_FIG): %.eps: %.fig
@echo "$< --> $(suffix $@)"
ifdef FIG2EPS
@fig2eps --nogv $< > /dev/null 2>&1
else ifdef FIG2DEV
@fig2dev -L eps $< $@
else
$(error $< --> $@: Neither fig2eps nor fig2dev found. Please install fig2ps or transfig (or fig2dev))
endif
@sh $(FIXANEPSFONTS) $@
# .eps --> .pdf rules
ifdef USE_A2PING
include a2ping-rule.mk
else
include epstopdf-rule.mk
endif
# bogus settings for preventing Inkscape from interacting with desktop manager
ISOLATE_INKSCAPE ?= XDG_RUNTIME_DIR=na DBUS_SESSION_BUS_ADDRESS=na
CodeSamples/formal/data/RCU-test-ratio.svg: CodeSamples/formal/data/rcu-test.dat
CodeSamples/formal/data/RCU-test-ratio.svg: CodeSamples/formal/data/plot.sh
CodeSamples/formal/data/RCU-test-ratio.svg:
@echo "Generating $@"
ifndef GNUPLOT
$(error gnuplot not found. Please install it)
endif
@cd CodeSamples/formal/data/ && \
sh plot.sh && \
cd ../../..
$(PDFTARGETS_OF_SVG_CROP): %-crop.pdf: %.pdf
@echo "Crop $< (pdfcrop)"
@pdfcrop $< $@ > /dev/null
ifdef RSVG_CONVERT
FALLBACK_RSVG_CONVERT = || (cat $<i | rsvg-convert $(RSVG_FMT_OPT) > $@ && echo "$< --> $(suffix $@) (fallback rsvg-convert)")
endif
ifeq ($(RSVG_CONVERT_GOOD),1)
SVG_TO_PDF_COMMAND = cat $<i | rsvg-convert $(RSVG_FMT_OPT) > $@
else
ifeq ($(INKSCAPE_ONE),0)
SVG_TO_PDF_COMMAND = inkscape --export-pdf=$@ $<i > /dev/null 2>&1 $(FALLBACK_RSVG_CONVERT)
else
SVG_TO_PDF_COMMAND = $(ISOLATE_INKSCAPE) inkscape -o $@ $<i > /dev/null 2>&1 $(FALLBACK_RSVG_CONVERT)
endif
endif
$(PDFTARGETS_OF_SVG): $(FIXSVGFONTS)
$(PDFTARGETS_OF_SVG): %.pdf: %.svg
@echo "$< --> $(suffix $@) $(SVG_PDF_CONVERTER)"
ifeq ($(STEELFONT),0)
$(error "Steel City Comic" font not found. See #1 in FAQ.txt)
endif
ifneq ($(RSVG_CONVERT_GOOD),1)
ifndef INKSCAPE
$(error $< --> $@ inkscape nor rsvg-convert not found. Please install either one)
endif
endif
ifeq ($(STEELFONTID),0)
@sh $(FIXSVGFONTS) < $< | sed -e 's/Steel City Comic/Test/g' > $<i
else
@sh $(FIXSVGFONTS) < $< > $<i
endif
ifeq ($(RECOMMEND_FREEFONT),1)
$(info Nice-to-have font family 'FreeMono' not found. See #9 in FAQ-BUILD.txt)
endif
ifeq ($(RECOMMEND_DEJAVUSANS),1)
$(info Nice-to-have font family 'DejaVu Sans' not found. See #9 in FAQ-BUILD.txt)
endif
ifeq ($(RECOMMEND_DEJAVUMONO),1)
$(info Nice-to-have font family 'DejaVu Sans Mono' not found. See #9 in FAQ-BUILD.txt)
endif
ifeq ($(RECOMMEND_LIBERATIONSANS),1)
$(info Nice-to-have font family 'Liberation Sans' not found. See #9 in FAQ-BUILD.txt)
endif
ifeq ($(RECOMMEND_LIBERATIONMONO),1)
$(info Nice-to-have font family 'Liberation Mono' not found. See #9 in FAQ-BUILD.txt)
endif
@$(SVG_TO_PDF_COMMAND)
@rm -f $<i
ifeq ($(chkpagegroup),on)
ifndef QPDF
$(error qpdf not found. Please install it)
endif
@echo "checking page group in $@"
@qpdf --qdf $@ $@q
@./utilities/extpagegroup.pl < $@q > $@p
@diff -q -w $@p pagegroup
@rm -f $@q $@p
endif
CodeSamples/snippets.d: $(SOURCES_OF_SNIPPET) $(GEN_SNIPPET_D)
sh ./utilities/precheck.sh
sh ./utilities/gen_snippet_d.sh
$(FCVSNIPPETS):
@echo "$< --> $(suffix $@)"
@utilities/fcvextract.pl $< $(subst +,\\+,$(subst @,:,$(basename $(notdir $@)))) > $@
@utilities/checkfcv.pl $@
$(FCVSNIPPETS_VIA_LTMS):
@echo "$< --> $(suffix $@)"
@utilities/fcvextract.pl $< $(subst +,\\+,$(subst @,:,$(basename $(notdir $@)))) > $@
@utilities/checkfcv.pl $@
$(FCVSNIPPETS_LTMS):
@echo "$< --> $(suffix $@)"
@utilities/reorder_ltms.pl $< > $@
help-official:
@echo "Official targets (Latin Modern Typewriter for monospace font):"
@echo " Full, Abbr."
@echo " perfbook.pdf, 2c: (default) 2-column layout"
@echo " perfbook-1c.pdf, 1c: 1-column layout"
@echo "Note:"
@echo " Official targets now enable indexing and Quick-Quiz framing."
help-semiofficial:
@echo
@echo "Semi-official targets:"
@echo " Full, Abbr."
@echo " perfbook-nq.pdf, nq: 2c without inline Quick Quizzes (chapterwise Qs)"
@echo " perfbook-sf.pdf, sf: 2c with sans serif font"
@echo " perfbook-sfnq.pdf, sfnq: sf + nq"
help-paper:
@echo
@echo "Set env variable PERFBOOK_PAPER to change paper size:"
@echo " PERFBOOK_PAPER=A4: a4paper"
@echo " PERFBOOK_PAPER=HB: hard cover book"
@echo " other (default): letterpaper"
@echo "Note:"
@echo " Modified PERFBOOK_PAPER takes effect after \"make paper-clean\"."
@echo
@echo "Paper-size specific targets (independent of PERFBOOK_PAPER):"
@echo " perfbook-lt.pdf, lt: 2c layout on letterpaper"
@echo " perfbook-hb.pdf, hb: 2c layout for hard cover book"
@echo " perfbook-a4.pdf, a4: 2c layout on a4paper"
@echo " perfbook-eb.pdf, eb: 1c layout for ebook reader"
help: help-official help-paper
@echo
@echo "\"make help-full\" will show the full list of available targets."
help-draft:
@echo
@echo "Targets for draft check, non-framed Quick Quizzes (quicker build)"
@echo " perfbook-ix.pdf, ix: for draft check, with indexed terms highlighted"
@echo " perfbook-df.pdf, df: for draft check, without indexing"
help-prefixed:
@echo
@echo "Prefixed targets:"
@echo " \"1c*\" such as \"1cnq\", \"1csf\", and \"1cix\" are for 1c-layout."
@echo " \"ebnq\", \"ebsf\", \"ebsfnq\", \"ebix\", and \"ebdf\" are for ebook-size 1c-layout,"
@echo " independent of PERFBOOK_PAPER."
help-experimental:
@echo
@echo "Experimental targets:"
@echo " perfbook-msnt.pdf, msnt: newtxtt as monospace (non-slashed 0)"
@echo " perfbook-mstx.pdf, mstx: txtt as monospace"
@echo " perfbook-msr.pdf, msr: regular thickness courier clone as monospace"
@echo " perfbook-msn.pdf, msn: narrow courier clone as monospace"
@echo
@echo "Historical targets:"
@echo " perfbook-tcb.pdf, tcb: table caption at bottom (First Edition)"
@echo " perfbook-msns.pdf, msns: non-scaled courier (First Edition)"
@echo " perfbook-mss.pdf, mss: scaled courier (default in early 2017)"
@echo
@echo "Notes:"
@echo " - \"msnt\" requires \"newtxtt\". \"mstx\" is a fallback target for older TeX env."
@echo " - \"msr\" and \"msn\" require \"nimbus15\"."
@echo " - \"msn\" doesn't cover bold face monospace."
@echo " - \"sf\" requires \"newtxsf\"."
@echo " - All the targets except for \"msn\" use \"Latin Modern Typewriter\" font"
@echo " for code snippets."
help-full: help-official help-paper help-semiofficial help-draft help-prefixed help-experimental
clean:
find . -name '*.aux' -o -name '*.blg' \
-o -name '*.dvi' -o -name '*.log' \
-o -name '*.qqz' -o -name '*.toc' -o -name '*.bbl' \
-o -name '*.pdfp' -o -name '*.pdfq' | xargs rm -f
rm -f perfbook_flat.tex perfbook*.out $(GENERATED_MAIN)
rm -f $(LATEXGENERATED)
rm -f qqz*.tex
rm -f perfbook*.idx perfbook*.ind perfbook*.ilg perfbook*.ist
rm -f perfbook*.acn perfbook*.acr perfbook*.alg
rm -f perfbook*.glg perfbook*.glo perfbook*.gls perfbook*.glsdefs
rm -f perfbook*.sil
rm -f CodeSamples/snippets.d
rm -f *.synctex*
@rm -f $(OBSOLETE_FILES) $(EPSSOURCES_TMP) $(SVG_EMERGENCY)
paper-clean:
rm -f $(BASE_DEPENDS)
distclean: clean
sh utilities/cleanpdf.sh
rm -f $(EPSSOURCES_FROM_DOT) $(EPSSOURCES_FROM_TEX) $(EPSSOURCES_FROM_FIG)
find . -name '*.fcv' -o -name '*.ltms' | xargs rm -f
touchsvg:
find . -name '*.svg' | xargs touch
ls-unused:
find . -name .unused | xargs ls
neatfreak: distclean
find . -name '*.pdf' | xargs rm -f
cleanfigs-eps:
rm -f $(EPSSOURCES_FROM_TEX) $(EPSSOURCES_FROM_DOT) $(EPSSOURCES_FROM_FIG)
rm -f $(PDFTARGETS_OF_EPS)
cleanfigs-svg:
rm -f $(PDFTARGETS_OF_SVG) $(SVG_EMERGENCY) $(SVG_GENERATED) $(PDFTARGETS_OF_SVG_CROP)
cleanfigs: cleanfigs-eps cleanfigs-svg
figs: $(PDFTARGETS_OF_EPS) $(PDFTARGETS_OF_SVG) $(PDFTARGETS_OF_SVG_CROP)
punctcheck:
utilities/punctcheck.sh
utilities/cleverefcheck.sh
punctcheck-auto: $(targ)
utilities/punctcheck.sh
utilities/cleverefcheck.sh
precheck:
VERBOSE=y sh utilities/precheck.sh
periodcheck: punctcheck
.SECONDEXPANSION:
$(ABBREVTARGETS): %: perfbook-$$@.pdf