如何在 GNU Make 中以编程方式定义目标?

2023-12-20

我不知道有什么方法可以在 GNU Make 中以编程方式定义目标。这怎么可能?

有时一个人可以走开用替代方法 https://stackoverflow.com/questions/8937500/how-to-generate-list-of-make-targets-automatically-by-globbing-subdirectories。然而,在 Makefile 中以编程方式定义目标的能力对于编写和组织复杂的生产规则非常重要make。复杂产生式规则的示例可以在 FreeBSD 的构建系统或 Makefile 库中找到,例如BSD Owl https://github.com/michipili/bsdowl

The 主要区别 https://stackoverflow.com/a/27293153/2654678shell 脚本和 Makefile 之间是:

  • 在 Makefile 中,程序的状态由命令行和文件系统给出,因此可以在中断后恢复作业。当然,这需要正确编写 Makefile,但即使这相当困难,它也比使用 shell 脚本实现类似的效果要容易得多。

  • 在 Makefile 中,使用通知或钩子修饰过程非常容易,而这在 shell 脚本中基本上是不可能的。

例如,一个非常简单且有用的模式如下:

build: pre-build
build: do-build
build: post-build

这提出了build目标作为三个目标的组合,其中一个包含实际指令do-build另外两个是钩子,在之前和之后执行do-build。许多为 BSD Make 编写的构建系统都使用这种模式,它顺便允许以编程方式定义目标,以便可以批量编写:

.for _target in configure build test install
.if !target(${_target})
${_target}: pre-${_target}
${_target}: do-${_target}
${_target}: post-${_target}
.endif
.endfor

引入的条件.if/.endif块使用户能够使用自己定义的任何${_target}.

该片段对于 GNU Make 的翻译是什么?


FWIW 这里是 make 的等效语法

.for _target in configure build test install
.if !target(${_target})
${_target}: pre-${_target}
${_target}: do-${_target}
${_target}: post-${_target}
.endif
.endfor

基本上,你想要make看到这样的片段:

build: pre-build
build: do-build
build: post-build

类似地对于configure, test and install。这表明一个循环eval某处:

define makerule =
  $1: pre-$1
  $1: do-$1
  $1: post-$1
endef

targets := configure build test install

$(foreach _,${targets},$(eval $(call makerule,$_)))

(要玩这个,改变eval to info)。小心那些关闭!

FWIW,这是扩展foreach:

  • make expands the list to be iterated over
    • ${targets}变成configure, build, test and install
    • We have $(foreach _,configure build test install,$(eval $(call makerule,$_)))
  • _被设置为第一个值,configure.
  • make扩大$(eval $(call makerule,configure))
  • To evaluate the eval, make expands $(call makerule,configure)
    • 它通过设置来做到这一点1 to configure,并扩大${makerule}它产生 3 行文本:
      configure: pre-configure
      configure: do-configure
      configure: post-configure
  • $(eval)去工作,阅读本文make syntax
  • 请注意,扩展$(eval)是空的!它的所有工作都是作为副作用完成的。 清洗、起泡、冲洗,重复。

