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_等删除重复项。只记得使用RSORS 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:删除重复的单词而不进行排序的主要内容,如果未能解决你的问题,请参考以下文章

我如何每行读取一个文本文件,然后将字符串分解成单个单词(分成一个树集)而不重复?

删除重复元素并计算ArrayList中的重复次数

std::sort 对 c 风格的字符串进行排序,而不复制字符串 [重复]

Leetcode(无重复字符的最长子串;删除排序链表中的重复元素II;加一;最后一个单词的长度;相同的树)

按字母顺序对HashMap程序的输出进行排序[重复]

根据重复次数对输入文本中的单词进行排序?