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

时间:2015-04-22 13:57:21

标签: makefile gnu-make

请考虑以下事项:

%.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

原因在于它的模式规则是如何制作的。来自文档:

  

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

有什么方法可以针对特定规则关闭此功能吗?

1 个答案:

答案 0 :(得分:3)

您可能希望阅读How Patterns Match

  

当目标模式不包含斜杠(并且通常不包含斜杠)时,文件名中的目录名将从文件名中删除,然后再与目标前缀和后缀进行比较。在将文件名与目标模式进行比较之后,目录名以及结束它们的斜杠将添加到从模式规则的先决条件模式和文件名生成的先决条件文件名中。仅为了查找要使用的隐式规则而忽略目录,而不是在该规则的应用程序中。因此,'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