我有 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。怎么解决?
即使它没有更新,它也会复制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
没有内在意义。