请考虑以下事项:
%.foo: %.bar
echo $< > $@
假设我们有一个文件1.bar
,执行的命令只是echo 1.bar > 1.foo
。但是,当%
包含路径而不仅仅是文件名时,它开始变得挑剔。我的问题是我想在%.bar
之前添加另一条路径,模式完全被破坏了。即,当%.bar
为nice/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
有什么方法可以针对特定规则关闭此功能吗?
答案 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