通用交叉编译方法及设备与流程

文档序号:17159536发布日期:2019-03-20 00:28阅读:220来源:国知局
通用交叉编译方法及设备与流程

本发明实施例涉及计算机技术领域,尤其涉及一种通用交叉编译方法及设备。



背景技术:

为了适配不同的硬件平台,经常会对相关软件进行交叉编译。例如,常用的开发和编译环境一般是x86平台,当开发代码需要跨平台运行,且目标平台并不能满足编译需求时。就需要用到交叉编译,将代码编译成可以在目标平台上运行的可执行程序。通常来说,交叉编译需要先在当前平台上搭建好目标平台的编译环境,再对代码进行编译,代码在编译过程中一般会有相应的依赖库,比如c的数据库及其python的各种包等等,只有先解决这些依赖库的编译,才能最终完成代码的编译。同时,代码的依赖库还会有其自身的依赖关系,正是这种复杂的依赖关系,使得交叉编译稍显复杂和困难。

现有技术中大多只是对搭建编译环境的研究,或者编译方法性能的优化分析,并没有对这种复杂依赖关系的自动化解决方案。对于其他语言或者依赖包较少的应用程序,例如目前使用较多的python库的交叉编译并不能通用,并且整个框架搭建和使用都很繁琐和费时。因此,找到一种能够对依赖包依赖关系进行自动化确定的方法,并且该方法能够方便交叉编译的操作,提高交叉编译的执行效率,就成为业界亟待解决的技术问题。



技术实现要素:

针对现有技术存在的上述问题,本发明实施例提供了一种通用交叉编译方法及设备。

第一方面,本发明的实施例提供了一种通用交叉编译方法,包括:从待编译安装包中获取依赖包,对所述待编译安装包中的依赖包之间的依赖关系进行排序,得到已排序的待编译安装包;将所述排序后的待编译安装包与交叉编译工具链结合,得到通用交叉编译框架;其中,所述通用交叉编译框架用于对程序代码进行编译,所述依赖包中包含待编译软件。

进一步地,所述交叉编译工具链,包括:已经编译完成的交叉编译工具链或实时编译完成的交叉编译工具链。

进一步地,所述从待编译安装包中获取依赖包,包括:获取所述待编译安装包的名称,将待编译安装包的名称存储至requirement列表,从存储了待编译安装包名称的requirement列表中获取依赖包,若所述依赖包不在所述存储了待编译安装包名称的requirement列表中,则将所述依赖包添加至存储了待编译安装包名称的requirement列表的末尾,并下载所述依赖包。

进一步地,所述从待编译安装包中获取依赖包,包括:从已经准备完毕的待编译安装包中获取依赖包。

进一步地,所述对所述待编译安装包中的依赖包之间的依赖关系进行排序,得到已排序的待编译安装包,包括:根据存储了待编译安装包名称的requirement列表中存储的待编译安装包名称,生成requirement_old_list列表,从所述requirement_old_list列表中查找依赖关系文件,获取依赖包的依赖关系;其中,所述requirement_old_list列表用于存储需要查找依赖包依赖关系的待编译安装包。

进一步地,在所述得到通用交叉编译框架之后,还包括:通过脚本向所述通用交叉编译框架中传送交叉编译需要的参数,采用所述通用交叉编译框架对程序代码进行交叉编译。

进一步地,在所述采用所述通用交叉编译框架对程序代码进行交叉编译之后,还包括:删除解压后的待编译安装包,压缩打包编译完毕的安装包。

第二方面,本发明的实施例提供了一种通用交叉编译装置,包括:

依赖关系获取模块,用于从待编译安装包中获取依赖包,对所述待编译安装包中的依赖包之间的依赖关系进行排序,得到已排序的待编译安装包;

通用交叉编译框架获取模块,用于将所述排序后的待编译安装包与交叉编译工具链结合,得到通用交叉编译框架;

其中,所述通用交叉编译框架用于对程序代码进行编译,所述依赖包中包含待编译软件。

