如何永远不重建一个已经建立的目标

How to never rebuild an already built target

我正在使用 Makefile 自动安装一些工具,我下载了其中一些

all:bin/symfony

bin/symfony: var/bin/symfonyInstaller
    @echo making $@
    @$< --install-dir bin > /dev/null 2>&1

var/bin/symfonyInstaller: var/bin
    @echo making $@
    @wget -q https://get.symfony.com/cli/installer -O $@ >/dev/null 2>&1
    @chmod a+x $@ > /dev/null

var/bin:
    @echo making $@
    @mkdir -p $@ > /dev/null

clean:
    @echo making $@
    @rm -rf bin var

由于某些原因,var/bin/symfonyInstaller 一直在重制:

$ make
making  var/bin
making  var/bin/symfonyInstaller
making  bin/symfony
$ make
making  var/bin/symfonyInstaller
$ 

有没有办法告诉 make“不要重建 var/bin/symfonyInstaller”?

您的 var/bin/symfonyInstaller 目标总是被重建,因为它取决于它所在的目录。并且每次构建目录的最后修改时间都会更新并变得比目标更新。如此循环往复。

你想要的是 order-only prerequisite| 分隔符之前的 make 规则中提到的每个先决条件都是“normal”。在 | 分隔符之后,它是一个仅供订购的先决条件。

所有先决条件,无论是正常的还是仅限订单,如果不存在或已过时,都会在目标之前更新。区别在于 make 如何决定重建或不重建相应的目标。如果它更新了一个正常的先决条件,或者如果正常的先决条件比目标更新,则 Make 会重建目标。但如果它是已更新或比目标更新的仅限订单的先决条件,则不是。

在你的情况下,你应该将它用于 var/bin:

var/bin/symfonyInstaller: | var/bin
    @echo making $@
    @wget -q https://get.symfony.com/cli/installer -O $@ >/dev/null 2>&1
    @chmod a+x $@ > /dev/null

如果 var/bin 不存在,它会在 var/bin/symfonyInstaller 之前创建,这很好,但是 var/bin/symfonyInstaller 不会因为它早于 var/bin 而重建。