请注意:我必须同意所有其他评论者的观点:你的模式是bad制作。如果你的 makefile 不是-j安全,那么就是broken(缺少依赖项)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 GNU Make 中以编程方式定义目标? 的相关文章

  • Nokogiri 本机扩展无法构建(不是 libxml2 或 libxslt 缺失问题)

    正如标题所示 它似乎并没有因为缺少 libxml2 或 libxslt 而失败 我不太确定该做什么make的错误 明白了吗 因为问题出在make期间 呵呵 无论如何 这是我得到的输出 任何想法 将不胜感激 Building native e
  • GNU Make 获取父目标名称

    在gnu make中 有没有办法获取启动整个链的原始目标并将执行引导到当前配方 PHONY all clean common all common clean common common echo echo MAKECMDGOALS for
  • 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
  • Makefile 头依赖项

    我是使用 make 的新手 并且一直在通过以下方式学习基础知识本教程 http www cs colby edu maxwell courses tutorials maketutor 这是本教程中的最后一个 makefile 示例 IDI
  • make: *** 没有规则可以创建“all”所需的目标“gcc”。停止

    我正在通过一个eg pgm 来创建一个make 文件 http mrbook org tutorials make http mrbook org tutorials make 我的文件夹eg make creation包含以下文件 des
  • 将文件夹中结构化的预构建文件集添加到 android out 文件夹

    我为arm编译了glibc 这与Android glibc或bionic C不同 因为我编译的glibc环境将有助于提供更多api 现在我可以在 Android 运行时将 glibc 环境复制到 system 文件夹中 并且在执行 chro
  • 在 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
  • 使用 GNU make “从源代码树中”构建 C 程序

    我想使用 GNU make 工具为我的微控制器构建一个 C 项目 我想以一种干净的方式来做这件事 这样我的源代码在构建后就不会被目标文件和其他东西弄乱 想象一下我有一个名为 myProject 的项目文件夹 其中有两个文件夹 myProje
  • 在 makefile 中,当我在 bash 函数内部使用 if 语句时,它会抛出错误

    在 makefile 中 当我在 bash 函数内部使用 if 语句时 它会抛出错误 test foo if a a then echo 1 fi foo hello ERROR bin sh 1 未找到 或与一个 test foo if
  • 对 sf:: 的未定义引用

    我想用 C 制作 GUI 应用程序 发现 SFML 是一个不错的选择 幸运的是 我使用的是 Linux 所以 SFML 2 4 已经安装在我的系统上 所以我开始搜索一些教程并找到了一个制作简单窗口的教程 但是当我运行代码时 出现错误 提示未
  • Makefile 和通配符

    好吧 这是我当前的 makefile 设置 有一些文件名为public01 c public02 c等等 我正在尝试使用以下方法为每个人制作目标文件public o带有通配符的标签 public o public c hashtable h
  • 如何不在输出中打印 makefile 中的注释

    我有一个像这样的 makefile install somecommand some explanation for next command lastcommand 发生的事情是评论 some explanation for next c
  • 如何调用位于其他目录的Makefile?

    我正在尝试这样做 我想打电话给 make Makefile存在于其他目录中 abc可以使用位于不同目录中的 shell 脚本的路径 我该怎么做呢 由于 shell 脚本不允许我cd进入Makefile目录并执行make 我怎样才能编写she
  • 用于发布和调试目标的 Makefile

    我正在尝试构建一个 Makefile 它可以通过指定目标而不是变量 例如make debug 1 不太好 我这里有一个精简的简化示例 它模拟了我想要实现的目标 ifdef debug BINARY my binary debug MODUL
  • 如何在使用cmake完成make后打印消息?

    我正在尝试使用 CMake 完成构建过程后打印消息 我只是想在之后通知用户make命令已完成 没有任何错误 我该怎么做 我试过add custom target 但我无法选择何时跑步 另外 我尝试过add custom command 它再
  • 如何调用使用 Define 创建的 GNU make 宏?

    在我的 Makefile 中调用 GREP 的两种方式有什么区别吗 我有什么理由应该使用其中之一 两者似乎产生相同的结果 define GREP word 3 shell echo define FOO 0xfff00100 endef a
  • Makefile:对子目录中的所有文件进行操作?

    我正在使用 Makefile 和 GNU make 基于源 Markdown 文件创建各种文档输出目标 这包括使用latex or pdflatex创建 DVI 文件 使用 EPS 或 PS 格式以外的图像会导致错误 我可以在源 Markd
  • 如何制作一个makefile只用于编译一些java文件?

    我有三个java文件 名为A java B java C java A将创建对象B B将创建对象C 但我以前从未构建过makefile 有谁可以帮我构建一个 makefile 来编译这三个 java 文件吗 我应该使用什么工具来制作 mak

