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

Gx1*_*TDa 6 makefile gnu-make

考虑以下:

%.foo: %.bar
    echo $< > $@ 
Run Code Online (Sandbox Code Playgroud)

假设我们有一个文件1.bar,执行的命令很简单echo 1.bar > 1.foo.但是,当%包含路径而不仅仅是文件名时,它开始变得挑剔.我的问题是我想要添加另一条路径%.bar,模式完全被破坏了.即,当%.barnice/path/1.bar,这成为不可能:

%.foo: /project/something/%.bar
    echo $< > $@
Run Code Online (Sandbox Code Playgroud)

这将运行,但它执行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

有什么方法可以根据具体规则关闭它吗?

Max*_*kin 1

您可能想阅读模式如何匹配

\n\n
\n

当目标模式不包含斜杠(通常不包含)时,在与目标前缀和后缀进行比较之前,会从文件名中删除文件名中的目录名。将文件名与目标模式进行比较后,目录名及其结尾的斜杠将添加到从模式规则 \xe2\x80\x99s 先决条件模式和文件名生成的先决条件文件名中。忽略目录只是为了查找要使用的隐式规则,而不是为了应用该规则。因此, \xe2\x80\x98e%t\xe2\x80\x99 与文件名 src/eat 匹配,其中 \xe2\x80\x98src/a\xe2\x80\x99 为词干。当先决条件转换为文件名时,主干中的目录将添加到前面,而主干的其余部分将替换 \xe2\x80\x98%\xe2\x80\x99。带有先决条件模式 \xe2\x80\x98c%r\xe2\x80\x99 的词干 \xe2\x80\x98src/a\xe2\x80\x99 给出文件名 src/car。

\n
\n\n

上面解释了为什么nice/path/要放在先决条件之前/project/something/1.bar

\n\n
\n\n

一种解决方法是在规则中使用完整的文件名,例如:

\n\n
${CURDIR}/nice/path/%.foo: /project/something/%.bar    \n
Run Code Online (Sandbox Code Playgroud)\n

  • 我知道*为什么*它会这样做(因此为什么我在问题中引用完全相同的文档),但是我怎样才能将其关闭?原因是在实际用例中我必须使用它,因为我的路径依赖于文件名(这是一个有点复杂的文件夹结构)。 (2认同)