第三方面,本发明的实施例提供了一种电子设备,包括:

至少一个处理器;以及

与处理器通信连接的至少一个存储器,其中:

存储器存储有可被处理器执行的程序指令,处理器调用程序指令能够执行第一方面的各种可能的实现方式中任一种可能的实现方式所提供的通用交叉编译方法。

第四方面,本发明的实施例提供了一种非暂态计算机可读存储介质,非暂态计算机可读存储介质存储计算机指令,计算机指令使计算机执行第一方面的各种可能的实现方式中任一种可能的实现方式所提供的通用交叉编译方法。

本发明实施例提供的通用交叉编译方法及设备,通过在建立交叉编译框架的过程中引入依赖包依赖关系的自动化确定机制,方便了交叉编译的操作,提高了交叉编译的执行效率。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图做一简单的介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例提供的通用交叉编译方法流程图;

图2为本发明实施例提供的通用交叉编译装置结构示意图;

图3为本发明实施例提供的电子设备的实体结构示意图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。另外,本发明提供的各个实施例或单个实施例中的技术特征可以相互任意结合,以形成可行的技术方案,但是必须是以本领域普通技术人员能够实现为基础,当技术方案的结合出现相互矛盾或无法实现时,应当认为这种技术方案的结合不存在,也不在本发明要求的保护范围之内。

本发明实施例提供了一种通用交叉编译方法,参见图1,该方法包括:

101、从待编译安装包中获取依赖包,对所述待编译安装包中的依赖包之间的依赖关系进行排序,得到已排序的待编译安装包;

102、将所述排序后的待编译安装包与交叉编译工具链结合,得到通用交叉编译框架。

其中,所述通用交叉编译框架用于对程序代码进行编译,所述依赖包中包含待编译软件。

本发明实施例提供的通用交叉编译方法,通过在建立交叉编译框架的过程中引入依赖包依赖关系的自动化确定机制,方便了交叉编译的操作,提高了交叉编译的执行效率。

在上述实施例的基础上,本发明实施例中提供的通用交叉编译方法,所述交叉编译工具链,包括:已经编译完成的交叉编译工具链或实时编译完成的交叉编译工具链。

在上述实施例的基础上,本发明实施例中提供的通用交叉编译方法,所述从待编译安装包中获取依赖包,包括:获取所述待编译安装包的名称,将待编译安装包的名称存储至requirement列表,从存储了待编译安装包名称的requirement列表中获取依赖包,若所述依赖包不在所述存储了待编译安装包名称的requirement列表中,则将所述依赖包添加至存储了待编译安装包名称的requirement列表的末尾,并下载所述依赖包。

在上述实施例的基础上,本发明实施例中提供的通用交叉编译方法,所述从待编译安装包中获取依赖包,包括:从已经准备完毕的待编译安装包中获取依赖包。

在上述实施例的基础上,本发明实施例中提供的通用交叉编译方法,所述对所述待编译安装包中的依赖包之间的依赖关系进行排序,得到已排序的待编译安装包,包括:根据存储了待编译安装包名称的requirement列表中存储的待编译安装包名称,生成requirement_old_list列表,从所述requirement_old_list列表中查找依赖关系文件,获取依赖包的依赖关系;其中,所述requirement_old_list列表用于存储需要查找依赖包依赖关系的待编译安装包。

在上述实施例的基础上,本发明实施例中提供的通用交叉编译方法,在所述得到通用交叉编译框架之后,还包括:通过脚本向所述通用交叉编译框架中传送交叉编译需要的参数,采用所述通用交叉编译框架对程序代码进行交叉编译。

在上述实施例的基础上,本发明实施例中提供的通用交叉编译方法,在所述采用所述通用交叉编译框架对程序代码进行交叉编译之后,还包括:删除解压后的待编译安装包,压缩打包编译完毕的安装包。

