You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 21:52:57