makefile for 循环中的变量扩展

Variable expansion in makefile for loop

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 列表。

食谱行的所有工作都是在扩展它们之后将它们一一传递给 shell。每行都是一个 seperate shell 实例,所以当你到达 echo 时 shell 甚至不知道 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;

Make 在将行发送到 shell 之前将 $("$${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)