适用范围
联网单品, 网关, IPC
TuyaOS 编译特点
TuyaOS基于统一的目录结构提供统一的编译工具,支持完整的编译、打包、文档输出。
TuyaOS 统一了不同的开发框架和产品开发包的编译和打包过程。
对开发者而言,TuyaOS 提供了统一的编译入口和开发形式。
TuyaOS基础目录结构
.
├── apps
├── application_components
├── application_driver
├── build
├── build_app.sh
├── CHANGELOG.md
├── docs
├── include
├── libs
├── LICENSE
├── Makefile
├── prepare_app.sh
├── README.md
├── scripts
└── vendor
TuyaOS 编译应用的命令
sh build_app.sh apps/tuyaos_demo_quickstart tuyaos_demo_quickstart 1.0.0
build_app.sh 参数:
$1 – 应用工程路径,如:apps/tuyaos_demo_quickstart
$2 – 应用工程名,如: tuyaos_demo_quickstart
$3 – 版本号,格式 XX.XX.XX,如: 1.0.0
$4 – 用户指令 (可选),如:clean
Tuya Wind IDE 提供一键编译功能
选择apps 目录下的应用文件夹,点击右键选择 Build Project,输入版本号即可执行编译动作。
TuyaOS 编译体系
基于xmake 体系
TuyaOS 编译脚本调用流程
RTOS
Linux
TuyaOS local.mk
TuyaOS 使用 local.mk 来描述编译内容。
存在路径
目前编译涉及到的local.mk 主要存在以下路径:
apps/xxx:应用工程
application.components/xxx:每个应用组件
application.driver/xxx:每个驱动组件
vendor/xxx/tuyaos/tuyaos_adapter:tkl适配层
符号集
local.mk采用NDK Android.mk 的语法,是它的语法子集。
目前支持的符号如下表所示:
基础模板
local.mk定义了每个组件/应用的编译头文件、源文件、生成物名称。
TuyaOS 编译步骤
- 将放在不同位置的,用于不同用途的源码,生成库文件。
- 将生成的库文件存储到 ./libs/ 目录下。
- 将所有的库链接成可执行文件
- 通过开发环境中的工具打包成固件包。
TuyaOS 编译内容和产物
TuyaOS 链接
链接内容基本可以固定,如果.a文件不存在,则提供空的.a文件,可以保证链接脚本的一致性。TuyaOS框架下需要链接的库,固定保存在./libs目录下。
可链接库
xx(产品名).a,产品入口,包含了main、tuya_app_main
tuyaapp_componets.a,应用组件,不存在则为空包
tuyaapp_drivers.a,应用驱动,不存在则为空包
tuyaos/ipc/gw/cc/subdev.a,TuyaOS 基线库
tuyaos_adapter.a,适配层
链接
TuyaOS编译框架不影响原厂内容(开发环境)的编译,可以使用原厂提供的编译机制,在链接的时候加入TuyaOS的库即可。Code: Select all
-l$(APP_BIN_NAME) -ltuyaapp_components -ltuyaapp_drivers -ltuyaos -ltuyaos_adapter
TuyaOS 固件包
输出位置
apps/xxx(应用)/output/xx.xx.xx(版本)/
关键固件
QIO后缀固件,又叫生产固件。该固件还包含了应用区固件和射频校准固件,可用于生产时做模组射频参数校准。所以该固件最大。
UA后缀的固件是用来上传到后台的用户区固件,如果使用涂鸦云模组工具烧录时,上位机软件拉的就是该固件。
UG后缀固件是用来上传到后台的升级区固件,模组进行OTA 的时候,模组拉取的固件就是该固件。
FAQ
Q:调用原厂的接口或者包含原厂的头文件会出现编译报错?
A:修改对应的local.mk,在local.mk中添加原厂文件的路径。
例:在增加bk原厂的一些文件路径
Code: Select all
# 模块源代码
LOCAL_SRC_FILES := $(shell find $(LOCAL_PATH)/src -name "*.c" -o -name "*.cpp" -o -name "*.cc")
# 模块内部CFLAGS:仅供本组件使用
LOCAL_CFLAGS += -I$(ROOT_DIR)/vendor/bk7231n/bk7231n_os/beken378/func/user_driver
LOCAL_CFLAGS += -I$(ROOT_DIR)/vendor/bk7231n/bk7231n_os/beken378/driver/include
LOCAL_CFLAGS += -I$(ROOT_DIR)/vendor/bk7231n/bk7231n_os/beken378/common
LOCAL_CFLAGS += -I$(ROOT_DIR)/vendor/bk7231n/bk7231n_os/beken378/app/config
LOCAL_CFLAGS += -I$(ROOT_DIR)/vendor/bk7231n/bk7231n_os/beken378/driver/common
LOCAL_CFLAGS += -I$(ROOT_DIR)/vendor/bk7231n/bk7231n_os/beken378/os/include
LOCAL_CFLAGS += -I$(ROOT_DIR)/vendor/bk7231n/bk7231n_os/beken378/os/FreeRTOSv9.0.0
Q:开发者新增的源文件如何加入编译?
A:新增源文件放到apps/xxx/src目录下,编译系统会自动查找,加入到编译体系中进行编译。
apps/xxx/下面有个local.mk 文件会通过shell脚本自动遍历 apps/xxx/src/ 下所有的源文件,并添加到 LOCAL_SRC_FILES 变量中进行编译,生成xxx.a 库,最后进行连接。