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等配置信息,最终生成必要的头文件。
(完)
west build套娃cmake这部分写的很清楚,感谢