软件编译方法及装置与流程

文档序号:12596553阅读:198来源:国知局
软件编译方法及装置与流程

本发明涉及通信领域,具体而言,涉及一种软件编译方法及装置。



背景技术:

大型项目软件架构复杂,代码量大,几百万行代码甚至更多;开发语言多样,比如汇编,c,c++,脚本语言等低级语言和高级语言交织在一起;代码组织复杂,嵌套层次多,进程由多组件构成,组件之间有复杂的层次依赖关系。因此单机完整编译一个大型项目的软件版本,非常耗时间。

目前业界比较流行的分布式编译工具有IncrediBuild,distcc。这两个工具都是把预编译文件分发到各客户端机器上,客户端完成编译再把结果文件返回给服务端进行链接。

IncrediBuild是一个对应Visual C++的分布式编译软件,不适合我们linux环境下多语言环境的编译。

使用distcc时的缺点在于其负载均衡算法过于简单,distcc的代理进程对各个工作机当前的负荷没有感知,分发预处理文件的唯一依据是主机出现在DISTCC_HOST环境变量中的次序,主机名越靠前,就会得到更多的编译任务,然而当编译场中某些机器性能过差,整体编译性能会显著下降,当阻塞Make运行的编译任务运行在这些机器上的时候,这种性能变化尤为明显。

目前相关技术中还做过一个类似原理的工具,基本原理是主机下载源码,打包分发到各客户端,各客户端再解压。任务分发采用静态分发算法,认为每台机器性能一致,平均分配。任务分配的粒度也比较粗放,是按单板为粒度分配,即一个编译任务就是编译一个单板上所有应用软件。

针对相关技术中,编译大型软件效率较低的问题,还未提出有效的解决方案。



技术实现要素:

本发明提供了一种软件编译方法及装置,以至少解决相关技术中编译大型软件效率较低的问题。

根据本发明的一个方面,提供了一种软件编译方法,包括:服务端向一个或者多个客户端及本地分发编译任务;其中,所述编译任务为所述服务端和所述一个或者多个客户端对各自的源码进行编译的依据;在所述服务端将同步至该服务端的源码编译完成后,将应用库同步至所述一个或者多个客户端,并接收所述一个或者多个客户端发送的进程; 所述服务端根据所述应用库和所述进程完成软件打包。

可选地,服务端向一个或者多个客户端及本地分发编译任务包括:获取所述一个或者多个客户端的编译任务上限;根据所述编译任务上限向所述一个或者多个客户端分发所述编译任务。

可选地,获取所述一个或者多个客户端的编译任务上限包括:获取所述一个或者多个客户端的硬件资源信息;根据所述硬件资源信息获取所述编译任务上限。

可选地,根据所述硬件资源信息获取所述编译任务上限包括:通过下述公式获取所述编译任务上限:所述编译任务上限y=(core*2)*0.6+(mem)*0.4;其中,core代表所述一个或者多个客户端的硬件内核数,mem代表所述一个或者多个客户端的内存大小,单位是G。

可选地,服务端向一个或者多个客户端及本地分发编译任务包括:获取所述一个或者多个客户端的性能参数;根据所述性能参数确定是否向所述一个或者多个客户端分发所述编译任务,以及向所述一个或者多个客户端分发所述编译任务的数量。

可选地,所述服务端和所述一个或者多个客户端之间采用TIPC进行通信。

根据本发明的另一个方面,提供了一种软件编译装置,包括:分发模块,用于向一个或者多个客户端及本地分发编译任务;其中,所述编译任务为所述服务端和所述一个或者多个客户端对各自的源码进行编译的依据;处理模块,用于在所述服务端将同步至该服务端的源码编译完成后,将应用库同步至所述一个或者多个客户端,并接收所述一个或者多个客户端发送的进程;打包模块,用于根据所述应用库和所述进程完成软件打包。

可选地,所述分发模块包括:第一获取单元,用于获取所述一个或者多个客户端的编译任务上限;第一分发单元,用于根据所述编译任务上限向所述一个或者多个客户端分发所述编译任务。

