添加多目标后Makefile同一目标覆盖问题的排查与解决
Makefile目标覆盖问题分析与修复
你的写法确实存在问题,核心原因是公共目标display被重复定义了。
每次调用TAR宏时,都会生成一段包含display:规则的代码,当targets有多个值(abc、xyz)时,foreach循环会触发两次eval,相当于你在Makefile里写了两遍完全一样的display规则:
display: @echo "XXXXXXXXXX"
虽然当前两次定义的规则内容完全一致,执行make abc时不会立刻出功能故障,但这是不符合Makefile规范的写法——重复定义同一个目标会让Make默认用最后一次定义的规则覆盖之前的,后续如果修改display的规则逻辑,很容易出现意料之外的覆盖问题。
另外还有个小细节:xxx-$(1):下面的命令行你用了空格缩进,Makefile要求规则里的命令必须用Tab键缩进,实际运行时会报错,这个也要注意。
修复后的代码
把公共的display目标从宏里抽出来,只定义一次,宏里只保留每个目标独有的规则即可:
targets: abc xyz # 公共display目标只定义一次 display: @echo "XXXXXXXXXX" define TAR $(1) : display xxx-$(1) xxx-$(1): # 这里必须用Tab缩进,执行目标特定操作 @echo "执行$(1)的专属操作" # 实际调用脚本可以写:./your-script.sh $(1) endef $(foreach x,$(targets),$(eval $(call TAR,$(x))))
这样修改后,执行make abc只会触发一次display,然后构建xxx-abc和abc,不会再出现目标覆盖的问题。
内容的提问来源于stack exchange,提问作者pupil
相关产品推荐
相关产品推荐

