MTK-makefile文件分析
- 格式:doc
- 大小:38.50 KB
- 文档页数:5
MTK make命令分析在MTK工程根目录里,只有一个make.bat批处理文件。
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}是tools\\make.exe,即GNU的make,${makeFolder}${myMF}是make\\Gsm2.mak,$action是new、update、remake等。
变量CUSTOMER和PROJECT分别是客户名和项目名,在构建过程中将根据此两个变量的值选定项目相关的配置文件,从而实现客户化的定制。
通过给make指定ARM版的核心Makefile文件Gsm2.mak,开始了ARM 版的构建过程。
Gsm2.mak文件中包含了Option.mak这个配置用的Makefile文件,另外还包含了一些以.tmp和.bld为后缀的由perl脚本make2.pl生成的临时配置文件。
详解MTK编译命令及相关文件MTK编译分资源的编译和代码的编译:一资源的编译1 在如下的情况下,需要重新编译资源:(1) 修改了字符串资源文件(Ref_list.txt)、字库文件(FontRes.c,L_**.h)、MMI配置文件(MMI_featuresPLUTO.h)等,这些文件位于..\plutommi\Customer\CustResource\PLUTO_MMI\ ;(2) 修改了MMI资源装载配置文件,这些文件位于..\plutommi\Customer\CustResource\PLUTO_MMI\Res_MMI 目录下,这个目录下都是Res_*.*文件,是各个AP或模块的资源装载文件,包括菜单、图片和字符串资源的装载配置;注意:Cust*.*文件是资源编译生成的,不能手动修改。
2 编译方法(1)在DOS环境下执行资源编译命令resgen即可;(2)进入..\plutommi\Customer目录,执行remakeResource.bat。
若是在模拟器上使用,则还需要在VC环境下build一下,就可以看到效果了。
3 与资源编译相关的文件ResGenerator_HW.bat在编译手机目标板工程时,有“new”,“resgen”等选项时,自动调用;ResGenerator.bat手机PC模拟器工程中,添加新资源后,需要手动调用;remakeResource.bat手机PC模拟器工程中,只替换图片或更新字符串等情况下,需要手动调用;res_gen.txt资源编译的log文件,在build目录下;Makefile..\plutommi\Customer\ResGenerator\Makefile此文件是资源装载预编译程序的Makefile;PopulateRes.c..\plutommi\MMI\Resource\PopulateRes.c执行资源装载,主体是函数PopulateResData(),mtk_resgenerator.exe在执行时会调用该函数;MMIDataType.h..\plutommi\mmi\Inc\MMIDataType.h定义AP的ID范围。
Linux顶层Makefile文件分析分类:Linux 系列2013-05-06 17:05 585人阅读评论(0) 收藏举报1、make menuconfigVERSION = 2PATCHLEVEL = 6SUBLEVEL = 26EXTRAVERSION =NAME = Rotary Wombat# *DOCUMENTATION*# To see a list of typical targets execute "make help"# More info can be located in ./README# Comments in this file are targeted only to the developer, do not# expect to learn how to build the kernel reading this file.# Do not:# o use make's built-in rules and variables# (this increases performance and avoids hard-to-debug behaviour);# o print "Entering directory ...";MAKEFLAGS += -rR --no-print-directory#-r禁止使用build-in规则#--no-print-directory是:不要再屏幕上打印"Entering directory.."#记住变量SHELL,MAKEFLAGS在整个make的执行过程中#始终被自动的传递给所有的子make# We are using a recursive build, so we need to do a little thinking# to get the ordering right.## Most importantly: sub-Makefiles should only ever modify files in# their own directory. If in some directory we have a dependency on# a file in another dir (which doesn't happen often, but it's often# unavoidable when linking the built-in.o targets which finy# turn into vmlinux), we will call a sub make in that other dir, and# after that we are sure that everything which is in that other dir# is now up to date.## The only cases where we need to modify files which have global# effects are thus separated out and done before the recursive# descending is started. They are now explicitly listed as the# prepare rule.# To put more focus on warnings, be less verbose as default# Use 'make V=1' to see the full commandsifdef V #v=1ifeq ("$(origin V)", "command line")KBUILD_VERBOSE = $(V) #把V的值作为KBUILD_VERBOSE的值 endifendififndef KBUILD_VERBOSE #即默认我们是不回显的#回显即在命令执行前显示要执行的命令KBUILD_VERBOSE = 0endif# 函数origin并不操作变量的值,只是告诉你你的这个变量是哪里来的。
1. 编写目的本文编写的目的主要是从整体上理解MTK的编译过程,以便较快的处理编译中遇到的问题,同时为以后可能的优化编译过程提供参考。
2. 简介MTK的编译过程主要是在windows命令行下通过Makefile文件执行相应的prel脚本或c程序,将资源包生成c源程序,并与相应模块的c程序.o,.lib或.obj的中间代码,最终生成在手机上使用的.bin文件和在模拟器上使用的mmiresource.dll资源文件。
3. 编译环境A. 编译工具和辅助工具l ADS1.2l ADS1.2_update_848.exel MSYS 版本:1.0.10l MinGW 版本:3.1.0l Gcc-core-3.3.1l Gcc-g++-3.3.1l ImageMagick 版本:6.3.6 Q16l 7-zip 版本:3.13l 注意:按照联发科技的要求,最好上述软件采用建议的版本,否则可能会出现异常情况,导致不能正常编译。
B. 编译环境搭建l 按默认路径安装ADS1.2,并安装848补丁包l 按默认路径安装Perll 按默认路径安装7_zipl 安装MinGW先按默认路径安装MinGW安装包,然后解压gcc-core、gcc-g++的压缩包,讲解压后的两个文件夹复制到MinGW安装路径下。
l 安装MSYSl 安装ImageMagick,注意:按默认提示安装到Select Additional Tasks时,所有的选择全取消,后面再按默认安装。
l 复制7z.exe拷贝..\7_Zip\7z.exe 至..\plutommi\Customer\ResGenerator,并改名为7za.exe。
l 复制MinGW拷贝..\MinGW至..\Tools\MinGW。
l 复制MSYS拷贝..\msys\1.0至..\Tools\MSYS。
l 复制ImageMagick拷贝..\ImageMagick-6.2.5-Q16文件夹下全部文件至..\plutommi\Customer\ResGenerator目录下l 设置make.exe改名mingw32-make.exe(..\Tools\MinGW)为make.exe,并放在tools目录下。
makefile文件示例及详细解析# 此文件使用说明:# 这是一个makefile文件,百度只允许word类型。
#在makefile 文件中表示注释。
# 要编译edit,执行命令# $make edit# 结果是生成目标文件以及最终生成可执行文件edit。
## 要清除编译结果,执行命令# $make clean# 执行结果是删除编译产生的可执行文件edit以及各个目标文件。
# 下面逐行注释。
# edit 依赖于main.o,kbd.o,command.o....insert.o ,files.o,utils.o 等几个目标文件(object files),这里"/" 是换行edit : main.o kbd.o command.o display.o /insert.o search.o files.o utils.o# 下面是完成edit目标的具体命令,使用"cc"命令,输出结果为"edit"(可执行文件,无扩展名),需要链接的目标文件有7个*.o,也就是上面的依赖关系所声明的。
cc -o edit main.o kbd.o command.o display.o /insert.o search.o files.o utils.o# 下面对于几个目标文件声明其make规则,这里有一个递归思想。
# main.o这个目标文件依赖于main.c和defs.h,使用命令cc -c main.c生成main.o。
main.o : main.c defs.hcc -c main.c# kbd.o的生成规则kbd.o : kbd.c defs.h command.hcc -c kbd.c# command.o的生成规则command.o : command.c defs.h command.hcc -c command.c# display.o的生成规则display.o : display.c defs.h buffer.hcc -c display.c# insert.o的生成规则insert.o : insert.c defs.h buffer.hcc -c insert.c# search.o的生成规则search.o : search.c defs.h buffer.hcc -c search.c# files.o的生成规则files.o : files.c defs.h buffer.h command.hcc -c files.c# utils.o的生成规则utils.o : utils.c defs.hcc -c utils.c# 注意,这里声明另一个目标,使用make跟参数调用这个目标。
makefile⽂件写法解析⼀、makefile⽂件⽰例makefile⽂件并不难写,⼀个makefile模版如下所⽰,所有makefile⽂件在此基上稍微修改就可以了。
# this is a makefile #这⼀⾏是注释NAME = MemInfo.exe #下来这⼏⾏是宏定义,相当于linux的变量OBJS = $(NAME).objRES = $(NAME).resLINK_FLAG = /subsystem:windowsML_FLAG = /c /coff$(NAME): $(OBJS) $(RES) #这⼀⾏指出最终⽣成的exe⽂件依赖哪些obj和res⽂件Link $(LINK_FLAG) $(OBJS) $(RES) #这⼀⾏是⽣成exe时执⾏的链接命令;.asm.obj: #这⼀⾏表⽰.asm⽂件转成.obj⽂件要使⽤下边这个语句ml $(ML_FLAG) $< #这⼀⾏是使⽤.asm转.obj的编译命令;$<表⽰对当前⽬录下所有.asm⽂件进⾏编译且编译⽣成的.obj⽂件使⽤和原来.asm⽂件⼀样的名字.rc.res: #这⼀⾏表⽰.rc⽂件转成.res⽂件要使⽤下边这个语句rc $< #这⼀⾏是使⽤.rc转.res的编译命令;$<表⽰对当前⽬录下所有.rc⽂件进⾏编译且编译⽣成的.res⽂件使⽤和原来.rc⽂件⼀样的名字clean: #这⼀⾏表⽰最后要执⾏以下的清除命令del *.obj #删除当前⽬录下的所有.obj⽂件del *.res #删除当前⽬录下的所有.res⽂件⼆、makefile⽂件解读2.1 makefile⽂件的组成我们⼿动编译的过程是:通过rc编译资源⽂件,通过ml编译源⽂件,通过link连接程序。
makefile其实就是⽤于指导make程序完成这⼏件事,makefile就是由obj/res转exe的链接规则、asm转obj的编译规则、rc转res的编译规则和清除中间⽂件的规则等四种规则组成;不过为了⽅便还引⼊了注释和宏定义,这并不难理解。
前些天写一个驱动模块。
竟然写内核模块
Makefile
时出了问题,于是将其总结下来,下次再用
时拿过来改下就行了。
#General Purpose Makefile for Linux Kernel module by guoqingbo
KERN_DIR = /home/gqb/development/linux-kernel-2.6.37
#KERN_DIR = /usr/src/$(shell uname -r)
#KERN_DIR = /lib/modules/$(shell uname -r)/build
all:
make -C $(KERN_DIR) M=$(shell pwd) modules
clean:
make -C $(KERN_DIR) M=$(shell pwd) modules clean
rm -rf modules.order
obj-m += xxx.o
第3行KERN_DIR表示内核源码目录,这种方式适用于嵌入式开发的交叉编译,KERN_DIR目录中包含了内核驱动模块所需要的各种头文件及依赖。
若在PC机开发内核模块则应使用第4、5行的写法。
第8行中-C表示指定进入指定的目录即KERN_DIR,是内核源代码目录,调用该目录顶层下的Makefile,目标为modules。
M=$(shell pwd)选项让该Makefile在构造modules目标之前返回到模块源代码目录并在当前目录生成obj-m指定的xxx.o目标模块。
clean这个目标表示将模块清理掉
obj-m += xxx.o即指定当前目录要生成的目标模块,然后modules目标指向obj-m变量中设定的模块。
编译内核模块的makefile解读
以下是一个示例内核模块的Makefile:
```
obj-m := mymodule.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean
```
这个Makefile 的作用是编译一个名为`mymodule` 的内核模块。
- `obj-m := mymodule.o` 表示将`mymodule.o` 文件作为目标模块。
也就是说,我们需要编译出`mymodule.ko` 文件。
- `KDIR := /lib/modules/$(shell uname -r)/build` 定义了内核源码所在的目
录。
- `PWD := $(shell pwd)` 定义了当前目录。
- `all:` 是默认的目标。
它告诉make 编译内核模块。
具体的编译过程是:先进入内核源码目录,然后将当前目录设置为`SUBDIRS`,最后编译出目标模块。
- `clean:` 目标会清除所有编译生成的文件。
总体来说,这个Makefile 的作用是用内核源码中的构建系统来编译内核模块。
它利用了make 编译系统的强大功能,以及内核源码中提供的一些特殊变量来完成这个任务。
Make.bat文件perl make2.pl %*make2.pl文件$ini = "make.ini";$delCmd = "rm";$dirDelim = "/";$makeFolder = "make/";$toolsFolder = "tools/";$MTKtoolsFolder = "mtk_tools/";$makeCmd = "tools/make";$myMF = "gsm2.mak";$prj_file = "make/${custom}_${project}.mak";@tools_Dirs = qw(tools/ tools/MinGW tools/MSYS);$makeCmd = "tools/make";push (@tools_file,$makeCmd) ;@mmi_path = qw(plutommi/Customer/ResGenerator lcmmi/Customer/ResGenerator); foreach $mmi_path (@mmi_path){next if (!-d $mmi_path);$sevenZa_file = $mmi_path."/7za.exe";push (@tools_file,$sevenZa_file) ;$convert = $mmi_path."/convert.exe";push (@tools_file,$convert) ;last;}# $ENV{"NUMBER_OF_PROCESSORS"} = 1;if ($env_last_S_CF eq "") {system("bsub -I perl m_cp2lsf.pl @orgARGV");} else {system("bsub -I -m \"${env_last_S_CF}+2 mtkcf+1\" perl m_cp2lsf.pl @orgARGV"); }if (($action eq "remake") || ($action eq "update") ||($action eq "new")|| ($action eq "bm_new")) {if ($action eq "bm_new") {system("echo BM_NEW=TRUE >> ${makeFolder}~buildinfo.tmp");$result = system("${makeCmd} -f${makeFolder}${myMF} -k -r -R CUSTOMER=$custom PROJECT=$project new");} else {$result = system("${makeCmd} -f${makeFolder}${myMF} -r -R CUSTOMER=$custom PROJECT=$project $action");}USAGE:tools\make.exe -f[make file] [build_flag] <CUSTOMER> <PROJECT> <ACTION> Example:tools\make.exe –fmake\gsm2.mak -r -R CUSTOMER=mtk PROJECT=gprs newm_cp2lsf.plif(-e "$lsf_dir\\custom_release\\$CUS_REL_FOLDER_NAME\\make\\Custom.bld"){ foreach my $file (<$lsf_dir\\custom_release\\$CUS_REL_FOLDER_NAME\\make\\*.mak>){next if -d $file;if (($file =~ /\\(\w+)_(GPRS|GSM|L1S|BASIC|UMTS)\.mak/i) && ($file !~ /\\REL_\w+_(GPRS|GSM|L1S|BASIC|UMTS)\.mak/i)){$make_file = $file;}if ($file =~ /\\REL_(CR|sub)_(\w+)_(GPRS|GSM|L1S|BASIC|UMTS)\.mak/i){$RELEASE_PACKAGE = $2;}}open MAKE_FILE, "<$make_file" or die "\ncannot open $make_file\n\n";Gsm2.mak# -----------------------------# Include scripts# -----------------------------include make\option.mak # Build option definitons-include make\app_cfg.mak# ************************************************************************* New Build# *************************************************************************ifeq ($(strip $(call Upper,$(LEVEL))),VENDOR)ifeq ($(strip $(NEED_BUILD_BOOTLOADER)),TRUE)new : cleanall cleanlog cleanbin resgen $(BTLD_BIN_FILE) remakeelsenew : cleanall cleanlog cleanbin resgen remakeendifelseifeq ($(strip $(NEED_BUILD_BOOTLOADER)),TRUE)ifeq ($(strip $(call Upper,$(L1_WCDMA))),TRUE)new : cleanall sysgen ckscatter mmi_feature_check asngen umts_gen codegen asnregen operator_check $(BTLD_BIN_FILE) updateelsenew : cleanall sysgen ckscatter mmi_feature_check asngen codegen asnregen operator_check $(BTLD_BIN_FILE) updateendifelseifeq ($(strip $(call Upper,$(PROJECT))),UMTS)new : cleanall sysgen ckscatter mmi_feature_check asngen umts_gen codegen asnregen operator_check updateelsenew : cleanall sysgen ckscatter mmi_feature_check asngen codegen asnregen operator_check updateendifendifendif-include make\Custom.bld # Custom release buildCkscatter@echo Check scatter fileCustom_Release.mak# -----------------------------# Include scripts# -----------------------------# Build option definitonsinclude make\option.makinclude make\ALIAS.makOption.mak# ************************************************************************* # Include GNU Make Standard Library (GMSL)# ************************************************************************* -include tools\GMSL\gmslLINK = $(DIR_TOOL)\armlink.exe # LinkerASM = $(DIR_TOOL)\armasm.exe # ARM assemblerLIB = $(DIR_TOOL)\armar.exe # Library toolBIN_CREATE = $(DIR_TOOL)\fromelf.exe # Binary toolCFLAGS := -cpu ARM7EJ-S -littleend -O2 -zo -facustominfo.pl# CMOS_SENSORif (($project ne "basic") && ($project ne "l1s") && defined($cmos_sensor)) {if ($cmos_sensor ne "NONE") {push(@thatdirs, "drv\\camera\\$board_ver");if (($yuv_sensor_support eq "TRUE") && ($isp_support eq "TRUE")) {push(@thatdirs, "drv\\yuv_sensor\\$cmos_sensor");} else {push(@thatdirs, "drv\\image_sensor\\$cmos_sensor");}}}$allinc .= "${mmidir}\\MMI\\Inc\n";.\tools\chk_env.exe例子Upper = $(subst z,Z,$(subst y,Y,$(subst x,X,$(subst w,W,$(subst v,V,$(subst u,U,$(subst t,T,$(subst s,S,$(subst r,R,$(subst q,Q,$(subst p,P,$(subst o,O,$(subst n,N,$(subst m,M,$(subst l,L,$(subst k,K,$(subst j,J,$(subst i,I,$(subst h,H,$(subst g,G,$(subst f,F,$(subst e,E,$(subst d,D,$(subst c,C,$(subst b,B,$(subst a,A,$(1)))))))))))))))))))))))))))CUSTOMERROOT = $(firstword $(subst _, ,$(strip $(call Upper,$(CUSTOMER)))))。