我正在编写一个 Makefile,但遇到了过滤器功能限制。实际上,过滤器只需要一个通配符。
我想做的是:我有一个文件列表,有些匹配正则表达式blabla,有些不匹配。但为此我需要 2 个通配符,因此我不能使用过滤功能。
我想将我的原始列表分成 2 个列表,一个包含所有包含 blabla 字符串的元素(等效过滤器),另一个包含不匹配的元素(等效过滤器)。
谢谢你的帮助。
您可以在不运行任何外部命令的情况下执行此操作。定义两个宏
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))
Make 最大的缺点之一是它处理正则表达式的能力很差。函数filter
和filter-out
单词中间找不到“旧”。我建议这个黑客:
NOT_OLD = $(shell echo $(LIST) | sed 's/[^ ]*old[^ ]* *//g')
OLD = $(filter-out $(NOT_OLD), $(LIST))
您可以利用 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 调用中$
需要使用双精度符号。$