make 保持 运行 一条规则

make keeps running a rule

下面的工作示例总是 运行s touch fileA,每个 运行 of make。我该如何阻止它?

all: analysis.txt

analysis.txt: countries
    touch $@

countries: usa.txt mexico.txt

$(countries): %.txt

%.txt:
    echo "bash ./cityGenerator $*" > $@

fileA 取决于 workflowB。所以只要workflowB过时,fileA就会过时,touch就会运行.

workflowB,如这里所示,被标记为 .PHONY,所以它总是被 make 认为是过时的,所以 fileA 将总是被重建。

即使不是 .PHONY,也没有创建名为 workflowB 的文件的规则,因此它仍然总是过时的。

至于如何阻止它,这完全取决于这些你没有告诉我们的事情做了什么,以及为什么你以同样没有告诉我们的方式构建 workflowB

解决它的一种方法是删除 .PHONY 并给 workflowB 一个涉及文件的食谱,然后它将是最新的。:

workflowB: workflowB_files
        touch $@

但是,当然,这可能会破坏此目的(同样,您没有告诉我们)。

您的 analysis.txt 依赖于被视为文件的 countries,但从未创建过此类文件,因此规则始终为 运行。你可以通过调试输出发现:

$ make -dr
...
   Finished prerequisites of target file 'analysis.txt'.
   Prerequisite 'countries' of target 'analysis.txt' does not exist.
  Must remake target 'analysis.txt'.
touch analysis.txt
...

您似乎将 countries 视为一个变量,因此也许可以重新处理:

$ cat Makefile
all: analysis.txt

countries := usa.txt mexico.txt

analysis.txt: $(countries)
        touch $@

%.txt:
        echo "bash ./cityGenerator $*" > $@

现在没有考虑 countries 文件并且 make 表现符合预期:

$ make
echo "bash ./cityGenerator usa" > usa.txt
echo "bash ./cityGenerator mexico" > mexico.txt
touch analysis.txt

$ make
make: Nothing to be done for 'all'.