通过包含不存在的文件构建目标

问题描述 投票:0回答:1

我有一个简单的Makefile,我试图理解它并找到有关其工作原理的文档,因此,我希望这里的人能够在两个方面都对我有所帮助。

这是我的Makefile:

TEMP_DIR = ~/Desktop/temp

default:
    $(info "reached default")

$(TEMP_DIR)/myfile.txt:
    $(info "running temp_dir target")

-include $(addprefix $(TEMP_DIR)/, myfile.txt)

现在,我知道当您调用make而不传递目标时,它将读取整个Makefile,然后处理第一个目标。在这种情况下,它将是目标default

当make读取最后一行时,它将检查文件myfile.txt是否存在并包含它。如果不是,那么就不会抛出任何错误,因为我正在使用-include指令。如GNU make手册所述:

[如果您想让make仅仅忽略一个不存在的makefile或无法重制,没有错误消息,请使用-include指令而不是包含

但是,通过包含此不存在的文件,它将导致第二个目标被执行。因此,当我运行make时,将得到以下输出:

"running temp_dir target"
"reached default"
make: `default' is up to date.

我的问题是,为什么要执行该目标?我的第二个问题是,是否存在有关通过包含不存在的文件来构建目标的文档?这似乎不是对我重建目标的传统方式。

还有一些进一步的研究,如果我注释掉包含行,则会得到以下输出:

"reached default"
make: `default' is up to date.

通过这种方式,我可以确认包括不存在的文件实际上导致了第二个目标的重建。

makefile include gnu target
1个回答
0
投票

没关系。我找到了答案。

GNU Makefile手册在包含makefile时使用此方法来重建makefile。手册指出:

为此,在读取所有makefile文件后,make将考虑每个作为目标目标并尝试对其进行更新。如果makefile有规则其中说出了如何更新它(可以在该makefile或另一个规则)或适用于它的隐式规则(请参阅使用隐式)规则),必要时将对其进行更新。

换句话说,每个包含的文件都被视为目标目标。这就是为什么当我包含文件myfile.txt时,它将为与该文件匹配的目标运行配方。

这里是我找到答案的链接:

https://www.gnu.org/software/make/manual/html_node/Remaking-Makefiles.html#Remaking-Makefiles

© www.soinside.com 2019 - 2024. All rights reserved.