变量赋值后的尾随注释颠覆比较

2023-11-30

在 GNU make 中,附加到变量赋值的尾随注释会阻止后续比较(通过ifeq)无法正常工作。

这是生成文件...

  A = a
  B = b ## trailing comment
  C = c

  RESULT :=

ifeq "$(A)" "a"
  RESULT += a
endif

ifeq "$(B)" "b"
  RESULT += b
endif

ifeq "$(C)" "c"
  RESULT += c
endif

rule:
    @echo RESULT=\"$(RESULT)\"
    @echo A=\"$(A)\"
    @echo B=\"$(B)\"
    @echo C=\"$(C)\"

这是输出...

$ make
RESULT=" a c"
A="a"
B="b "
C="c"

从显示的值可以看出RESULT, the ifeq受到分配中评论的影响B。回显变量B,表明问题不在于注释,而在于中间的空格.

显而易见的解决方案是明确地strip比较之前的空白就像这样......

ifeq "$(strip $(B))" "b"
  RESULT += b
endif

然而这似乎很容易出错。自从strip不需要操作,除非/直到使用注释,您可以省略strip一切都会一开始工作得很好——所以你很可能不会总是记得添加strip。稍后,如果有人在设置变量时添加注释,则 Makefile 将不再按预期工作。

注意:有一个密切相关的问题,如这个问题,即使没有注释,尾随空格也会破坏字符串比较。

问:还有吗万无一失如何处理这个问题?


这并不是 GNU Make 特有的东西;而是 GNU Make 特有的。相当,make is POSIX 定义以这种方式工作:

string1 = [string2]

