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'.
下面的工作示例总是 运行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'.