李森 劉先群
關(guān)鍵詞:開源軟件;編譯安裝;軟件包構(gòu)建方法;信創(chuàng)終端;國產(chǎn)操作系統(tǒng)
中圖法分類號:TP316 文獻(xiàn)標(biāo)識碼:A
近年來,信息技術(shù)應(yīng)用創(chuàng)新(以下簡稱“信創(chuàng)”)產(chǎn)業(yè)蓬勃發(fā)展。然而,在推進(jìn)信創(chuàng)工作中卻發(fā)現(xiàn)廣大用戶以國產(chǎn)軟件的生態(tài)系統(tǒng)不完善、應(yīng)用程序不豐富、缺乏相應(yīng)的軟件體系和軟件工程方法等為由而放棄使用。誠然,目前信創(chuàng)平臺的生態(tài)產(chǎn)品不夠豐富,尚未形成以操作系統(tǒng)為核心的軟件生態(tài),部分Windows平臺常用或好用的軟件無法找到替代方案,軟件數(shù)量匱乏、功能缺少、操作體驗差等因素也降低了用戶對信創(chuàng)終端的使用信心。
開源軟件,即一種版權(quán)持有人向公眾公開軟件源代碼,并允許公眾下載、編譯的軟件。國產(chǎn)操作系統(tǒng)基于開源Linux內(nèi)核研發(fā),開源軟件是國產(chǎn)軟件發(fā)展的基礎(chǔ)。開源軟件在整個軟件行業(yè)中占有重要地位,其開發(fā)模式成為技術(shù)創(chuàng)新和推動軟件產(chǎn)業(yè)發(fā)展的主要方式。引入主流Linux社區(qū)的開源軟件生態(tài)能很好地增添當(dāng)下國產(chǎn)軟件生態(tài)的多樣性,豐富用戶的信創(chuàng)終端使用體驗,軟件業(yè)的發(fā)展也為國產(chǎn)操作系統(tǒng)的發(fā)展提供了基礎(chǔ)性的技術(shù)支持。
本文通過對優(yōu)質(zhì)的開源軟件進(jìn)行重新編譯、部署安裝,首創(chuàng)了一套基于開源軟件在國產(chǎn)化平臺上編譯安裝的方法。該方法基于Linux與國產(chǎn)操作系統(tǒng)的特性進(jìn)行編制,采用一站化的方式對開源軟件的二進(jìn)制包執(zhí)行軟件包構(gòu)建,降低用戶對國產(chǎn)操作系統(tǒng)的學(xué)習(xí)成本,快速上手感受豐富的開源軟件生態(tài)。該方法能夠快速有效地豐富信創(chuàng)軟件生態(tài)產(chǎn)品,促進(jìn)信創(chuàng)軟件從“可用”到“好用”的轉(zhuǎn)變。
1開源軟件的編譯與運(yùn)行
開源軟件在Linux系統(tǒng)上的運(yùn)行離不開編譯,用戶自行按照軟件作者提供的編譯指引將軟件的源碼包編譯為二進(jìn)制包,從而完成編譯到運(yùn)行。國產(chǎn)操作系統(tǒng)在開源Linux內(nèi)核的基礎(chǔ)上進(jìn)行研發(fā),繼而可從Linux上的編譯方法引申出國產(chǎn)操作系統(tǒng)上的編譯方法。下文將介紹開源軟件中的源碼包與二進(jìn)制包關(guān)系以及3種主流編程語言的編譯方法,為后續(xù)軟件包部署方法打下基礎(chǔ)。
1.1源碼包與二進(jìn)制包
源碼包就是一大堆源代碼程序,是由程序員按照特定的格式和語法編寫出來的。計算機(jī)只能識別機(jī)器語言,即二進(jìn)制語言,所以源碼包的安裝需要一名“翻譯官”將“abcd”翻譯成二進(jìn)制語言,這名“翻譯官”通常被稱為編譯器。常規(guī)的開源軟件發(fā)行版中的源碼包文件名都帶有src,并且是gz等壓縮包格式。
所謂二進(jìn)制包,是指源碼包經(jīng)過成功編譯成二進(jìn)制字節(jié)碼之后產(chǎn)生的文件集。只需下載和解包(安裝)它們之后,就可立即使用。軟件包的內(nèi)容是01二進(jìn)制代碼(通常以16進(jìn)制顯示),即這些文件是計算機(jī)能直接識別的(計算機(jī)只能識別處理01二進(jìn)制)。
各種開發(fā)語言的編譯器或者解釋器都無法做到同源異構(gòu),但是二進(jìn)制包能夠做到一處編譯各處運(yùn)行。二進(jìn)制包通過編譯完成后的可執(zhí)行文件運(yùn)行,開源作者一般提供的二進(jìn)制包后綴為tar.gz,tgz等,有時會帶有版本號、適應(yīng)平臺、適應(yīng)的硬件類型等,例如eclipse-jee-2022-03-R-linux-gtk-aarch64.tar.gz。
而二進(jìn)制包的表現(xiàn)形式有2種,1種是上文提到的gz后綴的壓縮包形式,另1種則是基于前種形式構(gòu)建而成的軟件包形式,例如rpm和dpkg。
1.2不同開發(fā)語言的編譯方式
1.2.1 Java
通常而言,在開發(fā)Java應(yīng)用時,先使用Java編譯器把Java源代碼(.java)文件編譯為字節(jié)代碼(.class文件),可以說Java程序是由若干個.class文件組成的。因此,從源碼包到可運(yùn)行JAR包,其實就已經(jīng)完成了編譯過程。
以下為開源軟件創(chuàng)建可運(yùn)行JAR文件包的幾種常見的方式。
(1)使用IDE(集成開發(fā)環(huán)境)進(jìn)行創(chuàng)建。Java語言知名的IDE均內(nèi)置了創(chuàng)建可運(yùn)行JAR文件包的功能,例如Eclipse,IntelliJ IDEA等。
(2)使用MVN命令進(jìn)行構(gòu)建。當(dāng)下較多的Java開源項目都使用了Maven這個跨平臺的項目管理工具,Maven項目的標(biāo)志性在于根目錄下會存放1個pom.xml文件。
(3)使用開發(fā)者文檔中推薦的創(chuàng)建方式。有些開發(fā)者會有符合自己開發(fā)習(xí)慣的創(chuàng)建方法,建議參照執(zhí)行。
(4)也可使用命令jar cvfm test.jar manifest.mf test構(gòu)建,manifest.mf即為Java程序的一種配置文件。不過,這種方式較為煩瑣,不推薦使用。
1.2.2 Python
使用Python語言開發(fā)的開源軟件,其編譯安裝的核心在于Python環(huán)境的搭建,而Java,Python軟件的依賴包均需要手動安裝。部分Python開源軟件也會提供一個requirements.txt來指導(dǎo)用戶安裝所需的依賴包。由于其開發(fā)規(guī)則與用途的多元性,導(dǎo)致編譯安裝方式繁多。但也存在較多的Python開源項目源碼包中配置好了可直接運(yùn)行的主方法或可執(zhí)行文件,一般在源碼包的根目錄下。當(dāng)然,這種形式并非完全不需要編譯安裝,運(yùn)行時還是會受到依賴缺失或沖突的影響報錯。不過,這種方式可以配合Pylnstaller工具,實現(xiàn)重編譯輕安裝,幾乎無需將編譯安裝留給用戶。
Pylnstaller主要的功能是將.py文件打包為二進(jìn)制字節(jié)碼的可執(zhí)行文件,只要編譯安裝的環(huán)境依賴正常并能成功執(zhí)行Python開源軟件,那么使用該工具生成的可執(zhí)行文件則能做到處處運(yùn)行,無需額外安裝依賴。Pylnstaller推薦使用將所有相關(guān)文件打包成一個可執(zhí)行文件的方式,命令參考如下:
pyinstaller-F目標(biāo)文件.py
1.2.3 C/C++
使用C/C++開發(fā)的開源軟件,不僅需要C/C++依賴環(huán)境的搭建,還需根據(jù)軟件作者的指引進(jìn)行編譯。C/C++開源軟件最基本的編譯安裝方法就是使用Makefile,軟件作者通常會自己編寫一份Makefile來指導(dǎo)make的編譯,在軟件根目錄輸入以下基本的編譯命令即可:
./configure&&make
#注意這些命令大多需要獲取root權(quán)限
在./configure那一步就會告知環(huán)境里是否缺少必要依賴,若依賴滿足,執(zhí)行make后通常會在軟件根目錄下生成對應(yīng)的二進(jìn)制可執(zhí)行文件。這一整個過程就相當(dāng)于從源碼包到二進(jìn)制包的轉(zhuǎn)換。
目前主流的編譯工具基于make,但是需要安裝不同的依賴,執(zhí)行命令和方式也有所改變,本文主要介紹qmake和cmake。
(1)qmake需要完整的安裝qtbase系列的依賴包,使用qmake編譯的軟件通常其作者會有特別說明,或者是查看軟件根目錄中是否存在.pro后綴的文件。大致的編譯流程命令如下(根據(jù)軟件的不同可能會有所變化):
qmake該軟件的.pro&&make
(2) cmake需要安裝cmake軟件包。同qmake,可以通過查看軟件根目錄中是否存在CMakeLists.txt的文件來識別是否使用cmake編譯。大致的編譯流程命令如下:
mkdir build&&cd build
cmake..
之后編譯安裝生成的二進(jìn)制可執(zhí)行文件以及相關(guān)文件都會在build目錄下。
2開源軟件打包方法設(shè)計與實現(xiàn)
基于Debian
Linux的軟件包構(gòu)建(打包)方法本質(zhì)上就是將二進(jìn)制包構(gòu)建成軟件包,方便用戶安裝和使用。上文已闡述了Java,Python和C/C++這3種常見開發(fā)語言編譯生成二進(jìn)制包的方法,然而不同語言編譯生成的二進(jìn)制包,該如何構(gòu)建并方便用戶安裝和使用的軟件包?下文通過對Debian Linux以及國產(chǎn)操作系統(tǒng)的打包方法進(jìn)行分析之后,設(shè)計并實現(xiàn)了一套通用的打包方法。
2.1軟件包部署方式
國產(chǎn)操作系統(tǒng)其軟件部署方式也是源于Linux平臺下的軟件部署方式。該方式主要通過軟件包管理系統(tǒng)來實現(xiàn),具有代表性的2類包管理系統(tǒng)為rpm(RedHat Package Manager)和dpkg (DebianPackager)。dpkg是Debian Linux操作系統(tǒng)使用的軟件包管理系統(tǒng),其文件后綴為.deb,通過apt工具安裝,其中統(tǒng)信桌面操作系統(tǒng)、銀河麒麟桌面操作系統(tǒng)V10均是采用dpkg來進(jìn)行軟件部署。
2.2 Debian Linux的打包方法
(1)構(gòu)建打包目錄。
構(gòu)建1個用于存放打包文件的臨時文件夾,文件夾命名為應(yīng)用名稱,以下是打包目錄的結(jié)構(gòu):
DEBIAN文件夾中存放的是應(yīng)用的描述性文件,如control, rules, changelog, install, copyright。/opt/apps/com.apps.demo文件夾中存放的是應(yīng)用相關(guān)的文件。例如,子目錄entries/applications下存放的是應(yīng)用的桌面啟動器文件(類Windows下的快捷方式),entries/icons下存放的是應(yīng)用的圖標(biāo),entries/files下存放的則是應(yīng)用的二進(jìn)制包。
(2)修改control,rules,install等描述性文件。
control文件記錄了軟件的相關(guān)信息,rules文件指定了軟件的安裝規(guī)則,install文件指定了軟件安裝的目的路徑。
(3)創(chuàng)建.desktop文件(桌面啟動器)。
語法解釋如下:
[Desktop Entry] #文件頭
Name #英文名稱
Comment #軟件英文注解
Exec #軟件運(yùn)行文件絕對路徑
Icon #圖標(biāo)名
Terminal #是否使用終端
Type #啟動器類型
Categories #應(yīng)用類型
(4)放人源文件與圖標(biāo)文件。
將矢量圖格式(后綴名為SVG)的圖標(biāo)文件放入打包目錄下的/us r/share/ic ons/hic olor/sc alable/apps,若是其他格式(如PNG格式),則需要放入打包目錄下的/usr/share/icons/hicolor/128×128/apps,其中128×128為圖標(biāo)文件的分辨率。
軟件的源文件則需要解壓后,將所有文件放人打包目錄下的/opt/apps/軟件名稱/目錄。
(5)構(gòu)建deb包并驗證安裝。
使用命令dpkg-deb--build“構(gòu)建的打包目錄”,來構(gòu)建deb軟件包。構(gòu)建成功后,使用sudo dpkg-i對該軟件包.deb進(jìn)行驗證安裝,看軟件包是否可以在啟動器上顯示圖標(biāo),正常運(yùn)行即可。
2.3國產(chǎn)桌面操作系統(tǒng)打包方法異同
2.3.1統(tǒng)信桌面操作系統(tǒng)V20(UOS)
UOS的打包目錄與Debian Linux的區(qū)別主要在于根目錄中多出了1個info文件,其作用是應(yīng)用的描述文件,使用json格式,info內(nèi)容如下:
2.3.2銀河麒麟桌面操作系統(tǒng)V20(Kylin)
Kylin的打包方法與Debian Linux基本一致,打包目錄結(jié)構(gòu)差異不大,主要的改動在于補(bǔ)齊了桌面啟動器.desktop文件中的軟件中文注解,具體如下:
[Desktop Entry]
#文件頭
Name #英文名稱
Name[zh_CN] #中文名稱
Comment #軟件英文注解
Comment[zh_CN]#軟件中文注解
Exec #軟件運(yùn)行文件絕對路徑
Icon #圖標(biāo)名
Terminal #是否使用終端
Type #啟動器類型
Categories #應(yīng)用類型
2.3.3打包方法異同分析
由上文可知,統(tǒng)信UOS打包方法相較于Debian Linux與麒麟Kylin,最大的差異在于取消了打包目錄下的/usr/share/目錄,軟件的icons圖標(biāo)文件以及桌面啟動器.desktop文件均放人打包目錄下的/opt/apps/軟件包名/。UOS官方的說明為軟件包不允許直接向$ HOME目錄直接寫入文件,后期系統(tǒng)將會使用沙箱技術(shù)重新定向$ HOME,任何依賴該特性的行為都可能失效。
統(tǒng)信UOS強(qiáng)調(diào)自己獨(dú)特的生態(tài)建立,而麒麟Kylin選擇的是擁抱Debian Linux,以尋求更廣泛的軟件適用性。
2.4國產(chǎn)桌面操作系統(tǒng)通用打包方法設(shè)計
(1)主要改動點(diǎn)。
基于國產(chǎn)操作系統(tǒng)通用打包方法的設(shè)計,可以讓開源軟件在任意的國產(chǎn)操作系統(tǒng)甚至Debian Linux上都能完成打包并正常運(yùn)行。
首先,結(jié)合二者的差異點(diǎn),保留打包目錄下的/usr/share目錄,將桌面啟動器文件.desktop分別放入/usr/share/applications/,/opt/apps/軟件名稱/entries/applications這2個目錄下,保證兼容兩家的桌面啟動器規(guī)則。其次,不新增打包目錄下的info文件,實驗中發(fā)現(xiàn)在統(tǒng)信UOS上使用DEBAIN/control文件和桌面啟動器.desktop文件可以滿足軟件信息的描述。最后,軟件的icons文件僅放人/opt/apps/軟件名稱/entries/icons目錄,在桌面啟動器.desktop文件中指向?qū)?yīng)圖標(biāo)即可,實驗中發(fā)現(xiàn)這種方式在麒麟Kylin上得到了很好的表現(xiàn),圖標(biāo)可以正常展示。
(2)打包目錄調(diào)整。
改動后的打包目錄如下:
(3)一站式打包腳本設(shè)計。
以知名的開源性能測試工具軟件——Jmeter為例,完整的打包腳本設(shè)計如下:
#! /bin/sh
#包名--也是相對文件的目錄名
dpkg-deb--build $ APPDIR
#刪除臨時文件夾
rm-rf $ APPDIR
2.5打包過程與結(jié)果展示
本次打包實驗均在國產(chǎn)桌面整機(jī)上完成,仍以JMeter為例,具體配置信息如表1所列。
(1)將腳本與軟件文件夾放在同級目錄下,修改軟件文件夾名稱為包名(或其他名稱與腳本內(nèi)一致即可),然后執(zhí)行腳本。具體如1所示。
(2)打好的deb包在統(tǒng)信桌面操作系統(tǒng)V20、銀河麒麟桌面操作系統(tǒng)Vl0下均能正常安裝,軟件運(yùn)行與使用體驗與二進(jìn)制包的原生版本一致。具體如圖2、圖3、圖4所示。
3結(jié)束語
本文對不同開發(fā)語言的開源軟件在國產(chǎn)操作系統(tǒng)上的編譯進(jìn)行了歸納分析,并對不同國產(chǎn)操作系統(tǒng)上的打包方式進(jìn)行了總結(jié)分析,得出一套通用的打包方法,填補(bǔ)了這方面的空白。經(jīng)過實驗可以看到,同一個安裝包即可在不同的國產(chǎn)操作系統(tǒng)上完成安裝,使用體驗良好。通過提升開源軟件編譯安裝部署的便利性,有助于推廣信創(chuàng)生態(tài)和提升信創(chuàng)生態(tài)的用戶黏性,更能加快國產(chǎn)軟件行業(yè)的適配與發(fā)展。
本文的不足在于沒能研究得出編譯到部署安裝的一套方法,開源軟件的編譯過程仍需要一定的Linux知識以及編程能力。展望未來,希望更多的開源軟件能夠擁抱信創(chuàng)生態(tài),為國產(chǎn)操作系統(tǒng)進(jìn)行適配,降低用戶的使用門檻、豐富信創(chuàng)軟件生態(tài)。
作者簡介:
李森(1981—),碩士,高級工程師,研究方向:計算機(jī)應(yīng)用與網(wǎng)絡(luò)安全。
劉先群(1988—),本科,研究方向:軟件編程和軟件測試。