基于国产操作系统对开源软件编译方法的研究与应用

2023-07-10 14:00李森刘先群
计算机应用文摘 2023年11期

李森 刘先群

关键词:开源软件;编译安装;软件包构建方法;信创终端;国产操作系统

中图法分类号:TP316 文献标识码:A

近年来,信息技术应用创新(以下简称“信创”)产业蓬勃发展。然而,在推进信创工作中却发现广大用户以国产软件的生态系统不完善、应用程序不丰富、缺乏相应的软件体系和软件工程方法等为由而放弃使用。诚然,目前信创平台的生态产品不够丰富,尚未形成以操作系统为核心的软件生态,部分Windows平台常用或好用的软件无法找到替代方案,软件数量匮乏、功能缺少、操作体验差等因素也降低了用户对信创终端的使用信心。

开源软件,即一种版权持有人向公众公开软件源代码,并允许公众下载、编译的软件。国产操作系统基于开源Linux内核研发,开源软件是国产软件发展的基础。开源软件在整个软件行业中占有重要地位,其开发模式成为技术创新和推动软件产业发展的主要方式。引入主流Linux社区的开源软件生态能很好地增添当下国产软件生态的多样性,丰富用户的信创终端使用体验,软件业的发展也为国产操作系统的发展提供了基础性的技术支持。

本文通过对优质的开源软件进行重新编译、部署安装,首创了一套基于开源软件在国产化平台上编译安装的方法。该方法基于Linux与国产操作系统的特性进行编制,采用一站化的方式对开源软件的二进制包执行软件包构建,降低用户对国产操作系统的学习成本,快速上手感受丰富的开源软件生态。该方法能够快速有效地丰富信创软件生态产品,促进信创软件从“可用”到“好用”的转变。

1开源软件的编译与运行

开源软件在Linux系统上的运行离不开编译,用户自行按照软件作者提供的编译指引将软件的源码包编译为二进制包,从而完成编译到运行。国产操作系统在开源Linux内核的基础上进行研发,继而可从Linux上的编译方法引申出国产操作系统上的编译方法。下文将介绍开源软件中的源码包与二进制包关系以及3种主流编程语言的编译方法,为后续软件包部署方法打下基础。

1.1源码包与二进制包

源码包就是一大堆源代码程序,是由程序员按照特定的格式和语法编写出来的。计算机只能识别机器语言,即二进制语言,所以源码包的安装需要一名“翻译官”将“abcd”翻译成二进制语言,这名“翻译官”通常被称为编译器。常规的开源软件发行版中的源码包文件名都带有src,并且是gz等压缩包格式。

所谓二进制包,是指源码包经过成功编译成二进制字节码之后产生的文件集。只需下载和解包(安装)它们之后,就可立即使用。软件包的内容是01二进制代码(通常以16进制显示),即这些文件是计算机能直接识别的(计算机只能识别处理01二进制)。

各种开发语言的编译器或者解释器都无法做到同源异构,但是二进制包能够做到一处编译各处运行。二进制包通过编译完成后的可执行文件运行,开源作者一般提供的二进制包后缀为tar.gz,tgz等,有时会带有版本号、适应平台、适应的硬件类型等,例如eclipse-jee-2022-03-R-linux-gtk-aarch64.tar.gz。

而二进制包的表现形式有2种,1种是上文提到的gz后缀的压缩包形式,另1种则是基于前种形式构建而成的软件包形式,例如rpm和dpkg。

1.2不同开发语言的编译方式

1.2.1 Java

通常而言,在开发Java应用时,先使用Java编译器把Java源代码(.java)文件编译为字节代码(.class文件),可以说Java程序是由若干个.class文件组成的。因此,从源码包到可运行JAR包,其实就已经完成了编译过程。

以下为开源软件创建可运行JAR文件包的几种常见的方式。

(1)使用IDE(集成开发环境)进行创建。Java语言知名的IDE均内置了创建可运行JAR文件包的功能,例如Eclipse,IntelliJ IDEA等。

(2)使用MVN命令进行构建。当下较多的Java开源项目都使用了Maven这个跨平台的项目管理工具,Maven项目的标志性在于根目录下会存放1个pom.xml文件。

(3)使用开发者文档中推荐的创建方式。有些开发者会有符合自己开发习惯的创建方法,建议参照执行。

(4)也可使用命令jar cvfm test.jar manifest.mf test构建,manifest.mf即为Java程序的一种配置文件。不过,这种方式较为烦琐,不推荐使用。

1.2.2 Python

使用Python语言开发的开源软件,其编译安装的核心在于Python环境的搭建,而Java,Python软件的依赖包均需要手动安装。部分Python开源软件也会提供一个requirements.txt来指导用户安装所需的依赖包。由于其开发规则与用途的多元性,导致编译安装方式繁多。但也存在较多的Python开源项目源码包中配置好了可直接运行的主方法或可执行文件,一般在源码包的根目录下。当然,这种形式并非完全不需要编译安装,运行时还是会受到依赖缺失或冲突的影响报错。不过,这种方式可以配合Pylnstaller工具,实现重编译轻安装,几乎无需将编译安装留给用户。

Pylnstaller主要的功能是将.py文件打包为二进制字节码的可执行文件,只要编译安装的环境依赖正常并能成功执行Python开源软件,那么使用该工具生成的可执行文件则能做到处处运行,无需额外安装依赖。Pylnstaller推荐使用将所有相关文件打包成一个可执行文件的方式,命令参考如下:

pyinstaller-F目标文件.py

1.2.3 C/C++

使用C/C++开发的開源软件,不仅需要C/C++依赖环境的搭建,还需根据软件作者的指引进行编译。C/C++开源软件最基本的编译安装方法就是使用Makefile,软件作者通常会自己编写一份Makefile来指导make的编译,在软件根目录输入以下基本的编译命令即可:

./configure&&make

#注意这些命令大多需要获取root权限

在./configure那一步就会告知环境里是否缺少必要依赖,若依赖满足,执行make后通常会在软件根目录下生成对应的二进制可执行文件。这一整个过程就相当于从源码包到二进制包的转换。

目前主流的编译工具基于make,但是需要安装不同的依赖,执行命令和方式也有所改变,本文主要介绍qmake和cmake。

(1)qmake需要完整的安装qtbase系列的依赖包,使用qmake编译的软件通常其作者会有特别说明,或者是查看软件根目录中是否存在.pro后缀的文件。大致的编译流程命令如下(根据软件的不同可能会有所变化):

qmake该软件的.pro&&make

(2) cmake需要安装cmake软件包。同qmake,可以通过查看软件根目录中是否存在CMakeLists.txt的文件来识别是否使用cmake编译。大致的编译流程命令如下:

mkdir build&&cd build

cmake..

之后编译安装生成的二进制可执行文件以及相关文件都会在build目录下。

2开源软件打包方法设计与实现

基于Debian

Linux的软件包构建(打包)方法本质上就是将二进制包构建成软件包,方便用户安装和使用。上文已阐述了Java,Python和C/C++这3种常见开发语言编译生成二进制包的方法,然而不同语言编译生成的二进制包,该如何构建并方便用户安装和使用的软件包?下文通过对Debian Linux以及国产操作系统的打包方法进行分析之后,设计并实现了一套通用的打包方法。

2.1软件包部署方式

国产操作系统其软件部署方式也是源于Linux平台下的软件部署方式。该方式主要通过软件包管理系统来实现,具有代表性的2类包管理系统为rpm(RedHat Package Manager)和dpkg (DebianPackager)。dpkg是Debian Linux操作系统使用的软件包管理系统,其文件后缀为.deb,通过apt工具安装,其中统信桌面操作系统、银河麒麟桌面操作系统V10均是采用dpkg来进行软件部署。

2.2 Debian Linux的打包方法

(1)构建打包目录。

构建1个用于存放打包文件的临时文件夹,文件夹命名为应用名称,以下是打包目录的结构:

DEBIAN文件夹中存放的是应用的描述性文件,如control, rules, changelog, install, copyright。/opt/apps/com.apps.demo文件夹中存放的是应用相关的文件。例如,子目录entries/applications下存放的是应用的桌面启动器文件(类Windows下的快捷方式),entries/icons下存放的是应用的图标,entries/files下存放的则是应用的二进制包。

(2)修改control,rules,install等描述性文件。

control文件记录了软件的相关信息,rules文件指定了软件的安装规则,install文件指定了软件安装的目的路径。

(3)创建.desktop文件(桌面启动器)。

语法解释如下:

[Desktop Entry] #文件头

Name #英文名称

Comment #软件英文注解

Exec #软件运行文件绝对路径

Icon #图标名

Terminal #是否使用终端

Type #启动器类型

Categories #应用类型

(4)放人源文件与图标文件。

将矢量图格式(后缀名为SVG)的图标文件放入打包目录下的/us r/share/ic ons/hic olor/sc alable/apps,若是其他格式(如PNG格式),则需要放入打包目录下的/usr/share/icons/hicolor/128×128/apps,其中128×128为图标文件的分辨率。

