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

如何在Makefile中用单行实现多部分字符串匹配逻辑?

如何将Makefile多分支部分匹配判断合并为单行?

嘿,刚好碰到过类似的场景!你原来的多分支ifeq是基于部分字符串匹配(比如velocity包含city、Hitman包含man就触发对应逻辑),而filter只能做完整单词匹配确实不适用。要把这些分支合并成单行,我们可以利用Makefile的$(if)函数嵌套特性来实现,完美对应原来的多分支逻辑。

核心单行实现思路

直接用嵌套的$(if)结合$(findstring)来依次检查匹配模式,匹配到第一个符合条件的就执行对应逻辑,没匹配到则走默认分支:

# 替换<>里的内容为你的实际逻辑
$(if $(findstring city,$(TARGET_PRODUCT)),<city分支的执行逻辑>,$(if $(findstring man,$(TARGET_PRODUCT)),<man分支的执行逻辑>,$(if $(findstring zone,$(TARGET_PRODUCT)),<zone分支的执行逻辑>,<默认分支逻辑>)))

更清晰的写法(结合变量定义)

如果分支逻辑比较复杂,建议先把每个分支的逻辑定义成变量,再在单行里调用,可读性更好:

# 先定义各分支逻辑
CITY_ACTION := @echo "Building city-related variant: $(TARGET_PRODUCT)"
MAN_ACTION := @echo "Building man-related variant: $(TARGET_PRODUCT)"
ZONE_ACTION := @echo "Building zone-related variant: $(TARGET_PRODUCT)"
DEFAULT_ACTION := @echo "Building default variant: $(TARGET_PRODUCT)"

# 单行多分支判断执行
$(if $(findstring city,$(TARGET_PRODUCT)),$(CITY_ACTION),$(if $(findstring man,$(TARGET_PRODUCT)),$(MAN_ACTION),$(if $(findstring zone,$(TARGET_PRODUCT)),$(ZONE_ACTION),$(DEFAULT_ACTION))))

注意事项

  • 匹配顺序很关键:如果某个TARGET_PRODUCT同时包含多个匹配子串(比如cityman),会优先执行排在前面的分支逻辑,所以要把优先级高的模式放在最前面。
  • 如果你不需要默认分支,可以直接去掉最后一个$(if)的默认部分,写成:
    $(if $(findstring city,$(TARGET_PRODUCT)),<city逻辑>,$(if $(findstring man,$(TARGET_PRODUCT)),<man逻辑>,$(if $(findstring zone,$(TARGET_PRODUCT)),<zone逻辑>)))
    

内容的提问来源于stack exchange,提问作者amir ansari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:04:37