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

Makefile 通过包含不存在的文件来构建目标,makefile,include,gnu,target,Makefile,Include,Gnu,Target,我有一个简单的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) 现在

我有一个简单的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,然后处理第一个目标。在这种情况下,它将是目标
默认值

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

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

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

"running temp_dir target"
"reached default"
make: `default' is up to date.
我的问题是,它为什么要执行这个目标?我的第二个问题是,是否有关于通过包含不存在的文件来构建目标的文档?对我来说,这似乎不是重建目标的传统方式

作为进一步的研究,如果我注释掉include行,我会得到以下输出:

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

这样,我可以确认包含不存在的文件实际上是导致重建第二个目标。

无需担心。我找到了答案

GNU Makefile手册在包含Makefile时使用此方法重建Makefile。手册规定:

为此,在阅读完所有的Mag文件后,将考虑每个 作为目标,并尝试更新它。如果makefile有规则 这说明了如何更新它(可以在makefile中找到,也可以在 或者如果隐式规则适用于它(请参见使用隐式规则) 规则),如有必要,将对其进行更新

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

以下是我找到答案的链接: