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 编译系统的强大功能,以及内核源码中提供的一些特殊变量来完成这个任务。
GNU Makefile简介1.基本 makefile 结构GNU Make的主要工作是读进一个文本文件:makefile。
这个文件里主要是有关哪些文件(‘target’目的文件)是从哪些别的文件(‘dependencies’依靠文件)中产生的,用什么命令来进行这个产生过程。
有了这些信息,make会检查硬盘上的文件,如果目的文件的时间戳(该文件生成或被改动时的时间)比至少它的一个依靠文件旧的话, make 就执行相应的命令,以便更新目的文件。
(目的文件不一定是最后的可执行文件,它可以是任何一个文件,甚至是一个不存在的文件)makefile一般被叫做“makefile”或“Makefile”。
当然也可以在make的命令行通过-f参数指定别的文件名。
如果不特别指定,它会寻找当前目录下的“makefile”或“Makefile”文件,因此使用这两个名字是最简单的。
一个 makefile 主要含有一系列的规则,如下:<target>: <dependency>(tab)<command>(tab)<command>例如,考虑以下的 makefile 文件:这是一个非常基本的makefile。
make从最上面开始,把上面第一个目的:‘myprog’,做为它的主要目标(一个它需要保证其总是最新的最终目标)。
给出的规则说明只要文件‘myprog’比文件‘foo.o’或‘bar.o’中的任何一个旧,下一行的命令将会被执行。
但是,在检查文件foo.o和bar.o的时间戳之前,它会往下查找那些把foo.o或bar.o做为目标文件的规则。
它找到的关于foo.o的规则,该文件的依靠文件是foo.c, foo.h和bar.h 。
它从下面再找不到生成这些依靠文件的规则,它就开始检查磁碟上这些依靠文件的时间戳。
如果这些文件中任何一个的时间戳比foo.o的新,命令'gcc -o foo.o foo.c'将会执行,从而更新文件 foo.o 。
GNU Make 使用手册(中译版)翻译:于凤昌译者注:本人在阅读Linux源代码过程中发现如果要全面了解Linux的结构、理解Linux的编程总体设计及思想必须首先全部读通Linux源代码中各级的Makefile文件。
目前,在网上虽然有一些著作,但都不能全面的解释Linux源代码中各级的Makefile文件,因此本人认真阅读了GNU Make 使用手册(3.79)版原文,在此基础上翻译了该手册,以满足对Linux源代码有兴趣或者希望采用GCC编写程序但对缺乏GNU Make全面了解之人士的需要。
本人是业余爱好不是专业翻译人士,如果有问题请通过电子信箱与我联系共同商讨,本人的E-mail 为:yfc70@。
注意在文章中出现的斜体加粗字表示章节。
GNU make Version 3.79April 2000Richard M. Stallman and Roland McGrath目录1 Make 概述 (5)1.1怎样阅读本手册 (5)1.2问题和BUG (5)2 Makefile文件介绍 (6)2.1 规则的格式 (6)2.2一个简单的Makefile文件 (6)2.3 make处理makefile文件的过程 (7)2.4使用变量简化makefile文件 (8)2.5 让make推断命令 (9)2.6 另一种风格的makefile文件 (9)2.7 在目录中删除文件的规则 (10)3 编写makefile文件 (10)3.1 makefile文件的内容 (10)3.2 makfile文件的命名 (11)3.3 包含其它的makefile文件 (11)3.4 变量MAKEFILES (12)3.5 makefile文件重新生成的过程 (12)3.6 重载其它makefile文件 (13)3.7 make读取makefile文件的过程 (14)4编写规则 (14)4.1规则的语法 (15)4.2 在文件名中使用通配符 (15)4.3在目录中搜寻依赖 (17)4.4假想目标 (20)4.5 没有命令或依赖的规则 (21)4.6使用空目标文件记录事件 (22)4.7 内建的特殊目标名 (22)4.8 具有多个目标的规则 (23)4.9 具有多条规则的目标 (24)4.10 静态格式规则 (24)4.11双冒号规则 (26)4.12 自动生成依赖 (26)5在规则中使用命令 (27)5.1 命令回显 (27)5.2执行命令 (28)5.3 并行执行 (29)5.4命令错误 (29)5.5中断或关闭make (30)5.6递归调用make (30)5.8 使用空命令 (35)6 使用变量 (35)6.1 变量引用基础 (35)6.2 变量的两个特色 (36)6.3变量引用高级技术 (37)6.4变量取值 (40)6.5设置变量 (40)6.6 为变量值追加文本 (41)6.7 override指令 (42)6.8定义多行变量 (42)6.9 环境变量 (43)6.10 特定目标变量的值 (43)6.11 特定格式变量的值 (44)7 makefile文件的条件语句 (44)7.1条件语句的例子 (44)7.2条件语句的语法 (45)7.3测试标志的条件语句 (47)8 文本转换函数 (47)8.1函数调用语法 (47)8.2字符串替换和分析函数 (48)8.3文件名函数 (50)8.4函数foreach (51)8.5函数if (52)8.6函数call (52)8.7函数origin (53)8.8 函数shell (54)8.9 控制make的函数 (54)9 运行make (55)9.1 指定makefile文件的参数 (55)9.2指定最终目标的参数 (55)9.3 代替执行命令 (57)9.4避免重新编译文件 (57)9.5变量重载 (58)9.6 测试编译程序 (58)9.7 选项概要 (59)10 使用隐含规则 (61)10.1 使用隐含规则 (62)10.2隐含规则目录 (62)10.3隐含规则使用的变量 (65)10.4 隐含规则链 (66)10.5定义与重新定义格式规则 (67)10.6 定义最新类型的缺省规则 (71)10.7 过时的后缀规则 (72)11使用make更新档案文件 (74)11.1档案成员目标 (74)11.2 档案成员目标的隐含规则 (74)11.3 使用档案的危险 (75)11.4 档案文件的后缀规则 (76)12 GNU make的特点 (76)13 不兼容性和失去的特点 (78)14 makefile文件惯例 (79)14.1 makefile文件的通用惯例 (79)14.2 makefile文件的工具 (80)14.3 指定命令的变量 (80)14.4安装路径变量 (81)14.5用户标准目标 (84)14.6 安装命令分类 (87)15 快速参考 (89)16 make产生的错误 (92)17 复杂的makfile文件例子 (94)脚注 (98)名词翻译对照表 (98)1 Make 概述Make 可自动决定一个大程序中哪些文件需要重新编译,并发布重新编译它们的命令。
# Makefile to compare sorting routinesBASE = /home/blufox/baseCC = gccCFLAGS = -O –Wall-O-Wall的意思应该是优化生成代码并在编译时产生警告信息,-O主要参考GNU中对-O的定义:-O、-O1 :Optimize. Optimizing compilation takes somewhat more time, and a lot more memory for a large function.With ‘-O’, the compiler tries to reduce code size and execution time, without performing any optimizations that take a great deal of compilation time. EFILE = $(BASE)/bin/compare_sortsINCLS = -I$(LOC)/include-I dir的意思是说把此文件夹作为头文件可以直接搜寻的目录,我的看法就是可以直接用include""来使用,而不用再另外加路径-I dir主要参考GNU中对-I dir的定义:-I dirAdd the directory dir to the list of directories to be searched for header files. Directories named by ‘-I’ are searched before the standard system include directories.If the directory dir is a standard system include directory, the optionis ignored to ensure that the default search order for system directories and thespecial treatment of system headers are not defeated . If dir begins with =, thenthe = will be replaced by the sysroot prefix; see ‘--sysroot’ and ‘-isysroot’. LIBS = $(LOC)/lib/g_lib.a \$(LOC)/lib/h_lib.aLOC = /usr/localOBJS = main.o another_qsort.o chk_order.o \compare.o quicksort.o这句话的意思是以后所有出现main.o another_qsort.o chk_order.o \ compare.o quicksort.o的均可以用变量$(OBJS)表示;上面的也是这个意思。
MTK编译错误⼤全!这是MTK编译出现的错误解决⽅法:在⽇常的MTK⼯程代码编译中,总会遇到⼀些奇奇怪的报错信息,第⼀次碰到的话,肯定会很头疼。
下⾯列出了3个出现⼏率较⼤的⼏个异常。
1,non ELF类似于 Error:L6850E:Archive non ELF Object app_url.obj 之类的错误,⼀般是由于分布式编译异常中断引起的,可以⽤checkobj 这个指令来清除异常的obj⽂件。
再remake即可。
2,Image$$ZI$$Limit这个问题基本都是由于在⾃⼰的代码中MTK端宏⾥⾯,使⽤了C的标准输出函数printf、,malloc,free等。
3,Couldn't reserve space for cygwin's heap这种情况,基本是执⾏ sys-1.0.dll 时除了问题,可cmd定位到该⼯程⽬录,输⼊命令,rebase -b 0x76000000./tools/MSYS/bin/msys-1.0.dll 然后重新编译即可。
ERROR1 :non ELF Object在编译某模块时,在new时出现了下⾯的错误:LENOVO53_09A_GEMINI_PHOENIX310\log\mmi_app.log(2):Error: L6850E: Archive contains non ELF Objectphonebookstubstoothers.objcause:可能是分布式编译中断造成的部分⽣成⽂件有误,Object phonebookstubstoothers.obj⽂件⼤⼩为0解决:删除该⽂件重新remake下可以解决。
ERROR2 :Free clusters are NOT enough问题:问题:Free clusters are NOT enough . Check ckSysDrv.log for detail !分析分析:这可能是在项⽬中的mak⽂件中开了⼀些不必要的宏,造成nvram空间不够,看⽂件中下⾯分析:Cluster Size (Bytes) 512Free Space (Clusters) 870Folders and Applications Requirement (Clusters) 1008RESULT: FAIL!Shortage: 138 clusters (138 Sectors = 69.0 KB = 0.07 MB)1) Shrink FS First Drive Size to enlarge system drive size (Shrink at least 138 sectors).2) Enlarge FS Region Size.3) Disable some features to shrink quota requirement.4) Replace flash device with another bigger one (Custom release projects only).cluster(簇)的概念:ERROR3 :MTK cksysdrv has errors. Delete the binary file.ERROR3 :MTK cksysdrv has errors. Delete the binary file.删除log中的ckSysDrv.log ⽂件重新r下即可.ERROR3 :FLASHTOOL ERROR FROM UI解决:关闭catcher即可ERROR4 :MTK Output CustENFBImgMap.c... done在新加了联系⼈的备份功能后,在new的时候在编译时候出现了这样编译信息后⼀直不动原因是在res.txt⽂件中多了⼀空⾏。
海思makefile结构解析全文共四篇示例,供读者参考第一篇示例:海思芯片是一家领先的半导体公司,在国际市场上拥有广泛的市场份额。
海思芯片的产品广泛应用在手机、网络通信、物联网、智能家居等领域,其芯片性能卓越,在同行业内享有很高的声誉。
在海思芯片的开发中,makefile是一个非常重要的工具,它负责管理整个项目的编译、链接和部署过程,帮助开发人员更高效地完成工作。
makefile是一个用于自动化编译的脚本文件,通过编写makefile 文件,可以告诉计算机如何编译源代码,生成可执行文件。
海思makefile结构解析主要包括以下几个部分:1. 定义变量:在makefile中定义变量是非常重要的,可以方便地管理项目的路径、编译参数等信息。
海思makefile中通常会定义一些常用的变量,比如CC表示编译器的路径,CXX表示C++编译器的路径,CFLAGS表示编译参数等。
通过定义这些变量,可以在整个makefile中直接引用,减少了代码的冗余,提高了代码的可维护性。
2. 设置编译规则:在makefile中,通常会定义一些编译规则,告诉make工具如何编译源文件和生成可执行文件。
海思makefile中的编译规则通常使用模式匹配的方式,比如"%.c:%.o"表示将所有的.c文件编译为.o文件,而"%.o:%.c"则表示将所有的.o文件根据对应的.c文件进行重新编译。
通过这些编译规则,make工具可以根据需要自动化地完成整个项目的编译过程。
3. 定义目标:在makefile中通常会定义一些目标,这些目标可以是编译生成可执行文件的命令,也可以是清理生成的临时文件的命令。
海思makefile中的目标通常包括all、clean、install等,通过定义这些目标,可以方便地管理整个项目的编译和部署过程。
4. 调用外部工具:在海思makefile中,通常会调用一些外部工具来完成一些特定的任务,比如编译器、链接器、打包工具等。
openwrt这里主要介绍openwrt的主Makefile,并未对各个目录下的Makefile和相关文件进行介绍。
在Makefile里是两个主要的分支,由if语句根据OPENWRT_BUILD的值进行不同的处理。
第一个部分主要是执行编译前的准备,第二个部分是执行编译。
打开Makefile文件,可以看到默认的make目标world,这个目标没有依赖文件和执行命令。
执行make的时候,首先进入第一个部分,此时OPENWRT_BUILD的值为0,然后将OPENWRT_BUILD的值赋为1,在这里用到了override指示符,override指示符的作用的忽略make命令行的参数的赋值,可以对该变量进行赋值。
载入include下的相关文件,在toplevel.mk可以看到%::@+$(PREP_MK) $(NO_TRACE_MAKE) -r -s prereq@+$(SUBMAKE) -r $@默认的目标就会执行这里。
在toplevel.mk的顶部定义了PREP_MK= OPENWRT_BUILD= QUIET=0,将OPENWRT_BUILD的值赋为0。
在执行@+$(PREP_MK) $(NO_TRACE_MAKE) -r -s prereq命令的时候,在make命令行里有$(PREP_MK)变量,而由于OPENWRT_BUILD的值为0,在verbose.mk文件里NO_TRACE_MAKE := $(MAKE) V=99,所以会执行顶层目录的Makefile第一个分支部分的目标prereq,即toplevel.mk文件中的目标prereq: prereq:: prepare-tmpinfo .config@+$(MAKE) -r -s tmp/.prereq-build $(PREP_MK)@+$(NO_TRACE_MAKE) -r -s $@这里会进行一些编译前的准备工作,然后执行@+$(NO_TRACE_MAKE) -r -s $@,再次去执行顶层Makefile,此时,并没有$(PREP_MK)变量,所以会执行顶层Makefile的第一个部分,载入include下的相关文件,和一些必要的Makefile文件,在顶层Makefile去寻找prereq目标,prereq: $(target/stamp-prereq) tmp/.prereq_packages处理它的依赖文件。
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)))))。