Qt模块化工作进展

作者:殷允桥 | Jan 31, 2011 12:26:47 AM

原文链接: Kristian Amlie - Status of Qt Modularization

这是一篇去年十月份Qt正走向模块化的后续文章。目前这部分工作正在稳步推进, 现在我们已将大部分的Qt主要组件模块化。

在下图中, 你会看到当前的模块划分。那些本来就不是Qt一部分的模块没有包含在内。

一些关于设计方面的决策:

  • 模块间不允许有源代码依赖, 仅允许头文件依赖。
  • QtKernel代码库仍然包含很多模块。做出这一选择的原因是,从技术的角度来看分开这些模块太过于困难。在部分模块间有很多私有文件的依赖(尤其是QtCore和QtGui),虽然我们可以把这些模块分离在不同的代码库, 不过他们之间的依赖如此之大, 使得如此分离意义不大。在源码级别分离它们将需要太长时间, 目前而言使Qt剩下的部分模块化才是更重要的。 当然,我们仍然可以在后续的项目中进一步使之模块化。
  • 因为类的文档是写在.cpp文件里的,所以这部分文档将很自然地属于其所在模块。其它概述性的文档和qdoc工具本身将使用单独的代码库。
  • 示例和演示程序一般而言讲属于其所演示的模块, 不过如果依赖于多个模块,例如qtdemo这样的,将放在doc代码库。
  • 平台功能自动检测部分的配置脚本仍然属于QtKernel代码库, 即使这部分功能会被其它模块所用。这同样也是为了节省项目的时间。目标是, 当Qt模块化功能完成时,各个模块的维护者应该转向它们自己的配置脚本(或者其它方式)。例如,QtWebkit已经有了build-webkit这样的脚本。
  • "git submodule" 被选中做为提供包含全部模块化代码的主代码库的方式

当前状态:

Qt中的大部分已经被模块化, 且可以在Linux上被构建。当前正在进行中的三个主要工作是:在其它平台构建,运行自动化测试和在Qt代码库主分支上采用模块化(当前的工作基于Qt 4.7分支)。

在切换过程中将发生什么

因为模块化对我们来说是一个至关重要的项目, 所以我们希望能够尽可能早的切换过去。 这意味着部分会干扰到本次项目的工作要推迟到切换以后。目前为止还没有确切的日期, 不过初步估计会在1到2个月以内发生。当确定日期后,后续会公布更多消息。
切换时, 当前正在用于开发的Qt代码库讲被关闭并阻止任何代码提交。 然后, 按照上图所示的新代码库将被创建。旧Qt代码库将被归档,从而使用“git graft”机制仍然可以看到旧的代码历史。然而,新代码库起始状态将不包含任何代码历史信息,QtWebKit将是一个例外, 因为它已经是一个独立的基于原始的Webkit代码历史的代码库了。

这意味着代码合并请求要开始进入各个独立的模块,现存的合并请求将很遗憾地需要按照最新的模块分布重新提交。

在一开始将不可避免地会遇到很多困难, 但是希望在理顺这些关系后, 我们会有一个更易于使用和愉快地开发的全新的Qt代码库结构。

-
译者注:

一些未出现在上图中的模块说明:QtHelp属于QtTools代码库的Assistant模块, QtSql仍属于QtKernel代码库