我想在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
答案 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特定的语法,可能不适用于其他品牌。