今天折腾了好久,就为了debug两个makefile的bug。虽然最后找到原因了,但是,怎么说呢,用现在流行的话来说,实在是意难平啊!必须写一篇记录一下!

第一个问题,是个语法高亮问题。今天观察到makefile里一些有缩进的语句,没有被正确的语法高亮,比如下面这样:

看起来没什么毛病……就是变量B怎么不给我高亮?

而正常来说,B应该被识别成变量:

正常来说B应该被识别成变量

问题的原因是在写非recipe的时候,缩进应该使用空格而非TAB。在写makefile中的recipe时,因为实际上我们写的是希望shell执行的语句,所以使用的是shell syntax。而make识别recipe的方式就是缩进使用TAB。而其他时候,比如上面的例子中,我们并非在写recipe,这时候syntax应该按照makefile风格来写,所以应当使用空格来缩进。这也正是编辑器对语法高亮识别的方式。

虽然看起来只是语法高亮的问题,但归根结底是make如何识别makefile中语句的问题。错误的缩进可能导致其他问题,比如在下面的例子中:

A

我们的本意是打印B的值,但是执行结果却是打印了一个空行,同时接着一行B=B。这背后的原因,就是B=B这一行使用了TAB来缩进,因此make把这一行也当做recipe的一部分,于是将其交给Shell执行。而除此之外,makefile中没有定义B的值,因此echo打印了一个空行,并且B=B也被打印出来。

Wrong !

可以参考GNU Make 5.1节深入学习recipe syntax问题。

第二个问题看起来就更奇怪一些。出错的代码类似下面这样:

A

看起来打印的结果应该是B,但实际上执行的结果却打印了C:

这个问题表面上看非常不可思议。而真正发现问题之后,也让人不禁摇头感叹。这个问题其实上仅仅因为A=A这一行的结尾多了一个空格。所以变量A实际上值是"A "。故而ifeq语句走了else分支。

这种问题知道之后觉得是个非常郁闷,但makefile似乎很难避免这样的问题。因为在makefile中,语句之间没有分隔符号,同时对字符串变量也不需要加引号。在我们日常使用的很多语言中,空格是可以自由添加的,本身不代表任何含义。所以习惯了其他语言语法的我们,面对这种"ghost white space"真的很难发现。我们只能要求维护makefile的同事多留心了。

另外,对于变量来说,实际上=前后是允许有空格的,并且会被忽略掉,不会当做值的一部分。但行尾的空格则相反。

希望以后都不要再debug makefile问题了……愿这篇文章没有更新……

makefile 打印变量_[Makefile] 缩进与空格--记录踩过的坑相关推荐

  1. makefile 打印变量_通过实例学Makefile

    前言 老实说在我学过的所有"知识"中,shell语法和Make规则是最让我厌烦的,这俩东西更像是宏替换语言,潜规则特别多.但现实是Linux和后端编程少不了要与它们打交道,那有什么 ...

  2. Makefile 打印变量的值

    $(warning  $(XXX))   打印变量的值 1,使用info/warning/error增加调试信息 方法1: $(info, "here add the debug info& ...

  3. php debug 打印变量_打印变量到页面上的方法 PHP debug函数

    打印变量到页面上的方法 PHP debug函数 (2012-03-16 17:17:00) 标签: 杂谈 当我们对php进行调试的时候往往想知道,某些变量是什么内容.下面这个函数可以将PHP的内部函数 ...

  4. charles都踩过哪些坑_那些年我学Java踩过的坑

    学Java的一路简直就是踩坑的一路,来来来让我们细数一下我这些年的血泪史 菜鸟阶段,几乎天天在雷上度过... 第一个:数据库表字段不能用sql字段,会报500错误.比如order 在select 时就 ...

  5. mysql 优惠卷表设计_这些年MySQL表设计踩过的坑!

    本文首发于个人微信公众号<andyqian>,期待你的关注! 前言 有朋友在后台留言.希望我能说说我在数据库表设计时踩过的坑.那么,我们今天就来聊聊我在数据库表设计时踩过的坑,以及现在对数 ...

  6. Makefile中打印变量

    一.使用info/warning/error增加调试信息 方法1: $(info, "here add the debug info") 但是此不能打印出.mk的行号 方法2: $ ...

  7. Makefile之变量(10)

    在Makefile中的定义的变量,就像是C/C++语言中的宏一样,他代表了一个文本字串,在Makefile中执行的时候其会自动原模原样地展开在所使用的地方.其与C/C++所不同的是,你可以在Makef ...

  8. makefile 无法工作_什么是Makefile,它如何工作?

    makefile 无法工作 如果要在更新某些文件时运行或更新任务,则可以使用make实用程序. make实用程序需要一个文件Makefile (或makefile ),该makefile定义了要执行的 ...

  9. makefile自动变量与隐晦规则推导

    博客搬家,原地址:https://langzi989.github.io/2017/09/20/makefile自动变量与隐晦规则推导/ makefile的使用可以大大简化程序编译的过程,不过对于新手 ...

最新文章

  1. 205页PPT,看5G+AI引领的下一个时代!
  2. 智能驾驶继续突破,国内国外技术进入深水区
  3. centos6.5搭建流媒体服务器
  4. linux如何编译wine,利用winelib编译一个可在linux下运行的程序
  5. 字符串模式匹配(bf+KMP)
  6. 蓝桥杯 ALGO-29 算法训练 校门外的树(区间处理)
  7. Python天天美味(15) - Python正则表达式操作指南(re使用)(转)
  8. 米家扫地机器人静音模式在哪_贵了300块的米家扫地机器人1S 还是那个性价比神器吗?...
  9. robotstudio机器人应用实践(码垛搬运工作站)
  10. 【CDH】cdh 安装新节点卡在“Acquiring installation lock...“
  11. IB中文:文学作品中幽默手法的表现方式(下)
  12. 【ZJOI2022】 众数(根号分治)
  13. shc加密(仅仅对shell脚本加密)
  14. oracle七参数坐标转换,MapGIS国土空间数据2000大地坐标系转换系统
  15. 如何使用高防CDN防御DDOS攻击呢?
  16. iPhone is not available. Please reconnect the device
  17. 手机测试软件可以看cpu占用率,手机资源占用情况检测
  18. 构筑全云端数字生态,看游戏工业如何持续进化
  19. _signature、X-Bogus、msToken调试分析【2022.7.21】
  20. 将自己的图片插入QRcode中

热门文章

  1. Asp.net 面向接口可扩展框架之类型转化基础服务
  2. 【ArcGIS遇上Python】ArcGIS Python批处理入门到精通实用教程目录
  3. Visual Studio/SQL Server系统开发常见问题归纳
  4. C和指针之字符串编程练习9(在参数1中查找匹配参数2额任意字符)
  5. LeetCode之Find the Difference
  6. github上面如何编辑README
  7. Android之Bitmap学习总结
  8. c语言程序设计的顺序结构的常用控制语句,C语言程序设计教程-第03课-顺序结构的程序设计.ppt...
  9. 他解决了物理学千年争端,成就肩比牛顿、爱因斯坦,但却鲜有人知......
  10. 为什么手机最后 10% 的电量很不耐,最后1%的电量最耐用?