2022年MTK手机软件系统的构建过程 .pdf
MTK 手机软件系统的构建过程MTK 手机软件系统的构建使用了GNU的 make, 使得整个工程的构建可以自动进行,且可以灵活控制。整个构建过程由Make.bat 、make2.pl 、MoDIS.dsw 、Gsm2.mak 、Option.mak 、_.mak等文件控制。构建PC模拟版是通过msdev 和 VC的工程文件 MoDIS.dsw 来完成的。 Gsm2.mak 是构建 ARM 版的核心Makefile 文件,整个构建过程由其控制,其他是一些启动、选项配置、子过程的文件。其关系图如下所示。在 MTK 手机软件系统的根目录下有一个批处理文件Make.bat,这个批处理文件启动了整个工程的构建过程。在windows 的命令行下,在该系统的根目录下输入命令make 和相应的参数即可开始工程的构建,该批处理文件的使用方法如下所示。Usage: make customer|mt62xx project action modules Description: customer = mtk (Default customer) = firefly17_demo (FIREFLY17_DEMO project) = mt6217|mt6219|mt6226|mt6227|mt6228|mt6229 (EVB only) = . project = l1s (Layer 1 stand-alone) = gsm (GSM only) = gprs (GPRS only) = basic (Basic Framework) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 5 页 - - - - - - - - - action = new(codegen, resgen, clean, update) (default ) = update or u (scan, compile, link) = remake or r (compile, link) = clean or c (clean) = resgen (resgen) = c,u (clean then update) = c,r (clean then remake) = codegen (codegen) = viewlog (open edit to view build log) = emigen (emigen) = emiclean (emiclean) module(s) = modules name (kal, l1, .) = OPTIONAL when action is one of (clean c remake r update u c,r c,u) Example: make gsm new(MT6205B EVB new ) make gprs codegen (MT6218B EVB codegen) make mt6219 gprs update (MT6219 EVB update) make firefly17_demo gprs newmake milan_demo gprs c,u init custom make mt6219 gprs r init custom drv其中较常用的action 有 new 、update 、remake 、new_modis这几个。new 是全新开始构建整个工程的ARM 版,包括图片、声音、字符串等资源都要重做,依赖的其他动作最多,是最彻底也是耗时最长的一个动作,一般得到一个新的MTK 发布版本后要做一次。update 是重新更新整个工程的ARM 版,该动作会扫描工程中文件和库的依赖关系,若依赖关系有变化会建立新的依赖关系,随后根据新的依赖关系重新编译链接有改动的部分,一般在增加或删除一些驱动或应用的情况下需要用update 。remake 是重新编译整个工程的ARM 版,该动作只是简单的重新编译链接有改动的部分,不检查依赖关系,是耗时最短的一个动作,也是最常用的动作。new_modis是全新构建整个工程的PC 模拟版,其调用VC 的编译器和链接器得到一个可以在 windows 上运行的PC 模拟版。 MMI 应用软件工程师可以在没有硬件板的情况下在PC 上名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 5 页 - - - - - - - - - 检查和调试自己写好的应用。Make.bat 实际上只起引导作用,其只有一行批处理语句perl make2.pl %*,于是运行该批处理文件后控制权转给了perl 脚本 make2.pl 。在这个 perl 脚本中解析了用户输入的命令行参数,设置变量,准备make 时需要的临时配置文件,随后根据生成的可运行映像是PC模拟版还是ARM 版而分别调用不同的构建过程。Pc 模拟版的构建通过调用如下命令实现。system($msdev MoDIS.dsw /MAKE $argu - Win32 $modisDir/OUT $MoDISLogDir$argu.log)在这里 $msdev 就是 VC 的 msdev ,通过 VC 的工程文件MoDIS.dsw 和后面的参数进行具体的构建过程。熟悉VC 工程的朋友应该比较清楚,因此就不再具体解释了。之后将只以ARM版为主来讲解整个工程的构建过程。ARM 版的构建通过调用如下命令实现。system($makeCmd -f$makeFolder$myMF -r -RCUSTOMER=$custom PROJECT=$project $action)在这里 $makeCmd是 toolsmake.exe,即 GNU 的 make ,$makeFolder$myMF是makeGsm2.mak,$action 是 new 、update 、remake 等。变量CUSTOMER 和 PROJECT分别是客户名和项目名,在构建过程中将根据此两个变量的值选定项目相关的配置文件,从而实现客户化的定制。 通过给 make 指定 ARM 版的核心Makefile 文件 Gsm2.mak , 开始了 ARM版的构建过程。Gsm2.mak 文件中包含了Option.mak这个配置用的Makefile 文件,另外还包含了一些以.tmp 和.bld 为后缀的由perl 脚本 make2.pl 生成的临时配置文件。这些临时配置文件主要是一些 action 如 clean、 remake 等所需的变量设置,及客户化和版本号等的一些信息。Gsm2.mak 控制了 new 、update 、 remake 等动作的过程。具体分别如下所示。new : cleanall cmmgen mmi_feature_check asngen codegen asnregen operator_check_lite update 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 5 页 - - - - - - - - - update : cleanlog cleanbin mcddll_update codegen resgen cksysdrv remake remake : cleanlog cleanbin genverno libs $(BIN_FILE) done 上面的构建过程的几个步骤中,最重要的两个步骤是libs、$(BIN_FILE) 。libs 调用 ARM 版的编译器和连接器将各个模块目录下的C 文件编译链接为独立的库。$(BIN_FILE) 这个步骤将各个模块编译链接得到的库和mtk_lib 目录下的库一起链接起来得到一个映像文件,然后使用 ADS 的工具 fromelf 将映像文件生成以变量BIN_FILE 命名的二进制文件,该文件可以下载到硬件板上运行。libs 这个步骤如下所示。libs: cleanlib startbuildlibs $(COMPLIBLIST) libs 中真正进行编译链接的步骤是$(COMPLIBLIST) ,要生成的库由变量COMPLIBLIST列出,在ARM 版中,变量COMPLIBLIST 从变量 COMPLIST 得到。变量COMPLIST 是在Option.mak及其包含的Makefile 文件中赋值的。因有很多库需要编译链接,变量COMPLIBLIST 展开后包含多个步骤,而这些步骤都是重复不变的,因此在定义步骤$(COMPLIBLIST) 的构建过程时使用%.lib 代替。 %.lib 这个步骤先清除了之前的一些依赖关系文件,将一些变量的设置写入compbld.tmp这个临时文件中, 然后给 make 指定 Makefile文件 comp.mak ,完成库的编译和链接,如下所示。%.lib: if /I %OS% EQU WINDOWS_NT (if /I $(BM_NEW) EQU TRUE (toolsmake.exe -fmakecomp.mak -k -r -R $(strip $(CMD_ARGU) COMPONENT=$* $(strip $(COMPLOGDIR)$*.log 2&1) else (toolsmake.exe -fmakecomp.mak -r -R $(strip $(CMD_ARGU) COMPONENT=$* $(strip $(COMPLOGDIR)$*.log 2&1) ) else (if /I $(BM_NEW) EQU TRUE (toolsmake.exe -fmakecomp.mak -k -r -R $(strip $(CMD_ARGU) COMPONENT=$* $(strip $(COMPLOGDIR)$*.log) else (toolsmake.exe -fmakecomp.mak -r -R $(strip $(CMD_ARGU) COMPONENT=$* $(strip $(COMPLOGDIR)$*.log) ) 上面的命令语句中,参数-k 是指有错误也要继续编译,-r 和-R 是指没有GNU make 的默认名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 5 页 - - - - - - - - - 规则和变量。 COMPONENT=$* 把当前要生成的库赋给变量COMPONENT 。要注意 %.lib 匹配了所有要生成的库,但这个步骤一次只生成一个模块的库,这个步骤对所有匹配到的库都会执行一次。comp.mak 这个 Makefile 文件控制了模块的编译链接过程。在这个文件中,首先将当前模块要生成的库(由变量 COMPONENT 传入) 设置给了变量TARGLIB 。 之后从 .lis文件中得到SRC_LIST 和 CPPSRC_LIST 两个源文件列表, 设定要编译的C 文件、C+文件、汇编文件等的列表,和要链接的中间目标文件的列表。将.inc 、.def 、.pth 文件中的头文件路径、C 文件路径、编译链接参数等赋值给相应的变量。将平台相关(如6223、6225)的编译参数加上,确定使用ARM 编译器还是 thumb 编译器,是否支持ARM 指令和 thumb 指令的 interwork 模式。最后进入库的编译链接过程。库的编译链接由update_lib步骤完成,这个步骤直接依赖了$(TARGLIB) 。目标 $(TARGLIB)是由所有按照.c.obj 、.s.obj 、%.obj: %.cpp等规则编译得到的中间目标文件链接得到的。其主要过程如下所示。$(TARGLIB): . if exist $(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是整个工程构建过程中的总控配置文件,在这个文件中还包含了_.mak和 REL_CR_MMI_.mak这两个项目相关的配置文件,用户自定义的配置文件USER_SPECIFIC.mak ,另外还包含了一些临时生成的配置文件。这些配置文件在一起设置了工程构建过程中用到的编译器、链接器, 库和二进制的工具,设置了编译链接时的参数,公共的头文件路径,设置了需要包含mtk_lib 目录中的哪些既有的库,设置了需要生成的库等一系列相关的设置。这些设置都由一些重要的变量保存,具体在下一节中讲解。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 5 页 - - - - - - - - -