makefile:删除重复的单词而不排序

par*_*vus 17 makefile

是否有可能删除单词列表中的重复项而不在makefile中排序?

$(sort foo bar lose)
Run Code Online (Sandbox Code Playgroud)

确实删除了重复项(在这种情况下对我来说是主要功能),但也排序(对我来说这是一个不幸的副作用).我想避免这种情况.

[更新]

bobbogo的回答很有效.请记住,对于更高版本,define uniq请使用v3.81和(未检查此项)define uniq =.

如果您的记录分隔符不是空格,larsmans的回答也非常好,例如,如果您想删除重复项_foo_bar_lose_lose_bar_baz_等.只需记住使用RSORSawk选项代替tr,并将其全部包装$(firstword $(shell ... ))

bob*_*ogo 27

$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))
Run Code Online (Sandbox Code Playgroud)

非常恶魔使标准库递归调用(递归使得被认为非常恶魔?):

uniq = $(if $1,$(firstword $1) $(call uniq,$(filter-out $(firstword $1),$1)))
Run Code Online (Sandbox Code Playgroud)

值得注意的是,在第二个配方中没有变量被破坏(参见seen第一个).最好是只为(鉴于缺乏当地人的化妆)!

  • @antred 不,没有。`=` 是 `define` 的默认值(这是向后兼容的)。 (2认同)

pfa*_*con 11

取决于您需要它的位置以及您是否使用GNU make.如果您只想查找目标先决条件列表,那就像(http://www.gnu.org/software/make/manual/make.html#Quick-Reference)一样简单:

$ ^的值省略了重复的先决条件,而$ +保留了它们并保留了它们的顺序.

所以,像一个规则

exe: $(OBJS)
        $(LD) -o $@ $^
Run Code Online (Sandbox Code Playgroud)

将自动从$(OBJS)过滤重复项,同时仍保持其他项目的顺序相同.


Fre*_*Foo 6

你可以echo通过awk以下词语:

echo foo bar foo baz bar | tr ' ' '\n' | awk '!a[$0]++'
Run Code Online (Sandbox Code Playgroud)

catonmat取出的重叠单线程.

(不要忘了一倍$,以$$在一个Makefile.)