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

2024-04-28

考虑以下:

%.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(使用前将#替换为@)

如何在 GNU Make 模式规则中包含路径前缀 的相关文章

  • 在 makefile 中,目录名是假目标还是“真实”目标?

    根据我所读到的有关 makefile 的内容 虚假目标是指与实际文件名不对应的任何目标 我的直觉表明 作为目标的目录将被视为与文件相同 为什么这很重要 我的 makefile 中有一个目录作为目标 当我将其作为主要可执行文件的先决条件时 无
  • 制作带有源子目录的文件

    我最新的项目是用 C 编写的 我使用的是 GNU Make 项目目录布局如下 project src subdir1 subdir2 containing tests doc bin 我希望能够致电make在顶级目录中 即项目目录中需要一个
  • Eclipse CDT生成的Makefile在哪里?

    我已经使用 Eclipse helios CDT 构建了一个 hello world C 项目 它编译得很好 但我想看一下生成的 Makefile CDT 我在项目文件夹 调试 发布文件夹或 src 文件夹中找不到它 我在哪里可以找到这个
  • 如何在 Windows 上通过 Vim 使用 MinGW make

    我已经在我的机器上安装了 Vim 和 MinGW 所以我尝试创建 Hello World 然后在 Vim 中编译 一切正常 但是当我输入时 make它显示错误 make not recognized as an internal or ex
  • rm -rf 与 -rm -rf

    在 Makefile 中 我读到 rm rf 而不是 rm rf Makefile 行开头的第一个 是什么意思 代表着make本身将忽略来自的任何错误代码rm In a makefile 如果任何命令失败 则make进程本身会停止处理 通过
  • 使用 make 构建多个二进制文件

    我想创建一个 Makefile 在父目录中 来调用其他几个 Makefile 在子目录中 这样我就可以通过仅调用一个父 Makefile 来构建多个二进制文件 每个项目子目录一个 我的研究因在递归 Makefile 上找到大量内容而受到阻碍
  • Android.mk 包含其他项目

    说明 我的问题的目标是了解如何创建一个可以构建和运行的 Android mk makefile 如下所示的项目结构 Library is library on eclipse 数据 项目库 Project Interface 包含 1 个静
  • Android.mk 与 Application.mk

    我对 Android mk 和 Application mk 的使用有点模糊 我尝试阅读 APPLICATION MK HTML ANDROID MK HTML 在NDK 附带的文档 http developer android com s
  • makefile 中的路径不起作用

    我正在运行以下命令makefile哪些需要改变dir到特定目标并在那里运行npm install 问题是我能够在输出中看到它将目录 项目 应用程序 打印到正确的目录 但安装 npm install 在上层 项目 上运行 为什么 例如 当我运
  • 如何在 ubuntu 20 中安装旧版本的 gcc -3 或 gcc-4

    我正在尝试安装旧版本的 gcc 4enter code here对于我的ubuntu创建构建目录 mkdir gcc build cd gcc build 下载源文件 wgethttp www netgull com gcc release
  • 使用 gnu make 正确构建 git 子模块

    我目前尝试编写一个 Makefile 来正确构建一个包含 git 子模块的项目 该子模块有自己的一组 makefile 并一次生成多个目标 包括一些库 该 Makefile 应具有以下属性 即使使用并行构建 也不要重建两次子模块 当子模块代
  • Makefile 头依赖项

    我是使用 make 的新手 并且一直在通过以下方式学习基础知识本教程 http www cs colby edu maxwell courses tutorials maketutor 这是本教程中的最后一个 makefile 示例 IDI
  • 在 PATH 中找不到程序“make”

    我在 Eclipse 中遇到 程序 make 未在 PATH 中找到 错误 我检查了路径变量 C cygwin bin JAVA HOME bin ANT HOME bin ANDROID SDK tools ANDROID SDK pla
  • 在 Makefile 的先决条件列表中使用目标的目录路径

    我编写了一个脚本 它接收两个以 cfg 结尾的文件并输出一个以 cmp 结尾的文件 我想将其包含在我的 Makefile 中 因为一些源代码文件依赖于此 cmp 文件 在我的 Makefile 中 我想这样做 cmp cfg dir def
  • 如果覆盖率低于一定百分比,则单元测试失败

    我制作了一个执行的 makefilego test cover 是否有可能失败make unit tests如果覆盖范围低于 X 则命令 我该怎么做呢 您可以使用TestMain在你的测试中做到这一点 TestMain 可以充当测试的自定义
  • mingw32-make 的目录更改错误

    我正在MinGW32下构建POCO库1 6 0 环境 Windows 7 Ultimate 32位 shell MSYS 执行成功 配置 configure Configured for MinGW config make的内容 POCO
  • 通过相同的 Makefile 生成 Makefile 的包含文件

    在我的程序中 我有一个有点复杂的构建过程 目前 在我使用的一个目录中include in Makefile am对于一个文件 该文件不存在 但必须自行构建 原因是这个包含文件相当长 此外 在实际程序中 它不仅仅是一个文件 而是多个文件 并且
  • GNU Make 与 patsubst:需要两次替换

    我需要在变量替换的替换中引用词干两次 O23 OROOTS ODIR overx 2wk 3wk mlb 我需要使用相同的词干执行两次替换 但是替换使用patsubst这只做第一个 我们怎样才能同时实现这两点呢 事实上 杰克几乎猜对了 fo
  • 构建 gradle 系统应用程序作为 AOSP 构建的一部分

    我有一个基于 AOSP 的自定义 ROM 并且正在开发一个系统应用程序 该应用程序在 ROM 构建期间打包 就像任何其他系统应用程序一样 是否可以将此应用程序切换为 gradle 样式应用程序 并在 AOSP 构建期间使用 gradle 构
  • 从 Makefile 中的 C++FLAGS 中删除一个标志?

    我有一个 Makefile 其中包含另一个设置了很多默认值的 makefile 我无法编辑包含的 makefile 并且我想更改 makefile 中 C FLAGS 的值 即使它是在包含的 makefile 中设置的 具体来说 每当 de

随机推荐