是否有可能删除单词列表中的重复项而不在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_等.只需记住使用RS和ORSawk选项代替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第一个).最好是只为(鉴于缺乏当地人的化妆)!
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)过滤重复项,同时仍保持其他项目的顺序相同.
你可以echo通过awk以下词语:
echo foo bar foo baz bar | tr ' ' '\n' | awk '!a[$0]++'
Run Code Online (Sandbox Code Playgroud)
(不要忘了一倍$,以$$在一个Makefile.)
| 归档时间: |
|
| 查看次数: |
12500 次 |
| 最近记录: |