west命令详解:build

west build是开发阶段最常用的命令,它的使用方法异常简洁,但背后处理机制却极其复杂,犹如庞大的冰山在海面露出一个尖角。

本文介绍west build的使用方法和常用参数,并窥探一下命令背后的实现逻辑。

编译

初次编译:

$ cd zephyr\sample\hello_world
$ west build --board nrf52_pca10040

再次编译:

$ west build

重新编译:

$ west build --cmake

menuconfig

命令行界面:

$ west build --target menuconfig

GUI界面:

$ west build --target guiconfig

查看RAM/ROM占用

RAM:

$ west build --target ram_report

ROM:

$ west build --target rom_report

打印调试信息

以下命令依次打印更低级别的调试信息:

$ west -v build
$ west -vv build
$ west -vvv build

west转换成cmake

west build 的核心工作是执行:

$ mkdir build & cd build
$ cmake -G Ninja -DBOARD=nrf52_pca10040 ..

west build命令怎么就变成了cmake命令呢?

west在运行时会根据当前路径向上寻找.west文件夹,.west\config文件记录了zephyr文件夹的路径,然后读取zephyr\west.yml

打开west.yml,关注最后几行:

  ...

  self:
    path: zephyr
    west-commands: scripts/west-commands.yml

它指向了west扩展命令清单的路径:scripts/west-commands.yml,打开它:

west-commands:
  - file: scripts/west_commands/build.py
    commands:
      - name: build
        class: Build
        help: compile a Zephyr application

它意味着遇到west build命令时,要执行scripts/west_commands/build.py。这就成功将指定命令引导到Python脚本上。

build.py脚本会处理各种准备工作,并生成最终的执行命令:

cmake -B build_dir -S source_dir -G Ninja -DBOARD = board

解读CMakeLists.txt

cmake根据CMakeLists.txt文件进行操作。

打开hello_world\CMakeLists.txt:

1. cmake_minimum_required(VERSION 3.13.1)
2. 
3. find_package(Zephyr HINTS $ENV{ZEPHYR_BASE})
4. project(hello_world)
5. 
6. target_sources(app PRIVATE src/main.c)

第1行是模板,不管它。

第4行是设置工程名字,不管它。

第6行是将源代码加入到名为app的目标中,类似于我们将c文件拖放到SES的工程目录中,不管它。

关键是第3行,它就是冰山冒出海面的那个角。

$ENV{ZEPHYR_BASE}指向了zephyr的根目录路径,比如C:\repo\zephyr-repo\zephyr。

它是在什么时候被赋值的的呢?

build.py脚本会引用zephyr\scripts\west_commands\zephyr_ext_common.py,在这个脚本中设置了ZEPHYR_BASE宏。

find_package是cmake的系统函数,该行意思是在ZEPHYR_BASE目录中寻找名为Zephyr的模块。

在cmake的文档中找到关键注释:

  • cmake 模块的命名模板为:xxxConfig.cmake或Findxxx.cmake
  • cmake 模块的地址模板为:<prefix>/(lib/<arch>|lib*|share)/<name>*/(cmake|CMake)/

于是,我们找到名为Zephyr的模块文件:zephyr\share\zephyr-package\cmake\ZephyrConfig.cmake

zephyrConfig.cmake调用zephyr\cmake\app\boilerplate.cmake,它将处理device tree和kconfig等配置信息,最终生成必要的头文件。

(完)