展讯平台开发说明
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Build环境使用手册
Version: 0.2.5
2010-10-14
修订历史
重要声明
版权声明
本文档中的任何内容受《中华人民共和国著作权法》的保护,版权所有© 2006, 展讯通信有限公司,保留所有权利,但注明引用其他方的内容除外。
商标声明
本文档中展讯通信有限公司的产品的所有商标是展讯通信有限公司专有,但注明属于其他公司拥有的商标除外。
在提及其他公司及其产品时将使用各自公司所拥有的商标,这种使用的目的仅限于引用。
不作保证声明
展讯通信有限公司不对此文档中的任何内容作任何明示或暗示的陈述或保证,而且不对特定目的的适销性及适用性或者任何间接、特殊或连带的损失承担任何责任。
保密声明
本文档(包括任何附件)包含的信息是保密信息。
接收人了解其获得的本文档是保密的,除用于规定的目的外不得用于任何目的,也不得将本文档泄露给任何第三方。
目录
1说明 (6)
2编译环境及相关软件 (7)
3Source Code目录结构 (8)
4基本编译命令 (10)
4.1全新编译整个项目[new] (10)
4.2更新项目[update] (11)
4.3单独编译模块 (11)
4.4清除模块编译结果 (11)
4.5清除所有编译结果[cleanall] (11)
4.6生成可执行文件 (11)
4.7编译FDL/bootloader (11)
4.8编译NV (11)
4.9编译MMI Resource 文件 (12)
4.10编译PC模拟器工程 (12)
5其它编译命令 (15)
5.1编译Logel工具 (15)
5.2pclint 扫描 (15)
5.3编译完成net send提醒功能 (15)
5.4编译命令的简写 (15)
5.5多线程编译 (15)
5.6分布式编译 (16)
5.7编译出错暂停 (16)
5.8生成编译选项 (16)
6Makefile 工作流程 (17)
6.1重要脚本 (17)
6.2Makefile 执行流程 (18)
6.3两种编译方式 (19)
7模块修改及项目定制 (21)
7.1添加或删除模块 (21)
7.2修改模块 (21)
7.3创建新项目 (22)
7.4修改项目Feature Options (23)
8第三方编译选项说明 (24)
9相关使用技巧 (25)
9.1查看log文件 (25)
9.2makefile 报错:No rule to make target ` XXX ', needed by `yyy'. (25)
9.3makefile 报错:Can't return outside a subroutine at ./make/perl_script/sprd_macro_check.pl line XXX (25)
9.4Source Insight和ClearCase配置 (25)
9.5鼠标右键命令行快捷方式设置 (28)
9.6DOS下输入命令时用Tab键进行命令自动填充 (28)
1 说明
Build环境中实现了项目开发和维护使用的GNU标准应用脚本,基于这些应用脚本和相关make工具,Build环境可以完成项目全部代码的编译和二进制文件的生成,同时在此环境中可以通过脚本执行的方式产生其他软件以及开发工具,如fdl, bootloader, nv_parameter,resource等。
Build环境的相关命令脚本需要在Windows Command环境下进行,因为每个项目工程编译出来的中间依赖文件都独立存放,所以可以通过开启多个Windows Command窗口对多个不同的项目进行同时编译。
2 编译环境及相关软件
操作系统:建议Windows 2000 professional 或windows XP SP3 版本
编译工具:ADS V1.2 (ARM Developer Suite) patch848 is fully ready
RVDS V3.1(Realview Devloper Suite) is under evaluation
Microsoft Visual C++ 6.0 SP6
ADS patch版本的查看方法见下图:
其他工具:Microsoft Excel 2000 或者Microsoft Excel 2003 或者WPS 2005及以上版本
3 Source Code目录结构
Build环境目录结构
└─MS_Code
├─build 编译结果的输出总目录,此目录下内容在编译过程中生成
│├─8801h_s3b_builddir 与具体项目名称对应,自动生成的输出目录
││├─dep 编译依赖文件存放目录
││├─img编译最终结果存放目录,包括arm bin,fdl,bootloader,
│││resource,nv等
││├─lib 客户编译模块.a存放目录
││├─log 编译log文件目录,包括编译出错信息、告警信息等
││├─fdl_bootloader 编译生成的fdl bootloader文件目录
││├─res 编译生成的resource文件目录
││├─pclint 编译生成的pclint文件目录
││├─tmp 编译生成的临时文件目录
││└─obj 模块目标文件存放目录
││└─win 自动生成模拟器工程存放目录
│└─sc6600l_sp6601l_builddir
├─chip_drv Source Code
├─MS_Ref Source Code
├─PS
├─atc
├─common
│├─nv_parameters 统一NV project存放目录
│└─source 目标统一main.c存放目录
├─make 依据编译选项文件,makefile将自动搜寻该目录并循环|
对模块进行编译
│└─aac
│└─aac.mk 对应模块的编译脚本
| …
|
├─MS_Customize
│├─config
│├─custom
│└─product 区分不同产品驱动配置文件
├─version 目标统一版本version.c
├─MS_MMI
├─Third-party 第三方软件库文件和头文件存放位置
│└─bt_csr
│├─include
│└─lib
├─lib 展讯开放库文件目录存放地和build目录分开
├─fdl_bootloader fdl bootloader 存放目录
Build环境的关键目录如上图所示,所有相关代码和脚本都统一集中在MS_Code目录下,下面将对特殊的目录做些详细的说明:
1) build目录
bulild目录及其下的相关内容在程序编译过程中自动生成,对于特定的项目,build目录会生成projectname_builddir目录,并在该目录下自动生成dep、img、lib、log、nv、tmp及obj等目录。
2) make目录
make目录存放和模块对应的编译脚本,子目录和模块呈一一对应关系,各个子目录中存放着和目录名称对应的脚本文件。
一旦有了新添的模块源文件或删减,相关脚本需要进行修改。
同样,如果有了新增的模块,则需要在make目录下建立新的模块子目录。
相关过程在后面会有更详尽的描述。
3) MS_Customize目录
和项目相关的scatter file文件存放在MS_Customize目录中,需要注意该文件名称需要和项目名称保持一致。
4) version目录
version目录中存放项目相关的version.c文件,目前需要注意该文件名称需要和项目名称保持一致。
.
4 基本编译命令
Build的所有操作命令都要在Windows Command 下执行,并且需要在关键脚本的当前路径,即MS_Code目录下完成输入。
示例如下:
在编译项目时,会使用类似make PROJECT=projectname 命令,这里projectname必须和项目编译脚本的名称保持一定的对应关系,否则系统会报:
Project defined Makefile project_projectname.mk is not exist!
这样的错误。
如项目编译脚本文件名为project_8801h_s3b.mk,则projectname的内容为8801h_s3b,因此我们可以执行如下的命令来实现编译:
make PROJECT= 8801h_s3b
4.1 全新编译整个项目[new]
通过命令行工具在项目目录MS_Code下输入命令make PROJECT=projectname new,该命令将清除编译过程中生成的全部目标码和库文件,然后对projectname所指定的项目进行整体编译并在没有错误出现的情况下完成最终的链接,编译过程中会自动生成依赖关系。
会这一命令适合在项目进行了较大修改:比如公共头文件数据结构发生变化、公共接口参数发生变化、文件更新中时间戳混乱或makefile相关脚本被修改等等情况下建议使用这一命令,确保重新对项目进行完全编译得到正确的输出结果。
这个命令也会将fdl,bootloader,NV ,Resource同时编译出来。
该命令相当于运行如下3个命令
make PROJECT=projectname cleanall
make PROJECT=projectname MODULES=resource
make PROJECT=projectname update
4.2 更新项目[update]
通过命令行工具在项目目录MS_Code下输入命令make PROJECT=projectname 或make
PROJECT=projectname update命令,makefile根据已有的依赖关系编译因修改涉及到的相关的模块并在没有错误出现的情况下完成最终的链接,若不存在依赖关系,makefile 会在编译文件时自动生成依赖关系。
因为只编译较少的模块文件,可以节省编译时间。
这个命令也会将fdl,bootloader,NV 同时编译出来。
4.3 单独编译模块
通过命令行工具在项目目录MS_Code下输入命令make PROJECT=projectname MODULES=”module1 module2 …” update,该命令将对指定模块进行编译,但不会编译完成后进行自动链接。
该命令属于模块开发人员最常用的命令,在具体模块开发中需要经常使用该命令来验证模块的编译完整性。
4.4 清除模块编译结果
通过命令行工具在项目目录MS_Code下输入命令make PROJECT=projectname MODULES=”module1 module2 …” clean,该命令将清除指定模块的编译输出结果,其中包含指定模块的目标文件和库文件。
该命令适合在指定模块内部出现重大修改或者模块本身makefile脚本被修改,在进行模块编译前使用。
4.5 清除所有编译结果[cleanall]
通过命令行工具在项目目录MS_Code下输入命令make PROJECT=projectname cleanall,该命令将清除编译过程中生成的全部目标码和库文件。
4.6 生成可执行文件
通过命令行工具在项目目录MS_Code下输入命令make PROJECT=projectname image可以进行链接生成相关的可执行文件,该命令可以在模块修改并编译完成后进行,也适合第三方库文件更新后进行。
4.7 编译FDL/bootloader
通过命令行工具在项目目录MS_Code下输入命令make PROJECT=projectname MODULES=bootloader对bootloader编译
通过命令行工具在项目目录MS_Code下输入命令make PROJECT=projectname MODULES=fdl1对fdl1进行编译。
通过命令行工具在项目目录MS_Code下输入命令make PROJECT=projectname MODULES=fdl2对fdl2进行编译。
通过命令行工具在项目目录MS_Code下输入命令make PROJECT=projectname MODULES=nor_fdl对nor_fdl 进行编译。
输出结果位置:build/projectname_builddir/fdl_bootloader.同时会自动将最终的bin文件copy 到
build/projectname_builddir/img 下,方便下载到手机中。
您也可以根据工程具体情况用一条命令编译出所有目标,示例如下:
make PROJECT="rocky_6901" MODULES="fdl1 fdl2 bootloader"
make PROJECT="8801h_s3b" MODULES="nor_fdl"
4.8 编译NV
通过命令行工具在项目目录MS_Code下输入命令make PROJECT=projectname MODULES=nv_parameter 对nv_parameter编译
输出结果位置:build/projectname_builddir/nvm。
同时会自动将最终的bin文件复制到
build/projectname_builddir/img。
注意:
1. make/nv_parameter/nv_parameter.mk 是NV的makefile文件
make/nv_parameter/config_info.nv 为NV 的配置文件
2.如果希望单独修改项目某项NV参数,例如希望修改nv_type.nvm某项,应该在使用make指令编
译出NV项目文件之后使用NVEDITOR工具编译保存。
4.9 编译MMI Resource 文件
通过命令行工具在项目目录MS_Code下输入命令make PROJECT=projectname MODULES= resource 对Resource编译。
输出结果位置:build/projectname_builddir/res。
同时会自动将最终的映像文件复制到
build/projectname_builddir/img目录。
默认情况下编译Resource 使用了主工程中的Feature Options 转义宏和app.mk 模块中的宏,如果您的项目资源编译需要使用其他的模块的宏,请修改resource.mk文件。
注意:
1)当前不能正确支持多个项目工程的资源并行编译
2)编译资源文件需要工具脚本支持,如果环境不完整会导致编译过程停止
3)修改make\perl_script\ResGen\ResView.ini 中配置项[CustStrTable] ,可支持多个字符资源文件:
如:
[CustStrTable]
1=cust_str_table_01.xls
4.10 编译PC模拟器工程
●编译Win32模拟器工程的步骤
1)通过makefile 自动生成模拟器工程dsw文件;
生成模拟器工程时一些配置信息(skin,resource,sim)文件 MSSimCfg.ini, SIMTest.ini会自动生成并存放到win\bin文件夹下;模拟器 msdev工具也会从MS_MMI 里 Copy 一份到这个文件夹中。
使用类似如下的命令可在该工程的build 临时文件夹的win 下生成对应的所有.dsp ,dsw 文件
make PROJECT=sc6600l_sp6601l MODULES=simulator
2)编译模拟器;
用VC6 打开 win/simulator.dsw 文件,设置 msdevkernel 为 Active Project, 编译完成后 msdevkernel.dll 会生成到win/bin 目录下
3)运行模拟器;
双击win/bin 目录下的 msdev.exe即可。
●功能说明:
通过对 MOCOR 平台 makefile 工程文件分析,取得要编译的文件列表,宏,搜索路径等信息后自动生成对应的 VC dsp 工程文件和一个 simulator.dsw 的工作空间文件,执行simulator.dsw 就可以编译出模拟器使用的.dll文件.
●文件说明:
simulator.mk (make/simulator/simulator.mk)
指示模拟器需要使用的模块列表,特别指定的编译宏列表,及完成生成模拟器的所有工作
simulator.ini (make/simulator/simulator.ini)
配置文件,用来指示模拟器工程与make工程在文件,宏,搜索路径的差异。
其中msdevkernel 为总dsp 文件,模拟器工程需要的所有lib文件如第三方.lib文件等都要加到这个工程中。
该文件支持代码宏,示例如下:
#ifdef PLATFORM_SC6600L
chip_drv += chip_drv/source/c/ivsp_drv_6600l.c
#endif
simulator.ini 说明:
[ADD_INC_PATH]
用来指示除makefile对应工程的搜索路径外,dsp工程中还需要增加的搜索路径
[DEL_INC_PATH]
用来指示在makefile对应工程的搜索路径中需要删除的搜索路径
[ADD_OPTION]
用来指示除makefile对应工程的搜索路径外,dsp工程中还需要增加的编译宏
注意:宏列表需要用""来引起来,如 app = "USB_WEBCAMERA_SUPPORT USB_LOG"
[DEL_OPTION]
用来指示在makefile对应工程的编译宏中需要删除的宏
注意:宏列表需要用""来引起来,如 rtos="_RTOS WIN32 _DEBUG _MBCS _LIB _RTOS _ENABLE_LOG_TOOL"
[ADD_FILE]
用来指示除makefile对应工程的文件外,dsp工程中还需要增加的文件
[DEL_FILE]
用来指示在makefile对应工程的文件中需要删除的文件,如果具体某个模块的值为 * 则表示这个模块的所有文件都删除
[REPLACE_FILE]
用来指示在makefile对应工程的文件中路径的替换
使用技巧:
部分软件模块实现方式在模拟器和目标硬件环境不一致,可以参考如下样例修改兼容两种平台的编译:
1.平台目标硬件端JPG为硬解码,模拟器上怎么办?:
simulator.mk 中对 macro_set 赋值
ifeq ($(strip $(JPG_DEC_SUPPORT)), JPG_HW)
macro_set += JPG_DEC_SUPPORT=JPG_SW
endif
ifeq ($(strip $(JPG_ENC_SUPPORT)), JPG_HW)
macro_set += JPG_ENC_SUPPORT=JPG_SW
endif
simulator.ini 修改如下:
[DEL_OPTION]
global = ""
#if defined(JPG_DEC_SUPPORT_JPG_HW)
global += "JPG_DEC_SUPPORT_JPG_HW"
#endif
#if defined(JPG_ENC_SUPPORT_JPG_HW)
global += "JPG_ENC_SUPPORT_JPG_HW"
#endif
[ADD_OPTION]
global = "WIN32 _DEBUG _MBCS _LIB THREADX_OS _RTOS"
#if defined(JPG_DEC_SUPPORT_JPG_HW)
global += "JPG_DEC_SUPPORT_JPG_SW"
#endif
#if defined(JPG_ENC_SUPPORT_JPG_HW)
global += "JPG_ENC_SUPPORT_JPG_SW"
#endif
2.目标硬件板上已完成的功能但模拟器上还没有调好,怎么先禁掉该功能?
simulator.mk 中对 macro_set 赋值
ifeq ($(strip $(CMMB_SUPPORT)), TRUE)
macro_set += CMMB_SUPPORT=FALSE
endif
simulator.ini 修改如下
[DEL_OPTION]
global = ""
#if defined(CMMB_SUPPORT)
global += "CMMB_SUPPORT"
#endif
5 其它编译命令
5.1 编译Logel工具
通过命令行工具在项目目录MS_Code下输入命令make PROJECT="8801h_s3b" MODULES="logel" clean update对logel工具进行编译。
注意,编译这个工具需要perl 5.8 。
注意:SPRD 客户无法使用该命令
5.2 pclint 扫描
通过命令行工具在项目目录MS_Code下输入命令make PROJECT="8801h_s3b" pclint对全部模块代码进行pclint 扫描。
输入make PROJECT="8801h_s3b" MODULES=”app gui ps” pclint 对指定的模块代码进行pclint 扫描。
5.3 编译完成net send提醒功能
通过命令行工具在项目目录MS_Code下输入命令
make PROJECT="8801h_s3b" ip=192.168.0.1
make PROJECT="8801h_s3b" ip=pcname
当代码编译完成时,会自动向指定的IP地址或机器名发一个net send 消息,说明该工程编译是否成功。
注意,这个命令只在生成image 后才调用,单独编译某个模块并不生成image 时并不会调用。
5.4 编译命令的简写
make PROJECT=8801h_s3b MODULES=”app gui ps”
可以简写为
make p=8801h_s3b m=”app gui ps”
make PROJECT=8801h_s3b new
可以简写为
make p=8801h_s3b new
5.5 多线程编译
Build环境支持多线程编译,可以充分利用多核CPU 的优势,加快编译速度,必须通过显式的方式指定开启线程数:
make p=8801h_s3b new job=<模块内开启线程数>
make p=8801h_s3b new job=<模块内开启线程数> -j<同时并发编译的模块数>
<模块内开启线程数> 表示编译时同时启动线程个数,建议不要超过CPU 核心数。
<同时并发编译的模块数> 建议不要超过4.示例如下:
make p=8801h_s3b new job=8
make p=8801h_s3b new job=8 –j4
5.6 分布式编译
Build环境支持 Xoreax IncrediBuild 分布式编译,可以充分利用网络优势,加快编译速度.只需要在正常的编译指令后增加ib=1 即可:
make p=8801_s3b new ib=1
分布式编译支持依赖关系,所以当您执行make p=8801h_s3b m=app update ib=1 时,会重新编译所有app模块文件.另外如果您的代码中的文件位置有变动时,编译时请将涉及的模块先使用clean命令清理中间依赖文件,然后再编译,否则有可能出现找不到相关文件而无法编译的问题。
跟Xoreax IncrediBuild工具有关,此命令可能工作不正常。
5.7 编译出错暂停
默认情况下,编译出错后将继续编译,并不听停下来。
如果您需要makefile 支持编译出错暂停功能,请使用stop参数编译,并赋值为1。
命令示例如下:
make p=8801h_s3b stop=1 new
遇到异常时脚本会调用DOS下的Pause命令,用户敲任意键会继续编译,如果需要强行推出需要敲Control+C.
目前停止的方式是调用DOS的 Pause,按任意键会继续编译,如果需要强行推出,需要按 Control+C.
5.8 生成编译选项
MOCOR平台可以通过命令行方式获得宏/搜索路径/文件清单的定义,方便与其他工具集成或调试用.
1.获得整个工程的宏
make p=8801h_s3b options
2.获得某模块的宏
make p=8801h_s3b m=app options
make p=8801h_s3b m="app mmk" options
3.生成的宏定义文件可在如下地址获得:
MS_Code\build\<project-name>_builddir\options
6 MAKEFILE 工作流程
6.1 重要脚本
在MS_Code目录下存放有Makefile.rules、Makefile.modules、<PLATFORM>.modules 、Makefile以及项目编译脚本,比如project_8801h_s3b.mk等等,同时在make目录的各个子目录下存放有各个模块的make脚本,即模块编译脚本,比如aac.mk、app.mk等等。
一般情况下开发人员仅维护项目编译脚本即可,Makefile.rules、Makefile.modules和Makefile不需要修改。
针对模块和项目的变化,开发人员需要修改模块编译脚本和增加新的项目编译脚本。
下面将针对
Makefile.rules、Makefile.modules和Makefile进行简单的说明,关于模块编译脚本和项目编译脚本将在后面的章节中详细描述。
注:<PLATFORM>.modules 文件仅在maintrunk 版本中存在,在mocor_09a 中,该文件内容包含在Makefile 文件中。
Makefile.rules
Makefile.rules中定义了绝大部分平台无关、模块无关以及项目无关的公共变量及公共函数,其中包括编译器的指定、公共编译参数CFLAGS、AFLAGS的定义、文件复制、删除、目录创建等系统命令、公共头文件路径、SPRD 库路径以及第三方库文件路径等变量的定义。
请根据您的机器上的软件情况进行相应修改。
Makefile.modules
Makefile.modules定义了真正的编译指令及依赖关系,一般开发中不需要维护该文件,这里需要指出的是:目前有部分模块采用了armcc编译器(比如:mpeg4_codec),对于这部分模块需要在Makefile.modules中申明,具体操作可以参考该文件中已经被申明的相关模块部分。
对分布式编译(Xoreax IncrediBuild),将include make/perl_script/modules.pl。
<PLATFORM>.modules
<PLATFORM>.modules定义了项目需要编译的开放模块列表,非开放模块列表,参与连接.a 文件列表等信息。
Makefile.third-party
Makefile.third-party 将第三方逻辑独立成一个文件,便于维护,这个文件会被include 到各工程.mk 中. Makefile.verify
Makefile.verify 对makefile中的宏的父子关系进行校验,防止出错.另外转义的编译宏也在这个文件中生成。
Makefile
Makefile是最上层的总控脚本,该脚本直接处理用户的命令,并执行相关的处理,在没有特殊需要的情况下用户不需要维护该文件。
6.2 Makefile 执行流程
You need to type “make PROJECT=XXX new” in windows command to tell make which project to make.We will show a simple pseudo-code that describes makefile work flow .
Makefile
include Makefile.rules
ARM compiler setting
Common compiler options setting
Bash commands setting
public function setting
makefile location setting
include project_$(PROJECT).mk
Feature options setting
include Makefile.verify
Parent-child relationships of feature options
Get public MACRO
include Makefile.third-party
Setting third-party modules to variable 3RD_LIBS
include <PLATFORM.modules>
Set variable:
INDEPENDENT: value specified for external makefile
EXPORTLIBS: value specified for sprd modules list
COMPLIBS_DBG: value specified for modules list of open source
LINKLIBLIST: value specified for all .a list using for armlinking
MKLIBLIST = $(foreach comp,$(EXPORTLIBS) $(COMPLIBS_DBG), \
$(if $(findstring $(comp),$(INDEPENDENT)),$(comp).indep, $(comp).a)) image: $(MKLIBLIST) $(3RD_LIBS)
-$(LINK) $(LINKLIBLIST) -o
$(BUILD_DIR)/img/$(AXFFILENAME)
%.indep:
@$(MAKE) -f make/$*/$*.mk -I ./$(BUILD_DIR)/dep/$* %.a:
@$(MAKE) -f Makefile.modules -I ./$(BUILD_DIR)/dep/$* \
-k -r -R COMPONENT=$*
6.3 两种编译方式
从以上的简单流程中可以看出,MOCOR 平台项目的所有模块和工具目前采用两种方式编译。
1.独立的软件和工具编译方式
目前采用独立的makefile编译的软件或者工具模块有: fdl1, fdl2, bootloader, nv_parameter, resource, simulator 等。
这些模块或功能对应的make/module_name/module_name.mk 本身已经是一个完整的makefile文件,make直接调用执行。
方法是将模块名添加到INDEPENDENT 列表中。
采用独立编译的软件模块一般是实现一定的功能,并不一定有.a 文件生成,此方法对应6.2 中的%.indep目标。
# independent compile
INDEPENDENT= fdl1 fdl2 bootloader nor_fdl logel simulator resource nv_parameter pclint
编译方式为:make PROJECT=projectname MODULES=bootloader
注意:
如果该makefile 中需要使用总工程中宏信息和公共变量定义,请按如下方式包含文件。
以下四行是必须的,并且要保持如下顺序。
include Makefile.rules
include ./project_$(PROJECT).mk
include Makefile.verify
include Makefile.rules
2.主编译方式
绝大部分的模块都是通过这种编译方式来完成编译的。
这种编译方式使用一致的依赖关系生成方法,统一控制编译的行为。
对应的make/module_name/module_name.mk 文件并不是一个完整的makefile 文件,一般其中只包含编译需要的宏列表,文件列表,搜索文件路径,其他都由框架自动完成。
依赖关系文件存放于MS_Code\build\projectname_builddir\dep 下。
此方法对应6.2 中的%.a目标。
每个项目工程在编译的时候,脚本会自动将Feature Options 部分转义成真正的代码中使用的宏传给相应的子模块,在对子模块代码编译的时候,自动附加上这些宏。
转义的规则如下:
●对功能开关型的Feature Options ,当Feature Options 为TRUE 时转义,为FALSE时不转义
NANDBOOT_SUPPORT = TRUE ### Boot From Nandflash Support:
# Option1:TRUE
# Option2:FALSE
上面的定义会产生转义宏-DNANDBOOT_SUPPORT传递给各个子模块
●对功能枚举型的Feature Options ,将Feature Options 的名字和值拼接起来转义成一个宏,同时对
非空的值,同时转义一个Feature Options 名字的宏。
SUBLCD_SIZE = 96X64 ### Resolution Of Main LCD
# Option1:NONE #define SUBLCD_SIZE_NONE
# Option2:96X64 #define SUBLCD_SIZE_96X64
上面的定义会产生转义宏-DSUBLCD_SIZE_96X64和-DSUBLCD_SIZE传递给各个子模块
转义函数在Makefile.rules 中定义,在Makefile.verify 中调用,转义结果存放在全局变量中
C_MACRO ( for C language)
A_MACRO (for Assebly language)
注意:
Makefile.rules 文件中变量filter-out_macro 记录了不需要转义成编译宏的一些makefile变量,其中一些是编译时的命令行参数。
如果项目增加了额外的命令行参数,请考虑是否在转义宏时将其过滤掉(如果是客户版本,检测SPRD宏时有可能不通过).。
7 模块修改及项目定制
这里涉及到前面谈到的关键脚本的修改,在大多数情况下开发人员针对模块或者项目的需要只需修改和补充两类的关键脚本:模块编译脚本和项目编译脚本。
在此,我们把出现在Build环境中的最小编译单位称为模块,Build系统中将以MS_Code/make目录下的各个子目录名称作为约定的模块名称,这些子目录和各自的功能模块之间呈一一对应的关系。
7.1 添加或删除模块
●修改相应<PLATFORM>.modules文件中变量EXPORTLIBS或者COMPLIBS_DBG,添加或删除指定的模
块
EXPORTLIBS = audioservice agc_exp aud_algorithm bsd custom_tone char_lib \ digitalgain dsp_codec dtmf_tone dv eq_exp generic_tone \
layer1 layer1_dsp img_proc display l4 \
mpeg4_codec main ps record rtos \
sfs scaling transsamplerate daps parser \
voice vsp spml
COMPLIBS_DBG = app custom_drv chip_drv gui mmk Ucom ubot upcc version aud_dev \ aud_config scp scm atc refbase dc \
sim mmk_sys caf_templete caf_interface utility isp_service \
!nor_fdl !nv_parameter
某个模块应该放在EXPORTLIBS中进行声明或放在COMPLIBS_DBG声明,取决于该模块对客户的提供方式。
其中在EXPORTLIBS中申明的模块表明这些模块将采用库文件的方式提供给客户,而COMPLIBS_DBG的模块则表明会提供全部的源代码供客户进行开发。
对于客户自己新增加的模块,则只能在COMPLIBS_DBG变量中申明。
对于nvparameter、fdl1、fdl2、bootloader等是一些辅助的文件,只编译出来即可,不需要参与连接,则只需要在对应模块前紧加上“!”符号即变
成!nvparameter !fdl1 !fdl2 !bootloader 就可以将这些模块排除在项目的连接之外。
如果需要在项目中增加新的模块,则只需要在将该模块名称列举到这个序列中,用空格和其他模块分隔开即可。
注意:“\”符号后面应该紧接换行符而不能跟有空格,这个序列中的最后一个模块不能再带有“\”符号。
●添加或删除模块对应的 .mk 脚本
若有新模块需要添加到Build系统中,需要在MS_Code/make目录下同时建立对应该模块的子目录,同时在该目录下完成和目录名称一致并以“.mk”为后缀结尾的模块编译脚本,该脚本的主要任务是完成:MCFLAG_OPT、MINCPATH、MSRCPATH以及SOURCES(模块中有需要编译汇编文件的情况下还有MASMFLAG_OPT)的定义,编写方法同前面的7.2.1—7.2.3小节。
若有模块需要删除,删除MS_Code/make目录下对应该模块的子目录即可。
7.2 修改模块
●模块目录结构调整
如果模块内部存储目录结构或者模块整体相对目录发生改变,则需要修改模块相应的模块编译脚本并修改变量MSRCPATH,这里以模块aac为例:
在make/aac.mk中定义了:
MSRCPATH = MS_Ref/codec/aac/src MS_Ref/codec/aac/src/decoder
这里MSRCPATH用来定义该模块源文件的搜索路径,如果该模块中源文件的路径发生了变化,就需要重新定义MSRCPATH,确保模块编译需要的文件都包含在了搜索路径中。
如果涉及到头文件路径出现变化则需要重新定义变量MINCPATH,以确保模块使用到的头文件完全被包含在了头文件定义路径之中。
以aac.mk为例,其MINCPATH变量定义如下:
MINCPATH = MS_Include/chip_drv MS_Ref/codec/aac/inc MS_Ref/codec/aac/src/decoder \
MS_Ref/codec/aac/src/aac_plus_inc
注:这里MSRCPATH和MINCPATH的相对路径都是以MS_Code作为上级目录而言的,所以需要按照这一约定给出源文件或头文件完整的相对路径。
●添加或删除文件
如果模块编译文件有添加或删除的需要,则需要修改变量SOURCES,可以将增加的文件直接添加在原有的定义之后,如果是需要删除,则可以直接从定义中拿掉。
以aac.mk为例,其SOURCES定义如下:
SOURCES = aac_adp.c aac_lc_decoder.c bits.c cfft_tab.c common.c \
decoder.c filtbank.c huffman.c id3_parse.c \
is.c mp4.c mp4atom.c mp4ff.c mp4sample.c mp4util.c ms.c pns.c pulse.c \
specrec.c syntax.c tns.c internal_var.c
这里需要强调转意符\的用法,\在这里表示续行,在\后不能有空格出现,在最后一个文件后(这里为internal_var.c)不应该再出现该符号。
●修改编译选项
有时为了适应不同平台或者产品的需求,模块编译选项会发生变化,这时需要修改变量MCFLAG_OPT,通过不同的编译选择来满足需要,以aac.mk为例,其MCFLAG_OPT定义如下:
MCFLAG_OPT = -Otime -zc -D_AACARM_
这里的-Otime –zc属于该模块需要的编译器特殊选项,关于编译其他选项在前面的Makefile.rule中有描述,请参考Makefile.rule中CFLAGS的定义。
这里宏“_AACARM_”则属于模块自身的特殊选项。
针对不同项目的需要MCFLAG_OPT可以在这里进行相应的修改。
注意:对于“_AACARM_”这类模块内部定义的编译选项,需要在前面加上“-D”以示为编译选项。
7.3 创建新项目
●创建全新的项目
1.在MS_Code目录下创建一个新的项目编译脚本,该脚本的命名规则必须是前缀“project_”+“项目名称”+文件后缀“.mk”的形式,比如项目名称为abcd,则相应的项目编译脚本名称必须是project_abcd.mk。
2.在\MS_Code\MS_Customize\source\product\config目录下创建以projectname 为名的文件夹,并初始化好所有的项目定制文件并注意修改make\custom_drv\custom_drv.mk
3.修改project_ projectname.mk 中的PRODUCT_CONFIG 变量值指定为“projectname”,如 abcd
4.在\MS_Code\MS_Customize下创建编译其需要的scatter file文件
5.在\MS_Code\Version目录下创建相应的项目版本文件(version.c)
6. 修改\MS_Code\make\resource\resource.mk指定资源路径
7.修改\MS_Code\make\nv_parameter\nv_parameter.mk 指定NV配置文件
复制方式创建项目
为了加快创建工程文件的过程,您可以基于一个已有的一个工程文件,复制后改一个名字基本就可以编译通过了,在这个基础上配置您想要的工程配置。
当您通过复制方式创建一个新工程时,请考虑以下几项信息:
1.请确认新工程中 PRODUCT_CONFIG 指定的目录是否需要修改,是否需要创建一个新的驱动文件集;
2.请确认新工程中 PRODUCT_BASELIB_DIR 指定的非开放模块.a目录名是否需要修改;
3.请确认新工程的nv是否需要修改,检查nv_parameter.mk 文件是否满足您的需要;
4.请确认新工程的Resource是否需要修改,检查resource.mk 文件是否满足您的需要;
5.请确认是否为新工程创建一个新的scatter file文件
7.4 修改项目Feature Options
修改项目功能开关相关的编译选项时请注意:
1. 只有主Makefile中的“Feature Option(User Customized)”区域的宏开关,可以自行开关
2. 任何非原则1中的宏开关(包括子makefile, 代码中),用户均不可自行修改。
如要更改,必须通知展讯CPM,由展讯修改宏并重新编译版本发给客户,并且如果修改将导致编译错误:
Can't return outside a subroutine at ./make/perl_script/sprd_macro_check.pl line XXX
不同的项目可以按项目需要对上述变量进行相关修改。
与此同时,不同的项目或平台需要选择不同的第三方库文件参与链接,所以有必要修改文件Makefile.third-party。