專利名稱:一種完成軟件構(gòu)建的方法及系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種適用于嵌入式,網(wǎng)絡(luò)計算機等處理器能力相對較弱的系統(tǒng)平臺上
完成軟件的構(gòu)建方法,特別是一種適合于從頭開始的整個發(fā)行版的軟件構(gòu)建的方法及實現(xiàn) 該方法的系統(tǒng)。
背景技術(shù):
目前的編譯方法主要包括本地編譯和交叉編譯兩種。 交叉編譯是在一種平臺上編譯生成能運行在另一種平臺上的可執(zhí)行代碼。其中平 臺包含體系結(jié)構(gòu)和操作系統(tǒng)兩種概念。即同一個體系結(jié)構(gòu)上運行不同的操作系統(tǒng),或同一 個操作系統(tǒng)上運行不同的體系結(jié)構(gòu),均可以稱之為跨平臺。相對與交叉編譯,通常的編譯手 段稱之為本地編譯,即在某平臺下編譯生成的程序適用于在相同平臺上執(zhí)行。用于交叉編 譯跨平臺程序的編譯器叫交叉編譯器,用于本地編譯本地程序的編譯器本地編譯器。
本地編譯方法會面臨很多問題。例如對于某些開發(fā)環(huán)境,或者由于目的平臺上的 資源貧乏,不足以運行本地編譯器;或者由于目的平臺尚未被建立,未搭建操作系統(tǒng)等基礎(chǔ) 軟件,無法運行本地編譯器;或者由于目的平臺處理能力較弱,本地編譯大型程序需要的時 間很長。 對于上述目的平臺上不允許、不能夠或尚未安裝本地編譯器的情況,程序員可以 通過交叉編譯生成目的平臺的可執(zhí)行程序,開發(fā)應(yīng)用軟件。交叉編譯方法被廣泛應(yīng)用于異 平臺移植和嵌入式開發(fā)中。例如在項目的起始階段,目的平臺尚未建立的情況下,使用交 叉編譯生成啟動引導(dǎo)代碼以及操作系統(tǒng)核心;或當(dāng)目的平臺能啟動之后,由于目的平臺上 資源的限制,使用交叉編譯編譯大型程序。但是交叉編譯也會面臨一些問題首先,交叉編 譯受到的限制較多;其次,交叉編譯環(huán)境中必須包含生成待編譯文件所需的所有源程序和 被依賴頭文件、庫函數(shù)等文件,需要占用較大空間;由于編譯平臺和執(zhí)行平臺的環(huán)境變量、 庫函數(shù)、路徑等設(shè)置存在差異,可能會導(dǎo)致交叉編譯錯誤的情況。
目前構(gòu)建一整套發(fā)行版級的解決方案主要有 (1)完全本地編譯,這種方法最安全,但是由于本地處理器能力的限制,速度可能 比較慢。 (2)交叉編譯,這種方法主要的實踐是LFS(Li皿x From Scratch,是一種從網(wǎng)上 直接下載源碼,從頭編譯Li皿x的安裝方式)。交叉編譯軟件一直存在著一些問題例如路 徑和版本問題,包括查找錯誤的宿主機系統(tǒng)上的頭文件路徑、庫文件路徑和版本,生成的在
目標(biāo)機執(zhí)行的中間程序的問題......LFS是基于這樣一種想法,首先在宿主機系統(tǒng)上構(gòu)建
宿主機體系結(jié)構(gòu)的系統(tǒng)(該系統(tǒng)的內(nèi)容合要構(gòu)建的目標(biāo)系統(tǒng)一致),然后chroot (Change Root,改變程序執(zhí)行時所參考的根目錄位置)到該環(huán)境中,交叉編譯構(gòu)建目標(biāo)系統(tǒng),這樣由 于chroot后宿主機所呈現(xiàn)的路徑已經(jīng)和要生成的系統(tǒng)路徑一致,可以解決路徑的問題,但 是執(zhí)行小程序的問題還是需要用已經(jīng)生成的宿主機平臺的二進(jìn)制文件替換,而且在一些時 候需要手工替換Makefile腳本的一些內(nèi)容。
4
基于上述現(xiàn)有技術(shù)的缺陷,本發(fā)明提出了一種適合于從頭開始的整個發(fā)行版的軟 件構(gòu)建的新方法。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問題在于,提供一種完成軟件構(gòu)建的方法及實現(xiàn)該方法的
系統(tǒng),以更簡單更高效率的進(jìn)行完整發(fā)行版的軟件構(gòu)建。 為達(dá)到上述目的,本發(fā)明提供了一種完成軟件構(gòu)建的方法,用于包括客戶端和服
務(wù)器端的系統(tǒng)中,該客戶端和該服務(wù)器端分別安置在通過網(wǎng)絡(luò)連接的目標(biāo)機器和服務(wù)器 上,其特征在于,該軟件構(gòu)建的方法是由本地編譯和交叉編譯協(xié)同完成的,該方法進(jìn)一步包
括以下步驟 將編譯階段分為交叉編譯安全階段和交叉編譯不安全階段;
將所述交叉編譯的安全階段部署在所述服務(wù)器上進(jìn)行;
將所述交叉編譯的不安全階段部署在所述目標(biāo)機器上進(jìn)行。 上述完成軟件構(gòu)建的方法,其特征在于,所述交叉編譯的安全階段包括高級語言 文件生成匯編語言的編譯階段和匯編語言生成二機制代碼的匯編階段。 上述完成軟件構(gòu)建的方法,其特征在于,所述交叉編譯的不安全階段包括高級語
言文件中宏展開預(yù)處理階段,二機制代碼鏈接生成可執(zhí)行文件的鏈接階段。 上述完成軟件構(gòu)建的方法,其特征在于,所述客戶端主要負(fù)責(zé)解析命令行參數(shù),識
別、轉(zhuǎn)換所述目標(biāo)機器上發(fā)生的編譯行為。 上述完成軟件構(gòu)建的方法,其特征在于,所述客戶端解析命令行參數(shù),識別、轉(zhuǎn)換 所述目標(biāo)機器上發(fā)生的編譯行為的步驟進(jìn)一步包括 步驟一,從編譯選項中拆分、轉(zhuǎn)化出預(yù)處理階段的參數(shù),并通過調(diào)用本地工具鏈, 以本地編譯方法完成預(yù)處理階段的工作; 步驟二,從編譯選項中拆分、轉(zhuǎn)化出生成階段的參數(shù); 步驟三,將生成階段的參數(shù)封裝成消息,通過網(wǎng)絡(luò)傳輸給服務(wù)器端,并等待或繼續(xù) 處理。 上述完成軟件構(gòu)建的方法,其特征在于,所述服務(wù)器端主要負(fù)責(zé)解析客戶端請求, 按要求進(jìn)行交叉編譯,并返回編譯結(jié)果給所述客戶端。
上述完成軟件構(gòu)建的方法,其特征在于,所述服務(wù)器端具體執(zhí)行如下步驟 步驟一,在服務(wù)器上監(jiān)聽,當(dāng)接收到客戶端發(fā)送過來的編譯請求時,對編譯請求進(jìn)
行匹配和轉(zhuǎn)化,將該編譯請求中的本地編譯選項轉(zhuǎn)化為交叉編譯選項和環(huán)境變量; 步驟二,以交叉編譯方法調(diào)用預(yù)處理階段的生成文件,完成生成階段的工作; 步驟三,最后將生成階段的編譯結(jié)果狀態(tài)通過網(wǎng)絡(luò)傳輸給所述客戶端。 上述完成軟件構(gòu)建的方法,其特征在于,在所述步驟三之后,所述客戶端收到所述
服務(wù)器端傳輸?shù)木幾g結(jié)果狀態(tài)信息后,若結(jié)果狀態(tài)信息為成功,則客戶端從原編譯選項中
拆分、轉(zhuǎn)化出鏈接階段的參數(shù),并通過本地工具鏈,調(diào)用生成階段的生成文件,以本地編譯
方法完成鏈接階段的工作,生成最終的可執(zhí)行文件。 進(jìn)一步的,本發(fā)明還提供了一種實現(xiàn)上述方法的系統(tǒng),其特征在于,包括客戶端和 服務(wù)器端,該客戶端和該服務(wù)器端分別安置在通過網(wǎng)絡(luò)連接的目標(biāo)機器和服務(wù)器上,其中,該目標(biāo)機器上用于進(jìn)行交叉編譯的不安全階段,該服務(wù)器上用于進(jìn)行交叉編譯的安全階 段。 上述系統(tǒng),其特征在于,所述目標(biāo)機器上設(shè)置有待編譯軟件構(gòu)建過程中所需要的 二進(jìn)制工具和本地工具鏈;所述服務(wù)器上設(shè)置有面向目標(biāo)機器平臺的交叉編譯工具鏈,用 于進(jìn)行交叉編譯的安全階段;該目標(biāo)機器和該服務(wù)器共享該目標(biāo)機器上的文件系統(tǒng)。
與現(xiàn)有技術(shù)相比,本發(fā)明通過本地編譯和交叉編譯協(xié)同完成軟件構(gòu)建的方案,克 服了現(xiàn)有技術(shù)獨立運用交叉編譯和本地編譯的存在的缺陷,并且可以大大減少人工干預(yù)過 程,可以大大提高編譯速度,進(jìn)一步提高完整發(fā)行版的軟件構(gòu)建生產(chǎn)效率。
圖1為本發(fā)明方法的系統(tǒng)示意圖;
圖2為本發(fā)明系統(tǒng)中客戶端實施流程圖;
圖3為本發(fā)明系統(tǒng)中服務(wù)器端實施流程圖。
具體實施例方式
下面結(jié)合附圖對本發(fā)明的技術(shù)方案做詳細(xì)描述,以進(jìn)一步了解本發(fā)明的目的、方 案及功效,但并非作為對本發(fā)明權(quán)利要求保護(hù)范圍的限制。 本方法主要思想在于綜合使用本地編譯和交叉編譯的優(yōu)點,彌補單獨使用任一種 編譯方法的不足。 參考圖l,本發(fā)明的完成軟件構(gòu)建的方法,用于包括客戶端和服務(wù)器端的系統(tǒng)中, 客戶端和服務(wù)器端分別安置在通過網(wǎng)絡(luò)連接的目標(biāo)機器和服務(wù)器上,該軟件構(gòu)建的方法是 由本地編譯和交叉編譯協(xié)同完成的,該方法將編譯階段分為交叉編譯安全階段和交叉編譯 不安全階段;將交叉編譯的安全階段部署在服務(wù)器上進(jìn)行;將交叉編譯的不安全階段部署 在目標(biāo)機器上進(jìn)行。 本方法根據(jù)程序編譯順序和交叉編譯的安全性的不同,將編譯工作分為三個階 段高級語言文件中宏展開等預(yù)處理階段,高級語言文件生成二機制代碼的生成階段,二機 制代碼鏈接生成可執(zhí)行文件的鏈接階段。其中高級語言文件生成二機制代碼的生成階段又 可分為兩個階段高級語言文件生成匯編語言的編譯階段和匯編語言生成二進(jìn)制代碼的匯 編階段。其中,高級語言文件生成匯編語言的編譯階段和匯編語言生成二進(jìn)制代碼的匯編 階段為交叉編譯的安全階段;高級語言文件中宏展開等預(yù)處理階段和二機制代碼鏈接生成 可執(zhí)行文件的鏈接階段為交叉編譯的不安全階段。 安置在目標(biāo)機器上的客戶端主要負(fù)責(zé)解析命令行參數(shù),識別、轉(zhuǎn)換目標(biāo)機器上發(fā) 生的編譯行為。當(dāng)發(fā)現(xiàn)目標(biāo)機器上發(fā)出編譯請求時,客戶端被執(zhí)行??蛻舳素?fù)責(zé)對編譯選 項進(jìn)行匹配、篩選和拆分。參考圖2,客戶端進(jìn)一步通過以下步驟進(jìn)行編譯
步驟S201,從編譯選項中拆分、轉(zhuǎn)化出預(yù)處理階段的參數(shù),并通過調(diào)用本地工具 鏈,以本地編譯方法完成預(yù)處理階段的工作; 步驟S202,從編譯選項中拆分、轉(zhuǎn)化出生成階段的參數(shù); 步驟S203,將生成階段的參數(shù)封裝成消息,通過網(wǎng)絡(luò)傳輸給服務(wù)器端,并等待或繼 續(xù)處理,可以選擇同步或異步兩種通訊方式。
安置在服務(wù)器上的服務(wù)器端主要負(fù)責(zé)解析客戶端請求,按要求進(jìn)行交叉編譯,并返回編譯結(jié)果給客戶端。
參考圖3,服務(wù)器端進(jìn)一步通過以下步驟進(jìn)行編譯 步驟S301,服務(wù)器端在服務(wù)器上監(jiān)聽,當(dāng)接收到客戶端發(fā)送過來的編譯請求時,對編譯請求進(jìn)行匹配和轉(zhuǎn)化,將原請求中的本地編譯選項轉(zhuǎn)化為交叉編譯選項和環(huán)境變量;
步驟S302,以交叉編譯方法調(diào)用預(yù)處理階段的生成文件,完成生成階段的工作;
步驟S303,最后將生成階段的編譯結(jié)果狀態(tài)通過網(wǎng)絡(luò)傳輸給客戶端。
在步驟S303之后,當(dāng)客戶端收到服務(wù)器端傳輸回來的編譯結(jié)果狀態(tài)信息后,根據(jù)結(jié)果狀態(tài)信息進(jìn)行下一步操作。若結(jié)果狀態(tài)信息為"成功",客戶端負(fù)責(zé)從原編譯選項中拆分、轉(zhuǎn)化出鏈接階段的參數(shù),并通過本地工具鏈,調(diào)用生成階段的生成文件,以本地編譯方法完成鏈接階段的工作,生成最終的可執(zhí)行文件。 進(jìn)一步的,本發(fā)明提供一種實現(xiàn)上述方法的系統(tǒng),參考圖l,該系統(tǒng)包括客戶端和服務(wù)器端,客戶端和服務(wù)器端分別安置在通過網(wǎng)絡(luò)連接的目標(biāo)機器和服務(wù)器上,其中,在該目標(biāo)機器上進(jìn)行交叉編譯的不安全階段,在該服務(wù)器上進(jìn)行交叉編譯的安全階段。
其中,目標(biāo)機器為一臺軟件構(gòu)建目標(biāo)平臺的機器。目標(biāo)機器啟動后的系統(tǒng)應(yīng)該具備待編譯軟件構(gòu)建過程中所需要的基本二進(jìn)制工具(例如命令行解析工具,編譯輔助工具等)和本地工具鏈;服務(wù)器需要一臺較高性能服務(wù)器,應(yīng)該具備面向目標(biāo)機器平臺的交叉編譯工具鏈;目標(biāo)機器和服務(wù)器可共享目標(biāo)機器上的文件系統(tǒng)。
下面以一具體實施例進(jìn)一步說明本發(fā)明的技術(shù)方案的實施
1.硬件平臺 網(wǎng)絡(luò)計算機(UniCore32體系結(jié)構(gòu)) 一臺,x86服務(wù)器一臺,該網(wǎng)絡(luò)計算機和服務(wù)
器通過網(wǎng)絡(luò)連接。 2.軟件平臺 x86服務(wù)器上安裝Redhat Linux AS 4. 0,并且安裝有支持UniCore32體系結(jié)構(gòu)的GNU GCC工具鏈,該工具鏈和上述網(wǎng)絡(luò)計算機上部署的本地工具鏈版本一致,網(wǎng)絡(luò)計算機啟動所需要的內(nèi)核和文件系統(tǒng),協(xié)同編譯環(huán)境(Ritoo)服務(wù)器端程序,NFS (Network FileSystem,網(wǎng)絡(luò)文件系統(tǒng))服務(wù)器程序等。上述計算機上存在的軟件包括啟動所需的基本文件系統(tǒng)和相應(yīng)文件,定制后的本地工具鏈,本地編譯相關(guān)輔助工具等。
3.實施 這里主要說明最主要的Ritoo服務(wù)器端的程序和本地工具鏈的修改定制程。Ritoo服務(wù)器監(jiān)聽服務(wù)器上的1234端口 ,如果遇到上述網(wǎng)絡(luò)計算機傳送過來的命令,則替換處理命令,首先,編譯命令從本地工具鏈命令轉(zhuǎn)換成交叉編譯命令,如gcc,被轉(zhuǎn)換成皿icore32-li皿x-gcc, g++被轉(zhuǎn)換成皿icore32-li皿x-gcc等。其次,對路徑進(jìn)行相應(yīng)的變換,對-I后面相對路徑維持不變,絕對路徑均在前加上服務(wù)器上的網(wǎng)絡(luò)計算機文件系統(tǒng)的路徑名,例如將/usr/include加上服務(wù)器上的網(wǎng)絡(luò)計算機文件系統(tǒng)路徑后的這個默認(rèn)路徑總是放在編譯參數(shù)的最前面。在得到要允許的參數(shù)后服務(wù)器會調(diào)用fork函數(shù)創(chuàng)建一個新的進(jìn)程,然后執(zhí)行該命令。本地工具鏈的修改如下在gcc, 8++等調(diào)用的開始,檢測編譯參數(shù),如果遇到-c命令,則發(fā)現(xiàn)這條命令處理的是高級語言文件中宏展開等預(yù)處理階段,高級語言文件生成二機制代碼的生成階段過程,于是將其拆分為兩步,先轉(zhuǎn)變-c為-E,
7修改目標(biāo)文件名為.i后綴的預(yù)處理后的文件,在本地forkgcc執(zhí)行該命令后。在變化-E參數(shù)為-c,源文件由后綴.c變?yōu)?i,目標(biāo)文件.i后綴改為.o,把該命令發(fā)送到服務(wù)器的1234端口 。如果命令行中沒有-c,則檢查本地輸入文件是否存在,如果不存在,則等待并輪尋。本實施例客戶端和服務(wù)器是采用異步的通訊方式,即客戶端并不確認(rèn)服務(wù)器上的確認(rèn)消息,直到需要等待服務(wù)器需要生成的文件的時候,才等待。
4.使用 用戶使用本發(fā)明中部署了 Ritoo的環(huán)境的網(wǎng)絡(luò)計算機完成軟件的編譯過程,只需要像普通的本地編譯一樣,也就是說,采用本發(fā)明的實現(xiàn)軟件的構(gòu)件對用戶是透明的。
雖然本發(fā)明已以較佳實施例揭露如上,然其并非用以限定本發(fā)明,在不背離本發(fā)明精神及其實質(zhì)的情況下,熟悉本領(lǐng)域的技術(shù)人員當(dāng)可根據(jù)本發(fā)明作出各種相應(yīng)的改變和變形,但這些相應(yīng)的改變和變形都應(yīng)屬于本發(fā)明所附的權(quán)利要求的保護(hù)范圍。
8
權(quán)利要求
一種完成軟件構(gòu)建的方法,用于包括客戶端和服務(wù)器端的系統(tǒng)中,該客戶端和該服務(wù)器端分別安置在通過網(wǎng)絡(luò)連接的目標(biāo)機器和服務(wù)器上,其特征在于,該軟件構(gòu)建的方法是由本地編譯和交叉編譯協(xié)同完成的,該方法進(jìn)一步包括以下步驟將編譯階段分為交叉編譯安全階段和交叉編譯不安全階段;將所述交叉編譯的安全階段部署在所述服務(wù)器上進(jìn)行;將所述交叉編譯的不安全階段部署在所述目標(biāo)機器上進(jìn)行。
2. 根據(jù)權(quán)利要求1所述的完成軟件構(gòu)建的方法,其特征在于,所述交叉編譯的安全階 段包括高級語言文件生成匯編語言的編譯階段和匯編語言生成二機制代碼的匯編階段。
3. 根據(jù)權(quán)利要求1所述的完成軟件構(gòu)建的方法,其特征在于,所述交叉編譯的不安全 階段包括高級語言文件中宏展開預(yù)處理階段,二機制代碼鏈接生成可執(zhí)行文件的鏈接階 段。
4. 根據(jù)權(quán)利要求1所述的完成軟件構(gòu)建的方法,其特征在于,所述客戶端主要負(fù)責(zé)解 析命令行參數(shù),識別、轉(zhuǎn)換所述目標(biāo)機器上發(fā)生的編譯行為。
5. 根據(jù)權(quán)利要求4所述的完成軟件構(gòu)建的方法,其特征在于,所述客戶端解析命令行 參數(shù),識別、轉(zhuǎn)換所述目標(biāo)機器上發(fā)生的編譯行為的步驟進(jìn)一步包括步驟一,從編譯選項中拆分、轉(zhuǎn)化出預(yù)處理階段的參數(shù),并通過調(diào)用本地工具鏈,以本 地編譯方法完成預(yù)處理階段的工作;步驟二,從編譯選項中拆分、轉(zhuǎn)化出生成階段的參數(shù);步驟三,將生成階段的參數(shù)封裝成消息,通過網(wǎng)絡(luò)傳輸給服務(wù)器端,并等待或繼續(xù)處理。
6. 根據(jù)權(quán)利要求1所述的完成軟件構(gòu)建的方法,其特征在于,所述服務(wù)器端主要負(fù)責(zé) 解析客戶端請求,按要求進(jìn)行交叉編譯,并返回編譯結(jié)果給所述客戶端。
7. 根據(jù)權(quán)利要求6所述的軟件構(gòu)建的方法,其特征在于,所述服務(wù)器端具體執(zhí)行如下 步驟步驟一,在服務(wù)器上監(jiān)聽,當(dāng)接收到客戶端發(fā)送過來的編譯請求時,對編譯請求進(jìn)行匹 配和轉(zhuǎn)化,將該編譯請求中的本地編譯選項轉(zhuǎn)化為交叉編譯選項和環(huán)境變量;步驟二,以交叉編譯方法調(diào)用預(yù)處理階段的生成文件,完成生成階段的工作; 步驟三,最后將生成階段的編譯結(jié)果狀態(tài)通過網(wǎng)絡(luò)傳輸給所述客戶端。
8. 根據(jù)權(quán)利要求7所述的軟件構(gòu)建的方法,其特征在于,在所述步驟三之后,所述客戶 端收到所述服務(wù)器端傳輸?shù)木幾g結(jié)果狀態(tài)信息后,若結(jié)果狀態(tài)信息為成功,則客戶端從原 編譯選項中拆分、轉(zhuǎn)化出鏈接階段的參數(shù),并通過本地工具鏈,調(diào)用生成階段的生成文件, 以本地編譯方法完成鏈接階段的工作,生成最終的可執(zhí)行文件。
9. 一種實現(xiàn)上述權(quán)利要求1 8中任一項所述方法的系統(tǒng),其特征在于,包括客戶端 和服務(wù)器端,該客戶端和該服務(wù)器端分別安置在通過網(wǎng)絡(luò)連接的目標(biāo)機器和服務(wù)器上,其 中,該目標(biāo)機器上用于進(jìn)行交叉編譯的不安全階段,該服務(wù)器上用于進(jìn)行交叉編譯的安全 階段。
10. 根據(jù)權(quán)利要求9所述的系統(tǒng),其特征在于,所述目標(biāo)機器上設(shè)置有待編譯軟件構(gòu)建過程中所需要的二進(jìn)制工具和本地工具鏈;所述服務(wù)器上設(shè)置有面向目標(biāo)機器平臺的交叉 編譯工具鏈,用于進(jìn)行交叉編譯的安全階段;該目標(biāo)機器和該服務(wù)器共享該目標(biāo)機器上的文件系統(tǒng)。
全文摘要
本發(fā)明公開了一種完成軟件構(gòu)建的方法,用于包括客戶端和服務(wù)器端的系統(tǒng)中,該客戶端和該服務(wù)器端分別安置在通過網(wǎng)絡(luò)連接的目標(biāo)機器和服務(wù)器上,該軟件構(gòu)建的方法是由本地編譯和交叉編譯協(xié)同完成的,該方法進(jìn)一步包括以下步驟將編譯階段分為交叉編譯安全階段和交叉編譯不安全階段;將所述交叉編譯的安全階段部署在所述服務(wù)器上進(jìn)行;將所述交叉編譯的不安全階段部署在所述目標(biāo)機器上進(jìn)行。本發(fā)明還提供了一種實現(xiàn)上述方法的系統(tǒng)。
文檔編號G06F9/45GK101727347SQ20091016371
公開日2010年6月9日 申請日期2009年8月14日 優(yōu)先權(quán)日2009年8月14日
發(fā)明者劉先華, 張吉豫, 程旭, 管雪濤, 陳寅 申請人:北京北大眾志微系統(tǒng)科技有限責(zé)任公司;常州北大眾志網(wǎng)絡(luò)計算機有限公司