触摸目标在 Makefile 中没有任何作用
Touching targets does nothing in Makefile
我一直盯着我的代码看,想知道为什么触摸我的文件没有任何反应:
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 命令不是 运行(应该是,不是吗?)。 svg 文件是通过 运行ning jupyter 命令生成的。如果我删除它,一切正常,但触摸似乎什么也没做。
呸,我一直都在写其他答案,结果我误解了你的问题,哎呀。
你说如果你触摸barline.svg.
你希望jupyter
到运行
Make 使用文件时间戳来确定何时 运行。对于非虚假目标,规则很简单:如果任何先决条件比目标更新,或者目标不存在,则重建目标。否则,它不是。你的情况:
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 不会在其他地方的任何特殊位置跟踪构建时间戳,它的所有信息都来自文件系统,所以如果你触摸一个目标,它实际上没有什么可以比较的 "hey somebody modified the target, maybe I should rebuild it" (出于其他原因,您无论如何都不希望出现这种行为)。
我一直盯着我的代码看,想知道为什么触摸我的文件没有任何反应:
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 命令不是 运行(应该是,不是吗?)。 svg 文件是通过 运行ning jupyter 命令生成的。如果我删除它,一切正常,但触摸似乎什么也没做。
呸,我一直都在写其他答案,结果我误解了你的问题,哎呀。
你说如果你触摸barline.svg.
你希望jupyter
到运行
Make 使用文件时间戳来确定何时 运行。对于非虚假目标,规则很简单:如果任何先决条件比目标更新,或者目标不存在,则重建目标。否则,它不是。你的情况:
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 不会在其他地方的任何特殊位置跟踪构建时间戳,它的所有信息都来自文件系统,所以如果你触摸一个目标,它实际上没有什么可以比较的 "hey somebody modified the target, maybe I should rebuild it" (出于其他原因,您无论如何都不希望出现这种行为)。