写在前面
编译 Qt5 源码是个力气活,其各种库的依赖关系很复杂,如果自己编译,需要安装很多系统库及其头文件。
配置阶段,它自己会进行环境检测,依赖测试,对于依赖条件不满足的组件或者模块进行禁用操作。如果想启用某个模块,可能因为依赖不足多次出现配置失败的结果。
如果知道配置工具的工作原理,可以配置之前去查某个模块的依赖项,当然,这没有多少必要性,纯属个人兴趣。
configure 脚本
先看一下 Qt5.15 的 configure 文件结构。全文件分以下几部分
- script initialization
- utility functions
- operating system detection
- Verify Xcode installation on Mac OS
- Qt version detection
- initalize variables
- parse command line arguments
- help - interactive parts of the script _after_ this section please
- platform detection
- command line and environment validation
- build tree initialization
- build qmake
- create a qt.conf for the Qt build tree itself
- configure and build top-level makefile
它们完成的工作主要有:
- 初始化工作环境和检查编译器工具等
- 定义了几个函数,用于解析 qmake.conf,获取变量值,被下面的编译 qmake 过程引用
- 检测操作系统,主要是区分 Win 系、Unix 系,Mac 是个特例
- 如果是 Mac 检测 Mac 上的编译环境
- 检测当前Qt版本
- 初始化几个变量,QTDIR OPT_SHADOW CFG_SILENT CFG_DEV等等
- 解析命令行参数
- 帮助信息,如果是 help 打印帮助信息并退出
- 检测编译平台
- 命令行和环境验证,主要验证 QMAKESPEC 是否有效,指定的平台是否支持
- 初始化构建树,检测是不是 shadow build;如果是 shadow build,在当前目录下新建一些子目录
- 编译 qmake 工具
- 给本次构建树生成一个 qt.conf 文件
- 配置并构建顶层 Makefile ,生成各模块的 Makefile 文件
configure 脚本执行的最后一条命令是
1 | qmake path-for-src-root -- args-for-configure |
其中,path-for-src-root 表示源码目录根目录;args-for-configure 表示执行 configure 脚本时的所有参数; --
符号会把后面的所有参数传递下去,传递给qt.pro,传递给 qt_configure.prf,还有 qtbase/configure.pri 等等。
结尾
后面的配置过程工作就交给 qmake 去完成了 —— 检测配置项是否有效,检测系统是否支持某配置项,检测是否启用或者禁用某特性等等。
如果看旧版本的源码,会发现 qbase/configure 文件有7、8千行之多,而可能从5.6开始 qbase/configure 只有8百多行。砍掉的部分工作都交给 qmake 去做了。我可能把 qmake 的工作原理放到下一篇文章了。