如何在GNUMake模式规则中包含路径前缀



考虑以下内容:

%.foo: %.bar
echo $< > $@ 

假设我们有一个文件1.bar,那么执行的命令就是简单的echo 1.bar > 1.foo。然而,当%包含路径而不仅仅是文件名时,它开始变得挑剔。我的问题是,我想为%.bar准备另一条路径,模式变得完全混乱。也就是说,当%.barnice/path/1.bar时,这就不可能了:

%.foo: /project/something/%.bar
echo $< > $@

这将运行,但它执行echo nice/path//project/something/1.bar > 1.foo而不是echo /project/something/nice/path1.bar > 1.foo

原因在于make如何执行其模式规则。来自文档:

当目标模式不包含斜杠(通常也不包含)时,在将文件名与目标前缀和后缀进行比较之前,将从文件名中删除文件名中的目录名。[…]忽略目录只是为了找到要使用的隐式规则,而不是在应用该规则时。因此,"e%t"与文件名src/eat匹配,"src/a"作为词干。当先决条件转换为文件名时,词干中的目录将添加在前面,而词干的其余部分将替换为"%"。具有先决条件模式"c%r"的词干"src/a"给出了文件名src/car

有什么方法可以为特定规则关闭它吗?

您可能喜欢阅读"模式如何匹配:">

当目标模式不包含斜杠(通常也不包含)时,在将文件名与目标前缀和后缀进行比较之前,将从文件名中删除文件名中的目录名。将文件名与目标模式进行比较后,目录名以及结束目录名的斜杠将添加到根据模式规则的先决条件模式和文件名生成的先决文件名中。忽略这些目录只是为了找到要使用的隐式规则,而不是在应用该规则时。因此,"e%t"与文件名src/eat匹配,"src/a"作为词干。当先决条件转换为文件名时,词干中的目录将添加在前面,而词干的其余部分将替换为"%"。具有先决条件模式"c%r"的词干"src/a"给出了文件名src/car。

上面解释了为什么nice/path/是先决条件/project/something/1.bar的前缀。


一个修复方法是在规则中使用完整的文件名,例如:

${CURDIR}/nice/path/%.foo: /project/something/%.bar