我正在创建一个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中解决这个问题吗?
提前谢谢!
答案 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))
让我知道它是否有效