为了更加清晰的阐述本发明各个实施例的精神实质,有必要对本发明实施例中的通用交叉编译框架的建立过程再次做出一个整体性的描述。需要说明的是,该整体性描述仅仅是为了体现本发明的精神实质,并非对本发明技术方案的限制。凡是符合本发明精神实质的技术方案,均在本专利的保护范围之内。本发明实施例中提到的通用的交叉编译框架,主要分为下面四个模块:编译环境准备、依赖关系处理、编译执行、编译结果处理。

1、编译环境准备模块

交叉编译是在主机平台上,借助工具链编译出能在目标平台上运行的程序,一般目标平台的架构和主机平台是不一样的,因此本发明中独立出一个模块用于准备相关的环境参数和工具,例如编译工具链,目标平台的一些相关参数,路径等。下面主要对交叉工具链和编译参数的配置做下说明。

1)交叉工具链:

编译时需要将代码进行编译、链接等操作,这些操作分别需要依赖相应的工具,比如gcc编译工具,ld链接工具等等。而这些工具往往不只一个,且有自己使用的逻辑顺序,这些工具串起来就称为交叉工具链。本发明使用的交叉工具链是针对目标平台已经编译好的,因此可以直接使用,通常,还可以使用平台厂家提供的,或者借助制作工具自己编译。

2)编译参数配置:

通常将这些工具放在同一路径下,在编译的时候需要通过编译参数指定交叉编译器、编译器所选择的库函数、目标平台系统参数等。

例如通常需要配置的有:

build:编译平台,例如本发明中是x86_64-linux-gnu。

target/host:此处,都是设置的是交叉编译器的(前缀)。例如本发明中是mips64-octeon-linux-gnu。

prefix:当前代码编译之后的安装路径。

另还有目标平台编译器以及依赖库的指定,例如cc:${host}-gcc、pp:${host}-cpp、cxx:${host}-c++等。

编译参数配置在shell脚本中指定,编译的时候运行该脚本设置下参数即可。

2、依赖关系处理模块

交叉编译过程中比较难处理的就是各个待编译软件之间的依赖关系,比如a依赖b,则在编译a之前必须先完成b的编译,而b在编译的过程中,还有可能会依赖c库的编译,且不同版本应用程序依赖的版本号也有出入。因此本发明中着重将处理这种依赖关系单独出一个模块。

第1部分编译环境准备模块中准备的交叉编译工具链只是最基础的依赖工具,实际的代码中还会依赖更多应用程序,比如数据库、进程间消息中间件等,比如python中pyzmq-16.0.2版本的工具就依赖cython>=0.20以及sphinx>=1.3的库。因此在编译我们的代码之前,有必要先整理出各个应用程序的依赖顺序,以便在后面的编译执行模块中按照依赖顺序进行编译。

本发明中为了保持应用程序和编译环境的稳定性,不推荐在编译的过程中实时下载最新的安装包,最好是提前准备好安装包。但是如果需要实时下载,则可以先进行下面的操作。

本发明中采用的方式,以python为例,使用标准的requirement.txt文件记录依赖库及其版本号。当然,其他语言的安装包也可以使用该文件进行记录。

a、遍历requirement.txt文件中的各安装包名字,缓存到requirement列表。

b、解压并进入解压后的文件目录,读取依赖包。比如python安装包解压后有个requires文件,存储了其依赖关系。

c、更新requirement列表

如果依赖包已经存在于requirement列表中,不处理,继续下一个安装包的操作;否则,将该依赖包添加到requirement列表当前位置末尾,并下载该依赖包。

2)整理待编译安装包依赖关系

步骤1)中,主要是将待编译程序的依赖包下载完成。如果在实际过程中,已经提前知道所有的依赖包,比如,对于python来说,可以在本地环境中使用pip工具对requirement.txt中的依赖进行安装,安装后可以使用piplist查看所有安装好的依赖包,再将依赖关系更新到requirement.txt文件中,或者只将安装包更新到requirement.txt文件,所有的依赖包存放在固定目录。这样可以略过步骤1),直接进行步骤2)的操作。

整理出所有依赖的包之后,需要对依赖关系进行排序。

