Makefile Make:仅当第一个文件发生更改时才执行第二个规则
考虑以下Makefile Make:仅当第一个文件发生更改时才执行第二个规则,makefile,gnu-make,Makefile,Gnu Make,考虑以下make工作流,其中我(a)希望确保始终处理最新的download.zip文件,但(b)仅在该文件更改时运行工作流的其余部分: my_output.file: download.zip some_expensive_operation download.zip: wget -N http://some.server/download.zip 在本例中,wget获得了make没有的依赖项信息 如果存在download.zip,则该规则将永远不会执行,wget将永远不会检
make
工作流,其中我(a)希望确保始终处理最新的download.zip
文件,但(b)仅在该文件更改时运行工作流的其余部分:
my_output.file: download.zip
some_expensive_operation
download.zip:
wget -N http://some.server/download.zip
在本例中,wget
获得了make
没有的依赖项信息
如果存在download.zip
,则该规则将永远不会执行,wget
将永远不会检查是否有更新的文件可用
我当然可以制作.PHONY:download.zip
每次执行规则,然后一些昂贵的操作也会执行,无论文件是否更改
只有在下载.zip
发生实际更改时,才可以告诉make
运行上面的my_output.file
规则吗?使用强制规则技巧:
my_output.file: download.zip
some_expensive_operation
download.zip: FORCE
wget -N http://some.server/download.zip
FORCE: ;
(或者你可以声明.PHONY:FORCE
,如果你愿意的话)。这确保了download.zip
的配方始终运行,但它本身没有标记为虚假,因此依赖它的目标不会重建,除非它被更改。No。声明“所有依赖于此的目标将始终运行其配方”。相信我,它是有效的。你试过了吗?文档是正确的:目标依赖于FORCE
(download.zip
目标)始终运行其配方;我的理解是这就是你想要的。但是,如果download.zip
文件时间戳没有更改,则my\u output.file
不会被视为过期,并且某些昂贵的操作也不会运行。注意my_output.file
不依赖于FORCE
,因此文档中的语句不适用于该目标。IIRC上次尝试时,我观察到所有依赖于的目标。虚假的目标始终在重建。-我会再检查一遍。我重申:依赖于的目标是正确的。虚假的目标总是被重建的。但依赖于依赖于的(非虚假)目标的目标不是真的。虚假的目标总是被重建的。在我的示例中,my_output.file
不依赖于.PHONY
目标,因为download.zip
不是假的。因此,my_output.file
并不总是重建;它使用了正常的过时语义。是的,你是对的。我刚刚测试了一下,你的设置方法很有效。