如何在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
相关产品推荐
相关产品推荐

