west update
命令用于下载和更新zephyr仓库代码。这个命令简单易懂,本文介绍它的用法和后台逻辑,以此作为学习zephyr的切入点。
这些操作方法也适用于NCS。
首次下载最新版本
准备一个空的文件夹,比如C:\repo\zephyr-repo
。在命令行窗口中执行:
$ cd C:\repo\zephyr-repo
$ west init
$ west update
这几个命令需要执行好久,如果网络访问github比较慢,执行过程甚至会中断。
执行完毕后,本地目录结构如下:
$ tree -L 1
.
|-- .west
|-- bootloader
|-- modules
|-- tools
`-- zephyr
查看属性会发现总大小超过2GB,几行命令下载了这么多文件,难怪会慢。
这样下载的是最新的代码(master),如果想指定到某个版本,需要checkout:
$ cd C:\repo\zephyr-repo\zephyr
$ git checkout <target-tag>
首次下载指定版本
上面先下载再checkout的方法简单有效,除此之外,我们也可以一步到位:
$ cd C:\repo\zephyr-repo
$ west init --mr <target-tag>
$ west update
注意,参数mr前面有两个横线。
解读west init
完整的zephyr项目实际包含了30多个子仓库:
- Zephyr RTOS
- HAL_Nordic
- mcuboot
- …
并且每个仓库都要指定一个版本号(revision number)。
程序员拿到这个任务会写个脚本来自动执行,脚本思路为:
- 指定远程仓库地址
- 指定远程仓库版本号(revision number)
- 依次git clone各仓库代码
将这个脚本保存为west.yml。
由于只需要极少的git功能,zephyr团队写了个简易的git工具,取名为west。(zephyr取词于西风之神,west表示西风)
所以前面执行的west命令其实就是读取zephyr\west.yml文件,将其中列举的仓库依次下载下来。
west.yml文件又是从哪里来的呢?
west工具提供了一个命令参数,可以指定远程仓库地址:
$ west init -m <remote-git-url>
注意,这里参数m前面只有一个横线。
如果不指定远程仓库地址,它等效于:
$ west init -m https://github.com/zephyrproject-rtos/zephyr
即默认从zephyr仓库中获得west.yml文件。
west要求代码仓库在顶层目录下存在west.yml文件,如果找不到会报错。
解读west.yml
west.yml的内容如下:
manifest:
defaults:
remote: upstream
remotes:
- name: upstream
url-base: https://github.com/zephyrproject-rtos
projects:
- name: cmsis
revision: a2b82e79bd8ac156fb283d5f52fa0a2373962cf9
path: modules/hal/cmsis
self:
path: zephyr
west-commands: scripts/west-commands.yml
基本上靠猜就能理解其含义。
我们只需要修改远程仓库地址(url-base)和依赖仓库的版本号(revision)即可创建一个自己的west.yml脚本,然后让west从自己的远程地址下载。
本地west.yml
如果在本地创建了一个有效的west.yml,west也能直接读取,按我们期望的那样工作:
$ west init --local <local-west-yml>
下载提速
zephyr依赖的仓库代码全部部署在github.com,国内用户下载很慢。
我们可以通过自定义west.yml来实现高速下载的目的。
- 将zephyr仓库都搬运到国内的gitee.com上。gitee支持一键导入github仓库。
- 下载并修改west.yml文件中的远程仓库地址,指向gitee的新仓库地址。
- west init –local <local-west-yml>
这样就能飞快的下载zephyr及其依赖的仓库代码了。
这里只提供一个操作思路,熟练使用微辟恩才是正道。
更新本地版本
假设本地已经有了老版本,查看它的版本号:
$ cat zephyr/VERSION
此时希望升级到新版本,可以在命令行中执行:
$ cd C:\repo\zephyr-repo\zephyr
$ git pull
$ git checkout <target-tag>
$ west update
为什么需要先pull和checkout,直接update不行吗?
不行,因为不执行git pull
,west.yml就不变, west update
就无法获取新的依赖仓库地址。
(完)