makefile 中的 $(eval ) 导致配方在第一个目标错误之前开始

2023-12-23

CFormat:

define Format_File :=
    @echo Formatting
ifneq ("$(wildcard $(1))","")
    @echo if1

    # The default extensions for intermediate files are not used,
    # to avoid collisions with backup files open in the editor, etc.
    # Save the original source file with an '_X' suffix on the extension.
ifneq("$(wildcard $(1)_X)","") 
    @echo if2
else 
    @echo else2
endif
    @ren $(1) $(1)_X
    # C-Comment is invoked separately, due to pathing limitations
    # The redirection is a means to suppress blabbering.
    @echo Formatting $(1) . . .
    $(CFORMAT_PATH)\Cformat -h$(CFORMAT_PATH) $(1)_X -o$[Base, $(1)].tmp -ino >temp.tmp; 
    $(CFORMAT_PATH)\Ccomment -h$(CFORMAT_PATH) $[Base, $(1)].tmp -o$(1) >temp.tmp; 
else 
    @echo else1
endif
endef


FormatAll: CFormat
$(foreach loopFile,$(ALL_S_SOURCES),$(eval $(call Format_File,$(loopFile))))


.PHONY: FormatAll

当我用 info 替换 eval 时,它正确打印出函数调用,但每次我尝试实际评估格式化程序时,它都会在标题中给出错误。

编辑:这个问题到处都受到语法错误的困扰,但按照@MadScientist的建议,我最终能够使用shell循环让它工作。


最简单的答案是,你不能那样做。单个函数如$(foreach ...),或单个变量展开,可以never扩展到 makefile 中的多个逻辑行。 make 解析器不是这样工作的。

更远,$(eval ...)可以用来构建一个完整的规则,但你不能用它来构建规则的一部分:在 make 开始解析评估的输出之前,它将“关闭”当前正在定义的任何规则(就像你可以的那样) t 将规则的介绍放在一个文件中,将配方放在另一个文件中并使用include包括食谱)。

你还没有真正解释为什么你想以这种方式做事。一个简单的答案是使用 shell 循环,而不是 makefile 循环,如下所示:

FormatAll: CFormat
        @for f in $(ALL_S_SOURCES); do \
            echo Formatting; \
            if [ -f $$f ]; then \
                echo if1; \
                if [ -f $${f}_X ]; then \ 
                    echo if2; \
                else \
                    echo else2; \
                fi; \
                ren $$f $${f}_X; \
                echo Formatting $$f . . .; \
                $(CFORMAT_PATH)\Cformat -h$(CFORMAT_PATH) $F{f}_X -o$[Base, $$f].tmp -ino >temp.tmp; \
                $(CFORMAT_PATH)\Ccomment -h$(CFORMAT_PATH) $[Base, $$f].tmp -o$$f >temp.tmp; \
            else \
                echo else1; \
            fi; \
        done

我同意 Etan 的观点$[Base ...]语法很奇怪而且肯定不正确。

如果您想了解更多详细信息eval和调试,你可以看看这个帖子 http://make.mad-scientist.net/the-eval-function/以及该系列的早期作品。

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