可选地,所述第一获取单元包括:第一获取子单元,用于获取所述一个或者多个客户端的硬件资源信息;第二获取子单元,用于根据所述硬件资源信息获取所述编译任务上限。

可选地,所述第二获取子单元还用于:通过下述公式获取所述编译任务上限:所述编译任务上限y=(core*2)*0.6+(mem)*0.4;其中,core代表所述一个或者多个客户端的硬件内核数,mem代表所述一个或者多个客户端的内存大小,单位是G。

可选地,所述分发模块包括:第二获取单元,用于获取所述一个或者多个客户端的性能参数;第二分发单元,用于根据所述性能参数确定是否向所述一个或者多个客户端分发所述编译任务,以及向所述一个或者多个客户端分发所述编译任务的数量。

可选地,所述服务端和所述一个或者多个客户端之间采用TIPC进行通信。

通过本发明,采用服务端向一个或者多个客户端及本地分发编译任务;其中,该编译任务为服务端和一个或者多个客户端对各自的源码进行编译的依据;在服务端将同步至服务端的源码编译完成后,将应用库同步至一个或者多个客户端,并接收一个或者多个客户端发送的进程;服务端根据应用库和进程完成软件打包。解决了相关技术中编译大型软件效率较低的问题,进而提高了大型软件编译效率。

附图说明

此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:

图1是根据本发明实施例的软件编译方法的流程图;

图2是根据本发明实施例的软件编译装置结构框图;

图3是根据本发明实施例的软件编译装置结构框图(一);

图4是根据本发明实施例的软件编译装置结构框图(二);

图5是根据本发明实施例的软件编译装置结构框图(三);

图6是根据本发明实施例的分布式编译网络示意图;

图7是根据本发明实施例的服务端系统框图;

图8是根据本发明实施例的客户端系统框图;

图9是根据本发明实施例的服务端程序流程图;

图10是根据本发明实施例的客户端程序流程图。

具体实施方式

下文中将参考附图并结合实施例来详细说明本发明。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。

需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。

在本实施例中提供了一种软件编译方法,图1是根据本发明实施例的软件编译方法的流程图,如图1所示,该流程包括如下步骤:

步骤S102,服务端向一个或者多个客户端及本地分发编译任务;其中,该编译任务为服务端和一个或者多个客户端对各自的源码进行编译的依据;

步骤S104,在服务端将同步至该服务端的源码编译完成后,将应用库同步至一个或者多个客户端,并接收一个或者多个客户端发送的进程;

步骤S106,服务端根据该应用库和该进程完成软件打包。

通过上述步骤,服务端和客户端根据自身的编译任务对同步至该服务端和该客户端的源码进行编译,服务端根据该应用库和该进程完成软件打包,相比于相关技术中采用IncrediBuild或者distcc分布式编译工具进行软件编译,解决了相关技术中编译大型软件效率较低的问题,进而提高了大型软件编译效率。

上述步骤S102涉及服务端向一个或者多个客户端及本地分发编译任务,需要说明的是,可以通过多种方式分发编译任务。在一个可选实施例中,获取一个或者多个客户端的编译任务上限,根据该编译任务上限向一个或者多个客户端分发该编译任务。在另一个可选实施例中,获取一个或者多个客户端的性能参数,根据该性能参数确定是否向一个或者多个客户端分发该编译任务,以及向一个或者多个客户端分发该编译任务的数量。

在获取一个或者多个客户端的编译任务上限的过程中,在一个可选实施例中,获取一个或者多个客户端的硬件资源信息,根据该硬件资源信息获取该编译任务上限。

根据硬件资源信息获取编译任务上限的方式可以有多种,在一个可选实施例中,通过下述公式获取该编译任务上限:编译任务上限y=(core*2)*0.6+(mem)*0.4;其中,core代表该一个或者多个客户端的硬件内核数,mem代表该一个或者多个客户端的内存大小,单位是G。

在一个可选实施例中,服务端和一个或者多个客户端之间采用TIPC进行通信。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例该的方法。

