检索make变量中包含的列出元素的冗余条目

时间:2011-02-10 07:42:02

标签: makefile gnu-make

我有例如。分配给makefile中的变量的源文件列表 在构建时确定是否列出了两次可能会对构建过程及其结果造成影响的条目:

示例:

ListofSource = ./a/hello.c ./b/sys.c ./c/input.c ./d/hello.c

如何分析/过滤ListofSource检索列表

DuplicateSources = ./a/hello.c ./d/hello.c

函数$(排序列表)对列表进行排序并删除冗余条目,我需要相反的行为。 是否存在可以应用的make功能?

3 个答案:

答案 0 :(得分:0)

如果您对Makefile整洁有所了解,可以要求列表按排序顺序执行以下操作:

ifneq ($(LIST),$(sort $(LIST)))
$(error $$(LIST) contains duplicates)
endif

答案 1 :(得分:0)

使用$(shell),例如

DuplicateSources = $(shell perl -e '++$c{$_} for @ARGV; print join(" ",grep{$c{$_}>1} sort keys %c),"\n"' $(ListofSource))

应该有用。

答案 2 :(得分:0)

如果您可以在make中完成所有操作,则不建议使用

$(shell...)

list := a/1 b/2 c/3 a/1
duplicates := $(foreach v,$(sort ${list}),$(if $(filter-out 1,$(words $(filter $v,${list}))),$v))

(当然这可以清理一下。)这样的表达最好从内到外阅读。

  • $v依次设置为列表中的每个项目。这里没有重复,因为我们使用$(sort...)
  • $(filter $v,${list})会返回与$v匹配的所有项目。通常会有一个返回值,但在此示例中,当$va/1时,我们会得到两个(相同的)值。
  • 然后我们计算前面的单词。通常$(words...)将返回1,如果是重复,则返回更高的数字。
  • $(words...)返回1时,我们不感兴趣,所以我们$(filter-out...)这些情况。
  • 剩下的一切都是重复的!因此,使用$(if...)我们会在这种情况下返回$v

使用$(eval...)还有其他方法可以为您提供真正的编程机会。