随机推荐

  • 将新行添加到 pandas 中的现有数据框时出现错误

    我有以下数据框 df3 pd DataFrame columns Devices months 我从循环中获取行值 排 打印 数据 Devices months 1 Powerbank Feb month 当我将此数据行添加到 df3 时
  • 如何将结构体中的数组传递给内核?

    我需要向内核输出一个结构数组 其中将有一个数组 但最终 数据有点正确 但在某种程度上存在错误 我在主机上有这个代码 struct myStruct int a double b double c 5 myStruct result new
  • ASP.NET - 验证 UserControl 内的控件

    我有一个围绕 DropDownList 的包装器 UserControl 用于管理 DropDownList 值的语言特定翻译 我还有一个内部下拉列表所需的必填字段验证器 如何通过用户控件公开此控件以允许验证 我目前收到的错误如下 cann
  • Firebase数据库使用Map获取子级的特定值

    问题 我正在创建一个允许用户预订办公桌的 Android 应用程序 但遇到了如何从 Firebase 实时数据库子值检索数据的问题 我的代码目标 我想获取所有用户下所有条目的用户 ID 和办公桌号码 以便我可以将已预订的办公桌设置为在我的页
  • 输入(浮点)在保存时转换为整数

    问题 当表单的信息发送到 POST 操作时 浮点变量会丢失小数点并转换为integer代替float 信息 这是包含变量定义的类 PUnit and CoinValue public class Device Key public int
  • 如何避免在更新接口后必须更新所有实现类?

    我们有一个 WPF 应用程序 它主要是一个图表应用程序 大约有 30 个图表 每个图表在数据库中都有自己的表 其中保存图表的配置信息 每个图表在应用程序中都有一个类 其中包含与图表相关的配置信息 我们的应用程序中有一个界面 IChartCo
  • android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback 中出现奇怪的 ArrayIndexOutOfBoundsException

    我在 Play Store 控制台中收到了一个与以下相关的奇怪的越界异常android support v4 app ActivityCompat OnRequestPermissionsResultCallback https devel
  • 在 RadGrid Telerik 中查找分页记录

    当启用分页时 如何在 radGrid 中通过键查找给定记录 插入元素后 我想选择新行 这就是我需要此功能的原因 谢谢你的帮助 一种方法是禁用分页 然后进行Rebind 然后迭代所有项目 找到该项目应位于的页面 然后启用分页 另一种方法是单独
  • Heroku 无法访问此站点 (DNS_PROBE_FINISHED_NXDOMAIN)

    我在 Heroku 上的一些个人应用程序和专业应用程序无法访问 它们没有链接的自定义域 因此我通过 http herokuapp com 访问它们 大多数时候 它们工作得很好 但我经常从浏览器收到以下响应 This site can t b
  • 读取 CPU 使用率时出错:/proc/stat(权限被拒绝)

    附件是运行应用程序后 Android Studio 中出现的错误消息 我能够在设备上构建并运行该程序 没有任何问题 直到我开始按照 Google 的新应用程序要求定位 API 级别 26 后 我才收到此错误 关于如何修复错误有什么建议吗 另
  • vsto 插件中的本地化

    这是在 VSTO Word Addin 中实现本地化的正确方法吗 现在 我只是遵循命名约定 将当前文化附加到它搜索的资源文件中 我已经阅读了足够多的不同材料 感到困惑 一种方法是使用 Resgen exe 然后 Al exe 生成 dll
  • 为什么在 Swing 中使用空布局会令人不悦?

    最近 我开始为我工作的公司创建一个程序 正如背景信息一样 我仍然是一名学生和初学者程序员 所以我的解决方案可能不被推荐 而且我不知道如何做到这一点 但它有效 我不会因此而受到评判 因为这是一项与编程完全无关的学生工作 该程序的问题是 它将在
  • .insertOne 不是函数

    我想先说一下我已经阅读了这里有关此问题的几篇文章 我有一个节点 express mongo 应用程序 其中包含以下内容 app js var express require express var bodyParser require bo
  • 软件浮点和 x87 或 sse 已禁用

    我正在尝试按照 gcc 中的建议启用软件浮点这个问题 https stackoverflow com questions 1018638 using software floating point on x86 linux但我遇到了障碍 m
  • 错误 ContextCleaner:清理线程时出错

    我有一个包含 Spark 1 4 1 和 scala 2 11 的项目 当我使用 sbt run sbt 0 13 12 运行它时 它显示错误如下 16 12 22 15 36 43 ERROR ContextCleaner Error i
  • 我应该默认使用 Unicode 字符串吗?

    在 Python 中编码时 选择 Unicode 字符串而不是常规字符串是否被认为是一个好习惯 我主要在 Windows 平台上工作 目前大多数字符串类型都是 Unicode 即 NET String 在新的 C 项目中默认打开的 UNIC
  • 帮助反混淆这个 JS 攻击

    我有一段令人讨厌的 JavaScript 我想对其进行反混淆 我知道我可以启动虚拟机并看到恶意软件的所有辉煌 但我更感兴趣的是不让它运行 而是以非混淆的形式查看它 如果它需要运行才能做到这一点 那么就这样吧 我想 有人知道如何在不损害自己的
  • 在Python中从图像中提取任意矩形补丁

    有没有办法从图像中提取我选择的矩形 也许使用 numpy 数组 大多数可用的实现似乎都是针对常规滑动窗口解决方案 但它们总是包含步骤或相同纵横比的矩形或类似的东西 是否可以提供起始 x 和 y 坐标以及宽度和高度 或结束 x 和 y 坐标
  • Git 挂钩可在终端中生成 Github“创建拉取请求”链接,如 Bitbucket 一样

    我发现 Bitbucket 非常方便的一件事是 当您将新分支推送到 Bitbucket 中托管的存储库时 它会打印出 到终端屏幕 一个 URL 您可以点击该 URL 从刚刚推送的分支创建 PR 前任 git push origin some
  • 如何在 GNU Make 中以编程方式定义目标?

    我不知道有什么方法可以在 GNU Make 中以编程方式定义目标 这怎么可能 有时一个人可以走开用替代方法 https stackoverflow com questions 8937500 how to generate list of