构建系统(make)

编译架构

为了方便移植,本项目是用makefile组织编译的。

根路径的<home>/Makefile是总入口,考虑到协议栈、应用层、chipset以及platform之类的有其独特的编译配置,每个模块下面都有build.mk,用于配置所需参与编译的代码文件、头文件和所需的库。

如下所示,Home目录的Makefile会依次加载:

  • src/build.mk:蓝牙协议栈编译配置。

  • example/${APP}/build.mk:根据输入的APP参数选择example中例程进行编译。

  • chipset/${CHIPSET}/build.mk:根据输入的CHIPSET参数选择chipset中芯片进行编译。

  • porting/${PORT}/build.mk:根据输入的PORT参数选择porting中部署进行编译。

zephyr_polling
 ├── Makefile
 ├── chipset
 │   └── ${CHIPSET}
 │       ├── ...
 │       └── build.mk
 ├── example
 │   └── ${APP}
 │       ├── ...
 │       └── build.mk
 ├── platform
 │   └── windows
 │       ├── ...
 │       └── build.mk
 ├── porting
 │   └── ${PORT}
 │       ├── build.mk
 │       └── main.c
 └── src
     ├── ...
     └── build.mk

编译参数

由于蓝牙Dongle的接口、运行平台和例程不相同,为了区分不同的场景,特定应用只编译应用相关的东西,需要用户编译时配置不同的参数。

核心参数

  • APP:实际就是去找example/${APP}路径。如配置为APP=beacon

  • CHIPSET:实际就是去找chipset/${CHIPSET}路径。如配置为CHIPSET=csr8510

  • PORT:实际就是去找porting/${PORT}路径。如配置为PORT=windows_libusb_win32

GCC参数

SRC:代码文件路径,需要在各个分模块配置路径。

INCLUDE:头文件路径,需要在各个分模块配置路径。

LIB:库文件路径,需要在各个分模块配置路径。

LFLAGS:库文件名称,需要在各个分模块按需配置。

CFLAGS:gcc编译的c flags,如优化配置-O0

LDFLAGS:gcc编译的link flags,如-Wl,--gc-sections -Wl,--check-sections

CPU_ARCH:cpu架构配置,由于windows平台的cpu架构不同,需要应用不同的lib,所以需要特别配置。

其他参数

V:调试开关,配置V=1可以显示所有make过程的日志,便于调整编译流程。

NOGC:开启或关闭gcc编译的gc sections,配置NOGC=1就会关闭gc sections

编译目标

all:编译生成执行文件。

clean:清空中间文件和生成文件。

help:编译帮助,显示help文档。

info:打印当前的配置参数。

run:编译&执行程序。

code_format:对项目代码进行格式化,格式化配置为:<home>/.clang-format

menuconfig:kconfig的配置界面。

guiconfig:kconfig的配置界面-另外一个显示方式。

ram_report:对生成的main.elf进行ram分析,并生成output/ram.json

rom_report:对生成的main.elf进行rom分析,并生成output/rom.json

all_report:执行ram_report和rom_report。