17
Makefile Introduct Makefile Introduct ion ion Cuke.wang SWI HQ Cuke.wang SWI HQ 01/10/07 01/10/07

Makefile Introduction

  • Upload
    komala

  • View
    96

  • Download
    1

Embed Size (px)

DESCRIPTION

Makefile Introduction. Cuke.wang SWI HQ 01/10/07. 第一部分:总的介绍 第二部分:详细的过程分析. 过程. MTK 平台具体的代码表示. 1) Make 命令 Make *** gprs(gsm) new - PowerPoint PPT Presentation

Citation preview

Page 1: Makefile Introduction

Makefile IntroductionMakefile Introduction

Cuke.wang SWI HQCuke.wang SWI HQ

01/10/0701/10/07

Page 2: Makefile Introduction

第一部分:总的介绍第一部分:总的介绍第二部分:详细的过程分析 第二部分:详细的过程分析

Page 3: Makefile Introduction

过程过程

Page 4: Makefile Introduction

MTKMTK 平台具体的代码表示平台具体的代码表示 1) Make 1) Make 命令 命令 Make *** gprs(gsm) newMake *** gprs(gsm) new 2) 2) 编译 编译 Comp.makComp.mak armcc -apcs /interwork -c -cpu ARM7EJ-S -litt armcc -apcs /interwork -c -cpu ARM7EJ-S -litt

leend -O2 -zo -fa leend -O2 -zo -fa -DMAX_PHB_PHONE_ENTRY=300-DMAX_PHB_PHONE_ENTRY=300 -Ij2me/jal/incl-Ij2me/jal/includeude -o ./build/D169E/gsm/MT6217o/custom/custom_emi.obj custom -o ./build/D169E/gsm/MT6217o/custom/custom_emi.obj custom/system/D168_BB/custom_emi.c/system/D168_BB/custom_emi.c

3) 3) 链接 链接 Gsm2.mak armlink -map -info sizes,totals -symbols -xref -Gsm2.mak armlink -map -info sizes,totals -symbols -xref -remove remove -scatter custom\system\D168_BB\scatD169E.txt-scatter custom\system\D168_BB\scatD169E.txt -output -output .\b.\build\D169E\D169E_PCB01_gsm_MT6217_BN.elfuild\D169E\D169E_PCB01_gsm_MT6217_BN.elf -symdefs -symdefs .\build\D.\build\D169E\D169E_PCB01_gsm_MT6217_BN.sym169E\D169E_PCB01_gsm_MT6217_BN.sym -list -list .\build\D169E\D1.\build\D169E\D169E_PCB01_gsm_MT6217_BN.lis69E_PCB01_gsm_MT6217_BN.lis -libpath c:\progra~1\arm\adsv1_ -libpath c:\progra~1\arm\adsv1_2\lib .\build\D169E\gsm\MT6217o\lib\init.lib(bootarm.obj) …2\lib .\build\D169E\gsm\MT6217o\lib\init.lib(bootarm.obj) …

Page 5: Makefile Introduction

MakefileMakefile 文件文件 make 命令执行时,需要一个 Makefile 文

件,以告诉 make 命令需要怎么样的去编译和链接程序

一、 Makefile 的规则 target ... : prerequisites ...

command

Page 6: Makefile Introduction

make 是如何工作的 在默认的方式下,也就是我们只输入 make 命令。那么, 1 、 make 会在当前目录下找名字叫“ Makefile” 或“ makefile” 的文

件。 2 、如果找到,它会找文件中的第一个目标文件( target ),在上面

的例子中,他会找到“ edit” 这个文件,并把这个文件作为最终的目标文件。

3 、如果 edit 文件不存在,或是 edit 所依赖的后面的 .o 文件的文件修改时间要比 edit 这个文件新,那么,他就会执行后面所定义的命令来生成 edit 这个文件。

4 、如果 edit 所依赖的 .o 文件也存在,那么 make 会在当前文件中找目标为 .o 文件的依赖性,如果找到则再根据那一个规则生成 .o 文件。(这有点像一个堆栈的过程)

5 、当然,你的 C 文件和 H 文件是存在的啦,于是 make 会生成 .o 文件,然后再用 .o 文件生命 make 的终极任务,也就是执行文件 edit 了。

Page 7: Makefile Introduction

