manhattan compile

1.2目录结构介绍
├── build
//工程的编译系统所在目录,实现文件系统的整体编译功能
├── development
//包含一些开发中需要的库(本地),服务,以及工具等
│ ├── libutils
//底层工具以及 IPC 接口
│ ├── libcutils
//IPC 接口
│ ├── service
//提供了一些服务,包含休眠唤醒服务、watchdog 等
│ ├── source
//封装了一些硬件接口,上层可以调用,用户也可以参考该目录
下的代码实现自己的接口。
│ └── tools
//包含一些开发中用到的工具,如 gdb,adb 等。
├── device //板级存放目录,包含文件系统公共的部分 common 以及板级自己的
patch
│ ├── common
│ └── phoenix
├── docs
//工程说明文档
│ ├── doc //开发人员编辑的使用文档
│ ├── html //动态生成的 API 文档
├── external
//第三方模块,包括:库和工具
│ ├── alsa-lib
│ ├── alsa-utils
│ ├── e2fsprogs
├── hardware //hardware 所在目录,集成了一些操作硬件的接口
│ ├── init
├── kernel
//kernel 代码
├── Makefile
├── out
//编译生成目录
│ ├── host
//编译生成的 host 端库以及可执行程序
│ └── product
//编译生成的 device 端库以及可执行程序
├── packages
//Sample、App 及测试用例
├── prebuilts
//烧录工具及编译工具链
│ ├── burnertools
//烧录工具
│ ├── toolchains
//编译工具链
│ └── win-tool
//windows 工具
└── u-boot //u-boot 代码

 

执行如下命令配置系统的编译环境:
$ source build/envsetup.sh (初始化编译环境)
$ autoenvsetup

 

执行如下命令开始编译整个工程
$ source build/envsetup.sh ( 编译环境初始化后,此命令可以跳过 )
$ lunch
$ make
编译完成后,生成 out 目录,结构如下:
├── host
//host 端生成文件的存放路径
│ ├── include
//host 端编译过程所需头文件路径
│ ├── static
//host 端生成的静态库文件路径
│ │ └── lib

│ └── tools
└── product
└── phoenix
├── image
├── include
├── obj
├── static
└── system
//host 端编译过程中所需工具的存放路径
// 产品
// 生成的目标文件(uboot、kernel、文件系统)
//target 编译过程中所需头文件的存放路径
//模块编译过程中生成的中间文件及目标文件(strip 前)
//target 端生成的静态库文件(strip 前)
//文件系统(包含 strip 后的模块)

 

执行如下命令:
$ make clean
即可 clean 整个工程。

 

创建好板级目录以后,要在板级目录下新建并编辑 device.mk 文件。在编辑板级的
device.mk 时,其中要指定 uboot,kernel 编译路径,kernel 编译默认配置文件,kernel 生成
的镜像名,uboot 编译生成的镜像名以及文件系统类型等信息。以下对其中主要的宏进行解
释。
UBOOT_BUILD_DIR
#需要编译的 uboot 目录
KERNEL_BUILD_DIR
#需要编译的 kernel 目录
KERNEL_COFIG_FILE
#编译 kernel 时 make munuconfig 所需要的配置文件
MODEL
#指定的默认编译 model
 编译多线程配置:
MAKE_JLEVEL := 4
#配置编译时用几个进程
 硬件配置:TARGET_BOOTLOADER_BOARD_NAME
TARGET_PRODUCT_BOARD

#需要编译的 kernel 目录
TARGET_BOARD_PLATFORM #该板级属于的平台,如 phoenix 为 X1000
TARGET_BOARD_ARCH
#体系结构,mips
设备目录文件配置:
UBOOT_BUILD_CONFIG
#编译 uboot 需要的配置文件名
KERNEL_BUILD_CONFIG
#编译 kernel 需要的配置文件名
KERNEL_TARGET_IMAGE
#编译 kernel 的类型,如 uImage
KERNEL_IMAGE_PATH
#生成的 kernel 镜像存放目录
UBOOT_TARGET_FILE
#生成的 uboot 镜像文件名
FILE_SYSTEM_TYPE
#文件系统类型(目前只支持 jffs2,ubi,ext4 这三种文件系统类
型)
ROOTFS_JFFS2_NORFLASH_ERASESIZE:= 0x8000
ROOTFS_JFFS2_SIZE:= 0xc80000
MODEL
model2)

#文件系统 flash 擦除大小
#文件系统大小
#文件系统模式(model1 或者

 

$ 板级 _ 存储介质 _ 扩展功能 - 开发模式
如:phoenix_norflash_ota-eng

 

Lunch 选项的命名跟板级的目录结构存在一定的关系,还以 phoenix 板级为例,device
下 phoenix 的目录结构如下:
Phoenix
//板级名称(与 lunch 选项保持一致)
├── device.mk
//板级编译的配置配置文件
├── norflash
// 存储介质(与 lunch 选项保持一致)
│ ├── model1
//产品形态
│ ├── model2
│ └── Readme
├── phoenix_base.mk //板级模块选择性编译的配置文件
└── spinand
// 存储介质(与 lunch 选项保持一致)
├── model1
//产品形态
└── vendorsetup.sh //lunch 选项的定义文件
Lunch 选 项 解 析 后 所 对 应 的 各 个 配 置 的 定 义 在 板 级 的 device.mk 里 , 如 :
device/phoenix/device.mk.

 

