全部产品
云市场

基于Make的编译说明

更新时间:2019-03-15 17:27:06

在”快速体验”中使用到了make进行sdk的编译, 本章对make系统进行更详细的描述, 以及讲解如何对SDK进行裁剪

常用命令

命令 解释
make distclean 清除一切构建过程产生的中间文件, 使当前目录仿佛和刚刚clone下来一样
make 使用默认的或已选中的平台配置文件平台配置文件开始编译
make env 显示当前编译配置, 非常有用, 比如可显示交叉编译链, 编译CFLAGS等
make reconfig 弹出多平台选择菜单, 用户可按数字键选择, 然后根据相应的硬件平台配置开始编译
make config 显示当前被选择的平台配置文件
make menuconfig 以图形化的方式编辑和生成功能配置文件make.settings
make help 打印帮助文本

SDK裁剪

对V3.0.1以上版本, 可以用 make menuconfig 命令或者 config.bat 脚本, 分别在Linux/Windows主机上图形化的配置SDK

下面是运行图形化配置工具之后的图示:

image | left

在上面的界面中

  • 按下空格键可以选中或者失效某个功能, 使用小键盘的上下键来在不同功能之间选择
  • 如果想知道每个选项的具体含义, 先用方向键将高亮光条移到那个选项上, 再按键盘上的 “h”按键, 将出现帮助文本, 对选项进行详细说明。

注意: 不建议手动编辑 make.settings 文件改动配置, 一切配置都需通过上面的图形界面进行

配置选项说明:

FEATURE_MQTT_COMM_ENABLED

  • MQTT上云功能开关, 所谓MQTT上云是指搭载了C-SDK的嵌入式设备和阿里云服务器之间使用 MQTT 协议进行连接和交互。本选项使能之后,SDK将提供MQTT相关的API。

FEATURE_COAP_COMM_ENABLED

  • CoAP上云功能开关, 所谓CoAP上云是指搭载了C-SDK的嵌入式设备和阿里云服务器之间使用 CoAP 协议进行连接和交互

FEATURE_HTTP_COMM_ENABLED

  • HTTP/S上云功能开关, 所谓HTTP/S上云是指搭载了C-SDK的嵌入式设备和阿里云服务器之间使用 HTTP 协议或 HTTPS 协议进行连接和交互

FEATURE_DYNAMIC_REGISTER

  • 一型一密/动态注册功能开关, 所谓动态注册是指不需要为同个品类下的不同设备烧录不同的三元组, 只需烧录相同的productSecret, 每个设备在网络通信中动态注册自己

FEATURE_DEPRECATED_LINKKIT

  • 高级版接口风格的开关, 配置进行高级版物模型相关的编程时, C-SDK是提供 linkkit_xxx_yyy() 风格的旧版接口, 还是提供 IOT_Linkkit_XXX() 风格的新版接口

FEATURE_DEV_BIND_ENABLED

V2.3.0之后的版本才新增的这个开关

  • 绑定功能的开关, 只有用C-SDK连接飞燕平台的客户才需要关注并打开它, 用于使能设备被飞燕的公版app控制, 可绑定设备和用户账号

FEATURE_DEVICE_MODEL_GATEWAY

在V2.3.0以前的版本中, 这个开关的曾用名是 FEATURE_ENHANCED_GATEWAY

  • 高级版网关能力的开关, 配置进行高级版物模型相关的编程时, C-SDK是提供 linkkit_xxx_yyy() 风格的单品接口, 还是提供 linkkit_gateway_xxx_yyy() 风格的网关接口

FEATURE_HTTP2_COMM_ENABLED

  • HTTP2上云功能开关, 所谓HTTP2上云是指搭载了C-SDK的嵌入式设备和阿里云服务器之间使用 HTTP2 协议进行连接和交互

FEATURE_MQTT_DIRECT

  • MQTT直连功能开关, 所谓MQTT直连是指设备和阿里云服务器之间使用 MQTT 协议进行连接, 而不会前置基于 HTTP 协议认证的交互过程

FEATURE_OTA_ENABLED

  • 固件升级功能开关, 所谓固件升级是指设备从阿里云服务器上下载用户在IoT控制台中上传的固件文件功能

FEATURE_DEVICE_MODEL_ENABLED

在V2.3.0以前的版本中, 这个开关的曾用名是 FEATURE_SDK_ENHANCE

  • 高级版物模型能力的功能开关, 所谓高级版物模型能力是指设备可使用基于服务/属性/事件三要素的Alink协议和服务端通信

FEATURE_SUPPORT_TLS

  • 在TLS层是否使用TLS的功能开关, 关闭则代表用不带TLS加密的TCP连接连云

FEATURE_WIFI_PROVISION_ENABLED

在V2.3.0以前的版本中, 这个开关的曾用名是 FEATURE_WIFI_AWSS_ENABLED

  • WiFi配网的功能开关, 所谓WiFi配网是阿里巴巴自研的一种从手机app发送WiFi网络的SSID和密码给设备端的通信协议

输出说明

使用make进行成功编译, 将会打印类似如下的表格, 给出每个模块的ROM占用, 以及静态RAM占用的统计

  1. | RATE | MODULE NAME | ROM | RAM | BSS | DATA |
  2. |-------|-------------------------------------|-----------|-----------|------------|--------|
  3. | 45.3% | src/dev_model | 28563 | 216 | 188 | 28 |
  4. | 28.1% | src/mqtt | 17737 | 28 | 28 | 0 |
  5. | 25.7% | src/infra | 16195 | 544 | 60 | 484 |
  6. | 1.65% | src/dev_sign | 1045 | 48 | 0 | 48 |
  7. |-------|-------------------------------------|-----------|-----------|------------|--------|
  8. | 100% | - IN TOTAL - | 63540 | 836 | 276 | 560 |

