搜档网
当前位置:搜档网 › Build_Environment_Manual

Build_Environment_Manual

Build_Environment_Manual
Build_Environment_Manual

Build环境使用手册

Version: 0.2. 1

2010-4-22

https://www.sodocs.net/doc/05125349.html,

修订历史

重要声明

版权声明

本文档中的任何内容受《中华人民共和国著作权法》的保护,版权所有 ? 2006, 展讯通信有限公司,保留所有权利,但注明引用其他方的内容除外。

商标声明

本文档中展讯通信有限公司的产品的所有商标是展讯通信有限公司专有,但注明属于其他公司拥有的商标除外。在提及其他公司及其产品时将使用各自公司所拥有的商标,这种使用的目的仅限于引用。

不作保证声明

展讯通信有限公司不对此文档中的任何内容作任何明示或暗示的陈述或保证,而且不对特定目的的适销性及适用性或者任何间接、特殊或连带的损失承担任何责任。

保密声明

本文档(包括任何附件)包含的信息是保密信息。接收人了解其获得的本文档是保密的,除用于规定的目的外不得用于任何目的,也不得将本文档泄露给任何第三方。

目录

1说明 (6)

2运行环境 (7)

2.1编译环境及安装相关软件 (7)

3编译方式 (8)

4目录结构及主要脚本 (10)

4.1Build环境目录结构 (10)

4.2重要脚本 (11)

4.2.1Makefile.rules (11)

4.2.2Makefile.modules (11)

4.2.3Makefile.third-party (11)

4.2.4Makefile.verify (11)

4.2.5Makefile (11)

5基本命令 (12)

5.1帮助 (12)

5.2编译参数中 projectname 与项目编译脚本对应关系 (12)

5.3编译整个项目[update] (12)

5.4重新编译整个项目[new] (13)

5.5清除所有编译结果[cleanall] (13)

5.6清除模块编译结果 (13)

5.7编译模块 (13)

5.8生成可执行文件 (13)

5.9编译FDL/bootloader (13)

5.10编译NV (14)

5.11编译MMI Resource 文件 (14)

5.12编译PC模拟器工程 (14)

6其它命令 (17)

6.1编译Logel工具 (17)

6.2pclint 扫描 (17)

6.3编译完成net send提醒功能 (17)

6.4编译命令的简写 (17)

6.5多线程编译 (17)

6.6分布式编译 (17)

6.7编译出错暂停 (18)

7模块修改及项目定制 (19)

7.1模块修改 (19)

7.1.1模块目录结构调整 (19)

7.1.2添加或删除文件 (19)

7.1.3修改编译选项 (19)

7.1.4新增模块 (20)

7.2项目定制 (20)

7.2.1创建全新的项目编译脚本 (20)

7.2.2复制方式创建项目编译脚本 (20)

7.2.3添加或删除模块 (20)

7.2.4修改项目编译选项 (21)

7.2.5客户发布及使用 (21)

8第三方编译选项说明 (22)

9相关使用技巧 (23)

9.1查看log文件 (23)

9.2makefile 编译过程中报错: No rule to make target ` XXX ', needed by `yyy'. (23)

9.3Makefile 中全局变量和转义宏的区分 (23)

9.4Source Insight和ClearCase配置 (23)

9.5鼠标右键命令行快捷方式设置 (26)

9.6DOS下输入命令时用Tab键进行命令自动填充 (26)

1 说明

Build环境中实现了项目开发和维护使用的GNU标准应用脚本,基于这些应用脚本和相关make工具, Build环境可以完成项目全部代码的编译和二进制文件的生成,同时在此环境中可以通过脚本执行的方式产生其他软件以及开发工具,如 fdl, bootloader, nv_parameter,resource等。

Build环境的相关命令脚本需要在Windows Command环境下进行,因为每个项目工程编译出来的中间依赖文件都独立存放,所以可以通过开启多个Windows Command窗口对多个不同的项目进行同时编译。

2 运行环境

2.1 编译环境及安装相关软件

操作系统:建议 Windows 2000 professional 或 windows XP SP3 版本

