我有一个简单的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.
通过这种方式,我可以确认包括不存在的文件实际上导致了第二个目标的重建。
没关系。我找到了答案。
GNU Makefile手册在包含makefile时使用此方法来重建makefile。手册指出:
为此,在读取所有makefile文件后,make将考虑每个作为目标目标并尝试对其进行更新。如果makefile有规则其中说出了如何更新它(可以在该makefile或另一个规则)或适用于它的隐式规则(请参阅使用隐式)规则),必要时将对其进行更新。
换句话说,每个包含的文件都被视为目标目标。这就是为什么当我包含文件myfile.txt
时,它将为与该文件匹配的目标运行配方。
这里是我找到答案的链接:
https://www.gnu.org/software/make/manual/html_node/Remaking-Makefiles.html#Remaking-Makefiles