Makefile 为什么GNU制造';s vpath匹配路径将路径匹配为字符串,而不是路径?

Makefile 为什么GNU制造';s vpath匹配路径将路径匹配为字符串,而不是路径?,makefile,gnu,Makefile,Gnu,我正在优化一个非常大的项目的makefile,我发现gnumake的vpath命令只能做非常有限的工作。例如: vpath %.o $(OBJPATH) 表示按OBJPATH搜索路径值中的所有对象文件。这意味着/dir1/./dir2/obj1.o和/dir3/./dir2/obj1.o是同一个文件,但是,如果我已经制作了/dir1/./dir2/obj1.o,当工具思考规则为/dir3/./dir2/obj1.o时,它仍然找不到它,必须重新制作/dir3/./dir2/obj1.o,即使它代

我正在优化一个非常大的项目的makefile,我发现gnumake的
vpath
命令只能做非常有限的工作。例如:

vpath %.o $(OBJPATH)
表示按OBJPATH搜索路径值中的所有对象文件。这意味着
/dir1/./dir2/obj1.o
/dir3/./dir2/obj1.o
是同一个文件,但是,如果我已经制作了
/dir1/./dir2/obj1.o
,当工具思考规则为
/dir3/./dir2/obj1.o
时,它仍然找不到它,必须重新制作
/dir3/./dir2/obj1.o
,即使它代表与
/dir1/./dir2/obj1.o
相同的文件

我检查了GNU make源代码;它使用哈希表来比较文件路径字符串,因此如果字符串不同,尽管它们代表同一个文件,但仍然无法使用
vpath
进行匹配

为什么不使用更强大的功能实现
vpath

[GNU Make]使用哈希表来比较文件路径字符串,因此如果字符串不同,尽管它们代表相同的文件,但仍然无法使用vpath进行匹配

Make做的事情大致正确。检测两个对象是否相同需要依赖文件系统中唯一的ID(例如inode编号),这些ID是OS和文件系统特有的

为什么要使用两个不同的路径来引用同一个目标或先决条件?可以说,您在Makefile中所做的比使用字符串相等进行路径比较更糟糕

另外,你可能误解了一些事情。
vpath
指令和
vpath
变量与先决条件文件的搜索相关

您很少希望搜索对象文件作为先决条件(即使它们是构建可执行文件或库的先决条件)

这是因为不能假设对象文件存在,并且您不会搜索可能不存在的内容。当您进行干净的构建时,对象文件不在那里。您的Makefile必须知道它们的确切名称。这是各种各样的先决条件。例如,您知道您想要构建
foo.o
(它可能已经存在于以前的构建中,也可能不存在)。您不一定知道构建
foo.o
的源文件。它是
libfoo/foo.c
还是
utils/foo.c
?这就是
vpath
解决的问题:它将搜索这些地方并查找
foo.c
,类似于
PATH
如何帮助shell在
/bin
/usr/bin
中查找程序
foo

VPATH/VPATH
对于为小项目编写快速而脏的makefile来说有些不妥,因为小项目无法扩展到大型配置。试图改进它们是没有意义的。

Re:

[GNU Make]使用哈希表来比较文件路径字符串,因此如果字符串不同,尽管它们代表相同的文件,但仍然无法使用vpath进行匹配

Make做的事情大致正确。检测两个对象是否相同需要依赖文件系统中唯一的ID(例如inode编号),这些ID是OS和文件系统特有的

为什么要使用两个不同的路径来引用同一个目标或先决条件?可以说,您在Makefile中所做的比使用字符串相等进行路径比较更糟糕

另外,你可能误解了一些事情。
vpath
指令和
vpath
变量与先决条件文件的搜索相关

您很少希望搜索对象文件作为先决条件(即使它们是构建可执行文件或库的先决条件)

这是因为不能假设对象文件存在,并且您不会搜索可能不存在的内容。当您进行干净的构建时,对象文件不在那里。您的Makefile必须知道它们的确切名称。这是各种各样的先决条件。例如,您知道您想要构建
foo.o
(它可能已经存在于以前的构建中,也可能不存在)。您不一定知道构建
foo.o
的源文件。它是
libfoo/foo.c
还是
utils/foo.c
?这就是
vpath
解决的问题:它将搜索这些地方并查找
foo.c
,类似于
PATH
如何帮助shell在
/bin
/usr/bin
中查找程序
foo


VPATH/VPATH
对于为小项目编写快速而脏的makefile来说有些不妥,因为小项目无法扩展到大型配置。试图改进它们是没有意义的。

这一点非常不清楚。我们应该如何解析“当工具思维规则为
/dir3/./dir2/obj1.o
”时?也许如果你向我们展示规则,我们可以提供帮助。这是非常不清楚的。我们应该如何解析“当工具思维规则为
/dir3/./dir2/obj1.o
”时?也许如果你给我们看看规则,我们可以帮你。