Zephyr kernel Build System (CMake)介绍
目录
概述
1. 结构介绍
2 构建和配置阶段
2.1 配置阶段
2.2 Cmake编译
3 Zephy项目目录结构
3.1 文件架构
3.2 文件content
概述
本文主要介绍Zephyr kernel Build System CMake的功能,以及使用该工具构建项目,并详细介绍了每个目录以及目录下文件的作用。
1. 结构介绍
CMake 用于与 Zephyr 内核一起构建您的应用程序。一个 CMake 构建分两个阶段完成。第一阶段称为 configuration。在配置过程中,CMakeLists.txt构建脚本是 执行。配置完成后,CMake 有一个 Zephyr 构建,并且可以生成主机原生的构建脚本平台。
CMake 支持为多个构建系统生成脚本,但仅支持 Ninja 和 Make 由 Zephyr 测试和支持。配置后,您可以通过执行生成的构建脚本来开始构建阶段。这些生成脚本 可以重新编译应用程序,而无需涉及 CMake following 大多数代码更改。但是,在某些更改之后,配置步骤必须 在构建之前再次执行。构建脚本可以检测到其中的一些 情况并自动重新配置,但在某些情况下,这必须 手动完成。
Zephyr 使用 CMake 的“目标”概念来组织构建。一个 target 可以是可执行文件、库或生成的文件。为 应用程序开发人员,库目标是最重要的 理解。Zephyr 构建中的所有源代码都是通过以下方式实现的 包含在库目标中,甚至是应用程序代码。
库目标具有源代码,这些源代码是通过 CMakeLists.txt 构建如下脚本:
target_sources(app PRIVATE src/main.c)
解释:
app: 配置源文件的地址 src/main.c
PRIVATE:
keyword 表示我们正在修改库的内部的程序库
2 构建和配置阶段
Zephyr 构建过程可以分为两个主要阶段:配置 阶段(由 CMake 驱动)和构建阶段(由 Make 或 Ninja 驱动)。
2.1 配置阶段
当用户调用 CMake 生成 build system,指定源应用程序目录和 Board 目标。
CMake 首先在应用程序中处理文件 CMakeLists.txt目录中,该目录引用 Zephyr 中的 CMakeLists.txt顶级目录,该目录又引用文件 CMakeLists.txt在整个 build 树中(直接和间接)。它的主要输出是一个 一组 Makefile 或 Ninja 文件来驱动构建过程,但 CMake 脚本也会执行一些自己的处理,这将在此处进行说明。
2.2 Cmake编译
运行Cmake后,会创建build/目录
Cmake 编译的log信息:
-- west build: building domain(s): observer
[0/1] Re-running CMake...
Loading Zephyr default modules (Zephyr base (cached)).
-- Application: D:/ncs/v2.9.0/zephyr/samples/bluetooth/observer
-- CMake version: 3.21.0
-- Cache files will be written to: D:/ncs/v2.9.0/zephyr/.cache
-- Zephyr version: 3.7.99 (D:/ncs/v2.9.0/zephyr)
-- Found west (found suitable version "1.2.0", minimum required is "0.14.0")
-- Board: nrf52840dk, qualifiers: nrf52840
-- Found host-tools: zephyr 0.17.0 (C:/ncs/toolchains/b620d30767/opt/zephyr-sdk)
-- Found toolchain: zephyr 0.17.0 (C:/ncs/toolchains/b620d30767/opt/zephyr-sdk)
-- Found BOARD.dts: D:/ncs/v2.9.0/zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts
-- Generated zephyr.dts: D:/ncs/v2.9.0/zephyr/samples/bluetooth/observer/build/observer/zephyr/zephyr.dts
-- Generated devicetree_generated.h: D:/ncs/v2.9.0/zephyr/samples/bluetooth/observer/build/observer/zephyr/include/generated/zephyr/devicetree_generated.h
-- Including generated dts.cmake file: D:/ncs/v2.9.0/zephyr/samples/bluetooth/observer/build/observer/zephyr/dts.cmake
Parsing D:/ncs/v2.9.0/zephyr/Kconfig
Loaded configuration 'D:/ncs/v2.9.0/zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840_defconfig'
Merged configuration 'D:/ncs/v2.9.0/zephyr/samples/bluetooth/observer/prj.conf'
Merged configuration 'D:/ncs/v2.9.0/zephyr/samples/bluetooth/observer/build/observer/zephyr/.config.sysbuild'
No change to configuration in 'D:/ncs/v2.9.0/zephyr/samples/bluetooth/observer/build/observer/zephyr/.config'
No change to Kconfig header in 'D:/ncs/v2.9.0/zephyr/samples/bluetooth/observer/build/observer/zephyr/include/generated/zephyr/autoconf.h'
-- Configuring done
-- Generating done
-- Build files have been written to: D:/ncs/v2.9.0/zephyr/samples/bluetooth/observer/build/observer
[4/18] Generating include/generated/zephyr/version.h
-- Zephyr version: 3.7.99 (D:/ncs/v2.9.0/zephyr), build: v3.7.99-ncs2
[18/18] Linking C executable zephyr\zephyr.elf
Memory region Used Size Region Size %age UsedFLASH: 81792 B 1 MB 7.80%RAM: 23056 B 256 KB 8.80%IDT_LIST: 0 GB 32 KB 0.00%
Generating files from D:/ncs/v2.9.0/zephyr/samples/bluetooth/observer/build/observer/zephyr/zephyr.elf for board: nrf52840dk* Terminal will be reused by tasks, press any key to close it.
3 Zephy项目目录结构
使用vscode打开Zephy提供的demo,笔者以adc_dt项目为例,介绍Zephy架构下的项目文件结构,具体项目位置:C:\ncs\v2.9.1\zephyr\samples\drivers\adc\adc_dt。
3.1 文件架构
工程目录下包含两个文件夹和4个文件,其具体作用如下:
1) boards 目录:
.overlay文件: 包括和板块相关的配置,主要是根据板块的特性,重写设备树文件,该文件的后缀名为.overlay
.conf文件: 其主要用于使能Zephy提供的一些程序模块,通过对相应的模块配置y或者n,以打开或者关闭该功能
2) src目录
其主要用于包括和项目相关的工程文件,demo中的src目录只包括一个文件main.c,实际开发项目是,可在该目录添加更多的文件
3)CMakeLists.txt
编译项目相关的设置,包括项目名称,添加.c文件,文件路径等内容
4)prj.conf
在进行编译项目代码时,系统默认会选择该文件作为编译配置项,实际开发项目时,可根据需要进行改写
5)README.rst
说明文件,主要用于介绍项目的功能,编译环境,板块信息,使用方法,应用场景等
6)sample.yaml
编译选项配置文件
3.2 文件content
1) .overlay文件
/** SPDX-License-Identifier: Apache-2.0** Copyright (c) 2022 Nordic Semiconductor ASA*// {zephyr,user {io-channels = <&adc 0>, <&adc 1>, <&adc 7>;};
};&adc {#address-cells = <1>;#size-cells = <0>;channel@0 {reg = <0>;zephyr,gain = "ADC_GAIN_1_6";zephyr,reference = "ADC_REF_INTERNAL";zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;zephyr,input-positive = <NRF_SAADC_AIN1>; /* P0.03 */zephyr,resolution = <12>;};channel@1 {reg = <1>;zephyr,gain = "ADC_GAIN_1_6";zephyr,reference = "ADC_REF_INTERNAL";zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;zephyr,input-positive = <NRF_SAADC_VDD>;zephyr,resolution = <14>;zephyr,oversampling = <8>;};channel@7 {reg = <7>;zephyr,gain = "ADC_GAIN_1_5";zephyr,reference = "ADC_REF_VDD_1_4";zephyr,vref-mv = <750>;zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;zephyr,input-positive = <NRF_SAADC_AIN6>; /* P0.30 */zephyr,input-negative = <NRF_SAADC_AIN7>; /* P0.31 */zephyr,resolution = <12>;};
};
2) .conf文件结构
3) CMakeLists.txt
# SPDX-License-Identifier: Apache-2.0cmake_minimum_required(VERSION 3.20.0)find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(ADC)target_sources(app PRIVATE src/main.c)
4) sample.yaml
sample:name: ADC devicetree driver sample
tests:sample.drivers.adc.adc_dt:tags:- adcdepends_on: adcplatform_allow:- nucleo_l073rz- disco_l475_iot1- cc3220sf_launchxl- cc3235sf_launchxl- cy8cproto_063_ble- stm32l496g_disco- stm32h735g_disco- nrf51dk/nrf51822- nrf52840dk/nrf52840- nrf54l15dk/nrf54l15/cpuapp- nrf54h20dk/nrf54h20/cpuapp- mec172xevb_assy6906- gd32f350r_eval- gd32f450i_eval- gd32vf103v_eval- gd32f403z_eval- esp32_devkitc_wroom/esp32/procpu- esp32_devkitc_wrover/esp32/procpu- esp32s2_saola- esp32c3_devkitm- gd32l233r_eval- lpcxpresso55s36- mr_canhubk3- longan_nano- longan_nano/gd32vf103/lite- rd_rw612_bga- frdm_mcxn947/mcxn947/cpu0- ucans32k1sicintegration_platforms:- nucleo_l073rz- nrf52840dk/nrf52840harness: consoletimeout: 10harness_config:type: multi_lineregex:- "ADC reading\\[\\d+\\]:"- "- .+, channel \\d+: -?\\d+"
参考文献:
https://docs.zephyrproject.org/latest/build/cmake/index.html