第二部分:第二部分: 11 、命令的解释、命令的解释 使用使用 PerlPerl 语言语言 if (($action eq "remake") || ($action eq "update") ||if (($action eq "remake") || ($action eq "update") || ($action eq "new")|| ($action eq "bm_new")) {($action eq "new")|| ($action eq "bm_new")) { if ($action eq "bm_new") {if ($action eq "bm_new") { system("echo BM_NEW=TRUE >> ${makeFolder}~builsystem("echo BM_NEW=TRUE >> ${makeFolder}~buil

dinfo.tmp");dinfo.tmp"); $result = system("${makeCmd} -f${makeFolder}${myM$result = system("${makeCmd} -f${makeFolder}${myM

F} -k -r -R CUSTOMER=$custom PROJECT=$project neF} -k -r -R CUSTOMER=$custom PROJECT=$project new");w");

}} tools\make.exe -fmake\gsm2.mak -r -R CUSTOMER=mtk tools\make.exe -fmake\gsm2.mak -r -R CUSTOMER=mtk

PROJECT=gprs newPROJECT=gprs new

Page 8: Makefile Introduction

MTK PlatformMTK Platform

Page 9: Makefile Introduction

22 、编 译、编 译 1) 1) 格式:格式: Compiler [ search paths] [output-format] [tCompiler [ search paths] [output-format] [t

arget-option] [source]arget-option] [source]

在在 MTK:$(CMPLR) $(VIA) tmp0.txtMTK:$(CMPLR) $(VIA) tmp0.txt tmp0.txt tmp0.txt 的生成:的生成: remake n tmp0.txt $(CINTWORK) $(CFLAGS) $(CDEFS) $(CINCDIremake n tmp0.txt $(CINTWORK) $(CFLAGS) $(CDEFS) $(CINCDI

RS) $(MD) -o $(COMPOBJS_DIR)/$@ $< RS) $(MD) -o $(COMPOBJS_DIR)/$@ $< 自动生成自动生成 22

Page 10: Makefile Introduction

33 、链接、链接11 )格式:)格式: armlink [-output] [-elf]armlink [-output] [-elf]

MTK: $(BIN_FILE):MTK: $(BIN_FILE):

($(LINK) $(VIA) make\~libs.tmp > $(LOG) )($(LINK) $(VIA) make\~libs.tmp > $(LOG) )

22 )重要的选项:)重要的选项:ScatterScatter : 定义映像文件的地址映射: 定义映像文件的地址映射目前在项目中常使用目前在项目中常使用 NOR FLASH 128MbNOR FLASH 128Mb ++ pSRAM 32MbpSRAM 32Mb

定义了加载时域和运行时域 定义了加载时域和运行时域 在在 H330H330 :四个加载时域,所以烧写代码分为四个:四个加载时域,所以烧写代码分为四个 在在 D169ED169E :一个加载时域。:一个加载时域。

Page 11: Makefile Introduction

ScatterScatter 文件分析文件分析 ROM 0x08000000 { }ROM 0x08000000 { }在程序中,在程序中, FlashFlash 的片选脚是的片选脚是 ECS0ECS0 ,而,而 SRSR

AMAM 的片选脚是的片选脚是 ECS1ECS1 LANG_PACK_ROM 0x8AF0000 { }LANG_PACK_ROM 0x8AF0000 { } (+RW) ??(+RW) ?? CUSTPACK_ROM 0x8B90000 { }CUSTPACK_ROM 0x8B90000 { } JUMP_TABLE 0x08DFFE00 0x200 { }JUMP_TABLE 0x08DFFE00 0x200 { }对应于四个加载时域的文件对应于四个加载时域的文件

Page 12: Makefile Introduction

ROMROM ROM2 +0x0 0x400000 { .ANY (+RO-CODE) } //CROM2 +0x0 0x400000 { .ANY (+RO-CODE) } //C 语言的语言的 lib memcopylib memcopy ROM3 +0x0ROM3 +0x0 { .ANY (+RO-DATA) }{ .ANY (+RO-DATA) } EXTSRAM_LARGEPOOL_NORMAL 0x00000140 { j2me_custom_resourEXTSRAM_LARGEPOOL_NORMAL 0x00000140 { j2me_custom_resour

ce.obj (JAVA_ALIGN_ZI, LARGEPOOL_ZI)ce.obj (JAVA_ALIGN_ZI, LARGEPOOL_ZI) med_main.obj (LARGEPOOL_ZI) med_main.obj (LARGEPOOL_ZI) ScrMemMgr.obj (LARGEPOOL_ZI) }ScrMemMgr.obj (LARGEPOOL_ZI) } EXTSRAM +0x00 EXTSRAM +0x00 {{ * (+RW, +ZI) } * (+RW, +ZI) }

Page 13: Makefile Introduction

