gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:41:22 25 4
gpt4 key购买 nike

这是我的 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。

最佳答案

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

为了让 make 认为文件已过时且需要更新(因此,为了让 make 运行与目标关联的配方),至少必须满足以下两件事之一:目标(即文件或目录)不能存在,或者如果存在,则其最后修改时间必须至少早于其先决条件之一。

在您的情况下,您有第二个,它存在,因此不满足重建的第一个要求,并且没有先决条件,因此不满足第二个要求......所以目标不被认为是过时的并且不会调用该配方。

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

关于Makefile:与子目录同名的规则被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16317307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com