来自变量的Makefile目标会覆盖意外目标

时间:2018-03-12 18:09:09

标签: makefile gnu-make

我想创建一个目标,方法是将bootload_添加到Make中的列表变量前面。这是我的档案:

cs00:
    echo "in original target cs00"
cs01:
    echo "in original target cs01"

BOOTLOAD_ENABLED:=cs00 cs01

bootload_$(BOOTLOAD_ENABLED):
    echo "in bootload $@"

当我运行make bootload_cs00时,我得到了这个输出:

Makefile:9: warning: overriding recipe for target 'cs01'
Makefile:4: warning: ignoring old recipe for target 'cs01'
echo "in bootload bootload_cs00"
in bootload bootload_cs00

我不明白为什么这会超越原定目标?我在这里错过了什么。

1 个答案:

答案 0 :(得分:1)

bootload_$(BOOTLOAD_ENABLED)扩展为bootload_cs00 cs01,即它只是字符串连接。

您可以使用patsubstaddprefix或替换引用为变量中的所有字加上前缀。 E.g:

BOOTLOAD_ENABLED:=cs00 cs01
$(info $(addprefix bootload_,${BOOTLOAD_ENABLED}))
$(info $(patsubst %,bootload_%,${BOOTLOAD_ENABLED}))
$(info ${BOOTLOAD_ENABLED:%=bootload_%})

它们都打印相同的bootload_cs00 bootload_cs01字符串。

有关详细信息,请参阅Functions for Transforming Text