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列表。
答案 0 :(得分:2)
所有使用配方线的make都会在展开后将它们逐个传递给shell。每一行都是一个单独的 shell实例,所以当你到达echo
时,shell甚至不知道a b c
,更不用说makefile变量{{1}了等等(也只是事先失败,因为a_OBJ
不是有效的bash语法 - 记住每一行是完全独立的。)
您可以使用for i in a b c; do
特殊目标覆盖此行为,该目标会将多个配方行发送到单个shell实例
.ONESHELL
但是如果你试试这个,你会看到bash执行
.ONESHELL:
all:
# etc.
在将行发送到shell之前,将for i in a b c; \
do
echo ; \
done;
扩展为空字符串,因为没有名为$("$${i}_OBJ")
的变量。
您需要在发送之前扩展变量,并使用以下内容
"${i}_OBJ"