Makefile 如何在GNU Make模式规则中包含路径前缀
考虑以下几点:Makefile 如何在GNU Make模式规则中包含路径前缀,makefile,gnu-make,Makefile,Gnu Make,考虑以下几点: %.foo: %.bar echo $< > $@ 这将运行,但它执行echo nice/path//project/something/1.bar>1.foo而不是echo/project/something/nice/path1.bar>1.foo 原因在于它的模式规则是如何生成的。从文档中: 当目标模式不包含斜杠(通常不包含斜杠)时,文件名中的目录名将从文件名中删除,然后再与目标前缀和后缀进行比较。[…]忽略目录只是为了找到要使用的隐式规则,而不是在
%.foo: %.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”作为词干。当先决条件转换为文件名时,将在前端添加stem中的目录,而stem的其余部分将替换为“%”。带有先决条件模式“c%r”的干“src/a”给出了文件名src/car
有什么方法可以为特定规则关闭此选项吗 您可能想阅读以下内容: 当目标模式不包含斜杠(通常不包含斜杠)时,文件名中的目录名将从文件名中删除,然后再与目标前缀和后缀进行比较。将文件名与目标模式进行比较后,目录名以及结束它们的斜杠将添加到根据模式规则的先决条件模式和文件名生成的先决条件文件名中。忽略目录只是为了查找要使用的隐式规则,而不是在该规则的应用程序中。因此,“e%t”与文件名src/eat匹配,并以“src/a”作为词干。当先决条件转换为文件名时,将在前端添加stem中的目录,而stem的其余部分将替换为“%”。带有先决条件模式“c%r”的干“src/a”给出了文件名src/car 上面解释了为什么将
nice/path/
放在前提条件/project/something/1.bar
前面
一种修复方法是在规则中使用完整的文件名,例如:
${CURDIR}/nice/path/%.foo: /project/something/%.bar
你只是想在食谱中使用简单的文件名吗?如果是这样,只需使用
$(notdir$您的问题没有说明具体情况。如果您将此规则作为显式规则编写,它会是什么样子?您想要的扩展目标路径是什么,您想要的扩展先决条件路径是什么?扩展的先决条件路径应该是/project/something/nice/path1.bar
。它使nice/path//project/something/1.bar
。也就是说,它在前缀(nice/path
)和词干(1.bar
)中拆分%
),然后将/project/something/
前置到词干,然后将前缀前置到该词干。我希望它停止在前缀和词干中拆分%
。您没有回答我的问题。您试图构建的目标的完整路径名是什么?它只是1.foo
没有路径吗?它是nice/path/1.foo
?我知道我不明白nice/path
从何而来。从目标开始,从目标开始决定干,从目标开始决定先决条件。因此,如果你的目标是1.foo
,那么先决条件的干怎么可能是nice/path/1
?也许如果你提供了一个简短、完整的示例y在实际操作中显示了问题。查看发生了什么会更简单。我知道为什么会这样做(因此我在问题中引用了完全相同的文档),但我如何才能将其关闭?原因是在实际用例中我必须使用它,因为我的路径依赖于文件名(这是一个有点复杂的文件夹结构)@gx1sptda-Oops,错过了你的报价。为什么不能使用完整的文件名?
${CURDIR}/nice/path/%.foo: /project/something/%.bar