如何在Makefile中通过MY_TYPE变量切换top目标的依赖项?
实现Makefile中基于变量切换目标依赖的方案
这个需求在Makefile里很容易实现,我给你两种实用的方案,你可以根据自己的偏好选择:
方案一:提前定义条件依赖变量(推荐,可读性更高)
这种方法先把依赖的逻辑抽离出来,通过ifeq判断MY_TYPE的值,定义一个统一的本地依赖变量,再让top目标引用它,代码结构更清晰:
BUILD = build TARGETS = targets XLOCALS = xlocals YLOCALS = ylocals # 默认值为FOO,可通过命令行覆盖 MY_TYPE ?= FOO # 根据MY_TYPE选择对应的本地依赖 ifeq ($(MY_TYPE),FOO) LOCAL_DEP = $(XLOCALS) else ifeq ($(MY_TYPE),BAR) LOCAL_DEP = $(YLOCALS) else # 处理非法值,提前报错提示 $(error MY_TYPE must be set to FOO or BAR) endif $(BUILD): printf "\t Doing Build\n" $(TARGETS): printf "\t Doing target\n" $(XLOCALS): printf "\t my local build for X \n" $(YLOCALS): printf "\t my local build for Y \n" # 统一引用LOCAL_DEP变量,目标定义更简洁 top: $(BUILD) $(TARGETS) $(LOCAL_DEP) printf "\t doing top\n"
测试方法:
- 运行
make MY_TYPE=FOO top,会执行BUILD、TARGETS和XLOCALS的规则 - 运行
make MY_TYPE=BAR top,会执行BUILD、TARGETS和YLOCALS的规则
方案二:直接在依赖中使用条件函数(紧凑写法)
如果喜欢更紧凑的代码,可以用Makefile的$(if)和$(filter)函数,直接在top目标的依赖行里完成判断:
BUILD = build TARGETS = targets XLOCALS = xlocals YLOCALS = ylocals MY_TYPE ?= FOO $(BUILD): printf "\t Doing Build\n" $(TARGETS): printf "\t Doing target\n" $(XLOCALS): printf "\t my local build for X \n" $(YLOCALS): printf "\t my local build for Y \n" # 直接在依赖中嵌入条件判断逻辑 top: $(BUILD) $(TARGETS) \ $(if $(filter FOO,$(MY_TYPE)),$(XLOCALS),\ $(if $(filter BAR,$(MY_TYPE)),$(YLOCALS),\ $(error MY_TYPE must be FOO or BAR)\ )\ ) printf "\t doing top\n"
这种写法适合简单的二选一场景,但逻辑都集中在依赖行里,复杂场景下可读性会稍差。
内容的提问来源于stack exchange,提问作者user2532296
相关产品推荐
相关产品推荐

