最新WPS办公软件学习教程_免费企业办公软件下载_金山WPS Office官网论坛

 找回密码
 
查看: 182672|回复: 168

[交流讨论] 〖纪念贴〗WPS的Linux移植流水账(1999-2012)

  [复制链接]

17

主题

23

听众

768

积分

WPS开发团队

Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17

该用户从未签到

金币
0
威望
1365
帖子
158
精华
2
发表于 2012-4-24 19:26 |显示全部楼层
分享到: 新浪微博 腾讯微博
本帖最后由 xtaotao 于 2013-5-24 16:43 编辑

作者:xtaotao,WPS的架构师之一,男,未婚,内部人称涛哥

---------------------------------rachel提供作者信息,以下是涛哥全文-------------------------

1999年传闻中的WPS For linux搁浅

  WPS最早开发Linux版本的计划是始于1999年,并且在2002年都准备发布,至于为何搁浅就不得而知了。当然这些都是传闻。

2003年WPS For Linux 正式立项、再搁浅

  2003年,WPSV6项目立项之初,就明确了跨平台的目标,开发初期是Windows版本和Linux版本同时开发的。
  当时WPS的招聘广告大致是这样写的:WPSV6是要跨平台的,因此我们为每个员工准备了两台电脑,一台装Windows,一台装Linux,同时开发。又因为我们的办公空间非常的有限,所以我们给员工配备了液晶显示器。
   而事实上是:
  我2004年入职WPS,大多数员工都是一台电脑,一台老式CRT显示器,当时的液晶显示器只有十几台,约1年半之后,我才终于换上了液晶显示器,约7年半之后,我才领到了两台电脑,一台装Windows,一台装Linux。
  不过当时Linux确实是在做。后来随着市场和竞争对手的压力逐渐加大,Linux就被暂时搁浅。此后陆续用Wine模拟了两个Linux版本,不过未对外发布。

2010年放弃Delphi,QT重构开始
  2010年底,原Delphi的界面已经没有几个人能够维护了,在加上Linux的呼声也越来越高,于是下决心废掉Delphi的界面,用Qt重新来过。
  到2011年7月初,主界面的开发告一段落,我被从演示组抽出来,组建一支新的队伍,做两件事情:对话框的移植和Linux移植。
  同时演示组的同学赖平鄂、刘斌和区越坚也开始了用Qt替换GDI和GDI+的工作。
  而WPS的元老、20年工龄、WPS第一个Windows版本——WPS97的负责人章立新老师,重新回到WPS,带队做EMF/WMF的移植。

第一个跑通的版本Meego
  我对Linux的热情是始于Meego,在此之前,我对Linux始终是心存畏惧的,从来没有想过我会在Linux下开发,更没有想过我会带头来做Linux的移植。偶尔和同事聊天聊到Linux开发,聊到最多的就是:如果Visual Studio能有Linux版本就好了。当然,以微软对Linux的敌视态度,这是不可能的。
  虽然后来Meego被微软的间谍给耍了一道,但我对Linux的热情却没有因此而减弱,而且在ubuntu上跑通之后,我就将WPS移植到了Meego上网本系统,整个过程非常顺利,只改了一处代码,就可以跑了,比我安装Meego的过程都简单。

