解析MTK手機軟件系統(tǒng)構(gòu)建過程
MTK手機軟件系統(tǒng)構(gòu)建過程是本文要介紹的內(nèi)容,主要是來了解并學習MTK手機軟件系統(tǒng)應(yīng)用,首先來搭建一個MTK手機應(yīng)用系統(tǒng)平臺,具體內(nèi)容來看本文詳解。
MTK手機軟件系統(tǒng)的構(gòu)建使用了GNU的make,使得整個工程的構(gòu)建可以自動進行,且可以靈活控制。整個構(gòu)建過程由Make.bat、make2.pl、MoDIS.dsw、Gsm2.mak、Option.mak、

在MTK手機軟件系統(tǒng)的根目錄下有一個批處理文件Make.bat,這個批處理文件啟動了整個工程的構(gòu)建過程。在windows的命令行下,在該系統(tǒng)的根目錄下輸入命令make和相應(yīng)的參數(shù)即可開始工程的構(gòu)建,該批處理文件的使用方法如下所示。
- Usage:
- make["customer"|"mt62xx"]"project""action"["modules"]
- Description:
- customer=mtk(Defaultcustomer)
- =firefly17_demo(FIREFLY17_DEMOproject)
- =[mt6217|mt6219|mt6226|mt6227|mt6228|mt6229](EVBonly)
- =...
- project=l1s(Layer1stand-alone)
- =gsm(GSMonly)
- =gprs(GPRSonly)
- =basic(BasicFramework)
- action=new(codegen,resgen,clean,update)(default)
- =updateoru(scan,compile,link)
- =remakeorr(compile,link)
- =cleanorc(clean)
- =resgen(resgen)
- =c,u(cleanthenupdate)
- =c,r(cleanthenremake)
- =codegen(codegen)
- =viewlog(openedittoviewbuildlog)
- =emigen(emigen)
- =emiclean(emiclean)
- module(s)=modules'name(kal,l1,...)
- =>OPTIONALwhenactionisoneof(cleancremakerupdateuc,rc,u)
Example:
- makegsmnew(MT6205BEVBnew)
- makegprscodegen(MT6218BEVBcodegen)
- makemt6219gprsupdate(MT6219EVBupdate)
- makefirefly17_demogprsnew
- makemilan_demogprsc,uinitcustom
- makemt6219gprsrinitcustomdrv
其中較常用的action有new、update、remake、new_modis這幾個。
new是全新開始構(gòu)建整個工程的ARM版,包括圖片、聲音、字符串等資源都要重做,依賴的其他動作最多,是最徹底也是耗時最長的一個動作,一般得到一個新的MTK發(fā)布版本后要做一次。
update是重新更新整個工程的ARM版,該動作會掃描工程中文件和庫的依賴關(guān)系,若依賴關(guān)系有變化會建立新的依賴關(guān)系,隨后根據(jù)新的依賴關(guān)系重新編譯鏈接有改動的部分,一般在增加或刪除一些驅(qū)動或應(yīng)用的情況下需要用update。
remake是重新編譯整個工程的ARM版,該動作只是簡單的重新編譯鏈接有改動的部分,不檢查依賴關(guān)系,是耗時最短的一個動作,也是最常用的動作。
new_modis是全新構(gòu)建整個工程的PC模擬版,其調(diào)用VC的編譯器和鏈接器得到一個可以在windows上運行的PC模擬版。MMI應(yīng)用軟件工程師可以在沒有硬件板的情況下在PC上檢查和調(diào)試自己寫好的應(yīng)用。
Make.bat實際上只起引導(dǎo)作用,其只有一行批處理語句perlmake2.pl%*,于是運行該批處理文件后控制權(quán)轉(zhuǎn)給了perl腳本make2.pl。在這個perl腳本中解析了用戶輸入的命令行參數(shù),設(shè)置變量,準備make時需要的臨時配置文件,隨后根據(jù)生成的可運行映像是PC模擬版還是ARM版而分別調(diào)用不同的構(gòu)建過程。
Pc模擬版的構(gòu)建通過調(diào)用如下命令實現(xiàn)。
- system("$msdevMoDIS.dsw/MAKE\"$argu-Win32$modisDir\"
- /OUT${MoDISLogDir}\\${argu}.log")
在這里$msdev就是VC的msdev,通過VC的工程文件MoDIS.dsw和后面的參數(shù)進行具體的構(gòu)建過程。熟悉VC工程的朋友應(yīng)該比較清楚,因此就不再具體解釋了。之后將只以ARM版為主來講解整個工程的構(gòu)建過程。
ARM版的構(gòu)建通過調(diào)用如下命令實現(xiàn)。
- system("${makeCmd}-f${makeFolder}${myMF}-r-R
- CUSTOMER=$customPROJECT=$project$action")
在這里${makeCmd}是tools\make.exe,即GNU的make,${makeFolder}${myMF}是make\Gsm2.mak,$action是new、update、remake等。變量CUSTOMER和PROJECT分別是客戶名和項目名,在構(gòu)建過程中將根據(jù)此兩個變量的值選定項目相關(guān)的配置文件,從而實現(xiàn)客戶化的定制。通過給make指定ARM版的核心Makefile文件Gsm2.mak,開始了ARM版的構(gòu)建過程。
Gsm2.mak文件中包含了Option.mak這個配置用的Makefile文件,另外還包含了一些以.tmp和.bld為后綴的由perl腳本make2.pl生成的臨時配置文件。這些臨時配置文件主要是一些action如clean、remake等所需的變量設(shè)置,及客戶化和版本號等的一些信息。Gsm2.mak控制了new、update、remake等動作的過程。具體分別如下所示。
- new:cleanallcmmgenmmi_feature_checkasngencodegenasnregen\
- operator_check_liteupdate
- update:cleanlogcleanbinmcddll_updatecodegenresgencksysdrvremake
- remake:cleanlogcleanbingenvernolibs$(BIN_FILE)done
上面的構(gòu)建過程的幾個步驟中,最重要的兩個步驟是libs、$(BIN_FILE)。libs調(diào)用ARM版的編譯器和連接器將各個模塊目錄下的C文件編譯鏈接為獨立的庫。$(BIN_FILE)這個步驟將各個模塊編譯鏈接得到的庫和mtk_lib目錄下的庫一起鏈接起來得到一個映像文件,然后使用ADS的工具fromelf將映像文件生成以變量BIN_FILE命名的二進制文件,該文件可以下載到硬件板上運行。
libs這個步驟如下所示。
- libs:cleanlibstartbuildlibs$(COMPLIBLIST)
libs中真正進行編譯鏈接的步驟是$(COMPLIBLIST),要生成的庫由變量COMPLIBLIST列出,在ARM版中,變量COMPLIBLIST從變量COMPLIST得到。變量COMPLIST是在Option.mak及其包含的Makefile文件中賦值的。因有很多庫需要編譯鏈接,變量COMPLIBLIST展開后包含多個步驟,而這些步驟都是重復(fù)不變的,因此在定義步驟$(COMPLIBLIST)的構(gòu)建過程時使用%.lib代替。%.lib這個步驟先清除了之前的一些依賴關(guān)系文件,將一些變量的設(shè)置寫入~compbld.tmp這個臨時文件中,然后給make指定Makefile文件comp.mak,完成庫的編譯和鏈接,如下所示。
- %.lib:
- …
- @if/I%OS%EQUWINDOWS_NT\
- (if/I$(BM_NEW)EQUTRUE\
- (tools\make.exe-fmake\comp.mak-k-r-R$(strip$(CMD_ARGU))COMPONENT=$*>$(strip$(COMPLOGDIR))\$*.log2>&1)
- \
- else\
- (tools\make.exe-fmake\comp.mak-r-R$(strip$(CMD_ARGU))COMPONENT=$*>$(strip$(COMPLOGDIR))\$*.log2>&1)\
- )\
- else\
- (if/I$(BM_NEW)EQUTRUE\
- (tools\make.exe-fmake\comp.mak-k-r-R$(strip$(CMD_ARGU))COMPONENT=$*>$(strip$(COMPLOGDIR))\$*.log)\
- else\
- (tools\make.exe-fmake\comp.mak-r-R$(strip$(CMD_ARGU))COMPONENT=$*>$(strip$(COMPLOGDIR))\$*.log)\
- )
上面的命令語句中,參數(shù)-k是指有錯誤也要繼續(xù)編譯,-r和-R是指沒有GNUmake的默認規(guī)則和變量。COMPONENT=$*把當前要生成的庫賦給變量COMPONENT。要注意%.lib匹配了所有要生成的庫,但這個步驟一次只生成一個模塊的庫,這個步驟對所有匹配到的庫都會執(zhí)行一次。
comp.mak這個Makefile文件控制了模塊的編譯鏈接過程。在這個文件中,首先將當前模塊要生成的庫(由變量COMPONENT傳入)設(shè)置給了變量TARGLIB。之后從
庫的編譯鏈接由update_lib步驟完成,這個步驟直接依賴了$(TARGLIB)。目標$(TARGLIB)是由所有按照.c.obj、.s.obj、%.obj:%.cpp等規(guī)則編譯得到的中間目標文件鏈接得到的。其主要過程如下所示。
- $(TARGLIB):
- ...
- @ifexist$(FIXPATH)\$(CUS_MTK_LIB)\$(COMPONENT).lib\
- (copy/z$(FIXPATH)\$(CUS_MTK_LIB)\$(COMPONENT).lib$(subst/,\,$(TARGLIB)))&\
- ($(LIB)-r$(TARGLIB)$(COMPOBJS_DIR)/*.obj)\
- else\
- ($(LIB)-create$(TARGLIB)$(COMPOBJS_DIR)/*.obj)
- ...
Option.mak是整個工程構(gòu)建過程中的總控配置文件,在這個文件中還包含了
小結(jié):解析MTK手機軟件系統(tǒng)構(gòu)建過程的內(nèi)容介紹完了,希望通過學習MTK手機軟件系統(tǒng)的構(gòu)建能對你有所幫助。