Makefile“包含”一个虚假目标

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

假设 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 过程开始时创建。

makefile gnu-make
1个回答
0
投票

这种行为差异是由于 https://savannah.gnu.org/bugs/?60795 引入的,不幸的是,GNU Make 的新闻文件中似乎没有提到更改。

您在线阅读的文档适用于当前发布的版本,因此它没有描述旧版本 GNU Make 的行为。您必须查看这些旧版本的文档,了解它们的行为方式。您应该从收到软件的同一地点收到(或已提供)您所使用版本的完整文档。

至于你的问题,我不知道有什么可靠的方法可以做你想做的事情,这比这样更好:

_dummy := $(shell $(MAKE) some_files)

我对在这样的 shell 中运行

make
持怀疑态度,但它可能会起作用。

或者,如果您有一组明确定义的目标,您可以修改它们以依赖于要构建的文件,然后递归调用真正的目标。

我考虑过添加像

.SETUP:
.TEARDOWN:
(或类似的东西)这样的功能,其中这些目标的先决条件是在所有事情之前和之后构建的,但我从未真正调查过它。

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