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

相似文件名的makefile规则优先级,makefile,gnu-make,Makefile,Gnu Make,我有一个类似于以下内容的makefile: dist/myapp_darwin.tar.gz: release myapp_%: $(SRC) recipe1 release: recipe2 sometarget: dist/myapp_darwin.tar.gz recipe3 我正在运行makesometarget,这需要dist/myapp\u darwin.tar.gz。由于第一行中的特定目标,我希望使用recipe2(发布目标)可以满足此要求,但它是使用recip

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

dist/myapp_darwin.tar.gz: release

myapp_%: $(SRC)
  recipe1

release:
  recipe2

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


(就上下文而言,
myapp\u%
目标意味着在根目录中构建一个名为
myapp\u darwin
的二进制文件,
dist/myapp\u 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已经有了这个目标的配方,它不需要通过隐式规则搜索来寻找它。

您也可以将它定义为一个空规则,即>>dist/myapp\u darwin.tar.gz:release;