软件的源文件则需要解压后,将所有文件放人打包目录下的/opt/apps/软件名称/目录。

(5)构建deb包并验证安装。

使用命令dpkg-deb--build“构建的打包目录”,来构建deb软件包。构建成功后,使用sudo dpkg-i对该软件包.deb进行验证安装,看软件包是否可以在启动器上显示图标,正常运行即可。

2.3国产桌面操作系统打包方法异同

2.3.1统信桌面操作系统V20(UOS)

UOS的打包目录与Debian Linux的区别主要在于根目录中多出了1个info文件,其作用是应用的描述文件,使用json格式,info内容如下:

2.3.2银河麒麟桌面操作系统V20(Kylin)

Kylin的打包方法与Debian Linux基本一致,打包目录结构差异不大,主要的改动在于补齐了桌面启动器.desktop文件中的软件中文注解,具体如下:

[Desktop Entry]

#文件头

Name #英文名稱

Name[zh_CN] #中文名称

Comment #软件英文注解

Comment[zh_CN]#软件中文注解

Exec #软件运行文件绝对路径

Icon #图标名

Terminal #是否使用终端

Type #启动器类型

Categories #应用类型

2.3.3打包方法异同分析

由上文可知,统信UOS打包方法相较于Debian Linux与麒麟Kylin,最大的差异在于取消了打包目录下的/usr/share/目录,软件的icons图标文件以及桌面启动器.desktop文件均放人打包目录下的/opt/apps/软件包名/。UOS官方的说明为软件包不允许直接向$ HOME目录直接写入文件,后期系统将会使用沙箱技术重新定向$ HOME,任何依赖该特性的行为都可能失效。

统信UOS强调自己独特的生态建立,而麒麟Kylin选择的是拥抱Debian Linux,以寻求更广泛的软件适用性。

2.4国产桌面操作系统通用打包方法设计

(1)主要改动点。

基于国产操作系统通用打包方法的设计,可以让开源软件在任意的国产操作系统甚至Debian Linux上都能完成打包并正常运行。

首先,结合二者的差异点,保留打包目录下的/usr/share目录,将桌面启动器文件.desktop分别放入/usr/share/applications/,/opt/apps/软件名称/entries/applications这2个目录下,保证兼容两家的桌面启动器规则。其次,不新增打包目录下的info文件,实验中发现在统信UOS上使用DEBAIN/control文件和桌面启动器.desktop文件可以满足软件信息的描述。最后,软件的icons文件仅放人/opt/apps/软件名称/entries/icons目录,在桌面启动器.desktop文件中指向对应图标即可,实验中发现这种方式在麒麟Kylin上得到了很好的表现,图标可以正常展示。

(2)打包目录调整。

改动后的打包目录如下:

(3)一站式打包脚本设计。

以知名的开源性能测试工具软件——Jmeter为例,完整的打包脚本设计如下:

#! /bin/sh

#包名--也是相对文件的目录名

dpkg-deb--build $ APPDIR

#刪除临时文件夹

rm-rf $ APPDIR

2.5打包过程与结果展示

本次打包实验均在国产桌面整机上完成,仍以JMeter为例,具体配置信息如表1所列。

(1)将脚本与软件文件夹放在同级目录下,修改软件文件夹名称为包名(或其他名称与脚本内一致即可),然后执行脚本。具体如1所示。

(2)打好的deb包在统信桌面操作系统V20、银河麒麟桌面操作系统Vl0下均能正常安装,软件运行与使用体验与二进制包的原生版本一致。具体如图2、图3、图4所示。

3结束语

本文对不同开发语言的开源软件在国产操作系统上的编译进行了归纳分析,并对不同国产操作系统上的打包方式进行了总结分析,得出一套通用的打包方法,填补了这方面的空白。经过实验可以看到,同一个安装包即可在不同的国产操作系统上完成安装,使用体验良好。通过提升开源软件编译安装部署的便利性,有助于推广信创生态和提升信创生态的用户黏性,更能加快国产软件行业的适配与发展。

本文的不足在于没能研究得出编译到部署安装的一套方法,开源软件的编译过程仍需要一定的Linux知识以及编程能力。展望未来,希望更多的开源软件能够拥抱信创生态,为国产操作系统进行适配,降低用户的使用门槛、丰富信创软件生态。

作者简介:

李森(1981—),硕士,高级工程师,研究方向:计算机应用与网络安全。

刘先群(1988—),本科,研究方向:软件编程和软件测试。