为什么一个gnu制作目标,%总是被重建?

时间:2017-01-12 07:56:17

标签: gnu-make

我似乎在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'.

1 个答案:

答案 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