我似乎在Makefile中错误地使用%
。这个简单的makefile显示了问题
生成文件:
mylib: mylib-%.dll
mylib-%.dll:
touch mylib-13.dll
myotherlib: myotherlib-13.dll
myotherlib-13.dll:
touch myotherlib-13.dll
输出:
> make mylib
touch mylib-13.dll
> make mylib
touch mylib-13.dll
> make myotherlib
touch myotherlib-13.dll
> make myotherlib
make: Nothing to be done for `myotherlib'.
mylib总是被重建(第二个make mylib
调用再次执行touch
命令),而myotherlib只构建一次。
为什么这个以及我需要更改什么才能重建mylib,即第二次调用make mylib
也会返回make: Nothing to be done for 'mylib'.
?
答案 0 :(得分:0)
规则的目标(:
的左侧部分),除非在.PHONY
特殊规则下标记,否则应该在制作过程结束时创建并存在如果你马上重新发出命令。
此处您的规则myotherlib-13.dll
确实正确地创建了该目标,因为您的规则myotherlib
直接依赖于它,这是一个基本规则。
但是,您的规则mylib-%.dll
是一种模式规则,如果可能,它将与目标匹配。诀窍在于您的mylib
规则,该规则取决于mylib-%.dll
目标。您告诉make mylib
必须依赖于文件nammed mylib-%.dll
,因此它会查找匹配的规则并找到它,但此规则会创建一个名为mylib-13.dll
的文件,以便创建目标永远不会完成。
如果您想要演示正在发生的事情,请使用touch xxx
更改touch $@
命令($@
是替换模式后自动变量替换为规则的名称 - 匹配部分)。
所以用
mylib: mylib-%.dll
mylib-%.dll:
touch $@
myotherlib: myotherlib-13.dll
myotherlib-13.dll:
touch $@
正在做
$ make mylib
您将获得输出
touch mylib-%.dll
只需将mylib: mylib-%.dll
更改为mylib: mylib-13.dll
即可按预期工作。
使用演示中的代码,您会看到$@
现在可以正确替换为mylib13.dll
。