以下情况大大简化,但确实反映了我遇到的问题。
我有一个看起来像这样的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
答案 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
替换为空字符串。