首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅在列出的第一个依赖项中运行

仅在列出的第一个依赖项中运行
EN

Stack Overflow用户
提问于 2020-06-12 21:36:30
回答 2查看 101关注 0票数 0

我正在编写一个makefile,它接受三个目标:

代码语言:javascript
复制
make build-consul
make build-envoy

make build # (builds both)

build-consul/build-envoy任务可以按照预期自行工作。但是,build任务仅运行第一个依赖项。考虑下面的Makefile:

代码语言:javascript
复制
%consul: APP=consul
%envoy: APP=envoy

build-consul: _build
build-envoy: _build

build: build-consul build-envoy
_build:
  echo building $(APP)

运行build目标的输出为:

代码语言:javascript
复制
$ make build
echo working on consul
working on consul

为什么只运行第一个依赖项build-consul,而忽略第二个build-envoy依赖项?看起来,首先为build任务列出的任何依赖项都将始终运行(如果我交换它们,则输出为envoy

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-15 04:12:32

这是因为build-consulbuild-envoy都不能单独执行任何操作。它们都依赖于一个单独的目标_build,这个目标总是只执行一次。当make访问build-consul时,它会重新生成_build目标(因为该文件可能不存在),而当稍后访问build-envoy时,它不会重新生成_build目标,因为这已经生成了。你自己看一下:

代码语言:javascript
复制
$ 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'.

您可以在没有额外目标的情况下使其工作,如下所示:

代码语言:javascript
复制
$ 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是确保即使存在相同名称的文件也能构建目标(这是一个很好的实践)。

输出:

代码语言:javascript
复制
$ make build
echo building consul
building consul
echo building envoy
building envoy
票数 1
EN

Stack Overflow用户

发布于 2020-06-12 21:41:51

我没有注意到您指定make build作为命令行。

在这种情况下,请参阅以下答案:makefile: second dependency not execute

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62345397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档