使用``%``作为目标时,GNU Make的惊人(?)行为

时间:2016-10-15 18:12:51

标签: makefile

考虑以下Makefile

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<svg id="btn-test1" viewbox="0 0 40 40">
  <circle id="path1" opacity="0.33" fill="#913A3A" stroke="#CDC9C4" stroke-miterlimit="10" cx="20" cy="20" r="18.6" />
</svg>

发出foo: @echo '$@' test: @echo '$@' @echo '---' # Catch-all target %: test @echo '+++' @echo '$@' 时,控制台输出如下:

make bar

我想了解$ make bar test --- +++ Makefile +++ bar 的来源,它表明它在某些时候被作为参数接收,以及如何在这样的方案中摆脱它。这是使用

Makefile

1 个答案:

答案 0 :(得分:1)

GNU make将makefile本身视为需要更新的目标。见How Makefiles Are Remade

  

...在阅读所有makefile后,make会将每个作为目标目标并尝试更新它。如果一个makefile有一条规则说明如何更新它(在那个makefile或另一个中找到)或者隐含规则是否适用于它(参见使用隐式规则),它将在必要时更新......

     

如果您知道您的一个或多个makefile无法重新制作,并且您希望让make不对其执行隐式规则搜索,可能出于效率原因,您可以使用任何阻止隐式规则查找的常规方法这样做。例如,您可以编写一个以makefile作为目标的显式规则,以及一个空配方(请参阅使用空配方)。

因此,catch-all-target %用于更新Makefile。

Makefiles通常不需要更新,因此习惯上为此添加一个空规则:

Makefile : ;