在Make中更改规则的优先级

时间:2013-09-10 10:40:49

标签: makefile

以下情况大大简化,但确实反映了我遇到的问题。

我有一个看起来像这样的Makefile:

prefix-%.zip: prefix-%
    zip -r $@ $<

prefix-%: base
    cp -r base $@

它与另一个包含某些文件的目录库一起放在一个目录中。如果我执行命令

make prefix-1.zip

我希望使用第二条规则创建目录prefix-1,然后使用第一条规则基于该目录创建zip文件prefix-1.zip

但是,它似乎找到了第一个带有“1”的规则,但它没有选择该规则,因为该目录不存在。然后它似乎倾向于使用词干'1.zip'的第二条规则。虽然这是一个更长的词干,但这个规则被选中。我认为这是由于第一条规则缺少先决条件。有没有什么方法可以指导制作正确的规则,而无需手动首先制作目录?

顺便说一句,首先制作目录然后zip文件正常工作

make prefix-1
make prefix-1.zip

2 个答案:

答案 0 :(得分:2)

这是一个kludge,但它有效:

prefix-%.zip: prefix-%
    zip -r $@ $<

prefix-%: base | dummy%
    cp -r base $@

dummy%:
    @:

根据手册,"a rule whose prerequisites actually exist or are mentioned always takes priority over a rule with prerequisites that must be made by chaining other implicit rules."因此,我们通过赋予必须链接的虚拟先决条件,使第二条规则不那么有吸引力。原油但有效。我们使用管道(|)使其成为“仅订单”的先决条件,以免强制不必要地重建目录。

答案 1 :(得分:0)

这是我的解决方案。

prefix-%.zip: base
    cp -r base $(subst .zip,,$@)
    zip -r $@ $(subst .zip,,$@)

我使用subst函数删除.zip扩展名,将.zip替换为空字符串。