6

我正在编写一个 Makefile,但遇到了过滤器功能限制。实际上,过滤器只需要一个通配符。

我想做的是:我有一个文件列表,有些匹配正则表达式blabla,有些不匹配。但为此我需要 2 个通配符,因此我不能使用过滤功能。

我想将我的原始列表分成 2 个列表,一个包含所有包含 blabla 字符串的元素(等效过滤器),另一个包含不匹配的元素(等效过滤器)。

谢谢你的帮助。

4

3 回答 3

10

您可以在不运行任何外部命令的情况下执行此操作。定义两个宏

containing = $(foreach v,$2,$(if $(findstring $1,$v),$v))
not-containing = $(foreach v,$2,$(if $(findstring $1,$v),,$v))

现在你可以做

LIST := a_old_tt x_old_da a_new_da q_ty_we
LIST_OLD := $(call containing,old,$(LIST))
LIST_NOT_OLD := $(call not-containing,old,$(LIST))
于 2012-09-07T19:45:21.303 回答
3

Make 最大的缺点之一是它处理正则表达式的能力很差。函数filterfilter-out单词中间找不到“旧”。我建议这个黑客:

NOT_OLD = $(shell echo $(LIST) | sed 's/[^ ]*old[^ ]* *//g')
OLD = $(filter-out $(NOT_OLD), $(LIST))
于 2012-09-07T16:13:40.037 回答
1

您可以利用 shell 更高级的字符串处理功能。假设您有bash,您可以在您的 中使用以下内容makefile

LIST := a_old_tt x_old_da a_new_da q_ty_we
LIST_NOT_OLD := $(shell l=($(LIST)); echo $${l[@]//*old*})
LIST_OLD := $(filter-out $(LIST_NOT_OLD),$(LIST))

您可以在如何根据模式从数组中删除元素中找到有关 bash 字符串替换机制的说明。在 shell 调用中$需要使用双精度符号。$

于 2012-09-07T16:31:14.280 回答