makefile for 循环中的变量扩展

baw*_*nal 4 makefile gnu-make

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;
Run Code Online (Sandbox Code Playgroud)

在上面给出的示例 Makefile 中,我想打印 for 循环内的 obj 文件列表,但该列表没有按预期扩展,为了正确扩展 OBJ 列表,我在这里到底缺少什么。

use*_*267 5

所有使用配方行的方法都是在展开它们后将它们一一传递到外壳。每一行都是一个单独的shell 实例,因此当您到达echoshell 时,它甚至不知道a b c更不用说 makefile 变量a_OBJ等了(而且它只是事先失败了,因为for i in a b c; do不是有效的 bash 语法 - 记住每一行都是完全独立的)。

您可以使用特殊目标覆盖此行为,.ONESHELL该目标会将多个配方行发送到单个 shell 实例

.ONESHELL:
all:
# etc.
Run Code Online (Sandbox Code Playgroud)

但如果你尝试这个你会看到 bash 执行

for i in a b c;   \
do
echo ;  \
done;
Run Code Online (Sandbox Code Playgroud)

在将该行发送到 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)
Run Code Online (Sandbox Code Playgroud)