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
并不总是重建;它使用了正常的过时语义。是的,你是对的。我刚刚测试了一下,你的设置方法很有效。