Makefile:忽略与子目录同名的规则

Makefile:忽略与子目录同名的规则,makefile,gnu-make,Makefile,Gnu Make,这是我的生成文件: all: first second second: @echo "==Building second==" first: @echo "==Building first==" 如果存在名为second的目录,则makefile将完全忽略同名规则。如果没有,一切正常 请注意,无论第二个文件夹是否作为Makefile在其中,都会发生这种情况 我在组织我的项目时讨论了这个问题:我考虑创建一个通用的Makefile,然后调用每个目录中的Makefile。。因此,

这是我的生成文件:

all: first second

second:
    @echo "==Building second=="

first:
    @echo "==Building first=="
如果存在名为
second
的目录,则makefile将完全忽略同名规则。如果没有,一切正常

请注意,无论第二个
文件夹是否作为Makefile在其中,都会发生这种情况

我在组织我的项目时讨论了这个问题:我考虑创建一个通用的Makefile,然后调用每个目录中的Makefile。。因此,在我看来,规则与文件夹具有相同的名称是很自然的

解决方案很简单:在Makefile中更改规则名称……但这种行为似乎很奇怪:您对此有什么想法/见解,以及其他可能的解决方案吗


我在Ubuntu 12.04.2 LTS下使用Bash 4.2.25中的GNU Make 3.81。

似乎您希望始终运行
second
规则,无论文件(或目录)“second”是否已经存在。通过将其声明为
.PHONY
的先决条件,可以创建第二个此类符号目标

.PHONY: all
all: first second

.PHONY: second
second:
    @echo "==Building second=="
...

如果您只是寻找规则未运行的原因,那么很简单:make尝试构建目标。目标(默认情况下)由文件系统中是否存在工件来表示。不管工件是文件还是目录(理论上是其他任何东西),这都无关紧要

为了使一个文件过时和需要更新(因此,为了运行与目标相关的配方),至少两个事物中的一个必须是真的:要么目标(即文件或目录)不能存在,要么,如果它确实存在,它的最后修改时间必须比它的至少一个先决条件更大。 在您的情况下,您有第二个

,它是存在的,因此重建的第一个要求不是我,它没有先决条件,因此第二个要求不满足。。。因此,不会认为目标已过时,也不会调用配方


正如bobbogo所建议的,您可以通过将目标声明为
.PHONY
,告诉make应该始终重建目标,而不管其他任何事情。Make将理解目标并不代表文件系统中的工件,而是用于组织构建的makefile中的一个伪目标。

如果我正确理解您的问题陈述,您不是在调用
echo
,而是在调用
$(Make)-cssecond
。该读米勒的书了!虽然这些都不是传统品牌固有的问题,但要想更好地利用它们将是困难和笨拙的

正是因为这个原因,才创建了。您可以拥有大致相同的makefile,但不需要指定递归。如果目标目录中有makefile,它们通常会自动加载到同一进程中。或者,如果目标生成到另一个目录,则必须告诉makepp要加载哪些makefiles。无论哪种方式,一个流程都具有所有(自动检测到的!)依赖项的概览


还有很多事情要做。除了做GNU make所能做的几乎所有事情外,还有很多更有用的事情,你甚至可以通过一些Perl编程来扩展你的Makefile。

你想让
second
规则从
second/
中调用
second/Makefile
,对吗?