假设 makefile 包含虚假目标:
generator: some_files
some_files:
whatever recipe
.PHONY: generator
现在,如果这个目标是
include
d 呢?
-include generator
我期望这个
generator
被视为makefile,但在当前目录中找不到它。在这种情况下,make
应该尝试重制generator
,但是根据文档:
make 不会尝试重新制作标记为虚假的 makefile。
因此什么都不应该发生。然而,文件
some_files
实际上已经创建了!这怎么可能?我可以想象 make
将 generator
解释为一个简单的目标有一些魔力,因此它会执行相应的配方。 (如果这在文档中,我对链接感兴趣)
问题
并非所有系统上都会出现此行为。我有 GNU make 4.3,但一些用户报告没有生成文件(正如我从文档中期望的那样)。有没有更干净的方法来创建文件?请注意,它们需要在 make 过程开始时创建。
这种行为差异是由于 https://savannah.gnu.org/bugs/?60795 引入的,不幸的是,GNU Make 的新闻文件中似乎没有提到更改。
您在线阅读的文档适用于当前发布的版本,因此它没有描述旧版本 GNU Make 的行为。您必须查看这些旧版本的文档,了解它们的行为方式。您应该从收到软件的同一地点收到(或已提供)您所使用版本的完整文档。
至于你的问题,我不知道有什么可靠的方法可以做你想做的事情,这比这样更好:
_dummy := $(shell $(MAKE) some_files)
我对在这样的 shell 中运行
make
持怀疑态度,但它可能会起作用。
或者,如果您有一组明确定义的目标,您可以修改它们以依赖于要构建的文件,然后递归调用真正的目标。
我考虑过添加像
.SETUP:
和 .TEARDOWN:
(或类似的东西)这样的功能,其中这些目标的先决条件是在所有事情之前和之后构建的,但我从未真正调查过它。