如何永远不重建一个已经建立的目标
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
而重建。
我正在使用 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
而重建。