1

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

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

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

prefix-%: base
    cp -r base $@

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

make prefix-1.zip

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

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

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

make prefix-1
make prefix-1.zip
4

2 回答 2

2

这是一个kludge,但它的工作原理:

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

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

dummy%:
    @:

根据该手册,“其先决条件实际存在或被提及的规则始终优先于具有必须通过链接其他隐式规则来实现的先决条件的规则。” 因此,我们通过给它一个必须链接的虚拟先决条件来降低第二条规则的吸引力。粗鲁但有效。我们使用管道 ( |) 使其成为“仅订单”的先决条件,以免不必要地强制重建目录。

于 2013-09-10T18:50:37.837 回答
0

这是我的解决方案。

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

我使用subst函数.zip通过替换.zip为空字符串来去除扩展名。

于 2013-09-10T11:08:05.400 回答