Makefile中循环的变量扩展

4
APPS = a b c

a_OBJ = x.o y.o z.o
b_OBJ =  p.o q.o r.o
c_OBJ = s.o t.o k.o

all:
    for i in $(APPS);   \
    do
       echo $("$${i}_OBJ");  \
    done;

在上面给出的Makefile示例中,我想在for循环中打印obj文件列表,但列表没有像预期的那样展开,我到底缺少了什么以使OBJ列表正确展开。
1个回答

5
所有的制作都仅仅是将配方逐个展开并传递给外壳,每一行都是一个单独的外壳实例,因此当你到达"echo"时,外壳甚至不知道"a b c"甚至是makefile变量"a_OBJ"等(还有它之前就失败了,因为"for i in a b c; do"并不是有效的bash语法--请记住每一行都是完全独立的)。您可以使用".ONESHELL"特殊目标覆盖此行为,这将向单个shell实例发送多个配方行。
.ONESHELL:
all:
# etc.

但是如果你尝试这样做,你会发现Bash会执行

for i in a b c;   \
do
echo ;  \
done;

在将行发送到shell之前,Make将$("$${i}_OBJ")扩展为空字符串,因为没有名为"${i}_OBJ"的变量。

您需要像以下示例一样在发送变量之前进行扩展:

APPS = a b c

a_OBJ = x.o y.o z.o
b_OBJ =  p.o q.o r.o
c_OBJ = s.o t.o k.o

all: $(APPS)    
$(APPS):
    @echo $($@_OBJ)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接