如何在 make 中创建一个本身名为 'makefile' 的目标?

How to make a target in make that is itself named 'makefile'?

总结:我正在处理生成(以及可选的 'makes')生成文件的生成脚本。历史上它使用 make make "phony target" 来这样做。我想将其更改为 make makefile,因为它看起来更连贯并且更能代表正在发生的事情。但是,当我更改它并切换到 .FORCE 习惯用法时,它将根据人工虚假目标生成,似乎由于我不明白的原因,生成文件额外创建了 4 次。

详细信息:脚本的工作方式是您可以编写:

make -f makefile.boot

或:

make -f makefile.boot make

在第一种情况下,它假定您要使用 makefile.boot 中的规则生成特定于平台的 makefile,然后 运行 make文件。在第二种情况下,它假设您只想创建 makefile 而不是执行它。

这是 makefile.boot 的精简版本,在 make make 术语中有效:

top: make
    $(MAKE)

make:
    @echo "Pretending to generate makefile..."
    cp makefile.fake makefile

我们 "generate" 的 makefile 想要成为 makefile.boot 的 超集 。它也希望能够执行 make make 生成过程,但其 top 目标是实际构建。所以makefile.fake包含

top: product

make:
    @echo "Pretending to generate makefile..."
    cp makefile.fake makefile

product:
    @echo "Pretending to make build product..."
    echo "Build Product" >> product

它有效,但我有一个想法:

"make make" is confusing to read, and it would be clearer if it was "make makefile" instead

一个直接的问题是当你有一个真正的目标而不是一个虚假的目标时,如果文件存在并且没有依赖项,它就不会被重建。我希望在您每次执行 make makefilemake -f makefile.boot makefile 时创建此 makefile。所以我使用 .FORCE 惯用语 depend 假目标。更新 makefile.boot:

.FORCE

top: makefile
    $(MAKE)

makefile: .FORCE
    @echo "Pretending to generate makefile..."
    cp makefile.fake makefile

并更新了 makefile.fake:

.FORCE:

top: product

makefile: .FORCE
    @echo "Pretending to generate makefile..."
    cp makefile.fake makefile

product:
    @echo "Pretending to make build product..."
    echo "Build Product" >> product

看起来一切都很好,但是 它现在 运行makefile 生成了五次:

/test$ make -f makefile.boot
Pretending to generate makefile...
cp makefile.fake makefile
make
make[1]: Entering directory '/test'
Pretending to generate makefile...
cp makefile.fake makefile
Pretending to generate makefile...
cp makefile.fake makefile
Pretending to generate makefile...
cp makefile.fake makefile
Pretending to generate makefile...
cp makefile.fake makefile
Pretending to make build product...
echo "Build Product" >> product
make[1]: Leaving directory '/test'

我想要的第一个,而且似乎是我唯一要的。所有其他电话来自哪里?是什么触发了 makefile 的四个额外请求?或者在不理解的情况下,是否有其他方法可以实现我的意图?

记得 makefile 是许多 make 实现中的魔法目标,including GNU Make

如果目标 makefile 存在,那么 make 将在执行任何其他操作之前 重新制作 makefile ,完成后它将重新开始处理新的联编文件。这意味着即使您不要求,您的 makefile 目标也可能是 运行。

因为当你做make -f makefile.boot时的默认动作是运行make,那么至少有两个潜在[=30= makefile 目标的操作的 ]s 就在那里,甚至在查看 product 目标之前。我不能完全让这个加起来达到五个 运行,但我会花钱说正是这种特殊行为导致了意外的重复。