Makefile排除文件

时间:2011-04-15 09:28:50

标签: file makefile substring

我正在创建一个GNU Makefile,我遇到以下问题:

我有一个需要从源列表中排除的排除文件(和目录)列表。 现在,从列表中删除列出的文件并不是一个大问题。我只是做以下事情:

NEWSRC := $(shell find $(SOURCEDIR) -name '*.c')
EXCLUDES := $(shell cat ./$(TARGET12)_exclude.txt) #TARGET12 is a Makefile parameter
CSRC := $(filter-out $(EXCLUDES),$(NEWSRC))

问题是EXCLUDES包含目录(不是文件名),同时也应排除同一目录下的所有文件名。例如,如果EXCLUDES变量的一个成员是../sources/filesystem/SomePath,那么该目录下的所有文件也应该从CSRC中排除。例如,这些文件可能是:

../sources/filesystem/SomePath/something.c
../sources/filesystem/SomePath/src/something.c
../sources/filesystem/SomePath/Some1/src/something.c

你知道如何在Makefile中解决这个问题吗?

提前谢谢!

3 个答案:

答案 0 :(得分:6)

如果NEWSRC中的元素必须以...开头 ../sources/filesystem/SomePath,如何将后缀添加到EXCLUDES 以下?

$(filter-out $(addsuffix /%,$(EXCLUDES)),$(NEWSRC))

答案 1 :(得分:2)

如果您允许修改..._exclude.txt文件,则可以使用模式。

foo.exclude.txt:

badFile.cc anotherBadFile.cc \
../sources/filesystem/SomePath/% \
yetAnotherBadFile.cc

打一个'%'在您要排除的每个目录的末尾。

如果您允许修改foo_exclude.txt,您可以在makefile中执行相同的操作,但这有点难看:

EXCLUDES := $(shell cat ./$(TARGET12)_exclude.txt | sed -e 's|\/ |\/% |' -e 's|\/$$|\/%|')

答案 2 :(得分:0)

你可以使用

EXCLUDES := $(shell cat ./$(TARGET12)_exclude.txt)
EXCLUDES_FILE := { notdir $(EXCLUDES )}
CSRC := $(filter-out $(EXCLUDES_FILE),$(NEWSRC))

让我知道它是否有效