CN116991381B - 一种应用交叉编译方法、装置、计算设备及存储介质 - Google Patents
一种应用交叉编译方法、装置、计算设备及存储介质 Download PDFInfo
- Publication number
- CN116991381B CN116991381B CN202311255610.1A CN202311255610A CN116991381B CN 116991381 B CN116991381 B CN 116991381B CN 202311255610 A CN202311255610 A CN 202311255610A CN 116991381 B CN116991381 B CN 116991381B
- Authority
- CN
- China
- Prior art keywords
- file
- compiling
- cross
- application
- construction
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 70
- 238000010276 construction Methods 0.000 claims abstract description 94
- 230000001419 dependent effect Effects 0.000 claims abstract description 49
- 238000013515 script Methods 0.000 claims abstract description 24
- 230000015654 memory Effects 0.000 claims description 18
- 238000011161 development Methods 0.000 abstract description 5
- 230000008569 process Effects 0.000 description 13
- 238000010586 diagram Methods 0.000 description 12
- 238000004891 communication Methods 0.000 description 9
- 230000005540 biological transmission Effects 0.000 description 6
- 238000012360 testing method Methods 0.000 description 6
- 230000006870 function Effects 0.000 description 4
- 238000012545 processing Methods 0.000 description 4
- 238000012795 verification Methods 0.000 description 4
- 238000005516 engineering process Methods 0.000 description 3
- 230000003287 optical effect Effects 0.000 description 3
- 230000008901 benefit Effects 0.000 description 2
- 230000006835 compression Effects 0.000 description 2
- 238000007906 compression Methods 0.000 description 2
- 238000013500 data storage Methods 0.000 description 2
- 238000013507 mapping Methods 0.000 description 2
- 230000008859 change Effects 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 238000002955 isolation Methods 0.000 description 1
- 238000007726 management method Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000008520 organization Effects 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 239000000758 substrate Substances 0.000 description 1
- 230000007723 transport mechanism Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/37—Compiler construction; Parser generation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明涉及应用开发领域,特别涉及一种应用交叉编译方法、装置、计算设备及存储介质,方法包括:响应于应用的构建指令,根据构建指令确定目标编译架构;解析第一工程文件;根据目标编译架构获取交叉编译环境;根据依赖信息获取依赖文件;根据构建系统信息、交叉编译环境和源码文件生成构建脚本;设置容器,并根据交叉编译环境和依赖文件在容器中构建根文件系统;在根文件系统中使用交叉编译器执行构建脚本,对源码文件进行编译生成适于在目标编译架构下运行的编译应用文件。通过本发明的应用交叉编译方法,使用较为简单的工程文件生成编译应用文件,降低应用编译难度和复杂度,提高应用编译效率;在编译时使用容器环境进行交叉编译,安全性较高。
Description
技术领域
本发明涉及应用开发领域,特别涉及一种应用交叉编译方法、装置、计算设备及存储介质。
背景技术
随着计算机技术的发展,计算机中逐渐衍生出多种处理器架构。目前所开发的应用只能在包括相应处理器的计算设备中运行,相应处理器即具有适于应用运行的处理器架构的处理器。
现有技术中,如果想要在一种架构的设备中编译适于在另一种架构上运行的应用,需要先模拟另一种架构的硬件环境,再通过该硬件环境编译应用。由于通常所模拟的硬件环境性能较低,编译过程中效率较低,不利于提高应用开发效率;同时整个应用开发过程较为复杂。
为此,需要一种新的应用交叉编译方法和装置。
发明内容
为此,本发明提供一种应用交叉编译方法,以力图解决或者至少缓解上面存在的问题。
根据本发明的第一方面,提供一种应用交叉编译方法,适于在计算设备中运行,方法包括:响应于应用的构建指令,根据构建指令确定目标编译架构;解析第一工程文件,第一工程文件包括:源码信息、依赖信息和构建系统信息;根据源码信息获取源码文件;根据目标编译架构获取交叉编译环境;根据依赖信息获取依赖文件;根据构建系统信息、交叉编译环境和源码文件生成构建脚本;设置容器,并根据交叉编译环境和依赖文件在容器中构建根文件系统;在根文件系统中使用交叉编译器执行构建脚本,对源码文件进行编译生成适于在目标编译架构下运行的编译应用文件。
可选的,在根据本发明的方法中,根据目标编译架构获取交叉编译环境,包括:根据目标编译架构生成第二工程文件;根据第二工程文件对编译器文件进行编译得到交叉编译器;根据交叉编译器生成第三工程文件;根据第三工程文件对交叉编译环境基础文件进行编译得到交叉编译环境。
可选的,在根据本发明的方法中,编译器文件中设置有编译工具链组件的软链接,编译工具链组件根据目标编译架构进行设置,并适于在对编译器文件进行编译时被调用。
可选的,在根据本发明的方法中,根据交叉编译器生成第三工程文件包括:将交叉编译器作为交叉编译环境的依赖,设置第三工程文件的依赖信息。
可选的,在根据本发明的方法中,设置容器,并根据交叉编译环境和依赖文件在容器中构建根文件系统,包括:设置根文件系统的命名空间。
可选的,在根据本发明的方法中,第一工程文件包括依赖信息,根据待编译应用的第一工程文件获取依赖文件包括:根据第一工程文件的依赖信息确定编译源码文件所需要的依赖文件;获取依赖文件。
可选的,在根据本发明的方法中,编译应用文件的文件格式包括玲珑文件格式。
可选的,在根据本发明的方法中,根据依赖信息获取依赖文件包括:将依赖文件存储到本地代码仓库,以便根据本地代码仓库的依赖文件再次生成编译应用文件;将本地代码仓库的依赖文件存储到构建工作目录,以便挂载到容器生成编译应用文件。
可选的,根据本发明的方法还包括:判断是否存在历史构建记录;若存在历史构建记录,则获取历史构建记录的中记载的依赖文件。
可选的,在根据本发明的方法中,第一工程文件存储在工程目录下,工程目录通过执行初始化工程文件命令进行创建。
可选的,在根据本发明的方法中,根据源码信息获取源码文件包括:对源码信息中的源码类型字段进行解析确定源码类型;根据源码类型从相应存储位置获取源码文件。
可选的,在根据本发明的方法中,源码类型包括:压缩包、远程代码仓库和本地代码。
可选的,在根据本发明的方法中,工程文件还包括产物信息。
可选的,在根据本发明的方法中,构建系统信息包括cmake、qmake、自动构建工具和自定义构建,根据构建系统信息、基础环境文件和源码文件生成构建脚本包括:基于构建系统信息所记载的不同构建系统,根据基础环境文件和源码文件生成构建脚本。
可选的,在根据本发明的方法中,还包括:成功生成编译应用文件后,记录此次编译使用的依赖文件,生成历史构建记录。
可选的,在根据本发明的方法中,还包括:将编译应用文件存储到本地代码仓库,以便根据本地代码仓库查找编译应用文件。
可选的,在根据本发明的方法中,还包括:执行测试构建产物命令,包括:根据工程文件的产物信息确定软件包名;根据软件包名在本地代码仓库中查询是否存在成功构建的编译应用文件;若存在编译应用文件,则设置容器,并在容器中根据运行时环境文件运行编译应用文件,对编译应用文件进行测试。
可选的,在根据本发明的方法中,还包括:执行推送构建产物命令,包括:与服务端建立通信连接,并从服务端获取应用标识;根据应用标识和编译应用文件生成传输文件,发送到服务端。
可选的,在根据本发明的方法中,还包括:获取服务端对传输文件中应用标识进行校验的校验信息;根据校验信息确定上传结果。
根据本发明的第二方面,提供了一种应用交叉编译装置,适于驻留在计算设备中,装置包括编译模块和容器模块,编译模块适于执行交叉编译流程命令,包括:响应于应用的构建指令,根据构建指令确定目标编译架构;解析第一工程文件,第一工程文件包括:源码信息、依赖信息和构建系统信息;根据源码信息获取源码文件;根据目标编译架构获取交叉编译环境;根据依赖信息获取依赖文件;根据构建系统信息、交叉编译环境和源码文件生成构建脚本;通过容器模块设置容器,并根据交叉编译环境和依赖文件在容器中构建根文件系统;在根文件系统中使用交叉编译器执行构建脚本,对源码文件进行编译生成适于在目标编译架构下运行的编译应用文件。
根据本发明的第三方面,提供了一种计算设备,包括:一个或多个处理器;存储器;以及一个或多个程序,其中,一个或多个程序存储在存储器中并被配置为由一个或多个处理器执行,一个或多个程序包括用于执行根据本发明的应用交叉编译方法的指令。
根据本发明的第四方面,提供了一种存储一个或多个程序的计算机可读存储介质,一个或多个程序包括指令,该指令当由计算设备执行时,使得计算设备执行根据本发明的应用交叉编译方法。
本发明中的应用交叉编译方法,适于在计算设备中执行,方法包括:响应于应用的构建指令,根据构建指令确定目标编译架构;解析第一工程文件,第一工程文件包括:源码信息、依赖信息和构建系统信息;根据源码信息获取源码文件;根据目标编译架构获取交叉编译环境;根据依赖信息获取依赖文件;根据构建系统信息、交叉编译环境和源码文件生成构建脚本;设置容器,并根据交叉编译环境和依赖文件在容器中构建根文件系统;在根文件系统中使用交叉编译器执行构建脚本,对源码文件进行编译生成适于在目标编译架构下运行的编译应用文件。通过本发明的应用交叉编译方法,能够通过较为简单的工程文件生成编译应用文件,降低应用编译难度和复杂度,提高应用编译效率;并且在编译时使用容器环境进行交叉编译,避免编译过程对宿主机造成影响,安全性较高。
附图说明
为了实现上述以及相关目的,本文结合下面的描述和附图来描述某些说明性方面,这些方面指示了可以实践本文所公开的原理的各种方式,并且所有方面及其等效方面旨在落入所要求保护的主题的范围内。通过结合附图阅读下面的详细描述,本发明公开的上述以及其他目的、特征和优势将变得更加明显。遍及本公开,相同的附图标记通常指代相同的部件或元素。
图1示出了根据本发明一个示范性实施例的应用交叉编译方法100的示意图;
图2示出了根据本发明一个示范性实施例的计算设备200的结构框图;
图3示出了根据本发明一个示范性实施例的应用交叉编译装置300的示意图;
图4示出了根据本发明一个示范性实施例的编译模块310的功能示意图;
图5示出了根据本发明一个示范性实施例的交叉编译的示意图;
图6示出了根据本发明一个示范性实施例的初始化的工程目录的示意图;
图7示出了根据本发明一个示范性实施例的导出构建产物后工程目录的示意图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。相同的附图标记通常指代相同的部件或元素。
图1示出了根据本发明一个示范性实施例的应用交叉编译方法100的示意图。本发明的应用交叉编译方法100适于在计算设备中执行。
图2示出了根据本发明一个示范性实施例的计算设备200的结构框图。在基本配置中,计算设备200包括至少一个处理单元220和系统存储器210。根据一个方面,取决于计算设备的配置和类型,系统存储器210包括但不限于易失性存储(例如,随机存取存储器)、非易失性存储(例如,只读存储器)、闪速存储器、或者这样的存储器的任何组合。根据一个方面,系统存储器210包括操作系统211。
根据一个方面,操作系统211,例如,适合于控制计算设备200的操作。此外,示例结合图形库、其他操作系统、或任何其他应用程序而被实践,并且不限于任何特定的应用或系统。在图2中通过在虚线215内的那些组件示出了该基本配置。根据一个方面,计算设备200具有额外的特征或功能。例如,根据一个方面,计算设备200包括额外的数据存储设备(可移动的和/或不可移动的),例如磁盘、光盘、或者磁带。
如在上文中所陈述的,根据一个方面,在系统存储器210中存储程序模块212。根据一个方面,程序模块212可包括一个或多个应用程序,本发明不限制应用程序的类型,例如应用还包括:电子邮件和联系人应用程序、文字处理应用程序、电子表格应用程序、数据库应用程序、幻灯片展示应用程序、绘画或计算机辅助应用程序、网络浏览器应用程序等。
根据一个方面,可以在包括分立电子元件的电路、包含逻辑门的封装或集成的电子芯片、利用微处理器的电路、或者在包含电子元件或微处理器的单个芯片上实践示例。例如,可以将图2中所示出的组件集成在单个集成电路上的片上系统(SOC)来实践示例。根据一个方面,这样的SOC设备可以包括一个或多个处理单元、图形单元、通信单元、系统虚拟化单元、以及各种应用功能,其全部作为单个集成电路而被集成(或“烧”)到芯片基底上。当经由SOC进行操作时,可以经由在单个集成电路(芯片)上与计算设备200的其他组件集成的专用逻辑来对在本文中所描述的功能进行操作。还可以使用能够执行逻辑操作(例如AND、OR和NOT)的其他技术来实践本发明的实施例,其他技术包括但不限于机械、光学、流体和量子技术。另外,可以在通用计算机内或在任何其他电路或系统中实践本发明的实施例。
根据一个方面,计算设备200还可以具有一个或多个输入设备231,例如键盘、鼠标、笔、语音输入设备、触摸输入设备等。还可以包括输出设备232,例如显示器、扬声器、打印机等。前述设备是示例并且也可以使用其他设备。计算设备200可以包括允许与其他计算设备240进行通信的一个或多个通信连接233。合适的通信连接233的示例包括但不限于:RF发射机、接收机和/或收发机电路;通用串行总线(USB)、并行和/或串行端口。计算设备200可通过通信连接233与其他计算设备240通信连接。
本发明实施方式还提供一种非暂态可读存储介质,存储有指令,指令用于使计算设备执行根据本发明实施方式的方法。本实施例的可读介质包括永久性和非永久性、可移动和非可移动介质,可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。可读存储介质的例子包括但不限于:相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储,磁盒式磁带、磁带磁盘存储器或其他磁性存储设备、或者任何其他非暂态可读存储介质。
根据一个方面,通信介质是由计算机可读指令、数据结构、程序模块、或者经调制的数据信号(例如,载波或其他传输机制)中的其他数据实施的,并且包括任何信息传递介质。根据一个方面,术语“经调制的数据信号”描述了具有一个或多个特征集或者以将信息编码在信号中的方式改变的信号。作为示例而非限制,通信介质包括诸如有线网络或直接有线连接之类的有线介质,以及诸如声学、射频(RF)、红外线的、以及其他无线介质之类的无线介质。
需要说明的是,尽管上述计算设备仅示出了处理单元220、系统存储器210、输入设备231、输出设备232、以及通信连接233,但是在具体实施过程中,该设备还可以包括实现正常运行所必需的其他组件。此外,本领域的技术人员可以理解的是,上述设备中也可以仅包含实现本说明书实施例方案所必需的组件,而不必包含图中所示的全部组件。
回到图1,如图1所示,本发明的应用交叉编译方法首先执行步骤110:响应于应用的构建指令,根据构建指令确定目标编译架构。
根据本发明的一个实施例,应用的构建指令可由计算设备生成或用户输入,本发明对应用的构建指令的生成过程不做限制。计算设备中所包括处理器的架构为本地处理器架构,目标编译架构与本地处理器架构不同。本发明对目标编译架构和本地处理器架构的具体架构类型不作限制。
根据本发明的一个实施例,构建指令中包括目标编译架构的信息,能够根据构建指令确定目标编译架构。构建指令的一个示例如下:
$ ll-builder build --target arm64
其中,arm64即为目标编译架构。
随后,执行步骤120,解析第一工程文件,第一工程文件包括:源码信息、依赖信息和构建系统信息。
根据本发明的一个实施例,工程文件包括第一工程文件、第二工程文件和第三工程文件,用于记载编译所需要的相关信息,作为编译器编译使用的配置文件。
根据本发明的一个实施例,工程文件具体可实现为yaml格式,本发明对工程文件的具体文件格式不做限制。yaml格式编写难度较低,通过使用yaml格式的工程文件,并设置构建规则能够简化工程文件编写,降低构建工具使用难度。
根据本发明的一个实施例,工程文件具体可实现为linglong工程文件,或称为玲珑工程文件。linglong工程文件文件名可写作linglong.yaml,其中.yaml为玲珑工程文件的文件标识。linglong工程文件使用yaml语法描述软件包的元数据。软件包即编译生成应用的软件包,也即编译应用文件。
根据本发明的一个实施例,编译应用文件的文件格式包括玲珑文件格式,编译应用文件具体可实现为玲珑应用文件,本发明对编译应用文件的具体文件格式不做限制。
根据本发明的一个实施例,工程文件具有构建规范,包括:产物信息、基础环境信息、依赖信息、构建系统信息、变量信息和源码信息。
根据本发明的一个实施例,产物信息(Package)用于描述构建产物的基础信息,其包括字段如表1所示:
字段名称 | 描述内容 |
id | 构建产物的唯一名称。 |
version | 构建产物的版本。 |
kind | 构建产物的类型,包括app/runtime/lib三种类型。 |
description | 构建产物的详细介绍。 |
表1
根据本发明的一个实施例,基础环境信息(Base或Runtime)用于描述构建所使用的基础环境,其包括字段如表2所示:
字段名称 | 描述内容 |
id | 构建环境的唯一名称。 |
version | 构建环境的版本。 |
arch | 构建环境的架构(默认为当前宿主机架构,可指定为其他架构)。 |
表2
根据本发明的一个实施例,源码信息(Source)用于描述构建源码的来源,其包括字段如表3所示:
字段名称 | 描述内容 |
kind | 构建源码的类型,有archive/git/local三种类型。 |
url | 构建源码的url下载地址,仅archive/git类型需要填写。 |
version | 构建源码的版本,仅git类型需要填写。 |
commit | 构建源码的commit hash值。仅git类型需要填写。 |
patch | 构建源码使用的patch路径(相对工程文件的路径)。 |
表3
根据本发明的一个实施例,依赖信息(Depends)用于描述编译时所需的依赖项,编译可以有多个依赖项。其包括字段如表4所示:
字段名称 | 描述内容 |
id | 构建依赖的唯一名称。 |
version | 构建依赖的版本。 |
type | 构建依赖的类型。 |
表4
根据本发明的一个实施例,变量信息(Variable)用于描述构建过程中使用的变量,其包括字段表如表5所示:
字段名称 | 描述内容 |
conf_args | 构建过程使用的变量,描述编译参数。 |
extra_args | 构建过程使用的变量,描述编译额外参数。 |
jobs | 构建过程使用的变量,描述任务数。 |
build_dir | 构建过程使用的变量,描述构建所在的文件目录。 |
表5
根据本发明的一个实施例,构建系统信息(Build)用于描述构建使用的构建系统类型,其包括字段表如表6所示:
字段名称 | 描述内容 |
kind | 构建类型,有cmake/qmake/autotools/manual等类型。 |
manual | 构建类型重写,当已有构建类型不能满足需求或需要自定义构建规则时,使用该字段。 |
表6
根据本发明的一个实施例,linglong.yaml文件可具体通过如下代码构建:
package:
id: org.deepin.album
version: 5.9.8
kind: app
description: |
album for deepin os
runtime:
id: org.deepin.Runtime
version: 20.5.0
source:
kind: git
url: "http://gerrit.uniontech.com/deepin-album"
version: 5.9.8
commit: 21d153c3b0c8325351d9947adad7be3c341350d1
patch:
- patches/fix-cmake-include-dir-and-install-prefix.patch
depends:
- id: "udisks2-qt5"
version: 5.0.3
type: runtime
variable:
extra_args: |
-DCMAKE_BUILD_TYPE=Release \
-DAPP_VERSION=5.9.8 \
-DVERSION=5.9.8
build:
kind: cmake。
根据本发明的一个实施例,应用交叉编译方法可由应用交叉编译装置实施。应用交叉编译装置适于驻留在计算设备中。
图3示出了根据本发明一个示范性实施例的应用交叉编译装置300的示意图。如图3所示,应用交叉编译装置300包括编译模块310、容器模块320、服务端模块330、文件系统模块340、代码仓库模块350。
根据本发明的一个实施例,编译模块310可具体实现为linglong-builder,或称为ll-builder。编译模块310为源码构建工具,为实施编译的核心程序,提供组织软件包构建、测试、推送等逻辑;并且在编译时调用容器模块320实现提供容器化的应用构建环境,方便开发者在不同的环境上构建出一致性的内容。
根据本发明的一个实施例,编译模块可根据工程文件的构建规则对编译应用进行构建,并定义编译流程,支持从源码格式构建产生玲珑格式软件包。编译模块支持cmake、qmake、automake等多种常见构建系统,且支持其他类型扩展;支持多种源码来源,便于源码引入;在linglong-box提供的容器环境内进行构建,不会对宿主机环境造成影响;使用ostree作为数据存储工具,能够记录并保存每次构建的内容,支持可重复构建。
根据本发明的一个实施例,容器模块320可具体实现为linglong-box,或称为ll-box。容器模块320为按照OCI标准设计的容器引擎,提供容器环境,包括无特权的chroot与namespace隔离环境,供构建脚本运行。
服务端模块330可具体实现为linglong-server,或称为ll-server,提供后端存储服务(也即Linglong后端存储服务),可使用ostree存储软件包数据,也即编译的产物:编译应用文件;并提供仓库管理功能,在存取构建内容的基础上,实现检索等功能。
文件系统模块340可具体实现为overlayfs文件系统,用于挂载和显示构建内容。
代码仓库模块350可具体实现为ostree,ostree为用于传输和管理文件存储的工具,代码仓库模块350可通过ostree差异存储应用数据,以作为本地cache存储工具,也即本地代码仓库。
根据本发明的一个实施例,编译模块310设置有路径变量,这些路径变量对应于计算设备中的实际地址,用于参与应用编译。路径变量与实际地址的对应关系如表7所示:
路径变量 | 实际地址 | 说明 |
HOME | /home/${USER} | 用户家目录 |
PROJECT_ROOT | Linglong.yaml文件所在目录 | 工程文件根目录 |
PROJECT_TARGET | ${PROJECT_ROOT}/.linglong-target | 构建过程工作目录 |
BUILDER_CACHE | ${HOME}/.cache/linglong-builder | 构建缓存目录 |
BUILDER_REPO_ROOT | ${BUILDER_CACHE}/.cache/linglong-builder/repo | 本地ostree存储路径 |
表7
根据本发明的一个实施例,容器模块320在构建容器时,容器中设置用于应用编译的容器路径,并且通过设置路径映射关系与宿主机路径(即计算设备路径)相关联。路径映射关系如表8所示:
宿主机路径 | 容器路径 | 说明 |
${PROJECT_TARGET}/runtime | /runtime | 应用runtime及依赖挂载目录 |
${PROJECT_TARGET}/source | /source | 应用源码挂载路径 |
${BUILDER_CACHE}/layers/org.deepin.base/files/usr{,etc,var} | {/usr,/etc,/var} | Base环境挂载路径 |
表8
根据本发明的一个实施例,编译模块310可通过执行多种命令实现应用编译时的各种功能。图4示出了根据本发明一个示范性实施例的编译模块310的功能示意图。如图4所示,编译模块310能够执行的命令包括初始化工程文件命令(create)、执行编译流程命令(build)、导出构建产物命令(export)、测试构建产物命令(run)、推送构建产物命令(push)。
回到图1,根据本发明的一个实施例,编译模块310可通过执行编译流程命令实施步骤120-步骤180。
根据本发明的一个实施例,工程文件存储在工程目录下,工程目录通过执行初始化工程文件命令进行创建。编译模块310可通过执行初始化工程文件命令初始化一个包含linglong.yaml文件的工程目录:
$ ll-builder create org.deepin.demo
图6示出了根据本发明一个示范性实施例的初始化的工程目录的示意图。如图6所示,初始化的工程目录org.deepin.demo中包括linglong.yaml文件。
根据本发明的一个实施例,在开始构建时,首先读取当前目录下的工程文件,即linglong.yaml文件。
随后,执行步骤130,根据源码信息获取源码文件。
根据本发明的一个实施例,根据源码信息获取源码文件包括:对源码信息中的源码类型字段进行解析确定源码类型;根据源码类型从相应存储位置获取源码文件。源码类型包括:压缩包(archive)、远程代码仓库(git)和本地代码(local)。本发明可通过在工程文件的源码信息中源码类型字段(kind)中设置源码的来源。本发明可使用多种源码来源,通过与其他平台结合(如github、gerrit)使源码输入可控,安全性较高。
当源码类型为压缩包时,可根据url字段记载的下载地址下载压缩包,并对压缩包进行解压得到源码文件;
当源码类型为远程代码仓库时,可根据url字段记载的下载地址从远程代码仓库下载代码文件;
当源码类型为本地代码时,可从本地获取源码文件。
随后,执行步骤140,根据目标编译架构获取交叉编译环境。
根据本发明的一个实施例,根据目标编译架构获取交叉编译环境,包括:
根据目标编译架构生成第二工程文件,生成的第二工程文件中记载有目标编译架构的相关信息;
根据第二工程文件对编译器文件进行编译得到交叉编译器,其中,编译器文件中设置有编译工具链组件的软链接,以便在对编译器文件进行编译时调用编译工具链组件,编译工具链组件根据目标编译架构进行设置。
根据交叉编译器生成第三工程文件,包括:将交叉编译器作为交叉编译环境的依赖,设置第三工程文件的依赖信息。
根据第三工程文件对交叉编译环境基础文件进行编译得到交叉编译环境。
根据本发明的一个实施例,用于编译交叉编译器的工具可实现为其他编译器,交叉编译器可具体实现为gcc-cross编译器,其他编译器可具体实现为gcc编译器。本发明对交叉编译器和其他编译器的具体实现方式不做限制。交叉编译器为在当前计算机架构交叉编译出其他计算机架构程序的编译器。如在x86架构下可使用交叉编译器编译出arm架构下运行的程序。
编译器文件为用于编译交叉编译器的源码文件,其中包括所需要的编译工具链组件。在同种架构编译时,编译工具链组件使用同种架构编译所使用的组件,可包括gcc文件、gcc-nm文件等。在交叉编译时,需要对编译工具链组件进行设置,在编译器文件中根据目标编译架构连接到相应交叉编译所使用的编译工具链组件;若目标编译架构为aarch64架构,则交叉编译所使用的编译工具链组件包括:gcc-aarch64-linux-gnu文件、gcc-nm-aarch64-linux-gnu文件等。通过在编译器文件中设置软连接,即可实现在编译过程中调用相应的编译工具链组件。
根据本发明的一个实施例,编译得到的交叉编译器可存储在代码仓库模块中,代码仓库模块可具体实现为ostree,ostree为用于传输和管理文件存储的工具。
根据本发明的一个实施例,交叉编译环境基础文件具体可实现为base项目文件,如org.deepin.base项目文件,编译生成的交叉编译环境具体可实现为base环境,如org.deepin.base环境。本发明对交叉编译环境基础文件及交叉编译环境的具体类型不作限制。
根据本发明的一个实施例,编译得到的交叉编译环境可存储在代码仓库模块中,根据目标编译架构获取交叉编译环境时,可从代码仓库模块中进行获取。
随后,执行步骤150,根据依赖信息获取依赖文件;具体的:根据第一工程文件的依赖信息确定编译源码文件所需要的依赖文件;获取依赖文件。
图5示出了根据本发明一个示范性实施例的交叉编译的示意图。如图5所示,在获取交叉编译环境后,还根据第三工程文件判断编译源码文件时是否需要依赖文件,若需要依赖文件,则获取依赖文件;若不需要依赖文件,则根据交叉编译环境和依赖文件在容器中构建根文件系统。
根据本发明的一个实施例,还将依赖文件存储到本地代码仓库,以便根据本地代码仓库的依赖文件再次生成编译应用文件;将本地代码仓库的依赖文件存储到构建工作目录,以便挂载到容器生成编译应用文件。
根据本发明的一个实施例,本地代码仓库可由代码仓库模块提供,根据ostree存储工具进行设置。
根据本发明的一个实施例,还在获取依赖文件时,判断是否存在历史构建记录;若存在历史构建记录,则获取历史构建记录中记载的依赖文件。历史构建记录为在本次编译之前编译应用文件的编译记录,其中记载有成功编译所使用的依赖文件。记载的依赖文件可以特征值的形式进行存储,如哈希值,通过特征值即可确定和获取对应的依赖文件。
现有技术中,Debian系统构建deb软件包工具为dpkg。Debian是一种linux系统发行版,其软件包格式为deb。在dpkg基础上衍生了dbuild,pbuilder,cowbuilder等多种更加自动化的构建工具。这些工具根据构建环境类型又可分为两种:基于宿主机环境构建,如dpkg,dbuild等。该类型构建工具需要提前在宿主机安装相应的构建依赖才可进行编译,否则会编译失败;并且构建现场易被破坏,无法保证每次使用的构建依赖一致,影响可重复构建实施。而本发明不仅能够在编译时自动获取依赖文件进行编译,还能够保存每次编译所使用的依赖文件,从而解决上述技术问题。
随后,执行步骤160,根据构建系统信息、交叉编译环境和源码文件生成构建脚本。
根据本发明的一个实施例,构建系统信息包括cmake、qmake、自动构建工具(autotools)和自定义构建(manual),构建脚本可根据构建系统信息、基础环境文件和源码文件生成,包括:基于构建系统信息所记载的不同构建系统,根据基础环境文件和源码文件生成构建脚本。
根据本发明的一个实施例,自动构建工具autotools包括automake、autoconf等构建工具。自定义构建manual为用户进行自定义构建。本发明支持多种方式的构建系统,并生成每种构建系统相应的构建脚本。
随后,执行步骤170,设置容器,并根据交叉编译环境和依赖文件在容器中构建根文件系统。
根据本发明的一个实施例,设置容器时,可由编译模块调用容器模块进行设置,以便在容器中执行构建脚本。构建脚本在容器里组织命令,如make,Gcc等,编译源码文件得到最终的编译产物,即编译应用文件;通过设置容器能够提供更加安全的构建环境,不对宿主机造成影响。根据本发明的一个实施例,根文件系统具体可实现为rootfs系统。构建根文件系统时,还设置根文件系统的命名空间(namespace)。构建脚本即运行在所设置的命名空间中。在命名空间中运行的程序无法访问根文件系统以外的资源。
最后,执行步骤180,在根文件系统中使用交叉编译器执行构建脚本,对源码文件进行编译生成适于在目标编译架构下运行的编译应用文件。
根据本发明的一个实施例,编译应用文件可实现为二进制文件,即二进制包。本发明对编译应用文件的具体文件类型不做限制。
根据本发明的一个实施例,编译应用文件可实现为linglong格式,或称玲珑,可运行在本发明根据容器模块设置的容器中。
现有技术中,基于chroot环境进行构建应用,chroot:既是Linux的命令,也是系统调用,用于改变当前环境的根目录到一个文件夹,这个文件夹之外的东西,对于当前环境都是不可见的,这个文件夹也被称为chroot环境。
根据本发明的一个实施例,在构建完成后,退出容器。
根据本发明的一个实施例,在成功生成编译应用文件后,记录此次编译使用的依赖文件,生成历史构建记录,以便根据历史构建记录调用依赖文件,重复构建编译应用文件,实现高效稳定的可重复构建(reproducible);可重复构建即构建是可以重现的,如果给定相同的源代码、构建环境和构建指令,能够重新构建一个相同副本,构建过程中无人工干预。
根据本发明的一个实施例,还将编译应用文件存储到本地代码仓库,以便根据本地代码仓库查找编译应用文件。根据本发明的一个实施例,可由文件系统模块将需要提交的文件,即编译应用文件存放在相应目录下,并将相应目录挂载到本地代码仓库,以便通过本地代码仓库提交到服务端。将编译应用文件提交到服务端时,设置devel软件包和普通软件包进行提交。文件系统模块可实现为overlayfs文件系统。
根据本发明的一个实施例,构建完成后,编译模块还生成info.json文件,用于记载编译相关信息。若不是第一次构建,则对之前构建生成的info.json文件进行更新。info.json文件为linglong软件包的描述文件,记录软件包的元信息,如软件包名,软件包版本,所使用的linglong-runtime等。linglong-runtime(也即runtime)为linglong对应用运行环境的描述,在linglong工程文件中代表一种构建产物类型,主要由qt与dtk相关的库组成。
根据本发明的一个实施例,如图5所示,应用交叉编译方法还包括:在实现编译源码文件得到编译应用文件后,返回是否编译成功的编译状态。
根据本发明的一个实施例,若编译成功,则在构建完成后存储在本地缓存(cache)中,执行导出构建产物命令,具体的:通过export命令导出到工程目录下。
图7示出了根据本发明一个示范性实施例的导出构建产物后工程目录的示意图。如图7所示,导出构建产物后工程目录org.deepin.calculator包括linglong.yaml文件和构建产物文件。
根据本发明的一个实施例,应用交叉编译方法还包括:执行测试构建产物命令,构建产物即编译应用文件,包括:根据工程文件的产物信息确定软件包名;根据软件包名在本地代码仓库中查询是否存在成功构建的编译应用文件;若存在编译应用文件,则设置容器,并在容器中根据运行时环境文件运行编译应用文件,对编译应用文件进行测试。
如图5所示,本发明方法还包括:提交构建产物。本发明可通过执行推送构建产物命令,提交构建产物;具体的:
编译模块先获取服务端地址,即服务端url。服务端地址可从linglong.yaml配置文件或命令行参数中获取。根据本发明的一个实施例,服务端可部署在计算设备中,还可部署在与计算设备连接的其他设备中,如与计算设备连接的服务器。本发明对服务端的具体部署方式不做限制。
随后,根据服务端url向服务端请求应用标识,即token。
服务端向编译模块发送token。
编译模块在接收到token后,在编译应用文件头部附加token信息生成传输文件,并向服务端发送传输文件。
服务端校验传输文件,包括touken及接收到的编译应用文件,生成并发送校验信息,具体的:若校验成功则存储数据并返回正常状态码;若校验失败则返回错误状态码。
编译模块解析校验信息,根据校验信息中的正常状态码或错误状态码确定上传结果,以及提示当前推送状态,若校验信息中为正常状态码,则推送成功;若校验信息中为错误状态码,则推送失败。
本发明中的应用交叉编译方法,适于在计算设备中执行,方法包括:响应于应用的构建指令,根据构建指令确定目标编译架构;根据目标编译架构获取交叉编译环境;根据待编译应用的第一工程文件获取依赖文件;设置容器,并根据交叉编译环境和依赖文件在容器中构建根文件系统;在根文件系统中使用交叉编译器执行构建脚本,对源码文件进行编译生成适于在目标编译架构下运行的编译应用文件。通过本发明的应用交叉编译方法,能够通过较为简单的工程文件生成编译应用文件,降低应用编译难度和复杂度,提高应用编译效率;并且在编译时使用容器环境进行交叉编译,避免编译过程对宿主机造成影响,安全性较高。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下被实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其他实施例中所包括的某些特征而不是其他特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。
如在此所使用的那样,除非另行规定,使用序数词“第一”、“第二”、“第三”等等来描述普通对象仅仅表示涉及类似对象的不同实例,并且并不意图暗示这样被描述的对象必须具有时间上、空间上、排序方面或者以任意其他方式的给定顺序。
尽管根据有限数量的实施例描述了本发明,但是受益于上面的描述,本技术领域内的技术人员明白,在由此描述的本发明的范围内,可以设想其他实施例。此外,应当注意,本说明书中使用的语言主要是为了可读性和教导的目的而选择的,而不是为了解释或者限定本发明的主题而选择的。因此,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。对于本发明的范围,对本发明所做的公开是说明性的,而非限制性的。
Claims (8)
1.一种应用交叉编译方法,适于在计算设备中运行,其特征在于,所述方法包括:
响应于应用的构建指令,根据所述构建指令确定目标编译架构;
解析第一工程文件,所述第一工程文件包括:源码信息、依赖信息和构建系统信息;
根据所述源码信息获取源码文件;
根据所述目标编译架构获取交叉编译环境;
根据所述依赖信息获取依赖文件;
根据所述构建系统信息、交叉编译环境和源码文件生成构建脚本;
设置容器,并根据所述交叉编译环境和依赖文件在容器中构建根文件系统;
在所述根文件系统中使用交叉编译器执行构建脚本,对源码文件进行编译生成适于在目标编译架构下运行的编译应用文件;
其中,根据所述目标编译架构获取交叉编译环境包括:
根据所述目标编译架构生成第二工程文件;
根据所述第二工程文件对编译器文件进行编译得到交叉编译器;
根据交叉编译器生成第三工程文件;
根据所述第三工程文件对交叉编译环境基础文件进行编译得到交叉编译环境;
根据交叉编译器生成第三工程文件包括:
将所述交叉编译器作为所述交叉编译环境的依赖,设置所述第三工程文件的依赖信息。
2.如权利要求1所述的方法,其特征在于,所述编译器文件中设置有编译工具链组件的软链接,所述编译工具链组件根据目标编译架构进行设置,并适于在对编译器文件进行编译时被调用。
3.如权利要求1所述的方法,其特征在于,所述设置容器,并根据所述交叉编译环境和依赖文件在容器中构建根文件系统,包括:
设置所述根文件系统的命名空间。
4.如权利要求1所述的方法,其特征在于,所述根据所述依赖信息获取依赖文件包括:
将所述依赖文件存储到本地代码仓库,以便根据本地代码仓库的依赖文件再次生成编译应用文件;
将所述本地代码仓库的依赖文件存储到构建工作目录,以便挂载到所述容器生成编译应用文件。
5.如权利要求4所述的方法,其特征在于,所述方法还包括:
判断是否存在历史构建记录;
若存在历史构建记录,则获取历史构建记录中记载的依赖文件。
6.一种应用交叉编译装置,所述装置适于驻留在计算设备中,其特征在于,所述装置包括编译模块和容器模块,所述编译模块适于执行交叉编译流程命令,包括:
响应于应用的构建指令,根据所述构建指令确定目标编译架构;
解析第一工程文件,所述第一工程文件包括:源码信息、依赖信息和构建系统信息;
根据所述源码信息获取源码文件;
根据所述目标编译架构获取交叉编译环境;
根据所述依赖信息获取依赖文件;
根据所述构建系统信息、交叉编译环境和源码文件生成构建脚本;
通过所述容器模块设置容器,并根据所述交叉编译环境和依赖文件在容器中构建根文件系统;
在所述根文件系统中使用交叉编译器执行构建脚本,对源码文件进行编译生成适于在目标编译架构下运行的编译应用文件;
其中,根据所述目标编译架构获取交叉编译环境包括:
根据所述目标编译架构生成第二工程文件;
根据所述第二工程文件对编译器文件进行编译得到交叉编译器;
根据交叉编译器生成第三工程文件;
根据所述第三工程文件对交叉编译环境基础文件进行编译得到交叉编译环境;
根据交叉编译器生成第三工程文件包括:
将所述交叉编译器作为所述交叉编译环境的依赖,设置所述第三工程文件的依赖信息。
7.一种计算设备,其特征在于,包括:
一个或多个处理器;
存储器;以及
一个或多个程序,其中,一个或多个程序存储在存储器中并被配置为由一个或多个处理器执行,一个或多个程序包括用于执行根据权利要求1-5中任一项所述的方法的指令。
8.一种存储一个或多个程序的计算机可读存储介质,其特征在于,所述一个或多个程序包括指令,所述指令当由计算设备执行时,使得所述计算设备执行根据权利要求1-5中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311255610.1A CN116991381B (zh) | 2023-09-26 | 2023-09-26 | 一种应用交叉编译方法、装置、计算设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311255610.1A CN116991381B (zh) | 2023-09-26 | 2023-09-26 | 一种应用交叉编译方法、装置、计算设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN116991381A CN116991381A (zh) | 2023-11-03 |
CN116991381B true CN116991381B (zh) | 2023-12-29 |
Family
ID=88530618
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311255610.1A Active CN116991381B (zh) | 2023-09-26 | 2023-09-26 | 一种应用交叉编译方法、装置、计算设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116991381B (zh) |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114816417A (zh) * | 2022-04-18 | 2022-07-29 | 北京凝思软件股份有限公司 | 一种交叉编译方法、装置、计算设备及存储介质 |
CN115185531A (zh) * | 2022-06-29 | 2022-10-14 | 统信软件技术有限公司 | 一种应用编译方法、装置、计算设备及存储介质 |
WO2023051034A1 (zh) * | 2021-09-30 | 2023-04-06 | 中兴通讯股份有限公司 | 终端代码增量编译方法、系统、装置、服务器和存储介质 |
-
2023
- 2023-09-26 CN CN202311255610.1A patent/CN116991381B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2023051034A1 (zh) * | 2021-09-30 | 2023-04-06 | 中兴通讯股份有限公司 | 终端代码增量编译方法、系统、装置、服务器和存储介质 |
CN114816417A (zh) * | 2022-04-18 | 2022-07-29 | 北京凝思软件股份有限公司 | 一种交叉编译方法、装置、计算设备及存储介质 |
CN115185531A (zh) * | 2022-06-29 | 2022-10-14 | 统信软件技术有限公司 | 一种应用编译方法、装置、计算设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN116991381A (zh) | 2023-11-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
TWI536263B (zh) | 將作業系統之原始應用程式介面投射至其它程式語言 | |
EP3491527B1 (en) | Debugging tool for a jit compiler | |
CN104793946A (zh) | 基于云计算平台的应用部署方法和系统 | |
CN112035443B (zh) | 基于Linux平台的大数据执行方法、系统、设备及存储介质 | |
US20070234328A1 (en) | File handling for test environments | |
US20190180037A1 (en) | Method and system for identifying functional attributes that change the intended operation of a compiled binary extracted from a target system | |
CN115185531A (zh) | 一种应用编译方法、装置、计算设备及存储介质 | |
CN115629971A (zh) | 一种应用的开发系统和开发方法 | |
US20080141219A1 (en) | Multiple inheritance facility for java script language | |
CN114780950A (zh) | 应用软件跨版本兼容运行的方法、系统、装置及存储介质 | |
CN116049207A (zh) | 应用程序sql脚本处理方法、装置、处理器及电子设备 | |
US10387142B2 (en) | Using annotation processors defined by modules with annotation processors defined by non-module code | |
CN113312046A (zh) | 子应用页面处理方法、装置和计算机设备 | |
CN116991381B (zh) | 一种应用交叉编译方法、装置、计算设备及存储介质 | |
CN116991427B (zh) | 一种应用编译方法、装置、计算设备及存储介质 | |
CN110806891A (zh) | 嵌入式设备软件版本的生成方法及装置 | |
Wannipurage et al. | A Framework to capture and reproduce the Absolute State of Jupyter Notebooks | |
CN118092924A (zh) | 一种应用编译方法、装置、计算设备及存储介质 | |
CN114860202A (zh) | 项目运行方法、装置、服务器及存储介质 | |
CN114116030A (zh) | 操作系统的运行方法、装置、电子设备、存储介质 | |
CN111367512A (zh) | 一种应用程序开发中创建Android库模块依赖关系的方法及装置 | |
CN114895921B (zh) | 文件处理方法、装置、电子设备及存储介质 | |
CN117075960B (zh) | 程序重构方法、应用跨平台迁移方法、装置与计算设备 | |
CN117707543A (zh) | 一种应用安装包制作和安装方法、计算设备及存储介质 | |
CN117724756A (zh) | 一种应用包转换方法、装置、计算设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |