makefile:删除重复的单词而不进行排序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了makefile:删除重复的单词而不进行排序相关的知识,希望对你有一定的参考价值。
是否有可能删除单词列表中的重复项而不在makefile中排序?
$(sort foo bar lose)
确实删除了重复项(在这种情况下对我来说是主要功能),但也排序(对我来说这是一个不幸的副作用)。我想避免这种情况。
[更新]
bobbogo的答案很有效。只记得使用define uniq
for v3.81和(没有检查这个)define uniq =
的更高版本。
如果您的记录分隔符不是空格,例如larsmans的答案也很有效。如果你想从_foo_bar_lose_lose_bar_baz_
等删除重复项。只记得使用RS
和ORS
awk选项而不是tr
,并用$(firstword $(shell ... ))
包装它们
无聊的$eval
方法:
define uniq =
$(eval seen :=)
$(foreach _,$1,$(if $(filter $_,${seen}),,$(eval seen += $_)))
${seen}
endef
w := z z x x y c x
$(info $(sort $w))
$(info $(call uniq,$w))
非常恶魔使标准库递归调用(递归使得被认为非常恶魔?):
uniq = $(if $1,$(firstword $1) $(call uniq,$(filter-out $(firstword $1),$1)))
值得注意的是,在第二个配方中没有变量被破坏(参见第一个中的seen
)。这是优选的(鉴于制造中缺乏当地人)!
取决于您需要它的位置以及您是否使用GNU make。如果您只想要列出目标先决条件列表,那就像(http://www.gnu.org/software/make/manual/make.html#Quick-Reference)一样简单:
$ ^的值省略了重复的先决条件,而$ +保留了它们并保留了它们的顺序。
所以,像一个规则
exe: $(OBJS)
$(LD) -o $@ $^
将自动从$(OBJS)过滤重复项,同时仍保持其他项目的顺序相同。
你可以通过echo
awk
的话:
echo foo bar foo baz bar | tr ' ' '
' | awk '!a[$0]++'
从catonmat取出的重叠单线。
(别忘了在Makefile中将$
加倍到$$
。)
以上是关于makefile:删除重复的单词而不进行排序的主要内容,如果未能解决你的问题,请参考以下文章
我如何每行读取一个文本文件,然后将字符串分解成单个单词(分成一个树集)而不重复?
std::sort 对 c 风格的字符串进行排序,而不复制字符串 [重复]