.lis.lis 分析 分析 对应于对应于 ScatterScatter 文件的运行时域的文件文件的运行时域的文件 存贮位置:外部存贮位置:外部 ROMROM

1) Const 1) Const

system_jump_table 0x08dffe00 Data 416 custom_jump_tbl.obj(.constdata)system_jump_table 0x08dffe00 Data 416 custom_jump_tbl.obj(.constdata)

2) Arm Thum 2) Arm Thum 指令指令 外部外部 RAMRAM

11 )全局变量 )全局变量 (+RW)(+RW)

flash_id 0x000d04fc Data 2 custom_emi.obj(.bss)flash_id 0x000d04fc Data 2 custom_emi.obj(.bss)

22 )静态变量 ()静态变量 ( +ZI+ZI ))System_Mem_Pool 0x00129404 Data 286720 custom_config.obj(.bss)System_Mem_Pool 0x00129404 Data 286720 custom_config.obj(.bss) 内部内部 RAMRAM 内部内部 ROMROM

Page 14: Makefile Introduction

vpathvpath vpath %.s $(subst \,/,$(SRCPATH))vpath %.s $(subst \,/,$(SRCPATH)) vpath %.c $(subst \,/,$(SRCPATH))vpath %.c $(subst \,/,$(SRCPATH)) vpath %.cpp $(subst \,/,$(SRCPATH))vpath %.cpp $(subst \,/,$(SRCPATH)) vpath %.h $(subst \,/,$(INCDIRS))vpath %.h $(subst \,/,$(INCDIRS)) vpath %.dat $(subst \,/,$(INCDIRS))vpath %.dat $(subst \,/,$(INCDIRS)) vpath %.obj $(COMPOBJS_DIR)vpath %.obj $(COMPOBJS_DIR)

Page 15: Makefile Introduction

Make2.plMake2.pl

if (($action eq "remake") || ($action eq "update") ||if (($action eq "remake") || ($action eq "update") || ($action eq "new")|| ($action eq "bm_new")) {($action eq "new")|| ($action eq "bm_new")) { if ($action eq "bm_new") {if ($action eq "bm_new") { system("echo BM_NEW=TRUE >> ${makeFolder}~bsystem("echo BM_NEW=TRUE >> ${makeFolder}~b

uildinfo.tmp");uildinfo.tmp"); $result = system("${makeCmd} -f${makeFolder}${my$result = system("${makeCmd} -f${makeFolder}${my

MF} -k -r -R CUSTOMER=$custom PROJECT=$project MF} -k -r -R CUSTOMER=$custom PROJECT=$project new");new");

}} tools\make.exe -fmake\gsm2.mak -r -R CUSTOMER=mttools\make.exe -fmake\gsm2.mak -r -R CUSTOMER=mt

k PROJECT=gprs newk PROJECT=gprs new

Page 16: Makefile Introduction

{{ if ($#arguments != -1) {if ($#arguments != -1) { system("echo DO_CLEAN_MODULE=TRUE > ${makeFolder}~csystem("echo DO_CLEAN_MODULE=TRUE > ${makeFolder}~c

leanmod.tmp");leanmod.tmp"); system("echo CLEAN_MODS=@arguments >> ${makeFolder}~system("echo CLEAN_MODS=@arguments >> ${makeFolder}~

cleanmod.tmp");cleanmod.tmp"); system("${makeCmd} -f${makeFolder}${myMF} -r -R CUSTOMEsystem("${makeCmd} -f${makeFolder}${myMF} -r -R CUSTOME

R=$custom PROJECT=$project cleanmod");R=$custom PROJECT=$project cleanmod"); } else {} else { system("echo DO_CLEAN_MODULE=FALSE > ${makeFolder}~system("echo DO_CLEAN_MODULE=FALSE > ${makeFolder}~

cleanmod.tmp");cleanmod.tmp"); system("${makeCmd} -f${makeFolder}${myMF} -r -R CUSTOMEsystem("${makeCmd} -f${makeFolder}${myMF} -r -R CUSTOME

R=$custom PROJECT=$project cleanall");R=$custom PROJECT=$project cleanall"); }} }}

Page 17: Makefile Introduction

XXX_PCBXX_gprs_MT62XXX_S01.lisXXX_PCBXX_gprs_MT62XXX_S01.lis

该文件由该文件由 ARMlinkARMlink 根据根据 ScatterScatter 文件生成文件生成构成:构成:Global SymbolsGlobal SymbolsNeedExitFunc 0x000ce1b0 Data 1 NeedExitFunc 0x000ce1b0 Data 1 FactoryModeSrc.obj(.data)FactoryModeSrc.obj(.data)