该宏名为string1被定义为具有以下值string2, where string2被定义为之后的所有字符(如果有)<equals-sign>,最多一个注释字符(#)或未转义的<newline>. Any <blank>紧接在之前或之后的字符<equals-sign>应被忽略。

这可以解释为一个功能,允许您清楚地创建带有尾随空格的变量:

FOO = stuff  # this macro has two trailing spaces
BAR = something else# and this one has none

尽管通常重新组织您使用的地方可能会更清楚$(FOO)而不是依赖于它有模糊的空白。

也许处理这个问题的最好方法就是避免它:制定一个约定do not在变量定义行上添加注释(除非偶尔使有意的空白显式化)。而不是这样写:

A = a # list of apples
B = b # list of bananas
C = c # list of carrots

写这个:

# list of apples
A = a
# list of bananas
B = b
# list of carrots
C = c

这往往是 GNU 项目中的风格(例如,参见本页底部),尽管我不记得这是否在任何地方都有记录。

顺便说一句,当检查空格时,您可能想在您的变量中引用变量echo命令更多:

rule:
   @echo 'RESULT="$(RESULT)"'

In your echo RESULT=\"$(RESULT)\"版本,$(RESULT)没有从 shell 中引用,因此制表符和多个空格会被误导性地显示为单个空格。

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

变量赋值后的尾随注释颠覆比较 的相关文章

随机推荐

  • 使用 event.which 来验证用户是否按下空格键在 Firefox 中不起作用

    我想要一个脚本来验证按下的键是否是 空格键 键码 32 我注意到 IE 使用其他函数名称 我尝试了很多在这里找到的解决方案 event event window event IE does not pass event to the fun
  • 如何使用C#读取从asp.net页面传递的参数?

    我是 ASP net 新手 如何读取从 ASP net 页面传递的参数 任何小例子都会受到赞赏 这对我来说只是一个开始 使用您的示例 URL string id Request QueryString id string nam Reque
  • Spring Cloud Gateway转发客户端证书

    我正在尝试将 spring cloud gateway 用于基于 spring boot 的服务 该服务使用 ssl 和客户端身份验证 问题是 通过 api 网关从客户端调用服务总是失败 并显示 certificate unknown 没有
  • Phonegap 视频捕捉崩溃

    我制作了一个相对简单的phonegap应用程序 能够捕获图像和视频并将其上传到服务器 图像工作正常 但是当我调用捕获视频时 会出现相机 UI 当我接受视频时 应用程序崩溃并在 logcat 中出现以下错误 java lang Runtime
  • :touch CSS 伪类或类似的东西?

    我正在尝试制作一个按钮 这样当用户单击它时 它会在按住鼠标按钮的同时更改其样式 如果在移动浏览器中触摸它 我还希望它以类似的方式改变其样式 对我来说 看似显而易见的事情是使用 CSS active 伪类 但这不起作用 我尝试过 focus
  • R SHINY - 条件面板输出偏移?

    这篇文章是相关的R闪亮 复选框和条件面板问题 我在这里成功地创建了该问题的 MRE 再次总结一下 当单击第二个复选框或同时单击第一个和第二个复选框时 数据帧输出会发生移动 我希望它显示在与单击时相同的位置第一个复选框 library shi
  • 使用 Qt 中的命名参数列表发出 HTTP POST 请求

    我需要从 Qt 应用程序向服务器发出 HTTP POST 请求 POST 请求将包含命名值列表 即键 值对 它们主要是字母数字字符串 但可以包含特殊字符 例如引号 空格等 在 Qt 中执行此类 POST 请求的规范方法是什么 当前答案适用于
  • 将 Swift 数组转换为 NSData 以进行 NSUserDefaults.StandardUserDefaults 持久存储

    我正在尝试通过制作一个小应用程序来了解 Swift 在相对熟悉 Obj C 之后 我想使用 NSUserDefaults 持久保存少量数据 但我遇到了问题 我初始化一个空的元组数组 如下所示 var costCategoryArray na
  • 无法将 Ruby on Rails 连接到远程 mysql 数据库

    我正在尝试将我的rails 3应用程序连接到godaddy服务器上托管的mysql数据库 我可以使用 mysql 客户端进行远程连接 但在运行应用程序时却无法进行连接 我能够连接本地 mysql 但是当我尝试连接到远程托管数据库时 出现此错
  • 由于编码问题,WebClient.DownloadString 导致字符损坏,但浏览器正常

    下面的代码 var text new WebClient DownloadString http export arxiv org api query search query au Freidel L start 0 max result
  • Pandas - 当字符串与格式匹配时出现“时间数据与格式不匹配”​​错误?

    我收到一个值错误 指出我的数据与格式不匹配 不确定这是一个错误还是我在这里遗漏了一些东西 我指的是本文档对于字符串格式 奇怪的部分是 如果我将 数据 Dataframe 写入 csv 并读取它 然后调用下面的函数将转换日期 所以我不确定为什
  • php 邮件功能不发送电子邮件/发送电子邮件花费太长时间

    我有一个机架空间云 我想在其中设置 LAMP 服务器有CentOS 我安装了sendmail并且php邮件功能使用这个 但是使用php邮件功能发送电子邮件需要很长时间
  • Spark SQL - 转义查询字符串

    我不敢相信我会问这个但是 如何使用 SCALA 在 SPARK SQL 中转义 SQL 查询字符串 我已经厌倦了一切 到处寻找 我认为 apache commons 库可以做到这一点 但没有运气 import org apache comm
  • 如何更改 Handsontable 中已更改单元格的颜色?

    我正在使用 Handsontable 插件 当用户更改单元格中的值时 它应该变成黄色 以便他们可以跟踪更改的内容 在本例中 黄色是类 changeInput 棘手的部分是 当您双击单元格进行更改时 它会变成文本区域 而不再是 td 有任何想
  • 在 matplotlib 中显示表面前面的轮廓

    我一直在寻找答案 但我似乎不明白为什么在我的代码中我无法让投影轮廓显示在表面 后面 from mpl toolkits mplot3d import axes3d import matplotlib pyplot as plt from m
  • 使用 Selection 的 RangeElements 获取 Google 文档中的所有嵌套文本元素

    在类似于上面的文档中 我可以使用以下代码获取所有段落 var paras body getParagraphs 请注意 上面的代码不仅返回顶级段落 还返回内部的所有子级别段落ListItems Tables etc 如何在选定的范围内做同样
  • 如何处理 Angular 4 中的窗口滚动事件?

    我似乎无法捕获窗口滚动事件 在几个网站上我发现了类似的代码 HostListener window scroll onWindowScroll console log Scrolling 这些片段通常来自版本 2 这在 Angular 4
  • 将内部文本文件加载为 XML

    我正在编写一个 VB NET 应用程序 我想从资源加载内部文本文件 但代码显示无效 URI Uri 字符串太长 代码是 document Load C Users Sou Documents Visual Studio 2010 Proje
  • 在交替行上交换列(左/右)

    我有一系列行 每行包含两列 宽度按 50 50 分开 我希望每隔一行交换左列 image 在右边 但我需要维护 HTML 中的顺序 因为它在较小的屏幕上显示为一列 CSS ul list style none padding left 0
  • 变量赋值后的尾随注释颠覆比较

    在 GNU make 中 附加到变量赋值的尾随注释会阻止后续比较 通过ifeq 无法正常工作 这是生成文件 A a B b trailing comment C c RESULT ifeq A a RESULT a endif ifeq B