基于Make的编译说明

本文介绍Make系统的详细描述,以及讲解如何对SDK进行裁剪。

Make命令

命令

解释

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。

运行图形化配置工具图示

  • 在图示界面中按下空格键,可以选中或者失效某个功能,使用键盘的上下键可以选择不同功能。

  • 使用方向键将高亮光条移到选项上,再按键盘上的H键,将出现帮助文本,对该选项会进行详细说明。

    不建议手动编辑make.settings文件改动配置,所有配置都需通过上面的图形界面进行。

配置选项说明如下表格所示。

配置项

说明

FEATURE_MQTT_COMM_ENABLED

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

FEATURE_COAP_COMM_ENABLED

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

FEATURE_HTTP_COMM_ENABLED

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

FEATURE_DYNAMIC_REGISTER

一型一密或动态注册功能开关,动态注册是指不需要为同个品类下的不同设备烧录不同的设备证书(ProductKey、DeviceName、DeviceSecret),只需烧录相同的productSecret,每个设备在网络通信中动态注册自己。

FEATURE_DEPRECATED_LINKKIT

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

FEATURE_DEV_BIND_ENABLED

V2.3.0之后的版本新增绑定功能开关,只有用C Link SDK连接飞燕平台的用户需要关注并打开它,用于使能设备被飞燕的公版App控制,可绑定设备和用户账号。

FEATURE_DEVICE_MODEL_GATEWAY

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

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

FEATURE_HTTP2_COMM_ENABLED

HTTP2上云功能开关,HTTP2上云是指搭载了C Link 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和密码给设备端的通信协议。

FEATURE_ALCS_ENABLED

本地控制使能开关,仅当设备接入阿里云生活物联网平台时使用,并且要求设备通过WiFi或者以太网连接网络。该开关打开之后,手机App可以通过局域网对设备进行控制。

FEATURE_DEVICE_MODEL_SHADOW

物模型影子开关,使能之后当设备离线时云端可以对设备的属性进行设置,等设备上线之后设备获取云端保存的数值并进行执行。

FEATURE_SUB_PERSISTENCE_ENABLED

订阅Topic保存开关,当设备再次上线时若设备发现该Topic已订阅,则不再发送订阅消息给物联网平台,节约设备与平台之间的交互消息。

输出说明

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

| RATE  | MODULE NAME          | ROM     | RAM     | BSS    | DATA   |
|-------|----------------------|---------|---------|--------|--------|
| 45.3% | src/dev_model        | 28563   | 216     | 188    | 28     |
| 28.1% | src/mqtt             | 17737   | 28      | 28     | 0      |
| 25.7% | src/infra            | 16195   | 544     | 60     | 484    |
| 1.65% | src/dev_sign         | 1045    | 48      | 0      | 48     |
|-------|----------------------|---------|---------|--------|--------|
|  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 Link SDK的构建配置系统,有以下输入文件可接受用户的配置,您可以通过编辑文件,将配置输入到构建系统中。

  • 功能配置文件:即顶层目录的make.settings文本文件。

  • 平台配置文件:即目录tools/board下的config.xxx.yyy系列文件,也称config文件。

构建系统最终是依据config.xxx.yyy文件进行编译,由于功能配置或裁剪更为常用,将该文件抽取到make.settings中。

说明

config.xxx.yyy主要关注目标嵌入式硬件平台的工具链程序和编译或链接选项的指定,用于跨平台移植。config.xxx.yyy不仅以CONFIG_ENV_CFLAGS += ... 的语法新增自定义CFLAGSCONFIG_ENV_LDFLAGS += ... 也可以指定链接选项。make.settings则是在已被确定的目标硬件平台上,专注于C Link SDK的功能模块裁剪或者配置,用于裁剪功能模块。

构建单元

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

每一个构建单元,若相对顶层makefile的路径是barfoo/bar1,则可以用make barmake foo/bar1命令单独编译。

tools/board/config.xxx.yyy

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

  • 其中<VENDOR>,一般是指明嵌入式平台的软件OS提供方,如mxchipubuntuwin7等。会导致构建系统到$(IMPORT_DIR)/<VENDOR>目录下寻找预编译库的二进制库文件和头文件。

  • 其中<MODEL>,一般是标明嵌入式平台的具体硬件型号,如mtk7687qcom4004等,也可以写其它信息,因为构建系统不会去理解它,比如mingw32x86-64等。

调试方式

  • make ...命令行中,设置TOP_Q变量为空,可打印工程顶层的执行逻辑,例如硬件平台的选择,SDK主库的生成等。

    make .... TOP_Q=                  
  • make ...命令行中,设置Q变量为空,可打印模块内部的构建过程,例如目标文件的生成,头文件搜寻路径的组成等。

    make .... Q=            
  • 可以用make foo/bar单独对foo/bar进行构建,需要先执行make reconfig

  • 可以进入.O/foo/bar路径,查看完整的编译临时目录,makefile和全部源码,在这里执行makemake 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 :=的写法会导致该目录被跳过编译。