MTK-makefile文件分析
Makefile详解

2009-6-10 22:51 回复
nginx_h
11位粉丝
2楼
好,言归正传,GNU的make有许多的内容,闲言少叙,还是让我们开始吧。
Makefile 介绍
———————
make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。
在这个makefile中,目标文件(target)包含:执行文件edit和中间目标文件(*.o),依赖文件(prerequisites)就是冒号 后面的那些 .c 文件和 .h文件。每一个 .o 文件都有一组依赖文件,而这些 .o 文件又是执行文件 edit 的依赖文件。依赖关系的实质上就是说明了目标文件是由哪些文件生成的,换言之,目标文件是哪些文件更新的。
金道贵金属,首选现货黄金投资交易平台!
金香港金银业贸易场74号成员及金集团成员.任达华代言.100美元开户O佣金低点差. 存取款安全便捷!一流品牌,优质服务!..
黑龙江旅游首选美之旅
黑龙江旅游—美之旅旅行社是您不二之选,以优质旅游服务赢得广大旅客的一致好评. 专业从事东北旅游地接业务,专业的服务赢得您..
MTK make命令分析

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编译命令及相关文件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顶层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并不操作变量的值,只是告诉你你的这个变量是哪里来的。
Makefie技术详解

makefile 基本结构
上例注意到,第一个字符为 # 的行为注释行。第一个非注释行指定 test.o 为目标,并且依赖于test.C 和 test.h 文件。随后的行指定了如何从目标所 依赖的文件建立目标。 当 test.C 或 test.h 文件在编译之后又被修改,则 make 工具可自动重新编 译 test.o,如果在前后两次编译之间,test.C 和 test.h 均没有被修改,而 且 test.o 还存在的话,就没有必要重新编译。这种依赖关系在多源文件的 程序编译中尤其重要。通过这种依赖关系的定义,make 工具可避免许多不 必要的编译工作。当然,利用 Shell 脚本也可以达到自动编译的效果,但是 ,Shell 脚本将全部编译任何源文件,包括哪些不必要重新编译的源文件, 而 make 工具则可根据目标上一次编译的时间和目标所依赖的源文件的更 新时间而自动判断应当编译哪个源文件。 一个 makefile 文件中可定义多个目标,利用 make target 命令可指定要编 译的目标,如果不指定目标,则使用第一个目标。通常,makefile 中定义 有 clean 目标,可用来清除编译过程中的中间文件,例如: clean: rm -f *.o 运行 make clean 时,将执行 rm -f *.o 命令,最终删除所有编译过程中产 生的所有中间文件。
Makefile示例
1. 多模块项目编译示例 2. 多模块项目共享库编译与使用示例
多模块项目编译示例
• 在示例中有三个模块,它们分别是f1.c,f2.c和f3.c,它 们之间的关系如下图
多模块项目编译示例
项目编译过程分析
按照gcc的工作过程,对模块的编译和链接过程可分为: (1)生成目标代码 gcc -c f1.c gcc -c f2.c gcc -c f3.c (2) 生成可执行程序 gcc -o f f1.o f2.o f3.o
MTK程序编译及常见错误分析

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文件示例及详细解析# 此文件使用说明:# 这是一个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模版如下所⽰,所有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的编译规则和清除中间⽂件的规则等四种规则组成;不过为了⽅便还引⼊了注释和宏定义,这并不难理解。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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)))))。