如何使用宏在 foreach 内生成多个 Makefile 目标/规则?神秘的行为

2024-04-02

我正在使用 GNU make 3.81。这是一个演示该问题的测试 makefile:

define BOZO

a$(1): b c
    touch a$(1)

endef

$(foreach i,1 2 3,$(call BOZO,$(i)))

这里的想法是使用宏模板(BOZO)来生成遵循可预测模式的规则。

问题:当我在此 makefile 上运行 make 时,出现错误:

Makefile.fake:10: *** multiple target patterns.  Stop.

(其中第 10 行是包含 foreach 的行)。

现在,我知道该错误通常表示什么。让我们看看该行通过使用扩展成什么info将扩展发送到标准输出的函数。我将第 10 行更改为:

$(info $(foreach i,1 2 3,$(call BOZO,$(i))))

我跑:

$ make -n

a1: b c
    touch a1

a2: b c
    touch a2

a3: b c
    touch a3

make: *** No targets.  Stop.

请注意,“无目标”消息是预期的,因为 $(info ...) 函数计算结果为空,但会导致 makeprint生成的规则。

那么让我们运行这些规则吧?

$make -n > out.txt
make: *** No targets.  Stop.
$make -f out.txt a1 a2 a3
touch a1
touch a2
touch a3
$

啊啊!规则运作良好。那么...是 make 中的错误,还是我的理解中的错误?

最后一条线索可能有助于诊断:如果我将 foreach 行更改为:

$(foreach i,1,$(call BOZO,$(i)))

(这样 foreach 只有一次迭代)

然后做

$make a1

我收到一个不同的错误:

