12.18.6查找目标

GNU(全球导航单元)制作使用复杂算法来确定应该使用通过VPATH公司搜索。请参见如何执行目录搜索在里面GNU品牌手动.

如果需要重建目标,GNU制作丢弃VPATH公司搜索此目标,以及使用makefile中给定的文件名在本地构建文件。如果目标不需要重建,GNU制作使用在中找到的文件名VPATH公司搜索。

其他制作实施,如NetBSD制作,是更易于描述:在VPATH公司搜索无论是否需要重建目标,都将使用。因此新文件在本地创建,但现有文件在其VPATH公司位置。

OpenBSD和FreeBSD制作然而,从不执行VPATH公司搜索具有显式规则的依赖项。这太令人讨厌了。

当尝试VPATH公司为自动配置的包构建(例如。,mkdir构建&&cd构建&&/配置),这意味着GNU(全球导航单元)制作在本地构建所有内容建造目录,而BSD制作在本地生成新文件并更新源目录中的现有文件。

$cat生成文件VPATH=。。全部:foo.x bar.xfoo.x bar.x:更新的.x@echo建筑$@$触摸/巴。x个$触摸/更新。x个$制作#GNU品牌建筑foo.x建筑钢筋.x$普马克#NetBSD品牌建筑foo.x建筑物/巴.x$制造#FreeBSD制造,OpenBSD制造建筑foo.x建筑钢筋.x$tmake公司#Tru64品牌建筑foo.x建筑钢筋.x$触摸/巴。x个$制作#GNU品牌建筑foo.x$普马克#NetBSD品牌建筑foo.x$制造#FreeBSD制造,OpenBSD制造建筑foo.x建筑钢筋.x$特马克#Tru64品牌建筑foo.x建筑钢筋。x个

注意NetBSD如何制作更新../巴。x个在其中VPATH位置,以及FreeBSD、OpenBSD和Tru64的方式制作总是更新巴。x个,即使在../巴。x个是最新的。

另一点值得一提的是,一旦GNU制作决定忽略VPATH公司文件名(例如,它被忽略../巴。x个在上述示例中)当目标作为另一个规则的先决条件出现。

以下示例显示GNU制作不抬头巴。x个在里面VPATH公司在执行.x年规则,因为它忽略了VPATH公司的结果巴。x个在运行时这个bar.x:较新。x个规则。

$cat生成文件VPATH=。。全部:bar.ybar.x:较新的.x@echo建筑$@.后缀:.x.y.x.y(.x.y):cp$<$@$触摸/酒吧。x个$触摸/更新。x个$制作#GNU品牌建筑钢筋.xcp巴.x巴.ycp:无法stat“bar.x”:没有这样的文件或目录make:***[bar.y]错误1$普马克#NetBSD品牌建筑物/巴.xcp/巴.x巴.y$rm巴。$制造#FreeBSD制造,OpenBSD制造echo建筑bar.xcp巴.x巴.ycp:无法stat“bar.x”:没有这样的文件或目录***错误代码1$特马克#Tru64品牌建筑钢筋.xcp:bar.x:没有这样的文件或目录***出口1

请注意,如果您从bar.x:较新。x个规则,GNU制作神奇地开始工作:它我知道这一点巴。x个尚未更新,因此没有更新放弃结果VPATH公司(../巴。x个)在成功中使用。Tru64也可以工作,但FreeBSD和OpenBSD仍然没有。

$cat生成文件VPATH=。。全部:bar.ybar.x:较新的.x.后缀:.x.y.x.y(.x.y):cp$<$@$触摸/巴。x个$触摸/更新。x个$制作#GNU品牌cp/巴.x巴.y$rm巴。$普马克#NetBSD品牌cp/巴.x巴.y$rm巴。$制造#FreeBSD制造,OpenBSD制造cp巴.x巴.ycp:无法统计“bar.x”:没有这样的文件或目录***错误代码1$特马克#Tru64品牌cp/巴.x巴。

这似乎是唯一能让每个人都满意的解决方案制作实现永远不依赖VPATH公司搜索目标。换句话说,VPATH公司应保留给未生成的源。