Yocto workflow
-
date_range 05/03/2017 infosortEmbedded and Linux
Yocto 还算一个蛮新的东西,可能很多人都不太熟悉。我最近在看的时候,资料都挺难找的,虽然官方的 documents 很全,但是对入手的人很不友好, 总结起来就是缺少一份入门的 guide。能找到的大部分 guide,在教你输入 bitbake core-image-base 后就没内容了。 然后呢?我能用 yocto 干什么,我该怎么用 yocto 去做这些事情
1. 开发内核
当你执行过一次build之后,你可以在 tmp/work-shared/<MACHINE_NAME>/kernel-source
下面找到内核的代码,只要不执行 clean,这里的代码是一直存在的,可以放心的编辑。
修改完后可以执行下面的命令去进行编译:
bitbake linux-rockchip -c compile -f
如果修改的是configure,改为下面的命令
bitbake linux-rockchip -c menuconfig
上面这步只是编译而已,下面还需要烧写内核的话,分两种场景。
1.1. 烧写完整镜像
这个时候你只要去 build 你需要的 image 就可以了,bitbake 会依次执行 kernel 的 deploy 和 image 的 generate,最终 deploy/images 目录下面生成的完整镜像会包含新编译的kernel。
bitbake IMAGE_NAME
# flash image here
1.2. 只烧写内核
在开发一些比较庞大的项目的时候,不可能说每次都烧写几个 Gb 大小的 image,这个时候就要单独烧写内核。
要注意 compile 步骤只是执行编译而已,编译完内的 binary 还呆在 work 目录下的 build dir 里的,所以你需要执行下面的命令:
bitbake linux-rockchip -c deploy -f
执行完后 deploy/images 目录下面的 kenrel image 和 dtb 就会被更新,然后你才能通过 fastboot 或者 ums 一类的办法烧写至板子上。
2. 开发应用
目前修改应用我和修改kernel差不多用法,但是 yocto 的 document 里还介绍了一些工具,如 devtool,Quilt,等待研究。
不同于内核,应用和bootloader的代码都在tmp/work目录下面,根据recipes的不同,分布不同。
编译和内核是一样的,也是
bitbake app -c compile -f
但要注意deploy不一样。
如果也是打包在image里,那重新bitbake一次image就可以。
但如果是单独更新,就最好不能用deploy了(bootloader除外),需要进tmp/work/*/package-name/version/deploy-packages/
下面拿deb出来,然后用其他办法传板子上,用dpkg安装。
比如下面这样, 从pc上scp过来。
scp chen@192.168.10.237:/home/chen/workbench/rk-community-bsp/xwayland/tmp/work/cortexa17hf-neon-vfpv4-rk-linux-gnueabi/mpv/git
-r0/deploy-debs/cortexa17hf-neon-vfpv4/mpv_git-r0_armhf.deb ./
更新: 其实可以用devtool的,看这里 https://www.yoctoproject.org/docs/1.8/dev-manual/dev-manual.html#devtool-modifying-a-recipe
3. 离线工作
默认用 yocto 有一个问题,就是必须要保证网络在连接状态。如果想离线工作,还需要做一些配置
离线工作,分下面两个场景:
3.1. 场景一:
你有一个 source 是从内网服务器获取的,然后你离开了内网环境,或者 source 是 github 上的而你电脑断开了网络。
这种场景你执行 bitbake,大概率会发现 yocto 报 network unreachable。
这个错误的原因是因为我们设置了 SRCREV = “${AUTOREV}”,导致 bitbake 的时候虽然本地已经有了仓库,但他会去尝试连接 git 服务器,看看是不是有更新,如果这个时候无法连接上 git,就会报错。
解决办法就是把 SRCREV 固定为最新的 commit id,这样只要你不执行 clean,bitbake 就不会去尝试连接 git 服务器,就可以保持离线工作。
SRCREV = "75dc14fa97df26fbb0638ccd547a01ee1632bad6"
3.2. 场景二:
一个东西到了产品化阶段,我们想固定下所有的代码。
这个可以通过设置本地的 mirror 来完成,具体参考下面的网络资料。
“How do I create my own source download mirror”
注意这个场景也不能使用 SRCREV = “${AUTOREV}”,需要有固定的代码位置。根据网络的资料,可以通过 buildhistory-collect-srcrevs 来帮助获取当前的rev,但我也没用过,有兴趣的可以在自己 google 下。
4. Debug
默认编出来的 yocto image 不包含任何的 debug symbol 和 debug 工具,不是很方便开发。不过想要安装这些工具,也非常容易。
EXTRA_IMAGE_FEATURES = "tools-debug tools-profile tools-testapps dbg-pkgs debug-tweaks"
IMAGE_INSTALL_append = “ sshfs-fuse”
一般我都会把上面这两句加到 local.conf 里,这样的 image 就非常方便使用,可以用 sshfs 拷贝文件,可以有 gdb 去debug 应用。 具体这些的含义,请点击下面的链接: “Image Features”
5. Others
Yocto 的开发,他的文档已经很全了,不需要多写什么,下面就提炼一点小tips,节约获取信息的时间。
5.1. 指定任务
bitbake 可以指定只运行一个任务,比如
bitbake linux -c compile
他就只会执行compile命令。这里要注意如果不加 -f 的话,命令有检查完 stamp 之后就直接 skip了。
常见的一些操作有,fetch, unpack, configure, compile, install, deploy等等,对应的是更新download,更新workdir下的source,配置参数,编译,安装,打包这些步骤。
5.2. 覆盖文件
覆盖文件有两种,一种是通过 bappend 来修改提供这个文件的包,这种修改比较适合 bsp 包,有普遍性的修改。第二种就是通过 update-alternatives 来设定不同包的优先级,优先级最高的文件会覆盖进去。
5.3. 打印变量
Yocto 里有很多什么 IMAGE_FEATURES 啊 DISTRO_FEATURES 啊, 因为很多层文件都有修改这些变量,所以有时候会不确定这些变量具体的值。
之前找的资料显示可以用 bitbake -e, 但是这个不是很好用。
其实可以在 do_install 加一句 echo, 输出这个变量,bitbake 加 -v 就可以看到echo的内容了,比 -e 要容易看懂一点。
5.4. clean
执行 clean 会把 workdir 里的东西都删掉,执行 cleanstate 会多一个 shared cache,执行 cleanall 还会把 download 删掉。
5.5. 更新代码
暂时这样更新代码
bitbake linux-rockchip -c clean && bitbake linux-rockchip
5.6. 查看镜像里安装的包
Yocto 有一套乱七八糟的包依赖管理,所以到后面我们会不确定自己的镜像上到底装了些什么东西,这个时候就需要一些命令去把信息打印出来。
bitbake -g cvr-image
执行完这个命令就可以得到3个文件,分别记录了各个级别的依赖和版本关系。
5.7. 集成服务器
Yotco 有一个构建服务器叫 toaster, 等待研究。
toaster看起来并不是我想象中的CI服务器,应该来说只是一个build track web interface而已,在上面可以用web的方式比较方便的获取构建信息,比如build了几个包,花了多少时间,用的什么配置。
只能简单的用toaster来承担CI服务器的效果了,可以对接上测试服务器测试当前的代码,另外还可以用apache把build完后的image暴露出来,对内提供固件。