前言

如何提高 Makefile 的编译速度呢?既然是提高,那肯定是对于大项目而言,因为小项目本身源文件不多,Makefile 优化与否,对于编译速度而言,影响并不大。当然对于那些追求速度达到极致的人而言,就另当别论了。废话不多说了,切入主题!

本博文会随着所遇见的Makefile编译速度有关的问题而持续更新。

1. 赋值运算符的影响

‘:=’ 和 ‘=’ 两个赋值运算符是如何影响编译速度的呢?这其中的奥妙就在于它们的本质含义,若是理解透彻了也就不会心存疑惑了,博主也是苦思了很久,并且搜索了很多网络资料,最后被该篇博文一语惊醒!请点击此处查看该博文

= 赋值运算符 - 递归展开式 - 延后展开

“=”表示将整个 Makefile 展开后,再决定变量的值,即变量的值将会是整个Makefile中最后被递归展开所指定的值,而不管其引用的中间变量是在执行目标规则之前还是之后。

示例如下:

foo = $(bar)

bar = $(ugh)

ugh = $(Huh)

all:

@echo $(foo)

Huh = AfterTarget

make之后其结果为 : AfterTarget

其整个执行过程如下:

首先“$(foo)”被替换为“$(bar)”,

接下来 “$(bar)”被替换为“$(ugh)”,

“$(ugh)”被替换为“$(Huh)”,

最后$(Huh)被替换为“AfterTarget”。

整个替换的过程是在执行“echo $(foo)”是进行的。

注意一句话:整个替换的过程是在执行“echo $(foo)”时进行的。

:=赋值运算符 - 直接展开式 - 立即展开

“:=”表示变量的值决定于它在 Makefile 中的位置,而不是整个 Makefile 展开后的最终值。在使用该赋值运算符来定义变量时,变量值中对另外变量的引用或者函数的引用在定义时就被展开了,即定义时变量就已经是其表达式最终的值了。

示例如下:

x := foo

y := $(x) bar

x := xyz

在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。

以上是这两个赋值运算符基本的说明,下面详细描述其是怎么影响编译速度的!

示例如下:

TmpDir = /Source #此处随意定义了一个目录,

#但切记在实际编写的 Makefile 中,不要在赋值语句后面写注释,

#否则会把 /Source 到 # 之间的空格也算进去的。

#在下面引用该变量的时候实际上‘/Source_’最后还多了一个空格

#为了表示清楚,我用下划线表示空格,这样的目录肯定是不存在的

#以下语句调用了Shell函数,其结果是把指定目录下的所有源文件赋值给 x 变量,

#两者取其一运行make

#x := $(shell cd $(TmpDir); ls *.c)

x = $(shell cd $(TmpDir); ls *.c)

all:

@echo $(x)

@echo $(x)

@echo $(x)

:= 是立即变量赋值,在定义时值已经被确定。执行 make 时, x 的值已经是指定目录下的所有源文件了,所以尽管后面执行了三次 @echo $(x) ,但其实 Shell函数只调用了一次

= 是延时变量赋值,只有在这个变量被使用时才展开。执行 make 时, x 定义时其值并没有展开,所以后面执行了三次 @echo $(x) ,每次都调用了 Shell 函数,最终调用了三次 Shell 函数

通过以上分析过程,对于这两个运算符是如何影响编译速度的疑惑应该心里有底了。

总结

makefile 的解析分为两个阶段,第一阶段生成规则和依赖关系,第二阶段执行规则;只有立即展开的变量会在第一阶段计算,而延后展开的变量会在第二阶段计算。

当使用‘=’赋值运算符对变量进行赋值,若变量定义中使用了函数,则包含在变量值中的函数总会在引用了该变量的规则的地方被执行,若 Makefile 中多处引用了该变量(不要忽略了隐晦规则中的引用),此时就需要考虑使用‘:=’赋值运算符,来减少变量的展开次数以及函数的调用次数,从而提高编译速度。