十一之前Linux版本要能跑起来,这是死命令
  十一之前Linux版本要能跑起来,这是死命令。当时没有去想会有多大的难度和多少的工作量,仅凭着热情,就答应下来了。
  从7月初开始,有三个月的时间,时间还是相当充裕的,但后来因为主界面的遗留问题、对话框的一些准备工作以及年度旅游等事情,移植的工作拖到8月22号才开始。这时距离十一只有6周时间,算上周末共40天。
  8月22号:从主干上拉出一个新的linux分支。
  接下来要做的是工程文件的迁移,在Windows下,VC帮我们封装了这个操作,但是.vcproj的文件结构很复杂,一旦发生冲突,想看懂冲突双方各自的修改意图基本上是不可能的。正好趁这次移植Linux的机会,摆脱对.vcproj的依赖,而且这也是移植Linux必须要做的工作。
  当时有两个选择QMake和CMake,因为CMake的文档较丰富,并且被广泛应用,于是决定选用CMake。网上有一篇很好的教程:网友Cjacker写的《CMake实践》,非常适合作为CMake的入门教程。但当时压力非常大,根本没有心情看下去,一边看一边试,过了两天,没有什么进展,于是找了一个工具,folders4cmake,将.vcproj的文件列表提取出来,导出到.cmake文件,然后再一边改一边试。绕好大一圈,最终还是看回《CMake实践》。
  磨刀不误砍柴工,此话不假,但当时真的是没有心情慢慢悠悠的磨刀。终归是心理素质不够硬。
  约8月30号,CMake脚本在Windows下调通。具体的时间我不记得,这个时间是从svn的历史记录中查到的,不一定准,因为我提交代码会比较慎重,有时提交一次代码会拖延一到两天。后面的时间也都是大概的时间。
  在我迁CMake的这段时间,主干又合并了几个分支,代码发生了翻天覆地的变化,于是又将这部分修改合到Linux分支,更新CMake的文件列表,在Windows下编译通过入库。
  在之前两次迁移wine的过程中,修改了不少gcc的编译错误,这些修改一直没有合回主干。这次要把这些修改合到Linux分支,即为了避免重复劳动,也为了节约时间。
  由于wine分支从主干分出去的时间太长,因此合并产生了非常多的冲突。更有甚者,很多冲突文件都合并出了乱码。原本我们在windows下开发,没有考虑过编码的问题,所有代码都是VC默认的gb18030编码。在迁移wine的过程中,gcc不能正确识别gb18030编码的文件,导致有些文件编译不过,后来,这部分文件被存为了utf8编码,而在我们的新Linux分支上,依然保留着主干的gb18030编码。因此有些合并后的文件,混合了gb18030和utf8两种编码。
  乱码要一个个改过来,冲突也要一个个确认。眼看着时间不够用,而冲突还有很多,就放弃了部分和演示无关的代码。
  9月5号,重点解决了演示相关模块的冲突之后,提交代码。

  WPS2012专业版定于9月27号发布,但因为进度拖延的关系,所有开发人员开始加班:从9月5号开始,连上7天班,休1天,力争27号发版本。从28号开始调休,到10月12号上班,这个十一WPS连休了14天的。
  因此WPS Linux 版本的移植时间点也被提前到9月27号。

  这时,演示组的同学经过两个月的努力,已经成功用Qt替换了GDI和GDI+,可以显示不太复杂的演示文档了。
  9月6号,赖平鄂同学将将这部分修改合到了Linux分支,GDI和GDI+正式下岗了。

  终于可以切换到Linux平台工作了,取下Qt代码,编译不过,提示:找不到"emmintrin.h"文件。原因是我们修改了Qt,增加了用sse2指令集优化图片操作的代码。我也不知道应该到哪里去找"emmintrin.h"这个文件,大致看了一个,也没有什么头绪,就晾在一边。去Qt官网下载了未修改版的代码,编译通过。

  然后正式开始WPS演示代码的编译,freetype、zlib、hunspell原本就是跨平台的代码,因此编译过程非常顺利,第一个编译错误是kfc报出来的,kfc是03年开始建设WPS基础库,试图封装对不同操作系统的api的调用,但到后来,由于进度的压力,就提交了很多赤裸裸的Windows Api代码。
  有人说:人们对未知事物总是产生恐惧的心理。在没有接触CMake之前,我对CMake感到恐惧,因此静不下心来。但kfc的代码,再熟悉不过了,压力虽然很大,却可以静下来心来慢慢读懂相关代码,用Linux api或qt重现实现。
  这样过了约一周,kfc还没有移植完,估算了一下时间,按这样的进度,龙年马月也移植不完。于是开始加速,遇到Windows API的调用,整个函数就不要了,后来变成整个源码文件就不要了。甚至有几个工程对Windows的依赖比较大,就整个不要了。
  9月15号,提交了kfc和kso的代码。

  与此同时,黄叙鹏同学终于把手上乱七八糟的事情处理完了。仅用2天的时间就解决了编译Qt找不到"emmintrin.h"文件的问题。

未完,字数太多,一帖发不下,请大家不要插队,谢谢。

(编辑:Rachel)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,

已有 9 人评分威望 收起 理由
Chad + 10 赞一个!
kssbsr + 1 辛苦了!
超级宇航员 + 1 Qt很好很强大
zhcj + 6 我很赞同
yicheng800206 + 1 很有用
rachel + 10 精品文章
royalxrb + 1
unwake + 30 我很赞同
lhw828 + 8 精品文章,辛苦啦!

