我的所有服务都有基本 Makefile,在某些情况下我想使用默认的“测试”目标,在其他情况下我想覆盖\添加它。这些是我迄今为止拥有的文件(显然它没有按预期工作......)。
生成文件库
test:
./.../run-tests.sh
Run Code Online (Sandbox Code Playgroud)
生成文件
BASE_FILE := /path/to/MakefileBase
include ${BASE_FILE}
test:
@$(MAKE) -f $(BASE_FILE) test # un/comment this line in order to run the default tests.
# echo "custom test"
Run Code Online (Sandbox Code Playgroud)
当我运行测试并注释掉第一行时,我得到以下结果
Makefile:10: warning: overriding commands for target `test'
/.../MakefileBase:63: warning: ignoring old commands for target `test'
echo "no tests"
no tests
Run Code Online (Sandbox Code Playgroud)
除了警告它按预期工作之外,问题是当我尝试使用父函数时,我收到以下错误:
Makefile:9: warning: overriding commands for target `test'
/.../MakefileBase:63: warning: ignoring old commands for target `test'
make[1]: test: No such file or directory
make[1]: *** No rule to make target `test'. Stop.
make: *** [test] Error 2
Run Code Online (Sandbox Code Playgroud)
事实上,到目前为止,这两个答案都是错误的或不完整的:
exit 0in a 规则只会退出当前 shell(仅运行exit 0命令,因此在这种情况下它是无操作)。所以这不会覆盖。
没有警告就不能覆盖命令是不正确的。如果两个目标不需要具有相同的名称,您可以执行以下操作:
生成文件库
.PHONY: test-base
test-base:
echo base
%: %-base # handles cases where you don't want to override
Run Code Online (Sandbox Code Playgroud)
生成文件1
include MakefileBase
.PHONY: test
test:
echo override
Run Code Online (Sandbox Code Playgroud)
生成文件
include MakefileBase
.PHONY: test
test: test-base
echo append
Run Code Online (Sandbox Code Playgroud)
与双冒号规则一样,必须考虑每个目标(彼此之间)的影响,特别是如果您远离.PHONY(例如,文件被认为是最新的,因为其他规则刚刚更新了它们)。
顺便说一句,我没有看到你的方法有问题(除了警告)。对我来说效果很好。
| 归档时间: |
|
| 查看次数: |
6061 次 |
| 最近记录: |