加快linux编译速度,Linux Makefile 编译速度的优化【转】相关推荐

  1. 四、linux编译规则文件Makefile

    makefile脚本语法规则具体看: 1.编译器路径设置 linux内核源码根目录下makefile文件修改编译器路径.如下图: 2. 强制编译 源码开发者强制要求编译进内核的文件 ,类似下面的写法, ...

  2. linux中命令对c文件进行编译,Linux下C语言编译基础及makefile的编写

    这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将会学到以下内容: 源程序编译 Makefile的编写 程序库的链接 程序的调试 头文件和系统求助 1.源程序的编译 在L ...

  3. spdlog linux编译出错,Linux下编写Makefile引入第三方库

    Linux下编写Makefile引入第三方库 前言:一直在使用CmakaList 生成Makefile文件,其实很少去写Makefile,但是最近帮朋友处理了一个Makefile引入第三方库的问题,就 ...

  4. C/C++编译总结 (Linux下g++、makefile、automake)

    C/C++编译总结 (Linux下g++.makefile.automake) !! 阅读前提示: 1)本文是自己的学习过程和经验的总结,和大多数人一样,不懂就搜度娘.csdn.博客园等等,内容难免有 ...

  5. Linux——Linux驱动之Makefile编译总结(编译器路径设置、编译流程分析、编译试验测试)

    目录 0 引言 1 编译器路径设置 2 Makefile编译文件 3 Linux内核编译流程分析 4 编译试验测试

  6. 编译arm linux内核,编译Linux内核(下)---KConfig、Makefile详解以及ARM平台Linux内核的编译...

    转载自:http://blog.csdn.net/newthinker_wei/article/details/8022696 本文主要介绍Linxu2.6的内核配置系统. 如果你浏览一下源代码目录, ...

  7. linux makefile 编译标记 EXTRA_CFLAGS 简介

    1.介绍 EXTRA_CFLAGS,  EXTRA_AFLAGS,  EXTRA_LDFLAGS,  EXTRA_ARFLAGS 所有的EXTRA_变量只能使用在定义该变量后的makefile文件中. ...

  8. linux源文件编译工具Makefile编译流程

    一.Makefile介绍 个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至 ...

  9. linux内核2.6.35编译过程

    一.实验目的 学习重新编译Linux内核,理解.掌握Linux内核和发行版本的区别. 二.实验内容 在Linux操作系统环境下重新编译内核.实验主要内容: A. 查找并且下载一份内核源代码,本实验使用 ...

最新文章

  1. 一些常用工具地址,随时更新中~
  2. 181个NLP教程合集,Colab一键直达,无需环境配置,此外还有481个文本数据集
  3. mysql bingip,MySQL报错Ignoring query to other database的真正原因
  4. currenthashmap扩容原理_ConcurrentHashMap实现原理和源码解读
  5. docker随着主机启动 自动启动设置
  6. Excel教程一:将Excel中一列转换成多行
  7. cocos2dx实现翻书效果。
  8. Linux的chkconfig命令详解
  9. 数据库系统概论速成?
  10. O2O营销模式(Online To Offline)
  11. 鲁班学艺 ---学三个月的,手艺扎根在眼里;学三年的,手艺扎根在心里
  12. UML 用例图符号含义
  13. Flex 桌面应用 adl 调试模式运行
  14. 我们不一样!告诉你百度是如何做智能流量异常检测的
  15. ECCV 2022|通往数据高效的Transformer目标检测器
  16. 4298. 【NOIP2015模拟11.2晚】我的天
  17. Sqlmap 22.05.23.05
  18. 图片过大怎么办?如何把图片压缩到最小
  19. (初学者视角)二极管和三极管的工作原理
  20. 实现Python爬虫的思路、原理

热门文章

  1. python实现文件共享_基于Python的分布式文件共享系统的实现
  2. Spark vs. MapReduce 时间节约66%,计算节约40%
  3. 利用pandas,pyplot 绘制柱状图
  4. 确保河道环境_开展河道整治 改善生态环境
  5. kafka版本_Apache Kafka 版本演进及特性介绍
  6. react月份选择控件_看我的案例:用react写一个日历控件!
  7. Android studio吧,Android Studio 连接真机
  8. php mysql encode_PHP json_encode mysql结果
  9. html居中代码logo,关于logo(前端开发教程)垂直居中的问题
  10. axurerp折线图控件_Axure教程:如何画出曲线图?