在本实施例中还提供了一种通信设备中软件版本的升级装置,该装置用于实现上述实施例及优选实施方式,已经进行过说明的不再赘述。如以下所使用的,术语“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。

图2是根据本发明实施例的软件编译装置结构框图,如图2所示,该装置包括:分发模块22,用于向一个或者多个客户端及本地分发编译任务;其中,该编译任务为服务端和一个或者多个客户端对各自的源码进行编译的依据;处理模块24,用于在服务端将 同步至服务端的源码编译完成后,将应用库同步至该一个或者多个客户端,并接收一个或者多个客户端发送的进程;打包模块26,用于根据该应用库和该进程完成软件打包。

图3是根据本发明实施例的软件编译装置结构框图(一),如图3所示,分发模块22包括:第一获取单元222,用于获取一个或者多个客户端的编译任务上限;第一分发单元224,用于根据该编译任务上限向一个或者多个客户端分发该编译任务。

图4是根据本发明实施例的软件编译装置结构框图(二),如图4所示,第一获取单元222包括:第一获取子单元2222,用于获取一个或者多个客户端的硬件资源信息,第二获取子单元2224,用于根据该硬件资源信息获取该编译任务上限。

可选地,第二获取子单元2224还用于:通过下述公式获取该编译任务上限:该编译任务上限y=(core*2)*0.6+(mem)*0.4;其中,core代表该一个或者多个客户端的硬件内核数,mem代表该一个或者多个客户端的内存大小,单位是G。

图5是根据本发明实施例的软件编译装置结构框图(三),如图5所示,分发模块22包括:第二获取单元226,用于获取一个或者多个客户端的性能参数;第二分发单元228,用于根据该性能参数确定是否向该一个或者多个客户端分发该编译任务,以及向一个或者多个客户端分发该编译任务的数量。可选地,服务端和一个或者多个客户端之间采用TIPC进行通信。

需要说明的是,上述各个模块是可以通过软件或硬件来实现的,对于后者,可以通过以下方式实现,但不限于此:上述模块均位于同一处理器中;或者,上述模块分别位于多个处理器中。

本发明的实施例还提供了一种存储介质。可选地,在本实施例中,上述存储介质可以被设置为存储用于执行以下步骤的程序代码:

S1,服务端向一个或者多个客户端及本地分发编译任务;其中,该编译任务为服务端和一个或者多个客户端对各自的源码进行编译的依据;

S2,在服务端将同步至该服务端的源码编译完成后,将应用库同步至一个或者多个客户端,并接收一个或者多个客户端发送的进程;

S3,服务端根据该应用库和该进程完成软件打包。

可选地,在本实施例中,上述存储介质可以包括但不限于:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。

可选地,在本实施例中,处理器根据存储介质中已存储的程序代码执行上述S1、S2和S3。

可选地,本实施例中的具体示例可以参考上述实施例及可选实施方式中所描述的示 例,本实施例在此不再赘述。

一、本发明可选实施例采用以下技术方案:

1.利用多台linux服务器组成分布式编译网络,如图6所示。

2.利用svn将源码同步到各编译服务器上。

3.待源码下载完成后,由服务端向客户端和本地分发编译任务。客户端和本地编译完,将库同步到网络各节点,将进程同步到服务端。

4.最后在服务端完成软件打包。

5.分布式编译网络的建立。

分布式编译网络采用tipc通讯,先在网络各节点安装探测守护进程。探测守护进程定时发送广播消息,其它节点收到广播消息后建立与广播者的联系,实时获取网络各节点在线信息。

6.任务分发算法:

服务端的编译任务按库和进程为粒度划分,进程依赖于公共库,所以库得先编译,库编译完成再编译进程。

编译任务的分发在服务端进行,服务端采用静态和动态相结合的算法来给客户端和本地分配编译任务。

1.1静态分配算法:

编译是个很消耗内存和中央处理器(Central Processing Unit,简称为CPU)的过程,首先根据编译机硬件配置,为每个编译机静态设置最大任务上限。首先编译机上报自己的硬件资源信息。

硬件资源和编译上限的对应关系如下:

编译任务上限y=(core*2)*0.6+(mem)*0.4core代表硬件内核数,mem代表内存大小,单位是G。这个是根据运行时,实际的资源消耗大概估算的一个公式。一般8核,8G内存12个编译任务为上限。

1.2动态分配算法:

编译机定时向服务端上报自身的性能参数,性能参数是反映自身资源可利用情况的一个数值。经验公式如下:

Performance=CPU_USE_RATE*0.8+FREE_MEM_RATE*0.2

服务端根据编译机上报的性能参数和该编译机正在编译任务数决定是否继续派发 编译任务给该节点。策略是这样的,如果该编译机的编译任务达到上限则不派发编译任务;如果Performance小于90%,并且该编译机编译任务没达到上限,则继续派发编译任务,否则停止派发编译任务。

7.分布式编译网络的可靠性通讯。

分布式网络还有个问题就是可靠通信的问题。分布式编译要求在网络没断开的情况下,能够保证消息可靠派发。TIPC在多消息并发的时候也会丢包,所以分布式编译工具做了个可靠消息模块。可靠消息模块原理类似于同步消息,凡是利用可靠消息接口发送的消息都由可靠消息线程来派发,可靠消息线程是个优先级比较低的线程,其发送的消息都带上序列号,对端收到消息后必须给个应答,此消息才算发送成功;如果没有应答则延迟重发,当达到重发上限后,宣布消息发送失败。可靠消息线程会发消息给源消息发送者,告知消息发送失败。

8.可靠的文件同步功能。

文件同步采用tcp消息传输数据,tcp协议是按顺序发送报文,不会乱序。文件同步的发起者发送文件名及文件校验信息,接受者等文件传送完毕后进行crc校验,确保文件同步的准确性。

分布式编译工具采用c语言进行编写,由守护工具,服务端工具和客户端工具三部分组成;守护工具是在二层域中广播消息,并根据其它节点的广播消息进行组网;服务端工具负责任务收集与分发,客户端管理,本地资源管理与编译任务执行;客户端工具负责本地资源管理与上报,本地资源管理与编译任务执行。

二、1.服务端和客户端系统组成。

服务端和客户端系统框图,如图7,图8所示。

编译任务搜索模块,主要功能是解析配置文件,读出需要编译的的单板,cpu,库和进程。

编译任务分发模块,主要功能是制定任务分发策略,对任务进行派发,对编译任务结果进行跟踪与统计。

文件同步模块,主要功能是搜索要特定类型的文件,根据会话管理提供的网络节点信息,同步文件。

消息模块,主要功能是建立二层tipc协议的可靠消息通道,并按消息优先级和消息所属线程进行消息派发。

性能统计模块,主要功能是统计本地的cpu,内存使用情况。

编译任务执行模块,主要功能是根据派发的编译任务,在本地执行编译过程,并把 编译结果上报给服务端。

会话管理模块,主要功能是网络节点间的建链,断链,保活管理。

2.客户端和服务端程序流程图

2.1服务端程序流程图

上电后先初始化会话管理模块和可靠消息模块,会话管理采用链表的数据结构,可靠消息实现原理可以参考上述介绍。接下来创建TCP守护进程(供文件同步模块用),可靠消息线程,文件同步线程,编译执行线程,服务端任务管理线程,编译任务分发线程。以上初始化完毕后,判断客户端是否准备好,如果准备好则开始派发库编译任务,应用库都编译完毕后开始库同步,即每个节点上编译生成的库文件都要同步到其它节点上。库同步完成后开始派发进程编译任务,进程编译任务编译完毕后,各客户端将编译生成的进程编译文件同步到服务端。待所有进程文件都同步完成后,各客户端要向服务端同步本地的编译日志文件。

图9是根据本发明实施例的服务端程序流程图,如图9所示,该流程包括如下步骤:

步骤S902,上电后先初始化会话管理模块;

步骤S904,初始化可靠消息模块;

步骤S906,解析编译任务;

步骤S908,接下来创建TCP守护进程;

步骤S910,创建可靠消息线程;

步骤S912,创建文件同步线程;

步骤S914,创建编译执行线程;