编译工具:ADS V1.2 (ARM Developer Suite) patch848 is fully ready

RVDS V2.2(Realview Devloper Suite) is under evaluation

Microsoft Visual C++ 6.0 SP6

ADS patch版本的查看方法见下图:

其他工具:Microsoft Excel 2000 或者 Microsoft Excel 2003 或者 WPS 2005及以上版本

3 编译方式

项目的所有模块和工具目前采用两种方式编译。

1.独立的软件和工具编译方式

目前采用独立的makefile编译的软件或者工具模块有:

●fdl1

●fdl2

●bootloader

●nv_parameter

●resource

●logel

●simulator

●pclint

这些模块或功能对应的 make/module_name/module_name.mk 本身已经是一个完整的makefile文件,make工具可以直接执行。目前实现方式是在项目的工程文件中,将这些模块的列表对INDEPENDENT 赋值,指示这些模块需要单独编译。采用独立编译的软件模块一般不参与项目主工程的链接。

# independent compile

INDEPENDENT= fdl1 fdl2 bootloader nor_fdl logel simulator resource

编译方式为:make PROJECT=projectname MODULES=bootloader

注意:独立编译的模块,通过这种方式调用只能执行默认的最终目标。

2.主编译方式

绝大部分的模块都是通过这种编译方式来完成编译的。这种编译方式使用一致的依赖关系生成方法,统一控制编译的行为。对应的 make/module_name/module_name.mk 文件并不是一个完整的makefile 文件,一般其中只包含编译需要的宏列表,文件列表,搜索文件路径即可,其他都由框架自动完成。

每个项目工程在编译的时候,会自动将Feature Options 部分转义成真正的代码中使用的宏传给相应的子模块,在对子模块代码编译的时候,自动附加上这些宏。转义的规则如下:

●对功能开关型的 Feature Options ,当Feature Options 为TRUE 时转义,为FALSE时不转义

export NANDBOOT_SUPPORT = TRUE ### Boot From Nandflash Support:

# Option1:TRUE

# Option2:FALSE

上面的定义会产生转义宏 -DNANDBOOT_SUPPORT传递给各个子模块

●2对功能枚举型的 Feature Options ,将 Feature Options 的名字和值拼接起来转义成一个宏,同时对

非空的值,同时转义一个Feature Options 名字的宏。

export SUBLCD_SIZE = 96X64 ### Resolution Of Main LCD

# Option1:NONE #define SUBLCD_SIZE_NONE

# Option2:96X64 #define SUBLCD_SIZE_96X64

上面的定义会产生转义宏-DSUBLCD_SIZE_96X64和-DSUBLCD_SIZE传递给各个子模块

转义的宏临时文件存放在如下变量中

C_MACRO ( for C language)

A_MACRO (for Assebly language)

Makefile 文件中变量 filter-out_macro 记录了不需要转义成编译宏的一些makefile变量,其中一些是编译时的命令行参数。如果项目增加了额外的命令行参数,请考虑是否在转义宏时将其过滤掉 (如果是客户版本,检测SPRD宏时有可能不通过).。

3. 编译的依赖关系

在主编译方式中,系统会自动生成依赖关系文件,这些依赖关系文件存放在

MS_Code\build\projectname_builddir\dep 下。

注意:

●makefile中的配置文件 Makefile.rules 没有作为依赖,若其内容改变,需全新编译工程.

●对编译后生成的 .a 文件及其相应的依赖文件,这些文件默认都有固定的存放位置,没有特别需求,请

不要改变,否则有可能造成编译依赖错误,导致出现问题.

4.编译命令最大长度 8Kbytes限制

Windows 环境最大只支持8Kbytes长度的命令,所以需要控制宏的数量以搜索目录的数量或改进编译方法,防止命令行超长而无法编译.

4 目录结构及主要脚本

4.1 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

├─MS_Ref

├─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.2 重要脚本

