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

Hel*_*ios 4 makefile gnu-make

这是我的makefile:

all: first second

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

first:
    @echo "==Building first=="
Run Code Online (Sandbox Code Playgroud)

如果存在名为的目录second,则makefile将完全忽略具有相同名称的规则.如果没有,一切正常.

请注意,无论second文件夹是否为Makefile,都会发生这种情况.

我在组织我的项目时遇到了这个问题:我考虑创建一个通用的Makefile,然后在每个目录中调用Makefile.所以对我来说,规则与文件夹的名称相同是很自然的.

解决方案很简单:更改Makefile中的规则名称...但这种行为似乎很奇怪:你对此有什么想法/见解,还有另一种可能的解决方案吗?

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

Mad*_*ist 6

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

为了让make考虑一个过时且需要更新的文件(因此,对于make来运行与目标相关的配方),两件事中的至少一件必须是真的:要么是目标(即,文件或目录)不能存在,或者如果存在,则其上次修改时间必须早于至少一个先决条件.

在你的情况下,你有second,存在,所以重建的第一个要求不是我,没有先决条件,所以第二个要求没有得到满足......所以目标不被认为是过时的和食谱没有被调用.

正如bobbogo建议的那样,你可以通过声明目标来告诉make应该总是重建目标,而不管其他什么.PHONY.让会明白目标并没有在用于组织构建生成文件在文件系统中表示神器是,相反,只是一个假目标.