在添加第三方模块时,首先要确保模块能够正常编译通过,再添加到 platform 上,在添
加放置第三方功能模块时,建议放置到 external 目录下,并参照 external 目录下各个的
Build.mk 文件编写所添模块的 Build.mk 文件,对所添模块进行指导性编译,如下几个宏对第
三方的编译提供支持。
 核心编译宏:使用 include 引入如下两个宏中的一个(实为.mk 文件)完成模块的编译
工作。
BUILD_HOST_THIRDPART
#负责 HOST 端第三方模块的编译, 参见示例一
BUILD_THIRDPART
#负责 DEVICES 端第三方模块的编译, 参见示例二
 接口宏:
LOCAL_MODULE #模块名
LOCAL_MODULE_TAGS #模块所属开发模式
LOCAL_MODULE_GEN_BINRARY_FILES #模块产生的可执行程序(需含路径)
LOCAL_MODULE_GEN_STATIC_FILES #模块产生的静态库文件 (含路径)
LOCAL_MODULE_GEN_SHARED_FILES #模块产生的动态库文件 (含路径)
LOCAL_MODULE_PATH #指定目标文件的 copy 路径,不定义此宏目标文件将 copy 到默
认路径下 
LOCAL_MODULE_CONFIG_FILES #模块配置后生成的文件
LOCAL_MODULE_CONFIG #模块的配置方法
LOCAL_MODULE_COMPILE #模块的编译方法
LOCAL_MODULE_COMPILE_CLEAN #模块的 clean 方法
LOCAL_EXPORT_C_INCLUDE_FILES #模块对外导出的文件,所导出文件被其他模块使用
LOCAL_EXPORT_C_INCLUDE_DIRS #模块对外导出的目录,所导出目录下的文件被其他
模块使用
LOCAL_DEPANNER_MODULES
#本模块的编译依赖的其他模块(生成的库,头文件等),
此处为所依赖模块的 module 名,即 LOCAL_MODULE 的值。

注:
target 端静态库的路径默认存放在 system 的 usr/lib 下,可执行程序默认存放在 system 的 usr/bin 下。
Host 端默认路径在 out/host 下
其他的参见工程下 build/core/envsetup.mk 文件或者上述的 out 目录介绍。

 

Manhattan 平台支持如下几种类型文件的编译:
 可执行 bin 文件(host,device)
 动态库(host,device)
 静态库(host,device)
各类型模块分别由如下几个宏负责编译:
 核心编译宏:使用 include 引入如下宏中的一个(实为.mk 文件)完成模块的编译工作
1. 生成可执行 bin 文件
BUILD_EXECUTABLE (device)
BUILD_HOST_EXECUTABLE (host)
2. 生成动态库
BUILD_SHARED_LIBRARY (device)
BUILD_HOST_SHARED_LIBRARY (host)
3. 生成静态库
BUILD_STATIC_LIBRARY (device)
BUILD_HOST_STATIC_LIBRARY (host)
注:可执行文件的编译请参考 packages/example/Sample/下的模块
库的编译请参考 development/service/下的模块

接口宏:
LOCAL_MODULE #模块名
LOCAL_MODULE_TAGS
#模块所属开发模式
LOCAL_SRC_FILES #源文件
LOCAL_LDLIBS
#链接参数
LOCAL_CFLAGS
#C 编译参数
LOCAL_CPPFLAGS #CPP 编译参数

LOCAL_DOC_FILES #指定导出 api 的文件
LOCAL_C_INCLUDES
#编译所需头文件
LOCAL_MODULE_PATH #指定目标文件的 copy 路径,不定义此宏目标文件 copy 到默认路径
下 
LOCAL_SHARED_LIBRARIES #本模块编译所依赖的其他动态库,此动态库为工程中其他模块
产生。
LOCAL_STATIC_LIBRARIES #本模块编译所依赖的其他静态库,此静态库为工程中其他模块
产生。
LOCAL_DEPANNER_MODULES
#本模块的编译依赖的其他模块(生成的库,头文件等),此
处为所依赖模块的 module 名,即 LOCAL_MODULE 的值。
注:
target 端静态库的路径默认存放在 system 的 usr/lib 下,可执行程序默认存放在 system 的 usr/bin 下。
Host 端默认路径在 out/host 下
其他的参见工程下 build/core/envsetup.mk 文件或者上述的 out 目录介绍。

 

如何添加复制模块——prebuild
在开发过程中经常需要将一些库和头文件不加任何修改的从一个路径下 copy 到另外一
个目标路径下,为此编译系统添加了 prebuild 机制。

核心编译宏:使用 include 引入如下宏中的一个(实为.mk 文件)完成模块的 prebuild
工作
BUILD_PREBUILT
BUILD_MULTI_PREBUILT

// 一次 copy 一个文件
// 一次 copy 多个文件
接口宏:
LOCAL_MODULE
LOCAL_MODULE_TAGS
LOCAL_MODULE_CLASS
LOCAL_MODULE_PATH
LOCAL_COPY_FILES
LOCAL_MODULE_DIR
#模块名
#模块所属开发模式
#模块所属哪种 prebuild 模式
#文件(夹)copy 的目标路径
#源文件
#源文件夹

posted @ 2019-08-09 10:39  jony_L  阅读(341)  评论(0)    收藏  举报