使用bash for在makefile中声明变量

时间:2018-03-28 17:22:14

标签: bash makefile

我想在makefile中使用for中的bash声明变量。这就是我的尝试:

SRCS="path/to/foo.c path/to/boo.c path/to/bar.c"
OBJS=$(for file in $SRCS; do TEMP="$TEMP $(basename $file .c).o"; done; echo $TEMP)

此命令:

for file in $SRCS; do TEMP="$TEMP $(basename $file .c).o"; done
当回显TEMP时,

在bash上工作。但是makefile中的OBJS为空。我在这里缺少什么?

期望的输出:

foo.o boo.o bar.o

1 个答案:

答案 0 :(得分:2)

首先,有更好的方法可以在不使用bash的情况下执行此操作。您可以使用make构造来生成这些列表。请参阅$(notdir)$(addprefix...)$(addsuffix ...)

上的文档

但是,要回答关于这个特定例子的问题:

首先,您要在各种来源周围加上引号。 Make不会将引号解释为特殊字符,因此SRCS将扩展为"path/to/foo.c path/to/boo.c path/to/bar.c"(包括引号)。这将在以后弄乱你的for循环。

接下来是对$SRCS的引用 - make会将其解释为$S,后跟文字RCS(这不是您想要的)。你必须在bash中使用multi0letter变量的大括号 - $(SRCS)

接下来,TEMP=$TEMP...。当make看到$TEMP时,它会立即尝试展开它。因为TEMP未设置为make上下文中的任何内容,所以它将扩展为空字符串 - 这是在它调用bash shell之前...在这种情况下你想要做的是使用{{1} },make会扩展为$$TEMP

以下是您想要的:请注意$TEMP行仅用于调试。

$(info)

如果您想在没有bash或sh的makefile中执行此操作,可以尝试:

SRCS:=path/to/foo.c path/to/boo.c path/to/bar.c
OBJS:=$(shell for file in $(SRCS); do TEMP="$$TEMP $$(basename $$file .c).o"; done; echo $$TEMP)
$(info for file in $(SRCS); do TEMP="$$TEMP $$(basename $$file .c).o"; done; echo $$TEMP)    
$(info OBJS=$(OBJS))

注意:这是gnu-make特定的语法,可能不适用于其他品牌。