在MS_Code目录下存放有Makefile.rules、Makefile.modules、Makefile以及项目的相关make脚本,即项目编译脚本,比如project_8801h_s3b.mk等等,同时在make目录的各个子目录下存放有各个模块的make脚本,即模块编译脚本,比如aac.mk、app.mk等等。一般情况下开发人员仅维护项目编译脚本即可, Makefile.rules、Makefile.modules和Makefile不需要修改。

针对模块和项目的变化,开发人员需要修改模块编译脚本和增加新的项目编译脚本。下面将针对Makefile.rules、Makefile.modules和Makefile进行简单的说明,关于模块编译脚本和项目编译脚本将在后面的章节中详细描述。

4.2.1 Makefile.rules

Makefile.rules中定义了绝大部分平台无关、模块无关以及项目无关的公共变量,其中包括编译器的指定、公共编译参数CFLAGS、AFLAGS的定义、文件复制、删除、目录创建等系统命令、公共头文件路径、SPRD库路径以及第三方库文件路径等变量的定义。

请根据您的机器上的软件情况进行相应修改。

4.2.2 Makefile.modules

Makefile.modules定义了make/bulid系统中的目标依赖关系,一般开发中不需要维护该文件,这里需要指出的是:目前有部分模块采用了armcc编译器(比如:mpeg4_codec),对于这部分模块需要在Makefile.modules 中申明,具体操作可以参考该文件中已经被申明的相关模块部分。

4.2.3 Makefile.third-party

Makefile.third-party 将第三方逻辑独立成一个文件,便于维护,这个文件会被 include 到各工程.mk 中.

4.2.4 Makefile.verify

Makefile.verify 对makefile中的宏的父子关系进行校验,防止出错.

4.2.5 Makefile

Makefile是最上层的总控脚本,该脚本直接处理用户的命令,并执行相关的处理,在没有特殊需要的情况下用户不需要维护该文件。

.

5 基本命令

Build的所有操作命令都要在Windows Command 下执行,并且需要在关键脚本的当前路径,即MS_Code目录下完成输入。示例如下:

您也可以直接执行MS_Code\cmd.exe 即可一次进入这个目录。

5.1 帮助

通过命令行工具在项目目录MS_Code下输入命令make help可以获得相关的帮助信息,这些相关信息内容可以从下面对于小节中获取更详细的内容,这里不再重复。

5.2 编译参数中 projectname 与项目编译脚本对应关系

在编译项目时,会使用类似make PROJECT=projectname 命令,这里projectname必须和项目编译脚本的名称保持一定的对应关系,否则系统会报:

Project defined Makefile project_projectname.mk is not exist!

这样的错误。如项目编译脚本文件名为project_8801h_s3b.mk,则projectname的内容为8801h_s3b,因此我们可以执行如下的命令来实现编译

make PROJECT= 8801h_s3b

5.3 编译整个项目[update]

通过命令行工具在项目目录MS_Code下输入命令make PROJECT=projectname 或make

PROJECT=projectname update命令,makefile根据已有的依赖关系编译因修改涉及到的相关的模块并在没有错

误出现的情况下完成最终的链接,若不存在依赖关系,makefile 会在编译文件时自动生成依赖关系。因为只编译较少的模块文件,可以节省编译时间。这个命令也会将 fdl,bootloader,NV 同时编译出来。

