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)
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)