步骤S916,服务端任务管理线程;

步骤S918,编译任务分发线程;

步骤S920,以上初始化完毕后,判断客户端是否准备好,在判断结果为否的情况下,执行步骤S922,在判断结果为是的情况下,执行步骤S944;

步骤S922,睡眠一秒;

步骤S924,开始派发库编译任务;

步骤S926,判断是否库编码任务派发完成,在判断结果为否的情况下,执行步骤S928,在判断结果为是的情况下,执行步骤S930;

步骤S928,睡眠一秒;

步骤S930,同步库到其他节点;

步骤S932,判断是否本地和客户端同步完成,在判断结果为否的情况下,执行步骤S934,在判断结果为是的情况下,执行步骤S936;

步骤S934,睡眠一秒;

步骤S936,开始派发进程编译任务;

步骤S938,判断是否进程都同步到服务端,在判断结果为否的情况下,执行步骤S940,在判断结果为是的情况下,执行步骤S942;

步骤S940,睡眠一秒;

步骤S942,告知各客户端退出。

2.2客户端程序流程图

基本的初始化流程和主类似,客户端没有任务搜集,客户端管理,任务分发模块。客户端收到编译任务后,启动编译,等编译结束向服务端返回编译结果。

图10是根据本发明实施例的客户端程序流程图,如图10所示,该流程包括如下步骤:

步骤S1002,上电后先初始化会话管理模块;

步骤S1004,初始化可靠消息模块;

步骤S1006,创建TCP守护进程;

步骤S1008,创建任务文件同步线程;

步骤S1010,创建可靠消息线程;

步骤S1012,创建编译执行线程;

步骤S1014,创建客户端管理线程;

步骤S1016,向服务端上报本地准备好;

步骤S1018,判断是否有库编译任务,在判断结果为否的情况下,执行步骤S1020,在判断结果为是的情况下,执行步骤S1022;

步骤S1020,睡眠一秒;

步骤S1022,执行编译任务并返回编译结果;

步骤S1024,判断是否所有库编译完成,在判断结果为否的情况下,执行步骤S1026,在判断结果为是的情况下,执行步骤S1028;

步骤S1026,睡眠一秒;

步骤S1028,同步库到其他节点;

步骤S1030,判断是否有进程编译任务,在判断结果为否的情况下,执行步骤S1032,在判断结果为是的情况下,执行步骤S1034;

步骤S1032,睡眠一秒;

步骤S1034,执行编译任务并返回编译结果;

步骤S1036,判断是否所有进程编译完毕,在判断结果为否的情况下,执行步骤S1038,在判断结果为是的情况下,执行步骤S1040;

步骤S1038,睡眠一秒;

步骤S1040,同步进程文件到服务端;

步骤S1042,同步日志文件到服务端;

步骤S1044,判断是否收到退出命令,在判断结果为否的情况下,执行步骤S1046,在判断结果为是的情况下,执行步骤S1048;

步骤S1046,睡眠一秒;

步骤S1048,退出。

2.3编译过程中的异常处理

如果编译过程中有网络异常,则主根据将发给失联客户端的编译任务重新分发。

综上所述,通过本发明提供的工具是在linux环境上运行的,解决大型软件编译时间过长的一个分布式编译工具,它是以库和进程为粒度分发编译任务,和编译语言还有编译器无关,采用静态和动态的任务分配算法,有效的利用了各编译机器的资源。与相关技术中的工具相比较,有以下区别:1利用svn进行源码同步,提升了源码下载的速度;2每台机器安装完分布式工具后即能自动组网,每个节点都可以做为服务端发起编译任务;3任务分配粒度更细,分配算法采用静态动态相结合的方式,大大提升了编译速度;4采用可靠的消息通讯方式,提高了分布式编译的可靠性。解决了大型软件编译时间过长的问题,对于我们超大型软件的编译能节省大概6个多小时。与相关技术相比较,本发明能智能组建分布式编译网络,服务端根据客户端机器性能和当前硬件资源利用情况合理分配编译任务,采用可靠消息通讯增加了分布式编译的安全性。

显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们 存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。

以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1