LaTeXのMakefileで、auxファイルやidxファイルの変更がない場合には不要な作業は行わないように修正
[makefiles.git] / latex_mk / latex.mk
1 .PHONY: clean-tex distclean-tex
2
3 # シェルコマンド
4 CMP := cmp -s
5 CP := cp
6 ECHO := echo
7 GREP := grep
8 SED := sed
9
10 # LaTeXコマンド
11 LATEX := platex
12 DVIPDFMX := dvipdfmx
13 EXTRACTBB := extractbb
14 BIBTEX := pbibtex
15 MENDEX := mendex
16
17 #LaTeXオプション
18 interaction ?= batchmode
19 LATEXFLAG ?=
20 DVIPDFMXFLAG ?=
21 EXTRACTBBFLAGS ?=
22 BIBTEXFLAG ?=
23 MENDEXFLAG ?=
24
25 # LaTeX処理(コンパイル)
26 COMPILE.tex = $(LATEX) -interaction=$(interaction) $(LATEXFLAG) $(addsuffix .tex,$(basename $<))
27
28 # 相互参照の警告
29 WARN_REF := 'Label(s) may have changed. Rerun to get cross-references right.'
30
31 # 相互参照未定義の警告。2回目以降の処理で出る場合は、参照エラー
32 WARN_UNDEFREF := 'There were undefined references.'
33
34 # auxやtocなどのファイルがない警告
35 WARN_NOFILE := 'No file'
36
37 # LaTeX処理の最大回数
38 MAX_CNT := 10
39
40 # logファイルに相互参照または目次ファイルなしの警告がある場合、LaTeX処理を繰り返す
41 # 2回目以降の処理で相互参照未定義の警告がある場合と、
42 # 繰り返しの回数がMAX_CNTになった場合は、警告を表示してエラー終了
43 COMPILES.tex = \
44   cnt=0; \
45   while $(GREP) -F -e $(WARN_REF) -e $(WARN_NOFILE) $(addsuffix .log,$(basename $<)); do \
46     if test $$cnt -ge $(MAX_CNT); then \
47       $(ECHO) "LaTeX compile is over $$cnt times, but warnings exist."; \
48       exit 1; \
49     fi; \
50     $(COMPILE.tex); \
51     if test $$cnt -eq 1 && $(GREP) -F $(WARN_UNDEFREF) $(addsuffix .log,$(basename $<)); then \
52       exit 1; \
53     fi; \
54     cnt=`expr $$cnt + 1`; \
55   done
56
57 # \includeコマンドで読み込まれるtexファイル
58 intex = $(addsuffix .tex,$(basename $(strip $(shell \
59   $(SED) -n -e 's/\\\(include\|input\)\(\[[^]]*\]\)\{0,1\}{[^}]*}/&\n/gp' $<  | \
60   $(SED) -e 's/.*{\([^}]*\)}.*/\1/'))))
61
62 # \includegraphicsコマンドで読み込まれるグラフィックファイル
63 ingraphics = $(strip $(shell \
64   $(SED) -n -e 's/\\includegraphics\(\[[^]]*\]\)\{0,1\}\({[^}]*}\)/&\n/gp' $< $(intex) | \
65   $(SED) -e 's/.*{\([^}]*\)}.*/\1/'))
66
67 # \bibliographyコマンドで読み込まれる文献データベースファイル
68 bibdb = $(addsuffix .bib,$(basename $(strip $(shell \
69   $(SED) -n -e 's/\\bibliography\(\[[^]]*\]\)\{0,1\}{\([^}]*\)}/&\n/gp' $< $(intex) | \
70   $(SED) -e 's/.*{\([^}]*\)}.*/\1/' | \
71   $(SED) -e 's/,/ /g'))))
72
73 # texファイルに索引作成の指定があるか確認
74 MAKEINDEX := '\makeindex'
75 GREP-makeindex = $(GREP) -F $(MAKEINDEX) $<
76
77 # 依存関係を自動生成し、dファイルに格納
78 %.d: %.tex
79         @$(ECHO) '$@ is created by scanning $^.'
80   # texファイルの依存関係
81         @(($(ECHO) '$(subst .tex,.dvi,$<) $(subst .tex,.aux,$<) $(subst .tex,.d,$<): $<'; \
82        $(ECHO); \
83        $(ECHO) '$(subst .tex,.prev_aux,$<):') >$@)
84   # Include/Inputファイルの依存関係
85         $(if $(intex),@( \
86       $(ECHO); \
87       $(ECHO) '# Include/Input Files - tex'; \
88       $(ECHO) '$(subst .tex,.dvi,$<) $(subst .tex,.aux,$<): $(intex)') >>$@)
89   # 画像ファイルの依存関係
90         $(if $(ingraphics),@( \
91       $(ECHO); \
92       $(ECHO) '# IncludeGraphic Files - pdf, jpeg/jpg, png & xbb'; \
93       $(ECHO) '$(subst .tex,.dvi,$<) $(subst .tex,.aux,$<): $(ingraphics)'; \
94       $(ECHO); \
95       $(ECHO) '$(subst .tex,.dvi,$<) $(subst .tex,.aux,$<): $(addsuffix .xbb,$(basename $(ingraphics)))') >>$@)
96   # 文献処理用ファイルの依存関係
97         $(if $(bibdb),@( \
98        $(ECHO); \
99        $(ECHO) '# Bibliography Files - bbl & bib'; \
100        $(ECHO) '$(subst .tex,.dvi,$<): $(subst .tex,.bbl,$<)'; \
101        $(ECHO); \
102        $(ECHO) '$(subst .tex,.bbl,$<): $(bibdb)') >>$@)
103   # 索引作成用ファイルの依存関係
104         $(if $(strip $(shell $(GREP-makeindex))),@( \
105        $(ECHO); \
106        $(ECHO) '# MakeIndex Files - ind'; \
107        $(ECHO) '$(subst .tex,.idx,$<):'; \
108        $(ECHO); \
109        $(ECHO) '$(subst .tex,.ind,$<):'; \
110        $(ECHO); \
111        $(ECHO) '$(subst .tex,.dvi,$<): $(subst .tex,.ind,$<)') >>$@)
112
113 # 変数TARGETSで指定されたターゲットファイルに対応するdファイルをインクルード
114 # .dファイルからヘッダファイルの依存関係を取得する
115 # ターゲットに clean が含まれている場合は除く
116 ifeq (,$(filter %clean,$(MAKECMDGOALS)))
117   -include $(addsuffix .d,$(basename $(TARGETS)))
118 endif
119
120 # 相互参照ファイル作成。dviファイルも同時に作成される
121 %.aux: %.tex
122         $(COMPILE.tex)
123
124 %.prev_aux: %.aux
125         -$(CMP) $@ $< || $(CP) $< $@
126
127 # dviファイル作成
128 %.dvi: %.aux
129         $(COMPILES.tex)
130
131 # 文献処理用ファイル作成
132 # BiBTeXで文献処理するときに使用される
133 %.bbl: %.prev_aux
134         $(BIBTEX) $(BIBTEXFLAG) $(subst .prev_aux,aux,$<)
135
136 # バウンディング情報ファイル作成
137 # dvipdfmxで図を挿入するときに使用される
138 # pdf、jpeg/jpg、pngファイルに対応
139 %.xbb: %.pdf
140         $(EXTRACTBB) $(EXTRACTBBFLAGS) $<
141
142 %.xbb: %.jpeg
143         $(EXTRACTBB) $(EXTRACTBBFLAGS) $<
144
145 %.xbb: %.jpg
146         $(EXTRACTBB) $(EXTRACTBBFLAGS) $<
147
148 %.xbb: %.png
149         $(EXTRACTBB) $(EXTRACTBBFLAGS) $<
150
151 # 索引ファイル作成
152 # 索引を作成するときに使用される
153 %.idx: %.aux
154         $(COMPILE.tex)
155
156 %.prev_idx: %.idx
157         -$(CMP) $@ $< || $(CP) $< $@
158
159 %.ind: %.prev_idx
160         $(MENDEX) $(MENDEXFLAG) $(subst .prev_idx,.idx,$<)
161
162 # PDFファイル作成
163 %.pdf: %.dvi
164         $(DVIPDFMX) $(DVIPDFMXFLAG) $<
165
166 # tex-cleanターゲット
167 tex-clean:
168         $(RM) *.aux *.bbl *.blg *.idx *.ilg *.ind *.lof *.lot *.out *.toc *.xbb *.log *.d
169
170 # tex-distcleanターゲット
171 tex-distclean: tex-clean
172         $(RM) $(addsuffix .dvi,$(basename $(TARGETS))) $(addsuffix .pdf,$(basename $(TARGETS)))