触摸目标在Makefile中没有任何作用

时间:2016-09-06 14:34:58

标签: makefile gnu-make

我一直盯着我的代码,想知道为什么触摸我的文件什么都不做:

FILES = file1 file2

myapp: $(FILES) docs/img/barline.svg
    cd docs; make html

docs/img/barline.svg: docs/notebooks/barlines.ipynb docs/data/smbinning
    cd docs/notebooks; jupyter nbconvert --execute --output-dir html barlines.ipynb

如果我touch docs/img/barline.svg并运行make,那么jupyter命令就不会运行(因为它应该是,不应该运行吗?)。通过运行jupyter命令生成svg文件。如果我删除它,一切都按预期工作,但触摸似乎什么都不做。

1 个答案:

答案 0 :(得分:1)

Bah,我只是花了所有这些时间写一些其他的答案,结果我误解了你的问题,哎呀。

如果您触摸 barline.svg ,则表示您希望jupyter能够投放。

使用文件时间戳来确定何时运行。对于非虚假目标,规则很简单:如果任何先决条件比目标更新,或者目标不存在,则重建目标。否则,事实并非如此。在你的情况下:

docs/img/barline.svg: docs/notebooks/barlines.ipynb docs/data/smbinning

触及svg不符合该规则的条件,因为它是目标。

仅当barlines.ipynb或smbinning比barline.svg更新时,才会运行Make。所以你的期望已经过去了,触摸barline.svg不会做任何事情,除非可能导致任何使用 it 的目标作为自己重建的先决条件。

为此,您必须触摸barlines.ipynb或smbinning。这将使它们比barlines.svg更新并强制它重建。或者您可以删除barlines.svg,就像您已经发现的那样。

让make不跟踪其他地方的任何特殊地方的构建时间戳,其所有信息都来自文件系统,因此如果你触摸目标它并没有真正有任何东西可以将它与之比较说'&#34 ;嘿有人修改了目标,也许我应该重建它" (并且由于其他原因,你不会想要这种行为。)

相关问题