来自https://www.gnu.org/software/make/manual/html_node/Text-Functions.html#Text-Functions 的
$(filter PATTERN...,TEXT)返回与任何模式词匹配的文本中所有空格分隔的单词,删除所有不匹配的单词。这些模式是使用%编写的,就像上面的patsubst函数中使用的模式一样。
$(filter-out PATTERN...,TEXT)
返回不匹配任何模式词的文本中所有空格分隔的单词,删除与一个或多个匹配的单词。这与filter函数正好相反。
“空格-分隔词”是什么意思?
我们想我们知道了。至少,假设一个“正常”的地区。
因此,对于"C“("POSIX")区域设置我们有
“空间”
将要分类的字符定义为空白字符。
在POSIX中,至少应包括<space>、<form-feed>、<newline>、<carriage-return>、<tab>和<vertical-tab>。
Now,一个makefile,如下所示:
define foo
a
b
endef
all :
echo '$(filter a b,$(foo))'运行,我得到:
echo ''让我们来看看filter-out 的案例:
define foo
a
b
endef
all :
-echo '$(filter-out a b,$(foo))'运行,我得到:
echo 'a
/bin/sh: 1: Syntax error: Unterminated quoted string
makefile:8: recipe for target 'all' failed
make: [all] Error 2 (ignored)
b'
/bin/sh: 1: Syntax error: Unterminated quoted string
makefile:8: recipe for target 'all' failed
make: [all] Error 2 (ignored)因此,在这里,Make显然不能正确处理合法的white-space (换行符)。
对吗?
发布于 2015-08-21 15:08:10
问题是,您需要转义foo变量中的换行符,或者将其值传递到适当的位置。
与在makefile中编写任何嵌入式shell脚本一样,您需要转义每一行新代码。$(foo)将简单地从foo多行变量复制粘贴内容。因此,对于给定的foo值,下面的菜谱将引发语法错误:
test1:
echo '$(foo)'类似的事情也适用于您的filter-out示例。我不知道为什么filter函数没有语法错误。
1解决方案。如上所述,转义换行符是解决方案之一:
define foo
a\
b
endef
test1:
echo '$(foo)'好处是你不需要改变你的all配方。
第二个解决方案。在大多数情况下,您可能不想更改/编辑/解析多行变量。然后,您需要使用一个shell函数,它将直接调用一个shell命令,而不是将脚本粘贴到makefile内容中,然后解析它。我们的测试配方如下所示:
define foo
a
b
endef
test2:
echo $(shell echo '$(foo)')注意,函数正在将输出换行符转换为单个空格。
https://stackoverflow.com/questions/32136288
复制相似问题