允许 Makefile 附加和覆盖目标

Ida*_*hum 2 makefile gnu-make

我的所有服务都有基本 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)

phi*_*100 5

事实上,到目前为止,这两个答案都是错误的或不完整的:

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(例如,文件被认为是最新的,因为其他规则刚刚更新了它们)。

顺便说一句,我没有看到你的方法有问题(除了警告)。对我来说效果很好。