我正在编写一个Makefile来建立一个Latex文档,具体取决于其数据是由某些python脚本从其他数据生成的图。
看起来像这样
% pdf plot needed by final document
build/tikz-standalone/%.pdf: build/tikz-standalone/%.tex xy_data
cd $$(dirname $@) && ../../latexrun $$(basename $<)
xy_data: $(PLOT_DATA) tools/plots/crunch.py | build
% crunch.py will create data for plots needed by build/tikz-standalone/%.tex
PYTHONPATH=. tools/plots/crunch.py
build:
mkdir -p build build/other_stuff ...
crunch.py
在build/data
中生成build/tikz-standalone/%.tex
所需的多个数据文件。要创建这些文件,它使用存储在变量PLOT_DATA
中的其他文件。我可以将build/data
中的中间数据文件列表放到xy_data
位置的Makefile中。我不喜欢这样,因为这需要我在添加新文件时更新列表。我想要的是只要crunch.py
或$(PLOT_DATA)
发生更改,所有数据文件都将重新创建。
有没有办法在Make中表达这一点?
答案 0 :(得分:1)
如果您不想提供和维护所生成文件的列表,则可以将(虚假的)假xy_data
目标变成一个用作标记的空文件。只需在食谱末尾触摸它即可:
BUILDDIRS := build build/other_stuff ...
build/tikz-standalone/%.pdf: build/tikz-standalone/%.tex xy_data
cd $(dir $@) && ../../latexrun $(notdir $<)
xy_data: $(PLOT_DATA) tools/plots/crunch.py | $(BUILDDIRS)
PYTHONPATH=. tools/plots/crunch.py
touch $@
$(BUILDDIRS):
mkdir -p $@
注意:我还改善了一些其他方面:
dir
和notdir
代替等效的shell。$@
自动变量,所有构建目录的通用规则。