a)遍历requirement.txt文件中的安装包,生成requirement_old_list列表。

b)解压安装包,进入解压后的目录,查找依赖关系文件,读取依赖。

c)申请一个新的空列表requirement_new_list,将步骤b)中的依赖和安装包名更新到该空列表中。需要注意的是,如果该新列表中已经有待添加的依赖包了,则不用添加。

该步骤中需要注意,有的依赖包名字可能有包含与被包含的关系。因此在判断新列表中是否已经存在待增加的依赖包时,需要根据依赖包的名字用到正则表达式匹配。例如本发明中python依赖包的名字规则是abcdef-1.1,正则表达式可以定为name+'-'+'[0-9]'。其他命名规则依赖包的正则匹配表达式可以参照该表达式进行。

3、编译执行模块

编译环境都准备好之后,对各个依赖包执行编译的过程就比较简单了,例如c库的编译,一般编译都是:

./configure--xxx---这里编译的参数,可以通过大框架的脚本传入。

make

makeinstall

对于python依赖库的编译,一般是:

pythonsetup.pyinstall--xxx这里编译的参数,可以通过大框架的脚本传入,例如指定编译之后的安装路径,编译时需要用到的工具链参数等。

本发明中执行编译的模块主要使用shell脚本完成。

4、编译结果处理模块

一次编译完成之后,针对实际情况可能需要调试和优化,因此需要对编译环境做清理,方便后续的编译。主要的清理工作为,删除解压后的安装包。并将编译好的安装包可执行程序打包。方便在目标平台上直接安装运行。

本发明各个实施例的实现基础是通过具有处理器功能的设备进行程序化的处理实现的。因此在工程实际中,可以将本发明各个实施例的技术方案及其功能封装成各种模块。基于这种现实情况,在上述各实施例的基础上,本发明的实施例提供了一种通用交叉编译装置,该装置用于执行上述方法实施例中的通用交叉编译方法。参见图2,该装置包括:

依赖关系获取模块201,用于从待编译安装包中获取依赖包,对所述待编译安装包中的依赖包之间的依赖关系进行排序,得到已排序的待编译安装包;

通用交叉编译框架获取模块202,用于将所述排序后的待编译安装包与交叉编译工具链结合,得到通用交叉编译框架;

其中,所述通用交叉编译框架用于对程序代码进行编译,所述依赖包中包含待编译软件。

本发明实施例提供的通用交叉编译装置,采用依赖关系获取模块及通用交叉编译框架获取模块,通过在建立交叉编译框架的过程中引入依赖包依赖关系的自动化确定机制,方便了交叉编译的操作,提高了交叉编译的执行效率。

本发明实施例的方法是依托电子设备实现的,因此对相关的电子设备有必要做一下介绍。基于此目的,本发明的实施例提供了一种电子设备,如图3所示,该电子设备包括:至少一个处理器(processor)301、通信接口(communicationsinterface)304、至少一个存储器(memory)302和通信总线303,其中,至少一个处理器301,通信接口304,至少一个存储器302通过通信总线303完成相互间的通信。至少一个处理器301可以调用至少一个存储器302中的逻辑指令,以执行如下方法:从待编译安装包中获取依赖包,对所述待编译安装包中的依赖包之间的依赖关系进行排序,得到已排序的待编译安装包;将所述排序后的待编译安装包与交叉编译工具链结合,得到通用交叉编译框架;其中,所述通用交叉编译框架用于对程序代码进行编译,所述依赖包中包含待编译软件。

此外,上述的至少一个存储器302中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。例如包括:从待编译安装包中获取依赖包,对所述待编译安装包中的依赖包之间的依赖关系进行排序,得到已排序的待编译安装包;将所述排序后的待编译安装包与交叉编译工具链结合,得到通用交叉编译框架;其中,所述通用交叉编译框架用于对程序代码进行编译,所述依赖包中包含待编译软件。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、磁碟或者光盘等各种可以存储程序代码的介质。

以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。

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

最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

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