如何无需满足所有ifdef条件执行Makefile的clean目标?
解决方案
可以通过两种方式实现指定目标无需满足全局检查条件:
方法一:将检查逻辑绑定到需要的目标
把REVISION的检查逻辑从全局移到特定目标的依赖中,只有当编译需要检查的目标(比如all)时才触发检查,clean目标不受影响:
# 仅当构建all时才执行REVISION检查 all: check_revision echo "Hello" check_revision: ifndef REVISION $(error "REVISION missing, can't compile code") endif $(info "Revision is ${REVISION}") .PHONY: clean check_revision clean: rm -r build
执行make clean时,因为clean目标没有依赖check_revision,所以不会触发检查;执行make all或直接make时,会先执行check_revision的检查逻辑。
方法二:利用MAKECMDGOALS变量做全局条件判断
MAKECMDGOALS是Make内置变量,存储用户指定的目标列表。通过判断目标是否包含clean,决定是否跳过全局检查:
# 仅当目标不是clean时,执行REVISION检查 ifneq ($(filter clean,$(MAKECMDGOALS)),clean) ifdef REVISION $(info "Revision is ${REVISION}") else $(error "REVISION missing, can't compile code") endif endif all: echo "Hello" .PHONY: clean clean: rm -r build
这种方式不需要调整目标依赖,直接在全局做条件过滤。如果用户执行make clean,检查逻辑会被跳过;如果执行make all或make clean all(同时执行clean和编译),依然会触发检查(因为all目标需要编译,符合需求)。
内容的提问来源于stack exchange,提问作者ST Renegade
相关产品推荐
相关产品推荐

