在 Makefile 中,如何使通配符函数适用于 VPATH 变量设置的所有路径中的文件
Posted
技术标签:
【中文标题】在 Makefile 中,如何使通配符函数适用于 VPATH 变量设置的所有路径中的文件【英文标题】:In Makefile, how to make wildcard function work for files in all the paths set by VPATH variable 【发布时间】:2017-01-10 07:50:17 【问题描述】:我有两个文件如下(来自树命令)。
.
|-- Makefile
|-- dir1
| `-- file1.c
`-- dir2
`-- file2.c
我想编译dir1和dir2目录中的文件,所以我写了一个Makefile如下。
VPATH = dir1:dir2
CFILES := $wildcard *.v
$(info CFILES = $CFILES)
输出:
CFILES =
所以通配符函数不会自动搜索由 VPATH 变量设置的路径。 如果我在通配符函数中专门写了路径,它就可以工作。
CFILES := $wildcard dir1/*.c dir2/*.c <== this makes it work
$(info CFILES = $CFILES)
输出:
CFILES = dir1/file1.c dir2/file2.c
我只想将现有路径添加到 Makefile,但有什么方法可以将通配符函数用于 VPATH 设置的路径? (假设我需要从编译列表中删除一些文件,所以我需要文件列表。只是好奇..)
【问题讨论】:
看来你不能。详情在这里***.com/questions/2483182/… 【参考方案1】:您可以使用 Make 的文本转换功能将目录列表转换为所需的通配符命令。看看GNU Make manual,他们甚至在他们的示例中使用提取 VPATH 的目录。考虑类似的事情:
$(wildcard $(addsuffix /*.c,$(subst :, ,$(VPATH))
由于您通过通配符获得文件的完整路径,因此似乎不需要使用 VPATH。恕我直言,VPATH 是个坏主意,精心设计的构建系统不要使用它。
还要考虑如果同名文件出现在不同的目录中会发生什么!
【讨论】:
以上是关于在 Makefile 中,如何使通配符函数适用于 VPATH 变量设置的所有路径中的文件的主要内容,如果未能解决你的问题,请参考以下文章
wildcard ,notdir ,patsubst ,obj=$(dir:%.c=%.o)