makefile 规则相似文件名的优先级

makefile rules precedence for similar file names

我有一个类似于以下内容的 makefile:

dist/myapp_darwin.tar.gz: release

myapp_%: $(SRC)
  recipe1

release:
  recipe2

sometarget: dist/myapp_darwin.tar.gz
  recipe3

我是运行make sometarget,需要dist/myapp_darwin.tar.gz。由于第一行中的特定目标,我希望使用 recipe2(发布目标)可以满足此要求,但它是使用 recipe1 构建的。我做错了什么,我该如何解决?

(仅针对上下文,myapp_% 目标旨在在名为 myapp_darwin 的根目录中构建一个二进制文件,而 dist/myapp_darwin.tar.gz 旨在构建一个不同的工件,一个存档分发。)

问题是 make 总是需要每个目标的配方。如果您在没有关联配方的情况下编写此代码:

dist/myapp_darwin.tar.gz: release

这不是为目标 dist/myapp_darwin.tar.gz 定义规则,所做的只是向该目标添加新的先决条件 release。 Make 仍然需要搜索其规则数据库以找到用于构建该目标的规则,并且它将匹配模式规则。

因此,它将 运行 recipe2 然后 recipe1.

如果你想为目标声明一个明确的规则,那么你必须给它一个配方,即使它是一个空操作:

dist/myapp_darwin.tar.gz: release
         @:

现在 make 有了这个目标的配方,它不需要通过隐式规则搜索来寻找配方。