考虑以下:
%.foo: %.bar
echo $< > $@
假设我们有一个文件1.bar
,执行的命令很简单echo 1.bar > 1.foo
。然而,当%
包含一个路径,而不仅仅是一个文件名,它开始变得挑剔。我的问题是我想在前面添加另一条路径%.bar
,图案变得完全损坏。即,当%.bar
is 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
其原因在于 make 如何执行其模式规则。来自文档:
当目标模式不包含斜杠(通常不包含)时,在与目标前缀和后缀进行比较之前,文件名中的目录名将从文件名中删除。 [...] 目录被忽略只是为了查找要使用的隐式规则,而不是在应用该规则时。因此,“e%t”与文件名 src/eat 匹配,以“src/a”为词干。当先决条件转换为文件名时,主干中的目录将添加到前面,而主干的其余部分将替换“%”。带有先决条件模式“c%r”的词干“src/a”给出文件名 src/car
有什么方法可以针对特定规则关闭此功能吗?
您可能想阅读模式如何匹配 https://www.gnu.org/software/make/manual/make.html#Pattern-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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)