• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于國產(chǎn)操作系統(tǒng)對開源軟件編譯方法的研究與應用

      2023-07-10 14:00:32李森劉先群
      計算機應用文摘 2023年11期

      李森 劉先群

      關鍵詞:開源軟件;編譯安裝;軟件包構(gòu)建方法;信創(chuàng)終端;國產(chǎn)操作系統(tǒng)

      中圖法分類號:TP316 文獻標識碼:A

      近年來,信息技術應用創(chuàng)新(以下簡稱“信創(chuàng)”)產(chǎn)業(yè)蓬勃發(fā)展。然而,在推進信創(chuàng)工作中卻發(fā)現(xiàn)廣大用戶以國產(chǎn)軟件的生態(tài)系統(tǒ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ā)展的基礎。開源軟件在整個軟件行業(yè)中占有重要地位,其開發(fā)模式成為技術創(chuàng)新和推動軟件產(chǎn)業(yè)發(fā)展的主要方式。引入主流Linux社區(qū)的開源軟件生態(tài)能很好地增添當下國產(chǎn)軟件生態(tài)的多樣性,豐富用戶的信創(chuàng)終端使用體驗,軟件業(yè)的發(fā)展也為國產(chǎn)操作系統(tǒng)的發(fā)展提供了基礎性的技術支持。

      本文通過對優(yōu)質(zhì)的開源軟件進行重新編譯、部署安裝,首創(chuàng)了一套基于開源軟件在國產(chǎn)化平臺上編譯安裝的方法。該方法基于Linux與國產(chǎn)操作系統(tǒng)的特性進行編制,采用一站化的方式對開源軟件的二進制包執(zhí)行軟件包構(gòu)建,降低用戶對國產(chǎn)操作系統(tǒng)的學習成本,快速上手感受豐富的開源軟件生態(tài)。該方法能夠快速有效地豐富信創(chuàng)軟件生態(tài)產(chǎn)品,促進信創(chuàng)軟件從“可用”到“好用”的轉(zhuǎn)變。

      1開源軟件的編譯與運行

      開源軟件在Linux系統(tǒng)上的運行離不開編譯,用戶自行按照軟件作者提供的編譯指引將軟件的源碼包編譯為二進制包,從而完成編譯到運行。國產(chǎn)操作系統(tǒng)在開源Linux內(nèi)核的基礎上進行研發(fā),繼而可從Linux上的編譯方法引申出國產(chǎn)操作系統(tǒng)上的編譯方法。下文將介紹開源軟件中的源碼包與二進制包關系以及3種主流編程語言的編譯方法,為后續(xù)軟件包部署方法打下基礎。

      1.1源碼包與二進制包

      源碼包就是一大堆源代碼程序,是由程序員按照特定的格式和語法編寫出來的。計算機只能識別機器語言,即二進制語言,所以源碼包的安裝需要一名“翻譯官”將“abcd”翻譯成二進制語言,這名“翻譯官”通常被稱為編譯器。常規(guī)的開源軟件發(fā)行版中的源碼包文件名都帶有src,并且是gz等壓縮包格式。

      所謂二進制包,是指源碼包經(jīng)過成功編譯成二進制字節(jié)碼之后產(chǎn)生的文件集。只需下載和解包(安裝)它們之后,就可立即使用。軟件包的內(nèi)容是01二進制代碼(通常以16進制顯示),即這些文件是計算機能直接識別的(計算機只能識別處理01二進制)。

      各種開發(fā)語言的編譯器或者解釋器都無法做到同源異構(gòu),但是二進制包能夠做到一處編譯各處運行。二進制包通過編譯完成后的可執(zhí)行文件運行,開源作者一般提供的二進制包后綴為tar.gz,tgz等,有時會帶有版本號、適應平臺、適應的硬件類型等,例如eclipse-jee-2022-03-R-linux-gtk-aarch64.tar.gz。

      而二進制包的表現(xiàn)形式有2種,1種是上文提到的gz后綴的壓縮包形式,另1種則是基于前種形式構(gòu)建而成的軟件包形式,例如rpm和dpkg。

      1.2不同開發(fā)語言的編譯方式

      1.2.1 Java

      通常而言,在開發(fā)Java應用時,先使用Java編譯器把Java源代碼(.java)文件編譯為字節(jié)代碼(.class文件),可以說Java程序是由若干個.class文件組成的。因此,從源碼包到可運行JAR包,其實就已經(jīng)完成了編譯過程。

      以下為開源軟件創(chuàng)建可運行JAR文件包的幾種常見的方式。

      (1)使用IDE(集成開發(fā)環(huán)境)進行創(chuàng)建。Java語言知名的IDE均內(nèi)置了創(chuàng)建可運行JAR文件包的功能,例如Eclipse,IntelliJ IDEA等。

      (2)使用MVN命令進行構(gòu)建。當下較多的Java開源項目都使用了Maven這個跨平臺的項目管理工具,Maven項目的標志性在于根目錄下會存放1個pom.xml文件。

      (3)使用開發(fā)者文檔中推薦的創(chuàng)建方式。有些開發(fā)者會有符合自己開發(fā)習慣的創(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來指導用戶安裝所需的依賴包。由于其開發(fā)規(guī)則與用途的多元性,導致編譯安裝方式繁多。但也存在較多的Python開源項目源碼包中配置好了可直接運行的主方法或可執(zhí)行文件,一般在源碼包的根目錄下。當然,這種形式并非完全不需要編譯安裝,運行時還是會受到依賴缺失或沖突的影響報錯。不過,這種方式可以配合Pylnstaller工具,實現(xiàn)重編譯輕安裝,幾乎無需將編譯安裝留給用戶。

      Pylnstaller主要的功能是將.py文件打包為二進制字節(jié)碼的可執(zhí)行文件,只要編譯安裝的環(huán)境依賴正常并能成功執(zhí)行Python開源軟件,那么使用該工具生成的可執(zhí)行文件則能做到處處運行,無需額外安裝依賴。Pylnstaller推薦使用將所有相關文件打包成一個可執(zhí)行文件的方式,命令參考如下:

      pyinstaller-F目標文件.py

      1.2.3 C/C++

      使用C/C++開發(fā)的開源軟件,不僅需要C/C++依賴環(huán)境的搭建,還需根據(jù)軟件作者的指引進行編譯。C/C++開源軟件最基本的編譯安裝方法就是使用Makefile,軟件作者通常會自己編寫一份Makefile來指導make的編譯,在軟件根目錄輸入以下基本的編譯命令即可:

      ./configure&&make

      #注意這些命令大多需要獲取root權(quán)限

      在./configure那一步就會告知環(huán)境里是否缺少必要依賴,若依賴滿足,執(zhí)行make后通常會在軟件根目錄下生成對應的二進制可執(zhí)行文件。這一整個過程就相當于從源碼包到二進制包的轉(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..

      之后編譯安裝生成的二進制可執(zhí)行文件以及相關文件都會在build目錄下。

      2開源軟件打包方法設計與實現(xiàn)

      基于Debian

      Linux的軟件包構(gòu)建(打包)方法本質(zhì)上就是將二進制包構(gòu)建成軟件包,方便用戶安裝和使用。上文已闡述了Java,Python和C/C++這3種常見開發(fā)語言編譯生成二進制包的方法,然而不同語言編譯生成的二進制包,該如何構(gòu)建并方便用戶安裝和使用的軟件包?下文通過對Debian Linux以及國產(chǎn)操作系統(tǒng)的打包方法進行分析之后,設計并實現(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來進行軟件部署。

      2.2 Debian Linux的打包方法

      (1)構(gòu)建打包目錄。

      構(gòu)建1個用于存放打包文件的臨時文件夾,文件夾命名為應用名稱,以下是打包目錄的結(jié)構(gòu):

      DEBIAN文件夾中存放的是應用的描述性文件,如control, rules, changelog, install, copyright。/opt/apps/com.apps.demo文件夾中存放的是應用相關的文件。例如,子目錄entries/applications下存放的是應用的桌面啟動器文件(類Windows下的快捷方式),entries/icons下存放的是應用的圖標,entries/files下存放的則是應用的二進制包。

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

      control文件記錄了軟件的相關信息,rules文件指定了軟件的安裝規(guī)則,install文件指定了軟件安裝的目的路徑。

      (3)創(chuàng)建.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)構(gòu)建deb包并驗證安裝。

      使用命令dpkg-deb--build“構(gòu)建的打包目錄”,來構(gòu)建deb軟件包。構(gòu)建成功后,使用sudo dpkg-i對該軟件包.deb進行驗證安裝,看軟件包是否可以在啟動器上顯示圖標,正常運行即可。

      2.3國產(chǎn)桌面操作系統(tǒng)打包方法異同

      2.3.1統(tǒng)信桌面操作系統(tǒng)V20(UOS)

      UOS的打包目錄與Debian Linux的區(qū)別主要在于根目錄中多出了1個info文件,其作用是應用的描述文件,使用json格式,info內(nèi)容如下:

      2.3.2銀河麒麟桌面操作系統(tǒng)V20(Kylin)

      Kylin的打包方法與Debian Linux基本一致,打包目錄結(jié)構(gòu)差異不大,主要的改動在于補齊了桌面啟動器.desktop文件中的軟件中文注解,具體如下:

      [Desktop Entry]

      #文件頭

      Name #英文名稱

      Name[zh_CN] #中文名稱

      Comment #軟件英文注解

      Comment[zh_CN]#軟件中文注解

      Exec #軟件運行文件絕對路徑

      Icon #圖標名

      Terminal #是否使用終端

      Type #啟動器類型

      Categories #應用類型

      2.3.3打包方法異同分析

      由上文可知,統(tǒng)信UOS打包方法相較于Debian Linux與麒麟Kylin,最大的差異在于取消了打包目錄下的/usr/share/目錄,軟件的icons圖標文件以及桌面啟動器.desktop文件均放人打包目錄下的/opt/apps/軟件包名/。UOS官方的說明為軟件包不允許直接向$ HOME目錄直接寫入文件,后期系統(tǒng)將會使用沙箱技術重新定向$ HOME,任何依賴該特性的行為都可能失效。

      統(tǒng)信UOS強調(diào)自己獨特的生態(tài)建立,而麒麟Kylin選擇的是擁抱Debian Linux,以尋求更廣泛的軟件適用性。

      2.4國產(chǎn)桌面操作系統(tǒng)通用打包方法設計

      (1)主要改動點。

      基于國產(chǎn)操作系統(tǒng)通用打包方法的設計,可以讓開源軟件在任意的國產(chǎn)操作系統(tǒng)甚至Debian Linux上都能完成打包并正常運行。

      首先,結(jié)合二者的差異點,保留打包目錄下的/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ū)獔D標即可,實驗中發(fā)現(xiàn)這種方式在麒麟Kylin上得到了很好的表現(xiàn),圖標可以正常展示。

      (2)打包目錄調(diào)整。

      改動后的打包目錄如下:

      (3)一站式打包腳本設計。

      以知名的開源性能測試工具軟件——Jmeter為例,完整的打包腳本設計如下:

      #! /bin/sh

      #包名--也是相對文件的目錄名

      dpkg-deb--build $ APPDIR

      #刪除臨時文件夾

      rm-rf $ APPDIR

      2.5打包過程與結(jié)果展示

      本次打包實驗均在國產(chǎn)桌面整機上完成,仍以JMeter為例,具體配置信息如表1所列。

      (1)將腳本與軟件文件夾放在同級目錄下,修改軟件文件夾名稱為包名(或其他名稱與腳本內(nèi)一致即可),然后執(zhí)行腳本。具體如1所示。

      (2)打好的deb包在統(tǒng)信桌面操作系統(tǒng)V20、銀河麒麟桌面操作系統(tǒng)Vl0下均能正常安裝,軟件運行與使用體驗與二進制包的原生版本一致。具體如圖2、圖3、圖4所示。

      3結(jié)束語

      本文對不同開發(fā)語言的開源軟件在國產(chǎn)操作系統(tǒng)上的編譯進行了歸納分析,并對不同國產(chǎn)操作系統(tǒng)上的打包方式進行了總結(jié)分析,得出一套通用的打包方法,填補了這方面的空白。經(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)進行適配,降低用戶的使用門檻、豐富信創(chuàng)軟件生態(tài)。

      作者簡介:

      李森(1981—),碩士,高級工程師,研究方向:計算機應用與網(wǎng)絡安全。

      劉先群(1988—),本科,研究方向:軟件編程和軟件測試。

      镇安县| 门源| 疏勒县| 鹤山市| 舞钢市| 曲沃县| 寻乌县| 兰溪市| 雅安市| 兴义市| 平陆县| 竹溪县| 澄城县| 朝阳区| 瑞金市| 钦州市| 西安市| 紫云| 东台市| 湘潭县| 渝北区| 遵义县| 措美县| 武安市| 梅州市| 和田县| 张家口市| 湟中县| 小金县| 宁安市| 通城县| 定襄县| 徐汇区| 湘潭市| 秀山| 色达县| 桦川县| 东阳市| 偃师市| 信宜市| 石门县|