即使目标未更新,gnu make 也会执行规则

问题描述 投票:0回答:1

我有 builder.sh 文件。它可以(可选)更新文件effect.cpp。如果已更新,应将其复制到 src 目录。

builder.sh 应每次执行(创建规则),并且effect.cpp 仅在更新时才应复制(移动规则)。

我已经创建了makefile:

gen: create move

create:
    cd generated && ./builder.sh build

move: generated/effect.cpp
    cp generated/effect.cpp src/effect.cpp

但是即使它没有更新它也会复制effect.cpp。怎么解决?

makefile gnu-make
1个回答
0
投票

即使它没有更新,它也会复制effect.cpp。

嗯,是的。

make
不知道
generated/effect.cpp
是否已更新。它只能确定它是否比另一个文件更新,并且它将考虑的另一个文件是规则“移动”的目标。由于没有这样的文件,并且
move
规则实际上并没有创建它,因此每次
make
确定
move
需要更新时都会运行其规则的配方。

由于所讨论的规则是用于更新

src/effect.cpp
,因此这应该是其目标。此外,
generated/effect.cpp
应该是创建 it 的规则的目标,这也将满足首先运行
builder.sh
的要求。使其依赖于不存在的目标本身将确保其配方始终运行:

gen: src/effect.cpp

src/effect.cpp: generated/effect.cpp
    cp $< $@

generated/effect.cpp: FORCE
    cd generated && ./builder.sh build

FORCE:

请注意,名称

FORCE
只是一个约定。它对
make
没有内在意义。

© www.soinside.com 2019 - 2024. All rights reserved.