5.4 重新编译整个项目[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

5.5 清除所有编译结果[cleanall]

通过命令行工具在项目目录MS_Code下输入命令make PROJECT=projectname cleanall,该命令将清除编译过程中生成的全部目标码和库文件。

5.6 清除模块编译结果

通过命令行工具在项目目录MS_Code下输入命令make PROJECT=projectname MODULES=”module1 module2 …” clean,该命令将清除指定模块的编译输出结果,其中包含指定模块的目标文件和库文件。该命令适合在指定模块内部出现重大修改或者模块本身makefile脚本被修改,在进行模块编译前使用。

5.7 编译模块

通过命令行工具在项目目录MS_Code下输入命令make PROJECT=projectname MODULES=”module1 module2 …” update,该命令将对指定模块进行编译,但不会编译完成后进行自动链接。该命令属于模块开发人员最常用的命令,在具体模块开发中需要经常使用该命令来验证模块的编译完整性。

5.8 生成可执行文件

通过命令行工具在项目目录MS_Code下输入命令make PROJECT=projectname image可以进行链接生成相关的可执行文件,该命令可以在模块修改并编译完成后进行,也适合第三方库文件更新后进行。

5.9 编译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="rocky_3201" MODULES="nor_fdl"

5.10 编译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工具编译保存。

5.11 编译MMI Resource 文件

通过命令行工具在项目目录MS_Code下输入命令make PROJECT=projectname MODULES= resource 对Resource编译。MMI resource使用的资源原始文件路径通过如下编译宏来定义

export MMI_RES_DIR = mmi_res_240x320 # resource directory

# Option1:mmi_res_240x320

# Option2:mmi_res_240x400

输出结果位置: build/projectname_builddir/res。同时会自动将最终的映像文件复制到

build/projectname_builddir/img目录。

默认情况下编译Resource 使用了主工程中的Feature Options 转义宏和 app.mk 模块中的宏,如果您的项目资源编译需要使用其他的模块的宏,请修改resource.mk文件。

注意:

1)当前不能正确支持多个项目工程的资源并行编译

2)编译资源文件需要工具脚本支持,如果环境不完整会导致编译过程停止

3)make\make_cmd\merge.vbs 工具使用说明:

语法:merge.vbs str1.xls str2.xls

功能: 将 str2.xls 合并到 str1.xls,

说明:如果str2.xls中字符串ID与str1.xls中的ID相同,脚本会列出所有相同的ID,返回1,合并失败退出;如果没有重复ID,则返回0,合并成功。

这样做合并的好处是可以将不同来源的两个资源文件独立开来,不需要手工合成一个文件再编译。如果使用该功能,请自行修改resource.mk 。

5.12 编译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

6 其它命令

6.1 编译Logel工具

通过命令行工具在项目目录MS_Code下输入命令make PROJECT="rocky_3201" MODULES="logel" clean update对logel工具进行编译。注意,编译这个工具需要 perl 5.8 。

注意:SPRD 客户无法使用该命令

6.2 pclint 扫描

通过命令行工具在项目目录MS_Code下输入命令make PROJECT="rocky_3201" pclint对全部模块代码进行pclint 扫描。输入make PROJECT="rocky_3201" MODULES=”app gui ps” pclint 对指定的模块代码进行pclint 扫描。

6.3 编译完成net send提醒功能

通过命令行工具在项目目录MS_Code下输入命令

make PROJECT="rocky_3201" ip=192.168.0.1

make PROJECT="rocky_3201" ip=pcname

当代码编译完成时,会自动向指定的IP地址或机器名发一个 net send 消息,说明该工程编译是否成功。

注意,这个命令只在生成 image 后才调用,单独编译某个模块并不生成 image 时并不会调用。

6.4 编译命令的简写

make PROJECT=rocky_3201 MODULES=”app gui ps”

可以简写为

make p=rocky_3201 m=”app gui ps”

make PROJECT=rocky_3201 new

可以简写为

make p=rocky_3201 new

6.5 多线程编译

Build环境支持多线程编译,可以充分利用多核CPU 的优势,加快编译速度,必须通过显式的方式指定开启线程数:

make p=rocky_3201 new job=<开启线程数>

其中 <开启线程数> 表示编译时同时启动线程个数,建议不要超过CPU 核心数。

6.6 分布式编译

Build环境支持 Xoreax IncrediBuild 分布式编译,可以充分利用网络优势,加快编译速度.只需要在正常的编译指令后增加ib=1 即可:

make p=8801_s3b new ib=1

分布式编译支持依赖关系,所以当您执行make p=rocky_3201 m=app update ib=1 时,会重新编译所

有app模块文件.另外如果您的代码中的文件位置有变动时,编译时请将涉及的模块先使用clean命令清理中间依赖文件,然后再编译,否则有可能出现找不到相关文件而无法编译的问题。