总评分: 威望 + 68   查看全部评分

17

主题

23

听众

768

积分

WPS开发团队

Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17

该用户从未签到

金币
0
威望
1365
帖子
158
精华
2
发表于 2012-4-24 19:28 |显示全部楼层
接上文。


  接下来的移植要顺利的多,上层模块对Windows API的调用,比kfc要少很多,而且即使有,也是直接砍掉,我记得有一处图片处理的代码,调用了Windows API,本来应该是用Qt重写的,但被我直接砍掉了,时间已经不多了。
  所以在程序跑起来之后,很识时务的选择了渐变填充的样张来测试,而没有选择带图片的样张。因为我很清楚我都做了些什么。

  黄叙鹏同学负责移植自选图形相关模块的代码。我则开始移植演示相关代码。
  9月21号,我们改掉了演示相关工程的编译错误。

  然后开始报一堆的链接错误:"undefined reference to ...",对于这些错误的出现,在我们之前野蛮砍代码的时候就有心理准备。  兵分两路:我来改具体的链接错误。黄叙鹏同学找到我们之前移植的微软二进制格式复合文档的实现和utf16的字符串相关函数等实现代码,编译通过,接入到工程中。
  到9月26号上午10点,链接错误也都改完了。这时演示才算是真正的编过了。

  然而还没来得及高兴,就发现程序莫明其妙的跑不起来,而且每次挂掉的地方都不一样,main函数的断点都没有走到,根本没有办法调试。
  折腾了一段时间,都没什么结果。我甚至开始怀疑:Qt是不是不支持Linux,然后用QtCreator创建了一个空的Gui工程,发现能跑起来,后来想了想,QtCreator也是Qt的。排除了Qt的问题。我又开始怀疑,是不是WPS在Linux下就是不可能跑起来的。
  中午在食堂吃饭的时候,遇到晁总,晁总问进展怎么样了,我说:“跑不起来呀。实在不行,我就在Windows下截个图,写个程序来显示这张图片,然后去忽悠章总说,程序已经可以跑起来了,只是还不能操作。”晁总说:“这个方案还有个优势:可以在浏览器中运行,连WebOffice都有了。”
  下午,开始用暴力排除法调试。所谓排除法:就是一点一点的缩小范围,这是我遇到不好调试的疑难杂症时,经常用的手段,只是这次用的特别暴力。所谓暴力:就是不管程序运行起来是否正常,先砍掉一些模块,看main函数能不能跑进来,能跑进来就说明被砍掉的模块有问题,不能就继续砍。
  经过一个下午和半个晚上的折腾,代码已经删的只剩下几个文件,范围已经缩到足够小了。本来坚持一下就能找到原因的,但一心要忽悠章总的我,被一段看起来老实忠厚的代码给忽悠了。
  晚上睡觉的时候想了几种可能,想来想去还是觉得那段老实忠厚的代码嫌疑最大。

  9月27号,只有最后一天的时间。必须要抓紧了。我让叙鹏帮我验证其他几种可能的情况,我继续暴力排除,目标锁定昨天那段看似老实忠厚的代码,约10点左右,终于在屏蔽了一个头文件之后,程序跑到了main函数的断点,可以调试了。
  然后把昨天砍掉的其他代码恢复过来,编译。心情舒畅。
  编译是一个漫长的过程,因为,我们还没有为gcc添加预编译文件支持,编译一遍大约要两个小时。
  吃完午饭回来,改了一个内存越界的错误之后,程序跑起来了。

  看到程序跑起来,还没有反应过来。本来没指望能看到主界面,以为能看到启动封面就不错了。结果是我看到了主界面,启动封面反而没看到。
  过了半秒钟之后才反应过来。本来想大喊一声,告诉所有人,Linux版已经跑起来了。但发现大部分同事都在午休,于是找了几个没有午休的同事小规模的围观了一下。
  当时截了张图,本来想放到论坛上,但又怕用户对WPS产生心里阴影,于是没敢。过了两天之后,终于忍不住,就挂在微博上,算是纪念吧。

