Makefile 如何从不重建已构建的目标

Makefile 如何从不重建已构建的目标,makefile,gnu-make,Makefile,Gnu Make,我使用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.symfon

我使用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

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

您的
var/bin/symfonyInstaller
目标始终是重建的,因为它取决于它所在的目录。每次构建时,目录的上次修改时间都会更新,并且比目标更新。因此,无休止的循环

你想要的是一个。
|
分隔符前面的make规则中提到的每个先决条件都是“正常”先决条件。在
|
分隔符之后,它是仅限订单的先决条件

如果不存在或过时,所有先决条件(正常或仅顺序)都会在目标之前更新。区别在于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
旧而被重建,因为你的Makefile使用了
安装程序
,但是你的问题提到了
bin/installer
。这是你的Makefile中的错误还是你的问题中的输入错误?我将编辑我的问题,然后给出真实的问题:)啊,然后我将编辑我的问题,因为你的问题实际上是一个用作先决条件的目录。故事的寓意是:如果足够简单,请始终显示你的真实Makefile、你键入的真实命令和你得到的真实输出,加上为什么它不是你想要的。每个角色都很重要。否则,创建一个更简单的MCVE,但测试它;-)。感谢您提供有关$<的详细信息。