專利名稱:用于嵌入式系統(tǒng)的軟件包構(gòu)建方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及嵌入式系統(tǒng)的開發(fā),具體地,涉及嵌入式軟件包的構(gòu)建過程。
背景技術(shù):
嵌入式系統(tǒng)是嵌入于各種設(shè)備及應(yīng)用產(chǎn)品內(nèi)部,用以控制這些設(shè)備和應(yīng)用產(chǎn)品的計算機系統(tǒng)。通常,嵌入式系統(tǒng)的開發(fā)會涉及到交叉編譯問題。所謂交叉編譯就是在一個平臺上生成在另一個平臺上執(zhí)行的代碼。采用交叉編譯技術(shù)的原因可能是目標(biāo)平臺(產(chǎn)生的程序?qū)⒃谄渖线\行的系統(tǒng))上不允許或不能夠安裝所需的編譯器,而在為目標(biāo)平臺開發(fā)軟件時又需要這個編譯器的某些特征;或目標(biāo)平臺上的資源貧乏,無法運行所需的編譯器;或目標(biāo)平臺還未建立,甚至還沒有操作系統(tǒng),更不能運行所需的編譯器。
就嵌入式系統(tǒng)來說,通常不具有對應(yīng)用軟件進行編譯和優(yōu)化所需的資源,也沒有足夠的空間進行全面開發(fā)或糾錯,所以在嵌入式軟件的開發(fā)過程中經(jīng)常需要采用交叉編譯技術(shù)。
但是,對于嵌入式系統(tǒng)的軟件開發(fā)人員來說,交叉編譯并不是一個簡單的過程。一方面,基于交叉編譯的構(gòu)建過程通常比在目標(biāo)平臺上的本機構(gòu)建過程在編譯速度上快得多。另一方面,它又比本機構(gòu)建過程困難和復(fù)雜得多。以移植一個第三方軟件為例,在本機構(gòu)建的情況下,很少需要開發(fā)者去編輯構(gòu)建過程,所需要的只是鍵入一個構(gòu)建命令。但是,在交叉編譯的情況下,開發(fā)人員經(jīng)常需要在看到構(gòu)建過程成功運行到結(jié)尾之前花費幾個小時到幾天的時間調(diào)試構(gòu)建過程本身。在交叉編譯中遇到麻煩的根本原因在于,運行構(gòu)建過程的編譯時平臺不是所構(gòu)建的程序?qū)⒁\行的目標(biāo)平臺,即運行時平臺。更具體地,編譯時平臺與運行時平臺之間的不同將引起下面兩種情況中的問題1)構(gòu)建過程中的某些步驟會試圖運行前面步驟中所構(gòu)建的某些中間程序,這是很常見的現(xiàn)象。此中間程序可能是用于探查目標(biāo)平臺的某些方面的特征,且構(gòu)建過程可根據(jù)中間程序的執(zhí)行結(jié)果相應(yīng)地調(diào)整某些程序的編譯選項。這種中間程序的一個例子是用于測試目標(biāo)平臺的位字段順序的程序。這種中間程序的另一個可能的用途是用于生成要在后面的步驟中編譯的源代碼段。
很明顯地,在交叉編譯設(shè)置中,這些步驟將引起錯誤,因為所生成的目標(biāo)二進制代碼通常在構(gòu)建平臺,即編譯時平臺,上是不可執(zhí)行的。
2)在編譯一個源文件之前,構(gòu)建過程一般都會試圖探查目標(biāo)系統(tǒng)上是否存在待構(gòu)建軟件包所依賴的庫及該庫存在于目標(biāo)系統(tǒng)的哪里。如果構(gòu)建過程不能發(fā)現(xiàn)某些所依賴的庫,則在進一步的編譯中可能不會將相應(yīng)的調(diào)用代碼包括進去。相反,如果構(gòu)建過程能找到必需的庫,則應(yīng)該將這些庫的對象文件和頭文件的正確路徑通知給編譯器。
但是,在交叉編譯情況下,這種庫探查不是一項簡單的任務(wù)。這種任務(wù)經(jīng)常是以安裝在構(gòu)建平臺上但具有相同名字的“偽”庫而錯誤結(jié)束。這無疑將在后面的步驟中引起編譯錯誤。
可從http//www.research.att.com/~gsf/download/crosscomp.html處獲得的、標(biāo)題為“交叉編譯”的文章中披露了一種解決上述交叉編譯的第一種情況中問題的方法。該方法的主要思想是在構(gòu)建過程需要運行一個中間程序時,不是在編譯平臺上運行該中間程序,而是在目標(biāo)系統(tǒng)上遠程執(zhí)行該中間程序。但是,這種方案并沒有解決上述第二種情況中的問題。
發(fā)明內(nèi)容
本發(fā)明為了解決在嵌入式系統(tǒng)軟件開發(fā)中使用交叉編譯時容易產(chǎn)生編譯錯誤的問題,同時又為了能夠充分利用軟件本機構(gòu)建過程的簡易性,提出了一種用于嵌入式系統(tǒng)的既具有交叉編譯的高效特點,又具有本機構(gòu)建的用戶友好特點的軟件包構(gòu)建方案。
與交叉編譯類似,本發(fā)明的軟件包構(gòu)建方案除了目標(biāo)系統(tǒng)之外,還涉及到另一臺計算機系統(tǒng),其具有比目標(biāo)系統(tǒng)高得多的性能,但是具有與目標(biāo)系統(tǒng)不相同的體系結(jié)構(gòu)。在本發(fā)明中,將該高性能計算機稱作編譯服務(wù)器。與交叉編譯不同的是,本發(fā)明的軟件包構(gòu)建過程象本機編譯中那樣在目標(biāo)系統(tǒng)上啟動。此外,優(yōu)選地,目標(biāo)系統(tǒng)的根文件系統(tǒng)駐留在編譯服務(wù)器中,目標(biāo)系統(tǒng)通過網(wǎng)絡(luò)從編譯服務(wù)器上加載其根文件系統(tǒng)。
本發(fā)明的主要思想是實現(xiàn)一種機制,每當(dāng)目標(biāo)系統(tǒng)上的構(gòu)建過程試圖調(diào)用一個本地編譯器以將源文件包中的源文件編譯成可執(zhí)行文件時,便截獲此調(diào)用并將其重定向到遠程編譯服務(wù)器上運行的相應(yīng)交叉編譯工具。因為編譯服務(wù)器的高性能,利用其上運行的交叉編譯工具對源文件進行編譯將比使用目標(biāo)系統(tǒng)上相應(yīng)的本機編譯工具要花費更少的時間。此外,由于目標(biāo)系統(tǒng)的文件系統(tǒng)實際存儲在編譯服務(wù)器上,所以在編譯服務(wù)器上的交叉編譯工具讀輸入文件及寫輸出文件時,不會涉及到網(wǎng)絡(luò)IO操作。因此,在本發(fā)明中,源文件的編譯速度與單純的交叉編譯情況是一樣快的。
于是,根據(jù)本發(fā)明的一個方面,提供了一種軟件包構(gòu)建方法,包括在要構(gòu)建軟件包的目標(biāo)系統(tǒng)中創(chuàng)建遠程編譯服務(wù)器中交叉編譯工具的存根;在目標(biāo)系統(tǒng)上啟動軟件包構(gòu)建過程;其中,在所述構(gòu)建過程中,所述交叉編譯工具的存根截獲來自所述軟件包構(gòu)建過程的編譯命令,并將該編譯命令轉(zhuǎn)發(fā)給所述遠程編譯服務(wù)器,由所述遠程編譯服務(wù)器中的相應(yīng)的交叉編譯工具對源文件進行編譯。
優(yōu)選地,根據(jù)本發(fā)明的軟件包構(gòu)建方法還包括將所述目標(biāo)系統(tǒng)中文件系統(tǒng)的映象儲存在所述編譯服務(wù)器中。所述調(diào)用遠程編譯服務(wù)器中相應(yīng)的交叉編譯工具的步驟進一步包括所述交叉編譯工具存根將目標(biāo)系統(tǒng)上構(gòu)建過程中的編譯命令和命令行參數(shù)轉(zhuǎn)發(fā)給所述編譯服務(wù)器上的構(gòu)建守護進程;所述構(gòu)建守護進程利用接收到的命令行參數(shù)調(diào)用所述編譯服務(wù)器中相應(yīng)的交叉編譯工具;所述被調(diào)用的相應(yīng)的交叉編譯工具根據(jù)上述命令行參數(shù)從編譯服務(wù)器中目標(biāo)系統(tǒng)的文件系統(tǒng)映象中讀出所述源文件包中待編譯的源文件并對該源文件進行編譯,以生成目標(biāo)系統(tǒng)上可執(zhí)行的二進制代碼。
優(yōu)選地,根據(jù)本發(fā)明的軟件包構(gòu)建方法還包括所述被調(diào)用的相應(yīng)的交叉編譯工具將對所述源文件的編譯結(jié)果寫入編譯服務(wù)器中目標(biāo)系統(tǒng)的文件系統(tǒng)映象中;所述目標(biāo)系統(tǒng)上的構(gòu)建過程從所述編譯服務(wù)器中目標(biāo)系統(tǒng)的文件系統(tǒng)映象中讀出軟件編譯結(jié)果,并繼續(xù)進行后續(xù)的軟件包構(gòu)建工作。
優(yōu)選地,根據(jù)本發(fā)明的軟件包構(gòu)建方法還包括將所述命令行參數(shù)及待編譯的源文件的“#include”行中出現(xiàn)的絕對路徑轉(zhuǎn)換為所述編譯服務(wù)器的文件名稱空間中有效的相應(yīng)路徑;或?qū)⒕幾g服務(wù)器上所調(diào)用的交叉編譯工具的根目錄設(shè)置為與目標(biāo)系統(tǒng)的文件系統(tǒng)根目錄相同的路徑,并將與該調(diào)用的交叉編譯工具相關(guān)的可執(zhí)行文件和庫復(fù)制到該根目錄下;將編譯服務(wù)器上所調(diào)用的交叉編譯工具的當(dāng)前工作目錄設(shè)置為與目標(biāo)系統(tǒng)上的構(gòu)建過程調(diào)用相應(yīng)交叉編譯工具存根時所在的當(dāng)前目錄匹配的路徑。
根據(jù)本發(fā)明的另一個方面,還提供了一種軟件包構(gòu)建系統(tǒng),包括編譯服務(wù)器,該編譯服務(wù)器包括構(gòu)建守護進程,用于接收來自目標(biāo)系統(tǒng)的編譯工具調(diào)用請求,并根據(jù)該請求調(diào)用相應(yīng)的交叉編譯工具;以及至少一個交叉編譯工具,用于將指定的源文件編譯成目標(biāo)系統(tǒng)上可執(zhí)行的二進制代碼;以及布置于目標(biāo)系統(tǒng)中的至少一個交叉編譯工具存根,每一交叉編譯工具存根對應(yīng)于編譯服務(wù)器上的一個相應(yīng)的交叉編譯工具,用于截獲來自軟件包構(gòu)建過程的編譯命令,并將其轉(zhuǎn)發(fā)給編譯服務(wù)器,由編譯服務(wù)器上對應(yīng)的交叉編譯工具對目標(biāo)系統(tǒng)上相應(yīng)的源文件進行編譯。
優(yōu)選地,所述編譯服務(wù)器還包括目標(biāo)系統(tǒng)的文件系統(tǒng)映象,所述交叉編譯工具從該目標(biāo)系統(tǒng)的文件系統(tǒng)映象中讀取指定的源文件包中待編譯的源文件以及相關(guān)文件,并將編譯結(jié)果寫入該文件系統(tǒng)映象中,其可由目標(biāo)系統(tǒng)立即訪問。
優(yōu)選地,所述編譯服務(wù)器還包括網(wǎng)絡(luò)文件系統(tǒng),所述目標(biāo)系統(tǒng)通過該網(wǎng)絡(luò)文件系統(tǒng)來訪問駐留在編譯服務(wù)器上的該目標(biāo)系統(tǒng)的文件系統(tǒng)映象中的文件。
優(yōu)選地,所述目標(biāo)系統(tǒng)包括交叉編譯工具存根創(chuàng)建模塊,用于與遠程編譯服務(wù)器交互,以在目標(biāo)系統(tǒng)上創(chuàng)建遠程編譯服務(wù)器上每一交叉編譯工具的存根。
本發(fā)明所提供的軟件包構(gòu)建方法和系統(tǒng)相對于本機編譯來說,能夠使嵌入式軟件的開發(fā)者在軟件構(gòu)建過程中獲得與利用交叉編譯時近似的較短編譯周期,同時相對于交叉編譯來說,該方法和系統(tǒng)又能夠保留本機構(gòu)建的簡易性。也就是說,由于本發(fā)明中主要的構(gòu)建過程是在實際的目標(biāo)系統(tǒng)上執(zhí)行的,所以其不會使嵌入式軟件的開發(fā)者遇到在使用交叉編譯時將會出現(xiàn)的那些問題,更具體地1)如果構(gòu)建過程中的某個步驟需要執(zhí)行一個前面步驟中編譯出的中間程序,則本發(fā)明可以使該步驟照常在目標(biāo)系統(tǒng)上執(zhí)行該程序;2)本發(fā)明的構(gòu)建過程中對庫或其他相關(guān)文件的探查不會象在交叉編譯中那樣以“偽”庫或文件結(jié)束。
通過結(jié)合交叉編譯的速度優(yōu)勢和本機構(gòu)建的簡易性優(yōu)勢,本發(fā)明可在大多數(shù)情況下為嵌入式軟件的開發(fā)者帶來最佳編譯效率。
通過以下結(jié)合附圖對根據(jù)本發(fā)明的優(yōu)選實施例的詳細說明,會使本發(fā)明的這些或其他方面將變得更加清楚。
圖1是根據(jù)本發(fā)明一個優(yōu)選實施例的用于嵌入式系統(tǒng)的軟件包構(gòu)建系統(tǒng)的示意圖;圖2是根據(jù)本發(fā)明一個優(yōu)選實施例的圖1系統(tǒng)中編譯服務(wù)器的方框圖;圖3是根據(jù)本發(fā)明一個優(yōu)選實施例的圖1系統(tǒng)中布置于目標(biāo)系統(tǒng)中的部分的方框圖;圖4是根據(jù)本發(fā)明一個優(yōu)選實施例的用于嵌入式系統(tǒng)的軟件包構(gòu)建方法的流程圖。
具體實施例方式
下面就結(jié)合附圖對本發(fā)明的優(yōu)選實施例進行詳細的說明。
圖1是根據(jù)本發(fā)明一個優(yōu)選實施例的用于嵌入式系統(tǒng)的軟件包構(gòu)建系統(tǒng)的示意圖。
如圖1所示,該軟件包構(gòu)建系統(tǒng)由編譯服務(wù)器10和布置于嵌入式目標(biāo)系統(tǒng)11中的系統(tǒng)部分組成。編譯服務(wù)器10用于將目標(biāo)系統(tǒng)上軟件源文件包中的源文件編譯成目標(biāo)系統(tǒng)上可執(zhí)行的二進制代碼。布置于嵌入式目標(biāo)系統(tǒng)11中的部分則用于在目標(biāo)系統(tǒng)11上執(zhí)行嵌入式軟件包的整個構(gòu)建過程,并在需要對源文件包中的源文件進行編譯時請求編譯服務(wù)器10對該源文件進行編譯。編譯服務(wù)器10和目標(biāo)系統(tǒng)11之間可通過有線或無線網(wǎng)絡(luò)(未示出)連接。本領(lǐng)域的一般技術(shù)人員容易理解,目標(biāo)系統(tǒng)11也可以為一虛擬的目標(biāo)系統(tǒng)。
圖2示出了圖1的實施例中編譯服務(wù)器10的詳細方框圖。如圖所示,編譯服務(wù)器10中包括構(gòu)建守護進程101、一個或多個交叉編譯工具102、網(wǎng)絡(luò)文件系統(tǒng)(NFS)103、目標(biāo)文件系統(tǒng)映象104及文件系統(tǒng)適配器105。
構(gòu)建守護進程101用于接收來自目標(biāo)系統(tǒng)11上的交叉編譯工具存根的編譯工具調(diào)用請求,并利用該請求中所附的命令行參數(shù)調(diào)用編譯服務(wù)器上相應(yīng)的交叉編譯工具102。此外,構(gòu)建守護進程101還將編譯服務(wù)器10上所調(diào)用的交叉編譯工具102的標(biāo)準(zhǔn)輸入和輸出橋接到相應(yīng)的交叉編譯工具存根上。
一個或多個交叉編譯工具102用于將指定的源文件編譯成目標(biāo)系統(tǒng)上可執(zhí)行的二進制代碼。所述交叉編譯工具102包括編譯工具鏈中用于將某一高級語言源文件逐步翻譯成可執(zhí)行文件的各種程序,例如交叉預(yù)處理器、交叉編譯器、交叉鏈接器、交叉匯編器及任何常規(guī)交叉編譯工具鏈中將提供的其他必需工具。在一個實施例中,交叉編譯工具102是GNU編譯工具鏈中所提供的那些編譯工具,包括預(yù)處理器、C/C++編譯器、匯編器、鏈接器,和二進制工具等。交叉編譯工具102的輸出文件采用的格式是目標(biāo)系統(tǒng)11中的文件格式。例如,當(dāng)編譯服務(wù)器10是運行Windows的PC,而目標(biāo)系統(tǒng)11運行Linux on PowerPC時,交叉編譯工具102應(yīng)該生成在PowerPC上有效的代碼。
為了使交叉編譯工具102能夠?qū)δ繕?biāo)系統(tǒng)11上的源文件進行編譯,應(yīng)使交叉編譯工具102能夠訪問到目標(biāo)系統(tǒng)11中的文件。更具體地,交叉編譯工具102應(yīng)該能夠根據(jù)構(gòu)建守護進程101的指示讀取目標(biāo)系統(tǒng)11上待編譯的輸入文件,并將編譯后的輸出文件寫回到目標(biāo)系統(tǒng)11的文件系統(tǒng)中,而目標(biāo)系統(tǒng)11應(yīng)該能夠立即讀取到該編譯后的輸出文件。但是,由于文件輸入輸出的速度也是影響整體編譯速度的一個很大因素,因此,在本實施例中將目標(biāo)系統(tǒng)11的文件系統(tǒng)存儲在編譯服務(wù)器10上,以使交叉編譯工具102能夠以很小的開銷讀和寫它們的工作文件。而目標(biāo)系統(tǒng)11將通過網(wǎng)絡(luò)從編譯服務(wù)器10上安裝其文件系統(tǒng)。
因此,本實施例中,在編譯服務(wù)器10中還包括一網(wǎng)絡(luò)文件系統(tǒng)(NFS)103。網(wǎng)絡(luò)文件系統(tǒng)(NFS)是由Sun Microsystems公司最早實現(xiàn)的,用于在不同的操作系統(tǒng)、不同的網(wǎng)絡(luò)結(jié)構(gòu)及不同的傳輸協(xié)議之間共享文件。目標(biāo)系統(tǒng)通過該網(wǎng)絡(luò)文件系統(tǒng)(NFS)103可以訪問駐留在編譯服務(wù)器10上的目標(biāo)系統(tǒng)11的文件系統(tǒng)映象104中的文件。編譯服務(wù)器10中的每一交叉編譯工具102從該目標(biāo)文件系統(tǒng)映象104中讀取指定源文件包中的待編譯源文件以及相關(guān)文件(相關(guān)庫、相關(guān)頭文件等),并將編譯結(jié)果寫入該文件系統(tǒng)映象中,以使目標(biāo)系統(tǒng)11能夠立即訪問到編譯后的輸出文件。
此外,編譯服務(wù)器10中的文件系統(tǒng)適配器105用于在編譯服務(wù)器10本地不支持目標(biāo)系統(tǒng)11的文件系統(tǒng)類型時,提供編譯服務(wù)器10與目標(biāo)文件系統(tǒng)映象104的文件類型之間的轉(zhuǎn)換,以使交叉編譯工具102能夠訪問處于編譯服務(wù)器10上的目標(biāo)系統(tǒng)11的文件系統(tǒng)映象104中的文件。
駐留在編譯服務(wù)器上的目標(biāo)文件系統(tǒng)映象通過編譯服務(wù)器上的網(wǎng)絡(luò)文件系統(tǒng)(NFS)服務(wù)輸出,而且目標(biāo)系統(tǒng)可以通過該網(wǎng)絡(luò)文件系統(tǒng)的客戶端程序?qū)⑵浼虞d為根文件系統(tǒng),這樣,編譯服務(wù)器10上的交叉編譯工具102與目標(biāo)系統(tǒng)11上的構(gòu)建過程能夠有效地工作于同一文件系統(tǒng)環(huán)境下。但是,編譯服務(wù)器與目標(biāo)系統(tǒng)通常是具有不同的文件系統(tǒng)名稱空間的。例如,在編譯服務(wù)器上可能需要以諸如“/opt/target_root”之類的路徑名稱來訪問目標(biāo)系統(tǒng)的根目錄。在目標(biāo)系統(tǒng)上的構(gòu)建過程指定一個文件路徑時,該路徑只在目標(biāo)系統(tǒng)上的文件系統(tǒng)名稱空間中有效。因此,在編譯服務(wù)器上的交叉編譯工具試圖根據(jù)目標(biāo)系統(tǒng)上的構(gòu)建過程所指定的路徑訪問編譯服務(wù)器的目標(biāo)文件系統(tǒng)映象中的一個文件或目錄之前,必須根據(jù)編譯服務(wù)器上的文件系統(tǒng)名稱空間對該路徑進行轉(zhuǎn)換。因此,在本實施例中,構(gòu)建守護進程101還包括路徑轉(zhuǎn)換模塊1011,并且每一交叉編譯工具102也包括相應(yīng)的路徑轉(zhuǎn)換模塊1021,用來完成目標(biāo)系統(tǒng)上所指定路徑到編譯服務(wù)器中有效路徑的轉(zhuǎn)換。在軟件構(gòu)建過程中,可能會使用三種類型的文件路徑,包括絕對路徑、標(biāo)準(zhǔn)系統(tǒng)目錄路徑,和當(dāng)前工作目錄相對路徑。下面分別描述對這幾種路徑的轉(zhuǎn)換。
1)絕對路徑絕對路徑在unix上是以“/”,而在windows上是以“\”開頭的路徑。
在本發(fā)明的一個實施例中,守護進程101中的路徑轉(zhuǎn)換模塊1011掃描從目標(biāo)系統(tǒng)11的構(gòu)建過程接收到的命令行參數(shù),而各交叉編譯工具102中的路徑轉(zhuǎn)換模塊1021則掃描目標(biāo)系統(tǒng)的待編譯源文件中的“#include”行,以找出所有這樣的絕對路徑,并將它們轉(zhuǎn)換成編譯服務(wù)器的文件名稱空間中有效的相應(yīng)路徑。例如,如果目標(biāo)系統(tǒng)11的構(gòu)建過程以參數(shù)“-L/usr/local/xine/lib-I/usr/local/xine/include/home/xwk/src/xine/xine.c...”調(diào)用一個編譯器,則路徑轉(zhuǎn)換模塊1011應(yīng)將該路徑轉(zhuǎn)換為編譯服務(wù)器上的路徑“-L/opt/target root/usr/local/xine/lib-I/opt/target_root/usr/local/xine/include/opt/target_root/home/xwk/src/xine/xine.c...”。
在本發(fā)明的另一實施例中,對絕對路徑的轉(zhuǎn)換方法與前面實施例不同。本實施例中,不轉(zhuǎn)換文件的絕對路徑,而是由守護進程101將所調(diào)用的交叉編譯工具102的根目錄設(shè)為與目標(biāo)文件系統(tǒng)的根目錄相同的位置。這在unix上通常由“chroot”命令來實現(xiàn)。這樣,在此情況下,前面例子中所調(diào)用的交叉編譯工具102的根目錄將被設(shè)為“/opt/target_root”。這樣,編譯服務(wù)器上所調(diào)用的交叉編譯工具102將實際看到與目標(biāo)系統(tǒng)11上相同的文件名稱空間。但是,在此情況下,在改變所調(diào)用的交叉編譯工具102的根目錄時,在所調(diào)用的交叉編譯工具102執(zhí)行過程中可能調(diào)用的所有可執(zhí)行文件和庫都應(yīng)同時被復(fù)制到新的根目錄下的相應(yīng)目錄處,且PATH和LD_PATH環(huán)境變量也應(yīng)相應(yīng)被更新,否則,所調(diào)用的交叉編譯工具102在執(zhí)行時將不能找到這些文件。
2)標(biāo)準(zhǔn)系統(tǒng)目錄路徑“標(biāo)準(zhǔn)系統(tǒng)目錄路徑”是傳統(tǒng)的C語言和C編譯器概念。當(dāng)軟件開發(fā)者在源文件中指定一個“#include<header>”指令或指定一個“-include header”或“-library lib”編譯器選項時,編譯工具將會在預(yù)定的標(biāo)準(zhǔn)系統(tǒng)目錄中搜索指定的頭文件或庫。例如,在交叉編譯工具102為GNU編譯工具的情況下,這些目錄是“/include”、“/usr/include”、“/usr/lib”等。
為了應(yīng)對該轉(zhuǎn)換,交叉編譯工具102的標(biāo)準(zhǔn)系統(tǒng)目錄路徑應(yīng)被正確地設(shè)置為目標(biāo)系統(tǒng)的標(biāo)準(zhǔn)系統(tǒng)目錄。仍以前面前面的文件系統(tǒng)命名空間配置為例,交叉編譯工具102的標(biāo)準(zhǔn)系統(tǒng)目錄路徑應(yīng)被設(shè)置為“/opt/target_root/include”、“/opt/target_root/usr/include”及“/opt/target_root/usr/lib”等。交叉編譯工具102的標(biāo)準(zhǔn)系統(tǒng)目錄路徑是在生成這些交叉編譯工具時靜態(tài)指定的。
3)當(dāng)前工作目錄相對路徑除了上面描述的兩種路徑之外,所有其他路徑都屬于“當(dāng)前工作目錄相對路徑”的范圍內(nèi)。對于這些路徑,守護進程101中的路徑轉(zhuǎn)換模塊1011將所調(diào)用的交叉編譯工具102的當(dāng)前工作目錄設(shè)為與目標(biāo)系統(tǒng)上的構(gòu)建過程調(diào)用相應(yīng)交叉編譯工具存根時所在的當(dāng)前目錄匹配的路徑。
圖3中示出了圖1的實施例中布置于目標(biāo)系統(tǒng)11中的部分的詳細方框圖。如圖所示,本實施例中布置于目標(biāo)系統(tǒng)11中的部分包括軟件包構(gòu)建過程腳本111、交叉編譯工具存根創(chuàng)建模塊112、一個或多個交叉編譯工具的存根113、以及相關(guān)庫114、相關(guān)頭文件115、構(gòu)建中的軟件包116、中間可執(zhí)行程序117等。
軟件包構(gòu)建過程腳本111用于調(diào)用相關(guān)庫114、相關(guān)頭文件115、中間可執(zhí)行程序117等對目標(biāo)系統(tǒng)11中軟件的源文件包進行編譯、鏈接及優(yōu)化等整個構(gòu)建過程,以最終構(gòu)建成目標(biāo)系統(tǒng)上可執(zhí)行的軟件包。在對源文件包中的源文件進行編譯時,軟件包構(gòu)建過程腳本111調(diào)用目標(biāo)系統(tǒng)11上相應(yīng)的交叉編譯工具存根113,進而調(diào)用編譯服務(wù)器10上相應(yīng)的交叉編譯工具102對該源文件進行編譯。
在目標(biāo)系統(tǒng)上創(chuàng)建編譯服務(wù)器上的交叉編譯工具的存根是指將具有與所替代的本機編譯工具相同的文件名的交叉編譯工具存根拷貝到目標(biāo)系統(tǒng)上,從而替換對應(yīng)的本機編譯工具。該交叉編譯工具存根的創(chuàng)建過程既可以由系統(tǒng)管理員手工創(chuàng)建的,即在目標(biāo)系統(tǒng)建立時,由系統(tǒng)管理員將具有與所替代的本機編譯工具相同的文件名的交叉編譯工具存根拷貝到目標(biāo)系統(tǒng)上,從而替換對應(yīng)的本機編譯工具,也可以由一交叉編譯工具存根創(chuàng)建模塊112在目標(biāo)系統(tǒng)建立時,通過與遠程編譯服務(wù)器10的交互,在目標(biāo)系統(tǒng)11上自動創(chuàng)建遠程編譯服務(wù)器10上每一交叉編譯工具102的存根。
對于編譯服務(wù)器10上的每一交叉編譯工具102來說,在目標(biāo)系統(tǒng)上都存在與其對應(yīng)的交叉編譯工具存根113。這些存根并不進行實際的編譯工作,而是將來自軟件包構(gòu)建過程腳本111的編譯命令和命令行參數(shù)轉(zhuǎn)發(fā)給編譯服務(wù)器10上的構(gòu)建守護進程101,由其調(diào)用編譯服務(wù)器10上相應(yīng)的交叉編譯工具102來進行工作。此外,這些交叉編譯工具存根113還將它們的標(biāo)準(zhǔn)輸入和輸出重定向到遠程的構(gòu)建守護進程101上,因為目標(biāo)系統(tǒng)11上的構(gòu)建過程腳本111有時將使用這些標(biāo)準(zhǔn)輸入向編譯服務(wù)器10上的交叉編譯工具102饋送除了命令行參數(shù)之外的信息,或使用標(biāo)準(zhǔn)輸出從這些交叉編譯工具102獲得執(zhí)行狀態(tài)報告等。
以上結(jié)合附圖對根據(jù)本發(fā)明的優(yōu)選實施例的用于嵌入式系統(tǒng)的軟件包構(gòu)建系統(tǒng)進行了詳細的說明。
在同一發(fā)明構(gòu)思下,根據(jù)本發(fā)明的另一方面,提供了一種用于嵌入式系統(tǒng)的軟件包構(gòu)建方法。下面就結(jié)合附圖對該方法進行詳細說明。
圖4是根據(jù)本發(fā)明優(yōu)選實施例的用于嵌入式系統(tǒng)的軟件包構(gòu)建方法的流程圖。
如圖所示,該方法包括以下步驟。
在步驟401,在目標(biāo)系統(tǒng)上創(chuàng)建編譯服務(wù)器上的交叉編譯工具的存根。具體來說,該交叉編譯工具存根的創(chuàng)建過程既可以由系統(tǒng)管理員手工創(chuàng)建,即在目標(biāo)系統(tǒng)建立時,由系統(tǒng)管理員將具有與所替代的本機編譯工具相同的文件名的交叉編譯工具存根拷貝到目標(biāo)系統(tǒng)上,從而替換對應(yīng)的本機編譯工具,也可以由一交叉編譯工具存根創(chuàng)建模塊在目標(biāo)系統(tǒng)建立時,通過與遠程編譯服務(wù)器的交互,在目標(biāo)系統(tǒng)上自動創(chuàng)建遠程編譯服務(wù)器上每一交叉編譯工具的存根在步驟402,配置編譯服務(wù)器上的網(wǎng)絡(luò)文件系統(tǒng)服務(wù),使得可以在編譯服務(wù)器和目標(biāo)系統(tǒng)之間共享駐留在編譯服務(wù)器上的目標(biāo)文件系統(tǒng)的映象。
然后,在步驟403,嵌入式系統(tǒng)的軟件開發(fā)者在目標(biāo)系統(tǒng)上啟動對源文件包的可執(zhí)行軟件包構(gòu)建過程。
在步驟404,在構(gòu)建過程中,目標(biāo)系統(tǒng)上的相應(yīng)的交叉編譯工具存根截獲構(gòu)建過程所發(fā)出的編譯工具調(diào)用請求。
在步驟405,目標(biāo)系統(tǒng)上的交叉編譯工具存根將該編譯工具調(diào)用請求通過網(wǎng)絡(luò)轉(zhuǎn)發(fā)給編譯服務(wù)器上的構(gòu)建守護進程。該構(gòu)建守護進程在對調(diào)用請求中的文件路徑及將要調(diào)用的交叉編譯工具的相關(guān)工作目錄進行匹配轉(zhuǎn)換之后,利用編譯工具調(diào)用請求中的命令行參數(shù)本地調(diào)用與目標(biāo)系統(tǒng)上發(fā)來調(diào)用請求的交叉編譯工具存根相對應(yīng)的交叉編譯工具。
在步驟406,編譯服務(wù)器上調(diào)用的交叉編譯工具以目標(biāo)文件系統(tǒng)映象為基礎(chǔ),并結(jié)合相關(guān)頭文件和相關(guān)庫對目標(biāo)文件系統(tǒng)映象中的指定源文件進行編譯,以生成目標(biāo)系統(tǒng)上可執(zhí)行的二進制代碼,并將編譯后的輸出文件寫入映象中,然后通過構(gòu)建守護進程將編譯狀態(tài)報告給目標(biāo)系統(tǒng)上的構(gòu)建過程。
然后,在步驟407,目標(biāo)系統(tǒng)上的構(gòu)建過程在源文件編譯結(jié)束后,繼續(xù)進行其他的構(gòu)建工作。
需要說明的是,在目標(biāo)系統(tǒng)上的軟件包構(gòu)建過程中,可能會需要執(zhí)行某些已經(jīng)編譯過的中間可執(zhí)行程序,此時,構(gòu)建過程可根據(jù)指定路徑直接執(zhí)行這些中間程序,而不會象傳統(tǒng)交叉編譯方案中那樣產(chǎn)生在軟件構(gòu)建平臺上不能執(zhí)行已經(jīng)生成的中間程序的問題。
此外,需要說明的是,圖4所示實施例中的步驟順序只是示例性的,在具體實現(xiàn)中可以按不同步驟順序來實現(xiàn)本發(fā)明。例如,當(dāng)需要在同一目標(biāo)系統(tǒng)上多次執(zhí)行軟件包構(gòu)建過程時,只需在系統(tǒng)建立時執(zhí)行一次步驟401和402,而不需要重復(fù)執(zhí)行步驟401和402。即,只在目標(biāo)系統(tǒng)建立時在目標(biāo)系統(tǒng)上創(chuàng)建交叉編譯工具的存根和在編譯服務(wù)器上配置網(wǎng)絡(luò)文件系統(tǒng)服務(wù)。
利用上面結(jié)合附圖描述的用于嵌入式系統(tǒng)的軟件包構(gòu)建方法和系統(tǒng),軟件開發(fā)人員只需將軟件的源文件包復(fù)制到目標(biāo)文件系統(tǒng)中,并象本機編譯方案中那樣在目標(biāo)系統(tǒng)上鍵入構(gòu)建命令,便可實現(xiàn)軟件包的整個構(gòu)建過程。
以上,結(jié)合實施例對本發(fā)明的用于嵌入式系統(tǒng)的軟件包構(gòu)建方法和系統(tǒng)進行了描述。對于本領(lǐng)域一般技術(shù)人員來說很明顯,本發(fā)明適合一切需要采用交叉編譯的系統(tǒng)。還應(yīng)當(dāng)指出的是,這些實施例只是示例性的,本領(lǐng)域的技術(shù)人員可以在此基礎(chǔ)上做出各種改變。
權(quán)利要求
1.一種軟件包構(gòu)建方法,包括在要構(gòu)建軟件包的目標(biāo)系統(tǒng)中創(chuàng)建遠程編譯服務(wù)器中交叉編譯工具的存根;在目標(biāo)系統(tǒng)上啟動軟件包構(gòu)建過程;其中,在所述構(gòu)建過程中,所述交叉編譯工具的存根截獲來自所述軟件包構(gòu)建過程的編譯命令,并將該編譯命令轉(zhuǎn)發(fā)給所述遠程編譯服務(wù)器,由所述遠程編譯服務(wù)器中的相應(yīng)的交叉編譯工具對源文件進行編譯。
2.根據(jù)權(quán)利要求1的方法,還包括將所述目標(biāo)系統(tǒng)中文件系統(tǒng)的映象儲存在所述編譯服務(wù)器中。
3.根據(jù)權(quán)利要求2的方法,其中所述調(diào)用遠程編譯服務(wù)器中相應(yīng)的交叉編譯工具的步驟進一步包括所述交叉編譯工具存根將目標(biāo)系統(tǒng)上構(gòu)建過程中的編譯命令和命令行參數(shù)轉(zhuǎn)發(fā)給所述編譯服務(wù)器上的構(gòu)建守護進程;所述構(gòu)建守護進程利用接收到的命令行參數(shù)調(diào)用所述編譯服務(wù)器中相應(yīng)的交叉編譯工具;以及所述被調(diào)用的相應(yīng)的交叉編譯工具根據(jù)所述命令行參數(shù)從編譯服務(wù)器中目標(biāo)系統(tǒng)的文件系統(tǒng)映象中讀出所述源文件包中待編譯的源文件,并且對該源文件進行編譯,以生成目標(biāo)系統(tǒng)上可執(zhí)行的二進制代碼。
4.根據(jù)權(quán)利要求3的方法,還包括所述被調(diào)用的相應(yīng)的交叉編譯工具將對所述源文件的編譯結(jié)果寫入編譯服務(wù)器中目標(biāo)系統(tǒng)的文件系統(tǒng)映象中;以及所述目標(biāo)系統(tǒng)上的構(gòu)建過程從所述編譯服務(wù)器中目標(biāo)系統(tǒng)的文件系統(tǒng)映象中讀出軟件編譯結(jié)果,并繼續(xù)進行后續(xù)的軟件包構(gòu)建過程。
5.根據(jù)權(quán)利要求3或4的方法,還包括將所述命令行參數(shù)及待編譯的源文件的“#include”行中出現(xiàn)的絕對路徑轉(zhuǎn)換為所述編譯服務(wù)器的文件名稱空間中有效的相應(yīng)路徑。
6.根據(jù)權(quán)利要求3或4的方法,還包括將編譯服務(wù)器上所調(diào)用的交叉編譯工具的根目錄設(shè)置為與目標(biāo)系統(tǒng)的文件系統(tǒng)根目錄相同的路徑,并將與該調(diào)用的交叉編譯工具相關(guān)的可執(zhí)行文件和庫復(fù)制到該根目錄下。
7.根據(jù)權(quán)利要求3或4的方法,還包括將編譯服務(wù)器上所調(diào)用的交叉編譯工具的當(dāng)前工作目錄設(shè)置為與目標(biāo)系統(tǒng)上的構(gòu)建過程調(diào)用相應(yīng)的交叉編譯工具存根時所在的當(dāng)前目錄匹配的路徑。
8.根據(jù)權(quán)利要求3的方法,還包括將所述目標(biāo)系統(tǒng)上交叉編譯工具存根的標(biāo)準(zhǔn)輸入和輸出重定向到所述編譯服務(wù)器的構(gòu)建守護進程上,以相互傳送構(gòu)建過程中的信息。
9.根據(jù)權(quán)利要求1的方法,其中所述創(chuàng)建交叉編譯工具的存根的步驟進一步包括在目標(biāo)系統(tǒng)中創(chuàng)建遠程編譯服務(wù)器中每一交叉編譯工具的存根。
10.根據(jù)權(quán)利要求9的方法,其中所述編譯服務(wù)器中的交叉編譯工具包括交叉預(yù)處理程序、交叉編譯器、交叉匯編器和交叉鏈接程序。
11.一種軟件包構(gòu)建系統(tǒng),包括編譯服務(wù)器,該編譯服務(wù)器包括構(gòu)建守護進程,用于接收來自目標(biāo)系統(tǒng)的編譯工具調(diào)用請求,并根據(jù)該請求調(diào)用相應(yīng)的交叉編譯工具;以及至少一個交叉編譯工具,用于將指定的源文件編譯成目標(biāo)系統(tǒng)上可執(zhí)行的二進制代碼;以及布置于目標(biāo)系統(tǒng)中的至少一個交叉編譯工具存根,用于截獲來自軟件包構(gòu)建過程的編譯命令,并將其轉(zhuǎn)發(fā)給編譯服務(wù)器,由編譯服務(wù)器上對應(yīng)的交叉編譯工具對目標(biāo)系統(tǒng)上相應(yīng)的源文件進行編譯。
12.根據(jù)權(quán)利要求11的系統(tǒng),其中所述編譯服務(wù)器還包括目標(biāo)系統(tǒng)的文件系統(tǒng)映象,所述交叉編譯工具從該目標(biāo)系統(tǒng)的文件系統(tǒng)映象中讀取指定的待編譯源文件以及相關(guān)文件,并將編譯結(jié)果寫入該文件系統(tǒng)映象中。
13.根據(jù)權(quán)利要求12的系統(tǒng),其中所述編譯服務(wù)器還包括網(wǎng)絡(luò)文件系統(tǒng),用于在所述編譯服務(wù)器和所述目標(biāo)系統(tǒng)之間共享所述目標(biāo)系統(tǒng)的文件系統(tǒng)映象。
14.根據(jù)權(quán)利要求12的系統(tǒng),其中所述構(gòu)建守護進程包括路徑轉(zhuǎn)換模塊,用于將從目標(biāo)系統(tǒng)接收到的調(diào)用請求的命令行參數(shù)中出現(xiàn)的絕對路徑轉(zhuǎn)換為該編譯服務(wù)器的文件名稱空間中有效的相應(yīng)路徑,或?qū)⒕幾g服務(wù)器上所調(diào)用的交叉編譯工具的根目錄設(shè)置為與目標(biāo)系統(tǒng)的文件系統(tǒng)根目錄相同的路徑,并將與所調(diào)用的交叉編譯工具相關(guān)的可執(zhí)行文件和庫復(fù)制到該根目錄下;將編譯服務(wù)器上所調(diào)用的交叉編譯工具的當(dāng)前工作目錄設(shè)置為與目標(biāo)系統(tǒng)上的構(gòu)建過程調(diào)用相應(yīng)的交叉編譯工具存根時所在的當(dāng)前目錄匹配的路徑。
15.根據(jù)權(quán)利要求14的系統(tǒng),其中所述每一交叉編譯工具包括路徑轉(zhuǎn)換模塊,用于將待編譯的源文件的“#include”行中出現(xiàn)的路徑轉(zhuǎn)換為所述編譯服務(wù)器的文件名稱空間中有效的相應(yīng)路徑。
16.根據(jù)權(quán)利要求11的系統(tǒng),其中所述目標(biāo)系統(tǒng)中還包括交叉編譯工具存根創(chuàng)建模塊用于與遠程編譯服務(wù)器交互,以在目標(biāo)系統(tǒng)上創(chuàng)建遠程編譯服務(wù)器上每一交叉編譯工具的存根。
全文摘要
本發(fā)明公開了一種軟件包構(gòu)建方法和系統(tǒng),該方法包括在要構(gòu)建軟件包的目標(biāo)系統(tǒng)中創(chuàng)建遠程編譯服務(wù)器中交叉編譯工具的存根;在目標(biāo)系統(tǒng)上啟動軟件包構(gòu)建過程;其中,在所述構(gòu)建過程中,所述交叉編譯工具的存根截獲來自所述軟件包構(gòu)建過程的編譯命令,并將該編譯命令轉(zhuǎn)發(fā)給所述遠程編譯服務(wù)器,由所述遠程編譯服務(wù)器中的相應(yīng)的交叉編譯工具對源文件進行編譯。本發(fā)明的軟件包構(gòu)建方法和系統(tǒng)可以使嵌入式系統(tǒng)的軟件開發(fā)者能夠象在本機編譯中那樣在目標(biāo)系統(tǒng)上啟動軟件包構(gòu)建過程,而同時對軟件包中源文件的實際編譯則如交叉編譯中那樣由另外一臺高性能計算機上的交叉編譯工具來完成。
文檔編號G06F9/45GK1885264SQ20051007743
公開日2006年12月27日 申請日期2005年6月21日 優(yōu)先權(quán)日2005年6月21日
發(fā)明者謝偉凱, 葉航軍, 楊雨東 申請人:國際商業(yè)機器公司