在GNU Make中能否为Makefile目标创建可选依赖?
如何在GNU Make的Makefile中为目标设置可选依赖(不新增目标)
当然可以实现你想要的效果!要让build目标拥有可选的clean依赖——既支持单独执行build,也能在命令行指定clean时自动让它优先运行,同时不新增任何额外目标,我们可以借助GNU Make的内置变量和条件判断来搞定。
实现的Makefile代码
# 动态判断build是否需要依赖clean ifeq ($(filter clean,$(MAKECMDGOALS)),clean) BUILD_DEPENDENCIES = clean else BUILD_DEPENDENCIES = endif help: @echo Usage: clean: @echo Cleaning... build: $(BUILD_DEPENDENCIES) @echo Building... .PHONY: help clean build
工作原理说明
MAKECMDGOALS变量:这是GNU Make的内置变量,会存储你在命令行输入的所有目标列表。- 筛选目标:
$(filter clean,$(MAKECMDGOALS))会从目标列表中提取出clean——如果命令行里有这个目标,就返回clean,否则返回空值。 - 动态设置依赖:通过
ifeq条件判断,我们会动态给BUILD_DEPENDENCIES赋值:如果命令行包含clean,就让build依赖它;否则build没有额外依赖。 .PHONY声明:确保这些目标不会和同名的文件/目录混淆,保证每次执行都是运行我们定义的命令。
验证预期输出
执行不同的命令,完全符合你想要的结果:
- 执行
make:默认运行第一个目标help,输出Usage: - 执行
make clean:运行clean目标,输出Cleaning... - 执行
make build:build无额外依赖,直接输出Building... - 执行
make build clean或make clean build:因为命令行包含clean,build会先依赖执行clean,再运行自身,输出顺序为:Cleaning... Building...
内容的提问来源于stack exchange,提问作者Dmitry Sokolov
相关产品推荐
相关产品推荐