makefile 中的 $(eval ) 导致配方在第一个目标错误之前开始 的相关文章

  • R: Knit 给出 SQL-chunk 错误

    我想编织 R markdown 的输出 其中包括几个 SQL 块 但是 如果我开始编织 就会收到错误消息 Line 65 Error in eval expr envir enclos object pp dataset not found
  • DBI:在 eval 中引发错误

    这个问题参考了池上的评论 But if you re going to put an eval around every statement just use RaiseError gt 0 in this thread https sta
  • 数据绑定方法(例如 Eval()、XPath() 和 Bind())只能在数据绑定控件的上下文中使用

    我收到以下错误 数据绑定方法 例如 Eval XPath 和 Bind 只能在数据绑定控件的上下文中使用 但我想做的只是在 ASP NET REPEATER 控件内
  • 使用 GNU make “从源代码树中”构建 C 程序

    我想使用 GNU make 工具为我的微控制器构建一个 C 项目 我想以一种干净的方式来做这件事 这样我的源代码在构建后就不会被目标文件和其他东西弄乱 想象一下我有一个名为 myProject 的项目文件夹 其中有两个文件夹 myProje
  • 如何在 bash 中结合超时和 eval 命令

    为了执行存储在变量中的命令eval使用命令 gt a echo e a nb wc l gt eval a 2 但如何才能与它结合起来呢 timeout命令 我尝试过以下操作 这给了我错误的输出 gt timeout 10 a a b wc
  • 在 Mac OS X 上的 Makefile 中设置 PATH(但它适用于 Linux)

    我可以在 Linux 上的 Makefile 中设置 PATH 但不能在 Mac OS X 上设置 在 OS X 中 可以设置 PATH 但不会使用 这是一个演示 在带有 bash 4 1 2 1 release 和 GNU Make 3
  • @:(符号冒号)在 Makefile 中意味着什么?

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

    为什么我需要制作一个make target在能够构建我的源代码之前 更具体地说 什么是制定目标 http publib boulder ibm com infocenter rsdvhelp v6r0m1 index jsp topic o
  • 此 bash 命令在 Makefile 中未正确运行

    在 Makefile 里面我有这样的 release version poetry version cut f2 d echo release version 如果我运行 我的终端中的语句将毫无问题地运行 gt version poetry
  • 避免重复 GNU Make 规则

    我一直在编写一个执行一些依赖项生成的 Makefile 我发现自己必须重复规则 因为 遗留 代码库包含以下内容的混合 cpp and cc文件 好像有点难看 无论如何 是否可以指定目标的先决条件可以是 cpp or cc files 所以而
  • 具有两个同名目标的 Makefile

    我有一个包含包含语句的 makefile 我无法控制包含的 makefile 的内容 不过 我希望能够在 某些 不是全部 目标之前添加一些预处理步骤 考虑以下示例 install echo install target include ot
  • 内核makefile中的$(call cmd,tags)这里的cmd指的是什么?

    在内核 Makefile 中我发现如下代码 ctags CTAGS CSCOPE HEADERS SOURCES ETAGS ETAGSFALGS HEADERS SOURCES call cmd ctags 另外 在哪里可以找到宏或函数
  • 为什么这个 makefile 在“make clean”上执行目标

    这是我当前的 makefile CXX g CXXFLAGS Wall O3 LDFLAGS TARGET testcpp SRCS main cpp object cpp foo cpp OBJS SRCS cpp o DEPS SRCS
  • Makefile 和 .Mak 文件 + CodeBlocks 和 VStudio

    我对整个 makefile 概念有点陌生 所以我对此有一些疑问 我正在 Linux 中使用 CodeBlocks 创建一个项目 我使用一个名为 cbp2mak 的工具从 CodeBlocks 项目创建一个 make 文件 如果有人知道更好的
  • 如果未设置,则从控制台读取 Makefile 变量

    我正在更新一个从外部源访问某些资源的 Makefile 即存在以下形式的规则 External cvs up 对于不受限制的资源 它可以按预期工作 现在 出现了功能漂移 外部资源需要更复杂的登录 因此规则已更改为与此没有太大不同的内容 Ex
  • 在 Ubuntu 16.04 上编译 PCL 1.7,CMake 生成的 Makefile 中出现错误

    我正在尝试让 PCL 1 7 点云库 而不是其他 pcl 在 Ubuntu 16 04 上运行 我最终希望用于 C 的东西 但现在我只是想让这些例子工作 我使用的是 Ubuntu GNU 5 3 1 附带的默认编译器和 Cmake 版本 3
  • JavaScript 的 eval() 什么时候不是邪恶的?

    我正在编写一些 JavaScript 代码来解析用户输入的函数 用于类似电子表格的功能 解析了公式我could将其转换为 JavaScript 并运行eval 就可以得到结果了 然而 我一直回避使用eval 如果我可以避免它 因为它是邪恶的
  • Foreach循环无法找到对象

    我正在尝试将 foreach 与并行后端结合使用来加速计算 用于特征选择的 AUCRF 随机森林的交叉验证 如果这确实重要的话 在这样做的过程中 我需要获取向量的子集 向量的名称可以更改 但可以作为字符向量进行访问 我使用 eval par
  • .ko 文件是如何构建的

    我正在尝试将我自己的驱动程序移植到Beagle 板 xm arm cortex A8 在移植时我试图弄清楚如何 ko文件实际构建 在我们的Makefile我们只有一个命令来构建 o file 怎样是一个 ko文件已建立 使用Linux 2
  • 如何确保目标在 makefile 中的所有其他构建规则之前运行?

    我有一个 C 项目 其中包含所有其他 C 文件所依赖的生成文件 我试图在任何其他编译开始之前强制生成并编译该文件 通常它就像将该文件首先放入all 目标 但复杂的是我的 Makefile 也是由构建系统生成的 我只能将片段附加到 Makef

