如何在AIX原生make中实现目标特定变量赋值?
在AIX原生make中实现目标特定的变量覆盖
我有一个跨平台的主Makefile,以及AIX专属的aixmakefile(在主Makefile末尾被引入)。主Makefile中定义了宏A=somevalueA,且多个变量(如B1、B2)依赖A,最终被不同目标使用。我需要在AIX环境下,仅让target1和target2使用A=somenewvalue,其他目标保持原A值。
GNU make可以通过目标特定变量轻松实现:
# aixmakefile中添加 target1: A=somenewvalue target2: A=somenewvalue
但AIX原生make不支持该特性,现有的两种替代方案(复制变量定义或复制目标规则)都不够优雅,希望找到更简洁的解决方法。
方案1:利用字符串替换简化变量重定义
AIX原生make支持$(var:old=new)的字符串替换语法,无需拆分变量的组成部分,直接对依赖A的目标变量整体替换:
# aixmakefile NEW_A=somenewvalue # 仅重定义target1/target2用到的变量 B1=$(B1:$(A)=$(NEW_A)) B2=$(B2:$(A)=$(NEW_A))
这种方式只需两行代码完成变量覆盖,避免了拆分B1、B2的结构,保持代码简洁,且不修改主Makefile的核心逻辑。
方案2:递归Make调用实现隔离变量
通过递归调用make并传递临时变量,实现目标级别的变量覆盖,完全不修改主Makefile的变量定义:
# aixmakefile # 覆盖原target1/target2的规则 target1: $(MAKE) A=somenewvalue target1-orig target2: $(MAKE) A=somenewvalue target2-orig
同时需要在主Makefile中做微小调整,将原目标规则重命名并建立依赖(兼容其他平台):
# 主Makefile target1: target1-orig target2: target2-orig target1-orig: # 原target1的规则内容 target2-orig: # 原target2的规则内容
这种方式将变量隔离在递归调用的make进程中,不会影响其他目标的变量值,适合需要严格隔离变量的场景。
方案3:通过宏定义统一生成规则(需修改主Makefile)
如果允许调整主Makefile的结构,可以用宏来统一生成目标规则,在AIX下重定义宏实现变量替换:
# 主Makefile中定义规则生成宏 define BUILD_TARGET $1: # some recipe using $($2) endef # 生成所有目标规则 $(eval $(call BUILD_TARGET,target1,B1)) $(eval $(call BUILD_TARGET,target2,B2)) $(eval $(call BUILD_TARGET,target3,B3)) $(eval $(call BUILD_TARGET,target4,B4))
# aixmakefile中重定义宏,替换变量值 NEW_A=somenewvalue define BUILD_TARGET $1: # some recipe using $($2:$(A)=$(NEW_A)) endef # 重新生成target1/target2的规则 $(eval $(call BUILD_TARGET,target1,B1)) $(eval $(call BUILD_TARGET,target2,B2))
这种方式将规则逻辑抽象为宏,后续修改或平台适配只需调整宏定义,维护性更强。
内容的提问来源于stack exchange,提问作者Shubham Johri
相关产品推荐
相关产品推荐

