makefile - 即使已经有另一个与目标匹配的规则,模式隐式规则也会执行吗?
问题描述
基本上,如果我有一个已经有规则但仍然匹配另一个模式隐式规则的目标。make 如何处理这种情况?
targ.bin :: dep
dep: some-req
some rules
%.bin : some-reqs
some rules
在这种情况下,这两个规则都适用于 targ.bin 吗?意思是,dep 会被调用它的先决条件和规则,然后执行 %.bin 模式隐式先决条件和规则吗?
解决方案
请参阅 GNU Make 手册4.13 双冒号规则,尤其是:
每个双冒号规则都应该指定一个配方;如果不适用,则将使用隐含规则(如果适用)。请参阅使用隐式规则。
你的双冒号规则:
targ.bin :: dep
没有食谱。因此它只表达依赖targ.bin
->dep
和隐含规则:
%.bin : some-reqs
some rules
指定targ.bin
应通过执行更新:
some rules
以及暗示依赖targ.bin
-> some-reqs
。
Make 结合了 target 的所有先决条件targ.bin
。所以你的 Makefile 暗示:
dep: some-req
some rules
targ.bin : some-reqs dep
some rules
是完整的配方targ.bin
。由:
生成文件
targ.bin :: dep
dep: a
echo '$@ -> $^'
%.bin : b
echo '$@ -> $^'
运行如下:
$ touch a b
$ make
echo 'dep -> a'
dep -> a
echo 'targ.bin -> b dep'
targ.bin -> b dep
之后
假设在示例中您提供的双冒号规则有一个配方,这是否意味着不会应用隐含的规则?
请参阅10.1 使用隐式规则,尤其是:
通常,为每个目标搜索一个隐式规则,并为每个没有配方的双冒号规则搜索。
所以是的,如果双冒号规则有一个配方,则不会应用隐式规则。我把实验留给你。
推荐阅读
- reactjs - 在 useMemo 挂钩内的反应路由器链接中使用时状态未定义
- mysql - 我想在 node.js 的项目表中插入多个项目
- npm - 带有私人令牌的 verdaccio
- regex - Shell 脚本中的 REGEX 测试始终为 False
- html - 无法根据角度条件绑定值
- python - 气流为单个任务旋转多个子进程并挂起
- api - 使用 Microsoft Graph API 上传文件时出错
- javascript - 将驱动器文件列表获取到 Google 表格中
- javascript - 如何解决:角色未定义(Discord.js)
- arrays - 使用 .flatten 后,相同的字符串不相等