我正在编写一个makefile,它接受三个目标:
make build-consul
make build-envoy
make build # (builds both)build-consul/build-envoy任务可以按照预期自行工作。但是,build任务仅运行第一个依赖项。考虑下面的Makefile:
%consul: APP=consul
%envoy: APP=envoy
build-consul: _build
build-envoy: _build
build: build-consul build-envoy
_build:
echo building $(APP)运行build目标的输出为:
$ make build
echo working on consul
working on consul为什么只运行第一个依赖项build-consul,而忽略第二个build-envoy依赖项?看起来,首先为build任务列出的任何依赖项都将始终运行(如果我交换它们,则输出为envoy。
发布于 2020-06-15 04:12:32
这是因为build-consul和build-envoy都不能单独执行任何操作。它们都依赖于一个单独的目标_build,这个目标总是只执行一次。当make访问build-consul时,它会重新生成_build目标(因为该文件可能不存在),而当稍后访问build-envoy时,它不会重新生成_build目标,因为这已经生成了。你自己看一下:
$ make build -dr
Considering target file 'build'.
File 'build' does not exist.
Looking for an implicit rule for 'build'.
No implicit rule found for 'build'.
Considering target file 'build-consul'.
File 'build-consul' does not exist.
Looking for an implicit rule for 'build-consul'.
No implicit rule found for 'build-consul'.
Considering target file '_build'.
File '_build' does not exist.
Finished prerequisites of target file '_build'.
Must remake target '_build'.
echo building consul
Putting child 0x55931292b870 (_build) PID 8627 on the chain.
Live child 0x55931292b870 (_build) PID 8627
building consul
Reaping winning child 0x55931292b870 PID 8627
Removing child 0x55931292b870 PID 8627 from chain.
Successfully remade target file '_build'.
Finished prerequisites of target file 'build-consul'.
Must remake target 'build-consul'.
Successfully remade target file 'build-consul'.
Considering target file 'build-envoy'.
File 'build-envoy' does not exist.
Looking for an implicit rule for 'build-envoy'.
No implicit rule found for 'build-envoy'.
Pruning file '_build'. <--- Already built, not making again
Finished prerequisites of target file 'build-envoy'.
Must remake target 'build-envoy'.
Successfully remade target file 'build-envoy'.
Finished prerequisites of target file 'build'.
Must remake target 'build'.
Successfully remade target file 'build'.您可以在没有额外目标的情况下使其工作,如下所示:
$ cat Makefile
%consul: APP=consul
%envoy: APP=envoy
.PHONY: build
build: build-consul build-envoy
.PHONY: build-consul build-envoy
build-consul build-envoy:
echo building $(APP).PHONY是确保即使存在相同名称的文件也能构建目标(这是一个很好的实践)。
输出:
$ make build
echo building consul
building consul
echo building envoy
building envoy发布于 2020-06-12 21:41:51
我没有注意到您指定make build作为命令行。
在这种情况下,请参阅以下答案:makefile: second dependency not execute
https://stackoverflow.com/questions/62345397
复制相似问题