用户需要关注的输出产物都在 output/release 目录下:

output/release/lib

产物文件名 说明
libiot_hal.a HAL接口层的参考实现, 提供了 HAL_XXX() 接口
libiot_sdk.a SDK的主库, 提供了 IOT_XXX 接口和 linkkit_xxx() 接口
libiot_tls.a 裁剪过的 mbedtls, 提供了 mbedtls_xxx() 接口, 支撑 libiot_hal.a

output/release/include

产物文件名 说明
mqtt_api.h 当用户在配置环节选中”MQTT上云”时出现, 列出MQTT上云功能点提供的用户API
dev_model_api.h 当用户在配置环节选中”物模型管理”时出现, 列出物模型管理功能点提供的用户API

选中了什么功能, 该功能的API就会以 <功能名字>_api.h 的形式出现, 依次类推

output/release/bin

如果是在主机环境下不做交叉编译(Ubuntu/Windows), 是可以产生主机版本的demo程序, 可以直接运行的, 比如

产物文件名 说明
linkkit-example-solo 物模型管理功能的例程, 可演示 linkkit_xxx() 接口的使用
mqtt-example MQTT上云功能的例程, 可演示 IOT_XXX() 接口的使用

配置系统组成部分

用户输入

设备端C-SDK的构建配置系统, 有以下输入文件可接受用户的配置, 您可以通过编辑它们, 将配置输入到构建系统中

  • 功能配置文件: 即顶层目录的 make.settings 文本文件
  • 平台配置文件: 即目录 tools/board 下的 config.xxx.yyy 系列文件, 也称config文件

构建系统最终是依据 config.xxx.yyy 文件进行编译, 然而由于功能配置/裁剪更为常用, 我们将它额外抽取到了 make.settings

config.xxx.yyy 主要关注目标嵌入式硬件平台的工具链程序和编译/链接选项的指定, 用于跨平台移植

config.xxx.yyy 此外也能以 CONFIG_ENV_CFLAGS += … 的语法新增自定义 CFLAGS, 同理 CONFIG_ENV_LDFLAGS += … 可以指定链接选项

make.settings 则是在已被确定的目标硬件平台上, 专注于C-SDK的功能模块裁剪或者配置, 用于裁剪功能模块

构建单元

从工程顶层目录以下, 每一个含有iot.mk的子目录, 都被构建系统认为是一个构建单元

每一个构建单元, 若相对顶级makefile的路径是bar, foo/bar1, 则可以用make bar, make foo/bar1这样的命令单独编译

tools/board/config.xxx.yyy

文件名形式为config.<VENDOR>.<MODEL>的文本文件, 会被构建系统认为是硬件平台配置文件, 每个文件对应一个嵌入式软硬件平台

  • 其中部分, 一般是指明嵌入式平台的软件OS提供方, 如mxchip, ubuntu, win7等. 另外, 这也会导致构建系统到$(IMPORT_DIR)/<VENDOR>目录下寻找预编译库的二进制库文件和头文件
  • 其中部分, 一般是标明嵌入式平台的具体硬件型号, 如mtk7687, qcom4004等, 不过也可以写上其它信息, 因为构建系统不会去理解它, 比如mingw32, x86-64

调试方式

  • make ...命令行中, 设置TOP_Q变量为空, 可打印工程顶层的执行逻辑, 例如硬件平台的选择, SDK主库的生成等
    1. make .... TOP_Q=
  • make ...命令行中, 设置Q变量为空, 可打印模块内部的构建过程, 例如目标文件的生成, 头文件搜寻路径的组成等
    1. make .... Q=
  • 可以用make foo/bar单独对foo/bar进行构建, 不过, 这可能需要先执行make reconfig
  • 可以进入.O/foo/bar路径, 看到完整的编译临时目录, 有makefile和全部源码, 所以在这里执行make, 效果和make foo/bar等同

交叉编译相关

以下是常在 tools/board/config.xxx.yyy 平台配置文件中使用的变量

变量 说明
CONFIG_ENV_CFLAGS 指定全局的CFLAGS编译选项, 传给compiler, 例如CONFIG_ENV_CFLAGS += -DDEBUG
CONFIG_ENV_LDFLAGS 指定全局的LDFLAGS链接选项, 传给linker, 例如CONFIG_ENV_LDFLAGS += -lcrypto
CROSS_PREFIX 指定交叉编译工具链共有的前缀, 例如CROSS_PREFIX := arm-none-eabi-, 会导致构建系统使用arm-none-eabi-gccarm-none-eabi-ar, 以及arm-none-eabi-strip
OVERRIDE_CC 当交叉工具链没有共有的前缀或者前缀不符合prefix+gcc/ar/strip类型时, 例如armcc, 可用OVERRIDE_CC = armcc单独指定C编译器
OVERRIDE_AR 当交叉工具链没有共有的前缀或者前缀不符合prefix+gcc/ar/strip类型时, 例如armar, 可用OVERRIDE_AR = armar单独指定库压缩器
OVERRIDE_STRIP 当交叉工具链没有共有的前缀或者前缀不符合prefix+gcc/ar/strip类型时, 例如armcc没有对应的strip程序, 可用OVERRIDE_STRIP = true单独指定strip程序不执行
CONFIG_LIB_EXPORT 指定SDK产生的二进制库的形式, 例如`CONFIG\_LIB\_EXPORT := dynamic可以指定产生linux上的libiot\_sdk.so动态库文件, 默认为产生跨平台的libiot\_sdk.a静态库

目录文件相关

变量 说明
CONFIG_mmm/nnn 指定mmm/nnn目录是否需要编译的开关, 例如CONFIG_mmm/nnn :=的写法会导致该目录被跳过编译