make-仅在需要时创建中间文件

时间:2018-09-11 09:16:12

标签: makefile

我正在编写一个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.pybuild/data中生成build/tikz-standalone/%.tex所需的多个数据文件。要创建这些文件,它使用存储在变量PLOT_DATA中的其他文件。我可以将build/data中的中间数据文件列表放到xy_data位置的Makefile中。我不喜欢这样,因为这需要我在添加新文件时更新列表。我想要的是只要crunch.py$(PLOT_DATA)发生更改,所有数据文件都将重新创建。

有没有办法在Make中表达这一点?

1 个答案:

答案 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 $@

注意:我还改善了一些其他方面:

  1. 使用make函数dirnotdir代替等效的shell。
  2. 构建目录的变量声明,以避免多次写入同一列表,这既乏味又容易出错。
  3. 所有构建目录的明确列表作为仅订购的先决条件,而不只是一个,而如果存在一个,但不存在其他一些,则可能导致意外结果。
  4. 借助$@自动变量,所有构建目录的通用规则。