make: *** No rule to make target `a1'.  Stop.

我不知道有什么方法可以“看到”扩展$(foreach )使看到除了$(info ),而且它的输出是合法的,所以我很困惑。


$(foreach i,1 2 3,$(eval $(call BOZO,$(i))))

The 评估函数 http://www.gnu.org/software/make/manual/make.html#Eval-Function告诉 Make 将结构解析为 makefile 语法,以“制定”它们。我不知道为什么 Make 反对这种特殊方式的未经评估的规则,但这有点学术性。

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

如何使用宏在 foreach 内生成多个 Makefile 目标/规则?神秘的行为 的相关文章

  • 在 OS X 下将 ImageMagick 编译为 64 位?

    我正在尝试安装moddims http code google com p moddims 在 OS X 上 请参阅上一个问题 https stackoverflow com questions 1185106 how do i confi
  • 如果单元测试失败则 make 失败

    我有一个用于编译静态库的 makefile 该生成文件具有编译与静态库关联的单元测试套件的规则 编译测试套件后 将调用 python 脚本来运行测试并记录结果 它看起来像这样 unit MAKE C cXbase unit python T
  • 使用 GCC 和 autotools 为各个源文件设置编译标志的最佳方法是什么?

    我需要使用自动工具禁用单个文件的优化标志 最好的方法是什么 您是指单个源文件还是单个可执行文件 禁用可执行文件的优化很简单 bin PROGRAMS myprog myprog SOURCES foo c bar c myprog CFLA
  • 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
  • 使用 make 构建多个二进制文件

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

    说明 我的问题的目标是了解如何创建一个可以构建和运行的 Android mk makefile 如下所示的项目结构 Library is library on eclipse 数据 项目库 Project Interface 包含 1 个静
  • 如何在 Mac 上使用 Emscripten emcc 和 make 时包含 ncurses

    我正在尝试构建一个项目 即 Angband 的源代码 http rephial org downloads 3 3 angband v3 3 2 tar gz http rephial org downloads 3 3 angband v
  • makefile patternrule 在目标文件名中带有更多通配符

    我需要创建一个特殊的 makefile 规则 最好通过一个示例来解释 也许我们用规则创建文件 test pdf tex pdflatex jobname test tex result pdf tex pdflatex jobname re
  • 如何在 GNU Make 的定义中使用 ifeq?

    我正在尝试在 Makefile 中的定义内执行 ifeq 但我似乎遇到了一些错误 并且我想知道是否遗漏了某些内容 我有以下 Makefile info start ifeq X Y info DOES not appear 1 endif
  • Android.mk 与 Application.mk

    我对 Android mk 和 Application mk 的使用有点模糊 我尝试阅读 APPLICATION MK HTML ANDROID MK HTML 在NDK 附带的文档 http developer android com s
  • 在 Linux 上的 makefile 和 Makefile 之间进行选择

    我想在一个目录中同时使用 Makefile 和 makefile 进行 make 默认情况下 它将执行makefile 我可以选择执行 Makefile 吗 提前致谢 最简单的选择是使用 f make f Makefile From man
  • 编辑 CMakeLists.txt 以使用 -fPIC 进行编译

    我正在尝试为名为 libnifalcon 的 NOVINT Falcon 安装驱动程序 我使用 cmake 创建 make 文件 但是当我运行 make 时出现错误 Linking CXX shared library lib libnif
  • 如果覆盖率低于一定百分比,则单元测试失败

    我制作了一个执行的 makefilego test cover 是否有可能失败make unit tests如果覆盖范围低于 X 则命令 我该怎么做呢 您可以使用TestMain在你的测试中做到这一点 TestMain 可以充当测试的自定义
  • /usr/sbin/install 到底有什么作用?

    我正在尝试安装discount https github com Orc discount on my VPS http no de它基于Solaris 设置一些环境变量后编译效果很好 但是安装失败 https gist github co
  • 构建 gradle 系统应用程序作为 AOSP 构建的一部分

    我有一个基于 AOSP 的自定义 ROM 并且正在开发一个系统应用程序 该应用程序在 ROM 构建期间打包 就像任何其他系统应用程序一样 是否可以将此应用程序切换为 gradle 样式应用程序 并在 AOSP 构建期间使用 gradle 构
  • @:(符号冒号)在 Makefile 中意味着什么?

    Makefile 中的以下内容有何作用 rule deps 我在制作手册中似乎找不到这个 它的意思是 不要在输出中回显此命令 所以这条规则是说 执行 shell 命令 并且不回显输出 当然是shell命令 是一个空操作 所以这就是说 什么都
  • 如何调用使用 Define 创建的 GNU make 宏?

    在我的 Makefile 中调用 GREP 的两种方式有什么区别吗 我有什么理由应该使用其中之一 两者似乎产生相同的结果 define GREP word 3 shell echo define FOO 0xfff00100 endef a
  • 将环境变量从 Makefile 导出到用户态环境

    我正在研究如何从 Makefile 环境变量导出以在用户环境中公开 因此应该可以从用户 shell 访问从 Makefile 导出这些变量 我努力了make s export https www gnu org software make
  • 并行运行 make 时出错

    考虑以下制作 all a b a echo a exit 1 b echo b start sleep 1 echo b end 当运行它时make j2我收到以下输出 echo a echo b start a exit 1 b star

随机推荐

  • 在 CSS 中将文本垂直和水平居中在圆圈中(如 iphone 通知徽章)

    我正在寻找一种在 CSS3 中制作类似 iphone 的跨浏览器徽章的方法 我显然想使用一个 div 来实现这一点 但其他解决方案也可以 重要的因素是它需要在所有浏览器中水平和垂直居中 关于这些通知的一个有趣的设计问题是它们不能具有指定的宽
  • 如何解析/proc/pid/cmdline

    我试图在 Linux 上拆分进程的命令行 但似乎我不能依赖它用 0 字符分隔 你知道为什么有时 0 字符用作分隔符而有时它是常规空格吗 您知道检索可执行文件名称及其路径的其他方法吗 我一直在尝试使用 ps 获取此信息 但它总是返回完整的命令
  • C++11 嵌套宏调用?

    它在 C std 16 3 4 中说 生成的预处理标记序列 来自宏调用替换 与源文件的所有后续预处理标记一起重新扫描 以获取更多宏名称 代替 如果在替换列表扫描期间找到了被替换的宏的名称 不包括 源文件的其余预处理标记 它不会被替换 此外
  • Lua 中的“主”函数?

    在 python 中 通常会定义一个 main 函数 以便允许脚本用作模块 如果需要 def main print Hello world return 0 if name main sys exit main 在Lua中 这个习语if n
  • 用于改造响应代码处理的自定义 rx Func1

    我是 rxjava 的新手 所以请不要严格 我请求虱子下一个 Observable
  • 当我使用大量数据发出大量请求后,Volley 出现内存不足异常

    我有一个页面查看器 在每个页面内都有列表视图 该列表视图将使用 Web 服务有 10 条记录 因此页面查看器使用 Web 服务的三个调用来填充三个页面 当前页面 左侧页面和右侧页面 页 但在我进行了多次滑动后 我得到了这个异常 java l
  • PostgreSQL ORDER BY 问题 - 自然排序

    我有一个 PostgresORDER BY下表的问题 em code name EM001 AAA EM999 BBB EM1000 CCC 要将新记录插入表中 我选择最后一条记录SELECT FROM employees ORDER BY
  • mongo 数据库中的可尾游标超时

    我正在尝试用 ruby 创建一个 oplog 观察器 到目前为止 我想出了下面的一个小脚本 require rubygems require mongo db Mongo Connection new localhost 5151 db l
  • glsl 双精度顶点缓冲区

    如果我创建一个双精度顶点缓冲区 例如 GLuint vertBuffer spanBuffer spanCount patchSize program already setup glUseProgram program glEnableC
  • 无法使用“adb shell settings put”设置 location_providers_allowed 的值

    我正在尝试使用以下命令打开位置 adb shell settings put secure location providers allowed gps wifi network adb reboot 但它既不改变变量的值允许的位置提供者重
  • Antlr3:无法匹配词法分析器规则中使用的解析器规则中的标记

    我在 Antlr3 中的词法分析器规则为 HYPHEN TOKEN HYPHEN CHARS CHARS a z 解析器规则如下 exp CHARS some complex expression parser rule exp HYPHE
  • 使用梯形图程序将 TCP/IP 消息从 PLC 发送到 PC

    考虑以下梯形图程序 该程序检查连接是否已启用 A202 00 然后从 PLC 向 PC 发送消息 文档 Omron CX Programmer 严重缺乏对程序约定的解释 我不明白的是 从一个节点向另一个节点发送消息 我应该需要指定接收者 I
  • 限制“鼠标滚轮”增量每次滚动触发一次

    我使用下面的代码 向不同方向滚动两个 div 但我很好奇是否可以限制滚动 以便每次滚动只触发一次 而不是不断滚动并将我的函数发送到无限循环 page left page right bind mousewheel function even
  • Eclipse 插件:java.lang.NoClassDefFoundError

    如你看到的 I added jni4net j 0 8 6 0 jar到我参考的图书馆 但我仍然收到java lang NoClassDefFoundError例外 java lang NoClassDefFoundError net sf
  • PhoneStateListener onSignalStrengthsChanged 停止在 Service 中调用

    我正在编写包含两个元素的简单应用程序 服务和活动 活动仅用于启动和停止服务 服务用途PhoneStateListener获取有关当前 CellID LAC 和 RSSI 信号强度 的信息并将其记录到文件中 当手机未休眠时一切正常 我注意到
  • mod_pagespeed magento

    有人在 magento 商店中使用过 mod pagespeed 吗 它会破坏任何东西吗 比如自定义优化等 很有兴趣使用它 但苦于资源的运气 你的帖子让我感兴趣 所以我玩了 mod pagespeed 我没有做任何详细的测试或测量 我的总体
  • Android ADT插件问题

    当我尝试执行 ADT 插件步骤并需要一些帮助时 我遇到了这个问题 错误如下 Cannot complete the install because of a conflicting dependency Software being ins
  • 如何在IE9中访问Event.target?

    HTML DOM 对象模型定义了一个Event object with a target财产 https stackoverflow com a 10637046 12597 查看MSDN 微软文档target财产 http msdn mi
  • Xcode 上 Boost 的线程组

    在我的项目中遇到错误后 我尝试使用 C 在 Xcode 4 2 上运行一个小型测试程序 include
  • 如何使用宏在 foreach 内生成多个 Makefile 目标/规则?神秘的行为

    我正在使用 GNU make 3 81 这是一个演示该问题的测试 makefile define BOZO a 1 b c touch a 1 endef foreach i 1 2 3 call BOZO i 这里的想法是使用宏模板 BO