随机推荐

  • 将变量传递给 R 中的 WinBugs 模型

    我正在使用 R2WinBugs 包 我想将之前在 R 脚本中计算的两个参数传递给模型函数 c0yy lt 0 1 syy lt 0 0001 Model model lt function c0yy syy Likelihood for i
  • 如何使用 rspec 测试路由约束

    我正在开发一个主要用作 API 的应用程序 除了一些次要视图 例如会话 注册 这将是 标准 我喜欢最终确定的方法Railscast 350 API 版本控制 http railscasts com episodes 350 rest api
  • JPA/Hibernate 选择查询返回重复记录

    我有一个表 例如 Instrument 其中包含 ID State 和 User ID 作为列 所以我有这个 JPA 查询来返回所有具有匹配的仪器记录 用户身份 query manager createQuery SELECT instru
  • 在 matplotlib 轴上设置科学限制后调整指数文本

    目前 如果我将 matplotlib y 轴刻度标签设置为科学模式 它会在表单 y 轴顶部给出一个指数1e 5 我想调整这个来阅读r mathregular 10 5 这样就可以很好地打印出来 这是我的示例代码 Create a figur
  • jshell 启动时加载脚本的不同方法

    根据文档 还有在启动时加载脚本的选项 包括一些特殊的预定义选项 这些是使用 startup 标志指定的 传入文件名或以下之一 DEFAULT 加载默认行为 这与根本没有指定的行为相同 JAVASE 默认导入所有 Java SE 包 PRIN
  • FormBuilder 控件导致“表达式在检查后已更改”异常

    我有一个正在通过编程方式实例化的表单DynamicComponentLoader loadIntoLocation 表单代码如下 constructor private builder FormBuilder this editForm b
  • 如何使用log4j2(xml中的MDC)将不同的日志写入不同的文件中?

    现在我使用这样的结构 附加器
  • iOS:多个启动图像

    是否可以提供多个启动图像 而不是仅提供一个 Default png 启动图像 我的目标是 例如 您有 5 个不同的启动图像 并且对于每个应用程序启动 它都会显示另一个启动图像 以防万一有人对此做出回应 我知道对于不同的配置 例如屏幕方向 可
  • 如何在两个视图之间生成离线差异输出?

    我正在分析 Clearcase 中两个视图之间的不同文件 我需要生成输出 以便我可以在没有互联网连接的情况下完成此任务 我想要的是运行一个命令 递归地遍历每个视图 并为从视图 A 到视图 B 的每次更改生成一个合并 差异输出文件 这可以像合
  • 关于使用指针修改 const 变量的混乱

    以下示例使我的理解更加混乱 我无法理解如何修改本地 const 变量 请帮助我理解同样的事情 Compile code without optimization option volatile c include
  • 将带有通配符的参数传递给 Python 脚本

    我想做这样的事情 c data gt python myscript py csv 并将目录中的所有 csv 文件传递 给我的 python 脚本 这样sys argv包含 file1 csv file2 csv etc But sys a
  • 在 body 之前发送 head 以尽快加载 CSS 和 JS

    我想知道是否有人找到了一种在渲染中间发送 head 标签的方法 以便在页面渲染完成之前加载 CSS 和 Javascript 我们的页面大约需要 523 毫秒来呈现 并且在收到页面之前不会加载资源 我已经完成了很多 PHP 工作 并且可以在
  • 在 NTFS 上打开许多小文件太慢

    我正在编写一个程序 应该处理许多小文件 比如说数千甚至数百万 我一直在 500k 文件上测试该部分 第一步只是迭代一个目录 其中包含大约 45k 目录 包括子目录的子目录等 和 500k 小文件 遍历所有目录和文件 包括获取文件大小和计算总
  • 在 C# 中创建自定义引导程序/引导加载程序

    我们决定为我们的部署解决方案创建一个自定义引导程序 我们目前正在重写和重新设计我们所有产品的部署策略 遗憾的是 我们都不是部署专家 这是到目前为止我们所得到的 答 MSI 包将在 InstallShield 中编写 我们将使用 Instal
  • JNI_OnLoad 返回错误版本 (-1)

    我试图在我的 Android 应用程序中加载 Qt5Core 库 我得到了这个 JNI OnLoad returned bad version 1 in data data com xxx yyy lib libQt5Core so 0x4
  • WPF 中的 NumericUpDown 等效项很好吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在 WPF 中寻找一个简单的 NumericUpDown 又名数字微调器 控件 这似乎是WPF中另
  • CSR scipy 矩阵在更新其值后不会更新

    我在 python 中有以下代码 import numpy as np from scipy sparse import csr matrix M csr matrix np ones 2 2 dtype np int32 print M
  • Python 读取文件超时

    在Linux中 有一个文件 sys kernel debug tracing trace pipe 顾名思义 是一个管道 因此 假设我想使用 Python 读取其中的前 50 个字节 我运行以下代码 sudo python c f open
  • Keycloak:从内部 docker 容器运行时令牌颁发者无效

    我在配置 keycloak 在我们的服务器上运行时遇到一些问题 在本地它工作得很好 但在我们的测试环境中 登录后 在使用收到的访问令牌的任何调用中 我们得到 无效的令牌颁发者 预期 http keycloak 8080 auth realm
  • makefile 中的 $(eval ) 导致配方在第一个目标错误之前开始

    CFormat define Format File echo Formatting ifneq wildcard 1 echo if1 The default extensions for intermediate files are n