跟Xoreax IncrediBuild工具有关,此命令可能工作不正常。

6.7 编译出错暂停

默认情况下,编译出错后将继续编译,并不听停下来。如果您需要makefile 支持编译出错暂停功能,请使用stop参数编译,并赋值为1。命令示例如下:

make p=rocky_3201 stop=1 new

遇到异常时脚本会调用DOS下的Pause命令,用户敲任意键会继续编译,如果需要强行推出需要敲Control+C.

目前停止的方式是调用DOS的 Pause,按任意键会继续编译,如果需要强行推出,需要按 Control+C.

7 模块修改及项目定制

这里涉及到前面谈到的关键脚本的修改,在大多数情况下开发人员针对模块或者项目的需要只需修改和补充两类的关键脚本:模块编译脚本和项目编译脚本。

7.1 模块修改

在此,我们把出现在Build环境中的最小编译单位称为模块,Build系统中将以MS_Code/make目录下的各个子目录名称作为约定的模块名称,这些子目录和各自的功能模块之间呈一一对应的关系。

7.1.1 模块目录结构调整

如果模块内部存储目录结构或者模块整体相对目录发生改变,则需要修改模块相应的模块编译脚本并修改变量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作为上级目录而言的,所以需要按照这一约定给出源文件或头文件完整的相对路径。

7.1.2 添加或删除文件

如果模块编译文件有添加或删除的需要,则需要修改变量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)不应该再出现该符号。

7.1.3 修改编译选项

有时为了适应不同平台或者产品的需求,模块编译选项会发生变化,这时需要修改变量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.1.4 新增模块

一旦有了新的功能模块需要添加到Build系统中,需要在MS_Code/make目录下同时建立对应该模块的子目录,同时需要在该目录下完成和目录名称一致并以“.mk”为后缀结尾的模块编译脚本,该脚本的主要目标就是需完成:MCFLAG_OPT、MINCPATH、MSRCPATH以及SOURCES(模块中有需要编译汇编文件的情况下还有MASMFLAG_OPT)的定义,编写方法同前面的5.1.1—5.1.3小节。

7.2 项目定制

7.2.1 创建全新的项目编译脚本

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配置文件

7.2.2 复制方式创建项目编译脚本

为了加快创建工程文件的过程,您可以基于一个已有的一个工程文件,复制后改一个名字基本就可以编译通过了,在这个基础上配置您想要的工程配置。

当您通过复制方式创建一个新工程时,请考虑以下几项信息:

1.请确认新工程中 PRODUCT_CONFIG 指定的目录是否需要修改,是否需要创建一个新的驱动文件集;

2.请确认新工程中 PRODUCT_BASELIB_DIR 指定的非开放模块.a目录名是否需要修改;

3.请确认新工程的nv是否需要修改,检查nv_parameter.mk 文件是否满足您的需要;

4.请确认新工程的Resource是否需要修改,检查resource.mk 文件是否满足您的需要;

5.请确认是否为新工程创建一个新的scatter file文件

7.2.3 添加或删除模块

如果需要从项目中去除不需要的模块,可以修改变量EXPORTLIBS或者COMPLIBS_DBG,比如:EXPORTLIBS = \

aac aac_lc !atc audioservice admcm adpcm amr \

bsd bt_pal_csr chip_drv custom_tone custom_drv char_lib \

dc digitalgain dsp_codec dtmf_tone dv eq_exp generic_tone \

layer1 layer1_dsp img_proc img isp l4 \

midi mpeg4_codec mmk gui main mp3 nvm \

pcm ps record refbase rtos \

scp scm !sim sfs scaling transsamplerate !tcpip \

ucom ubot upcc voice version xsr_port !nvparameter !fdl1 !fdl2 !bootloader

COMPLIBS_DBG = app

某个模块应该放在EXPORTLIBS中进行定义或放在COMPLIBS_DBG进行定义,取决于该模块对客户的提供方式。其中在EXPORTLIBS中申明的模块表明这些模块将采用库文件的方式提供给客户,而COMPLIBS_DBG

相关主题