WPS For Linux的第一个方块字版本
  现在放上当时的截图,建议各位网友围观之前要有心里准备。相信大家围观了之后,就会理解WPS的Linux版本为什么发布的这么慎重了。不是饥渴营销,真的。

  下面这张图是后来补上的,当时没有截。


  下午上班之后,正好章总路过,向章总报告了这一好消息。这个时候,大部分操作都还不能使用,随便点点就挂了。但有几个菜单是可以弹出来的。比用截图真实多了。
  WPS2012企业版的开发也很顺利,下午正式发布,我们都到一楼开了个小型庆功会,会上,邵哥向WPS全体同学公布了这一个好消息。

  本来希望能够在27号打开文件的,不过最终没有打开。于是28号又调了一天,29号调了大半天,终于在9月29号下午,可以打开文件了。然后截了几张图,发邮件给WPS所有同学。其实这个时候WPS的同学都已经放假了。发这个邮件也就是为了存档,纪念一下。

  依旧是方块文,连打开对话框都是:



  这是我们打开的文档:



  什么?你什么都没看见,是么?拿起鼠标,从视图左上角,拖到右下角,反过来也可以:



  再来看看,你是不是看到了控制点和文本框的边框。



  拖动文本框的边框看看,你看到了什么?



  既然文档已经打开了,接下来是不是该保存了呢?
  当然不是。因为最初的目标是能够打开文档,所以在移植的时候,存盘模块是被裁剪掉的。这个时候,点击保存按钮会发生什么事情,我也不知道,也没敢去点。
  移植了这么多天,终于能看到点效果了,累了,也该放松一下了。

WPS For Linux开发背后的故事(一)  作者:涛哥

本帖子中包含更多资源

您需要 登录 才可以下载或查看,

已有 2 人评分威望 收起 理由
东北林子 + 10 辛苦。
jinchizhong + 30 涛哥威武,不用多说,大家懂的。 ...

总评分: 威望 + 40   查看全部评分

回复

使用道具 举报

30

主题

33

听众

1万

积分

版主

机飞弹打

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

签到天数: 948 天

[LV.10]以坛为家III

金币
948
威望
26501
帖子
3350
精华
0

重阳节勋章 测试体验团

发表于 2012-4-24 19:41 |显示全部楼层
致敬!
点滴纪录·随心生活
http://Allog.ml
lhw828=机飞弹打
回复

使用道具 举报

17

主题

23

听众

768

积分

WPS开发团队

Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17

该用户从未签到

金币
0
威望
1365
帖子
158
精华
2
发表于 2012-4-24 19:44 |显示全部楼层
已经发完了,忘了说了。抱歉。
可以回复了。
回复

使用道具 举报

1495

主题

8

听众

8592

积分

版主

管理员&宣传大使

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

该用户从未签到

金币
98
威望
13570
帖子
7668
精华
2

特殊贡献奖 最佳管理奖 宣传大使奖 活跃会员奖 测试体验团

发表于 2012-4-24 20:19 |显示全部楼层
加油
回复

使用道具 举报

0

主题

0

听众

37

积分

LV.1

Rank: 1

该用户从未签到

金币
0
威望
60
帖子
25
精华
0
发表于 2012-4-24 20:22 |显示全部楼层
万事开头难..支持一个
回复

使用道具 举报

3

主题

0

听众

516

积分

LV.5

Rank: 5Rank: 5

该用户从未签到

金币
0
威望
1122
帖子
217
精华
0
发表于 2012-4-24 20:24 |显示全部楼层
偶狂顶。
回复

使用道具 举报

0

主题

0

听众

28

积分

LV.1

Rank: 1

该用户从未签到

金币
0
威望
30
帖子
13
精华
0
发表于 2012-4-24 20:27 |显示全部楼层
当时看到涛哥的邮件,涛哥的形象再次高大起来了。涛哥V5
回复

使用道具 举报

1

主题

0

听众

125

积分

LV.3

Rank: 3Rank: 3

该用户从未签到

金币
1
威望
211
帖子
66
精华
0
发表于 2012-4-24 20:28 |显示全部楼层
支持一个
回复

使用道具 举报

16

主题

3

听众

833

积分

测试体验团员

Rank: 14Rank: 14Rank: 14Rank: 14

该用户从未签到

金币
58
威望
1494
帖子
389
精华
0
发表于 2012-4-24 20:30 |显示全部楼层
浩大的工程,后面的工作还很多,强力支持!
爱linux,爱wps!
http://phpcj.org/
河北Linux用户组QQ群:249872047
Gentoo中文社区QQ群:160294591
回复

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 更多账号登录:

快速回帖:

fastpost

WPS论坛更新日志|WPS Office官方论坛     

GMT+8, 2017-11-19 07:11

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部