如何让Makefile变量在多个目标/命令间持久生效
问题描述
示例Makefile代码:
PLATFORM=wrongName debug: @echo debug $(PLATFORM) debug-android: android debug android:PLATFORM=android android: @echo set PLATFORM to $(PLATFORM)
执行make debug-android后的终端输出:
user:~/Project/maketest$ make debug-android set PLATFORM to android debug wrongName
执行make debug-android时,期望android目标中设置的PLATFORM=android能在后续依赖的debug目标中生效,但实际debug目标仍使用了全局默认值wrongName,需要让变量赋值在不同目标/命令间持久生效。
解决方案
方法1:使用递归Make调用(推荐)
通过启动子Make进程并传递变量,确保后续目标能读取到修改后的变量值。修改后的Makefile如下:
PLATFORM=wrongName debug: @echo debug $(PLATFORM) # 调用子Make进程并传递PLATFORM变量 debug-android: $(MAKE) PLATFORM=android android debug android: @echo set PLATFORM to $(PLATFORM)
执行make debug-android后,输出会变成:
set PLATFORM to android debug android
方法2:使用$(eval)修改全局变量
通过$(eval)函数在目标执行阶段直接修改全局变量,让后续目标读取到更新后的值:
PLATFORM=wrongName debug: @echo debug $(PLATFORM) debug-android: android debug android: # 用eval修改全局PLATFORM变量 $(eval PLATFORM := android) @echo set PLATFORM to $(PLATFORM)
执行make debug-android后,同样会得到符合预期的输出。
内容的提问来源于stack exchange,提问作者WeezyKrush
相关产品推荐
相关产品推荐

