我一直盯着我的代码,想知道为什么触摸我的文件什么都不做:
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文件。如果我删除它,一切都按预期工作,但触摸似乎什么都不做。
答案 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 ;嘿有人修改了目标,也许我应该重建它" (并且由于其他原因,你不会想要这种行为。)