首页 > 解决方案 > 过滤 Makefile 列表中的相邻单词

问题描述

我需要在 gnu makefile 中操作一些 C 标志,并且我需要从标志中提取一些两个字的参数(例如-mllvm,'s 后跟空格,然后是子参数。我需要删除mllvm和后续词)

CFLAGS := -DFOO -DBAR -mllvm llvmflag1 -mllvm llvmflag2
OTHER_CFLAGS := ??   #should be -DFOO -DBAR
MLLVM_FLAGS  := ??   #should be -mllvm llvmflag1 -mllvm llvmflag2

不幸的是,我没有看到这样做的直接方式。$(filter)不起作用,因为搜索参数被假定为以空格分隔的单词列表,并且模式是多个单词 。$(patsubst)似乎也不起作用,根据手册页,它:

在文本中查找与模式匹配的以空格分隔的单词...

但我需要匹配多个单词,而不仅仅是单词。我想知道是否有任何我可能遗漏的巧妙技巧。

标签: makefilegnu-make

解决方案


我认为您将不得不使用递归调用函数。也许是这样的:

removearg = $(if $2,$(if $(filter $1,$(word 1,$2)),$(call removearg,$1,$(wordlist 3,$(words $2),$2)),$(word 1,$2) $(call removearg,$1,$(wordlist 2,$(words $2),$2))))

keeparg = $(if $2,$(if $(filter $1,$(word 1,$2)),$(word 1,$2) $(word 2,$2) $(call keeparg,$1,$(wordlist 3,$(words $2),$2)),$(call keeparg,$1,$(wordlist 2,$(words $2),$2))))

CFLAGS := -DFOO -DBAR -mllvm llvmflag1 -mllvm llvmflag2

OTHER_CFLAGS := $(call removearg,-mllvm,$(CFLAGS))
MLLVM_FLAGS := $(call keeparg,-mllvm,$(CFLAGS))

基本上,removearg 检查列表中的第一个单词是否等于第一个参数 ( -mllvm),如果是,则通过从第三个单词开始递归调用自身来跳过第一个和第二个单词;如果不是,它会扩展到第一个单词,然后从第二个单词开始递归调用自身。

keeparg 函数是相同的,但如果-mllvmelse 跳过下一个单词,则会扩展到前两个单词。

预计到达时间

实际上,这里有一个更简单的方法:

removearg = $(filter-out $1^%,$(subst $1 ,$1^,$2))
keeparg = $(subst $1^,$1 ,$(filter $1^%,$(subst $1 ,$1^,$2)))

OTHER_CFLAGS := $(call removearg,-mllvm,$(CFLAGS))
MLLVM_FLAGS := $(call keeparg,-mllvm,$(CFLAGS))

-mllvm^这假设您永远不会有从CFLAGS. 如果是这样,请选择除 之外的其他一些不存在的字符^


推荐阅读