我在GNU Make文件中定义了以下函数:
define comma-seperated
$(shell printf '$(foreach name,$(1),$(name),)' | head -c -1)
end
你可以这样使用它:
names := John Paul George Ringo
.PHONY: test
test:
@echo Hey $(call comma-sepperated, "$(names)")
但它的输出结果是:
Hey
"John,Paul,George,Ringo"
并生成错误:
/bin/sh: John,Paul,George,Ringo: command not found
make: *** [Makefile: test] Error 127
为什么函数调用的输出被移到单独的行,为什么shell试图将其作为命令执行?
发布于 2021-09-02 12:24:13
就像我说的,我不能重现这个。此外,您的makefile在逗号后添加了空格,而示例输出中没有这些空格,因此有些地方明显不同。请尽量确保您的问题使用准确的示例代码,并显示准确的输出。
但是,允许define
变量包含换行符,如果包含换行符,这些换行符将被保留,并在展开该变量的任何配方中解释为换行符。例如,您可以在define
中创建包括多行的整个配方,然后在规则中使用它,它将按预期工作。所以,我怀疑在你的真实版本中,在扩展中有一个初始换行符。
我看不出有什么好的理由去使用这么复杂的方法:一个很难理解的call、shell、printf、head等的组合。在make中做所有这些事情要简单得多。
这里有一种方法:
EMPTY :=
SPACE := $(EMPTY) $(EMPTY)
COMMA := ,
comma-separated = $(subst $(SPACE),$(COMMA),$(strip $(1)))
names := John Paul George Ringo
.PHONY: test
test:
@echo Hey $(call comma-separated,$(names))
https://stackoverflow.com/questions/69034031
复制