在 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 变量设置的所有路径中的文件的主要内容,如果未能解决你的问题,请参考以下文章

makefile的使用

如何使匹配函数也适用于数值

wildcard ,notdir ,patsubst ,obj=$(dir:%.c=%.o)

Makefile文件语法

Eclipse makefile 仅适用于 C(windows 版本)

无法在内核模块 makefile 中使用通配符