makefile - 过滤 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)
似乎也不起作用,根据手册页,它:
在文本中查找与模式匹配的以空格分隔的单词...
但我需要匹配多个单词,而不仅仅是单词。我想知道是否有任何我可能遗漏的巧妙技巧。
解决方案
我认为您将不得不使用递归调用函数。也许是这样的:
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 函数是相同的,但如果-mllvm
else 跳过下一个单词,则会扩展到前两个单词。
预计到达时间
实际上,这里有一个更简单的方法:
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
. 如果是这样,请选择除 之外的其他一些不存在的字符^
。
推荐阅读
- c# - 想将指纹图像保存在数据库中,并且还想检索相同的图像
- angular - 当我在做 ng serve -o 时,出现未处理的异常:ts.createNodeArray is not a function
- mongodb - 有没有办法找到给定数组的哪些元素不在数据库中
- maven-3 - 我收到错误消息:无法执行插件“Cucumber Artifact Copier”
- mysql - 在 MySQL 中使用 Json 键值对对象查找和替换字符串
- azure - Azure VM - 注册表更改阻止启动机器
- javascript - 如何模拟 AWS sqs 调用以进行单元测试
- arduino - IMU 设备 - 如何在设备垂直时通过计算欧拉角获得水平旋转角
- java - 如何将 JPA 默认获取更改为 LAZY
- javascript - ployly.js 时间序列图表上的 yaxis 自定义标签有什么解决方案吗?