west命令详解:init&update

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来实现高速下载的目的。

  1. 将zephyr仓库都搬运到国内的gitee.com上。gitee支持一键导入github仓库。
  2. 下载并修改west.yml文件中的远程仓库地址,指向gitee的新仓库地址。
  3. 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就无法获取新的依赖仓库地址。

(完)