makefile for循环中的变量扩展

时间:2015-07-07 06:16:14

标签: makefile gnu-make makefile-project

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 个答案:

答案 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"