2. hello yocto¶
关键词: yocto poky bitbake
通过两个小示例来了解yocto的构建流程,熟悉poky进而了解yocto。
主要内容:
快速构建yocto环境
hello bitbake
hello poky
构建流程详解
文档参考:
最新文档 https://taotaodiy-yocto.readthedocs.io/en/latest/yocto/yocto-hello.html
2.1. 快速开始¶
可直接参考官方文档:点击跳转
2.1.1. 准备主机¶
运行受支持的Linux发行版(即Fedora,openSUSE,CentOS,Debian或Ubuntu)。
50 GB的可用磁盘空间
Git 1.8.3.1或更高
tar 1.28或更高
Python 3.5.0或更高版本。
gcc 5.0或更高。
2.1.2. 科学上网¶
此处省略,但这一点很关键,没有这一步就不用下一步了。
2.1.3. 安装环境¶
sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev pylint3 xterm python3-subunit mesa-common-dev
2.1.4. 获取poky¶
git克隆poky仓库
git clone git://git.yoctoproject.org/poky
yocto官方每半年发布一个版本,本文档编写时,官方发布yocto-3.1。 方便后续学习,我们先查看poky标签,尽量使用最新的分支。
1 cd poky
2 git fetch --tags
3 git tag
从标签yocto-3.1创建本地分支taotaodiy-yocto-3.1,请根据最新tag自行修改。
git checkout tags/yocto-3.2.2 -b taotaodiy-yocto-3.2.2
2.1.5. 构建镜像¶
初始化构建环境
source oe-init-build-env
我们会得到一些提示,比如
You can now run 'bitbake <target>'
Common targets are:
core-image-minimal
core-image-sato
meta-toolchain
meta-ide-support
我们就按照提示开始构建(注意不能使用root)
bitbake core-image-sato
这时候就开始构建了,我们会看到运行的若干tasks,耗费时间根据网速和主机性能而定。
再去查看我们的工程会发现多出来一个build目录,里面放着下载的文件、构建的临时文件以及我们最终编译的镜像。
2.2. hello world¶
新建一下目录:
新建层 poky/meta-hello 新建文件夹 poky/meta-hello/conf 新建配方 poky/meta-hello/recipes-hello 新建文件夹 poky/meta-hello/recipes-hello/hello/files
conf添加layer.conf,直接复制的meta-poky的conf/layer.conf,改了个名字
新建layer.conf,新建Recipes文件
1# We have a conf and classes directory, add to BBPATH
2BBPATH =. "${LAYERDIR}:"
3
4# We have recipes-* directories, add to BBFILES
5BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
6 ${LAYERDIR}/recipes-*/*/*.bbappend"
7
8BBFILE_COLLECTIONS += "hello"
9BBFILE_PATTERN_hello = "^${LAYERDIR}/"
10BBFILE_PRIORITY_hello = "5"
11
12LAYERSERIES_COMPAT_hello = "gatesgarth"
13
14# This should only be incremented on significant changes that will
15# cause compatibility issues with other layers
16LAYERVERSION_hello = "3"
17
18LAYERDEPENDS_hello = "hello"
19
20REQUIRED_POKY_BBLAYERS_CONF_VERSION = "2"
目录结构如下
1meta-hello
2├── conf
3│ └── layer.conf
4└── recipes-hello
5 ├── hello-bitbake
6 ├── hello-git
7 └── hello-poky
8 └── files
在bblayers.conf中添加 meta-hello的绝对路径
1BBLAYERS ?= " \
2 /home/taotaodiy/yocto-project/poky/meta \
3 /home/taotaodiy/yocto-project/poky/meta-poky \
4 /home/taotaodiy/yocto-project/poky/meta-yocto-bsp \
5 /home/taotaodiy/yocto-project/poky/meta-hello \
6 "
2.2.1. hello bitbake¶
新建hello-bitbake.bb
1DESCRIPTION = "Prints Hello World"
2SECTION = "examples"
3PV = '1'
4PR = "r0"
5
6LICENSE = "MIT"
7LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"
8
9
10python do_build() {
11 bb.plain("********************");
12 bb.plain("* *");
13 bb.plain("* Hello, World! *");
14 bb.plain("* *");
15 bb.plain("********************");
16}
编译hello-bitbake.bb
使用bitbake查找hello bitbake -s | grep hello-bitbake
编译单独的层 bitbake hello-bitbake bitbake -c clean hello-bitbake
2.2.2. hello poky¶
files中添加hello.c和Makefile
1#include "stdio.h"
2
3int main()
4{
5 printf("hello yocto\n");
6 printf("hello taotaodiy\n");
7 return 0;
8}
1hello:
2 $(CC) hello.c -c -o hello-git
3
4.PHONY:clean
5clean:
6 -rm -rf *.o
新建hello-poky.bb
1DESCRIPTION = "Hello World Test"
2SECTION = "examples"
3
4LICENSE = "MIT"
5LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"
6PV = "1"
7PR = "r0"
8
9SRC_URI = "file://hello.c;md5=a4ded9eb3c34d18125f8fb676c34290e\
10 file://Makefile;md5=c0c08aca49fc1069080622478ad17ad6 \
11 "
12
13S = "${WORKDIR}"
14
15do_compile () {
16 make
17}
18
19do_install() {
20 install -d ${D}${bindir}/
21 install -m 0755 ${S}/hello-taotaodiy ${D}${bindir}/
22}
23
24FILES_${PN} = "${bindir}/hello-taotaodiy"
DESCRIPTION:这个包的描述
LIC_FILES_CHKSUM:文件的md5校验值,可以用md5sum hello.c来获取
PV:recipe的版本号
PR:recipe的修订版本号
SRC_URI:源文件列表
S:指定变量
do_compile : 重写了bitbake的函数,是bitbake进行compiletask的时候做的事情
do_install:同上
bindir:是一个路径变量,可以在总的conf,以及各个packge的conf中找到定义,大部分情况下是 /usr/bin/
md5计算 xxx为文件名
md5sum xxx
编译hello-poky.bb
使用bitbake查找hello bitbake -s | grep hello-poky
编译单独的层 bitbake hello-poky bitbake -c clean hello-poky
将hello-poky添加到镜像中
我们之前构建的命令是 bitbake core-image-sato
这个文件在poky/meta/recipes-sato/images/core-image-sato.bb
向文件末尾添加一行
IMAGE_INSTALL_append += "hello-poky"
再次编译,等待编译完成。
最终我们就能在 poky/build/tmp/work/qemux86_64-poky-linux/core-image-sato/1.0-r0/rootfs/usr/bin 中找到hello-taotaodiy
再次启动我们编译的系统,runqemu qemux86-64
在终端执行 hello-taotaodiy 就会得到如下输出:
2.2.3. hello git¶
这里我们再换一种,从远端仓库获取代码编译进系统
首先我们要有一个远程仓库,https://gitee.com/taotaodiy/hello-git
这个仓库只有一个.c文件和一个Makefile,和上面代码一致。
在hello-git目录下添加如下.bb文件。
1DESCRIPTION = "hello git"
2SECTION = "examples"
3
4LICENSE = "MIT"
5LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"
6PV = "1"
7PR = "r0"
8
9#DEPENDS = "xxx"
10
11UBRANCH = "master"
12
13SRC_URI = "git://gitee.com/taotaodiy/hello-git.git;protocol=https;branch=${UBRANCH}"
14SRCREV = "c77fa3087e5a2f23fdac118ea00350d0eb40be95"
15
16S = "${WORKDIR}"
17
18do_compile () {
19 make
20}
21
22do_install() {
23 install -d ${D}${bindir}/
24 install -m 0755 ${S}/hello-git ${D}${bindir}/
25}
26
27FILES_${PN} = "${bindir}/hello-git"
其中SRCREV为git远程提交时的log,可通过 git log 命令查看
同样我们将hello-git添加到镜像中
IMAGE_INSTALL_append += "hello-git"
运行编译的系统,在终端执行 hello-git 。
2.3. yocto tips¶
系统开发人员需要的基本技能。
处理企业代理
将包装添加到图像
了解配方和包装的区别
自己构建一个包,为什么有用
找出配方创建了哪些包装
找出包装中的文件
找出图像中有哪些文件
将ssh服务器添加到映像(启用将文件传输到目标)
知道食谱的解剖
知道如何创建和使用图层
查找配方(带有OpenEmbedded Layer索引)
了解机器和发行版设置之间的区别
查找并使用适合您硬件的正确BSP(机器)
查找发行版功能的示例并知道在何处进行设置
了解任务管道并执行单个任务
了解devtool以及它如何简化您的工作流程
通过共享下载和共享状态缓存提高构建速度
生成并理解依赖图
生成并了解比特烘烤环境
构建用于应用程序开发的可扩展SDK