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

yocto-taotaodiy

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标签,尽量使用最新的分支。

查看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,耗费时间根据网速和主机性能而定。

构建poky

再去查看我们的工程会发现多出来一个build目录,里面放着下载的文件、构建的临时文件以及我们最终编译的镜像。

2.1.6. 模拟运行

构建完毕,使用QEMU运行构建的镜像

runqemu qemux86-64
runqemu001 runqemu002 runqemu003

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文件

poky/meta-hello/conf/layer.conf
 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"

目录结构如下

meta-hello 目录结构
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

参考 https://docs.yoctoproject.org/bitbake/bitbake-user-manual/bitbake-user-manual-hello.html#the-hello-world-example

poky/meta-hello/recipes-hello/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

poky/meta-hello/recipes-hello/hello/files/hello.c
1#include "stdio.h"
2
3int main()
4{
5    printf("hello yocto\n");
6    printf("hello taotaodiy\n");
7    return 0;
8}
poky/meta-hello/recipes-hello/hello/files/Makefile
1hello:
2        $(CC) hello.c -c -o hello-git
3
4.PHONY:clean
5clean:
6    -rm -rf *.o

新建hello-poky.bb

poky/meta-hello/recipes-hello/hello-poky/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/

  • file:// : 从本地获取文件,会从配方(*.bb)或者附加文件(.bbappend)的子目录中去寻找

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 就会得到如下输出:

runqemu004

2.2.3. hello git

这里我们再换一种,从远端仓库获取代码编译进系统

首先我们要有一个远程仓库,https://gitee.com/taotaodiy/hello-git

这个仓库只有一个.c文件和一个Makefile,和上面代码一致。

在hello-git目录下添加如下.bb文件。

poky/meta-hello/recipes-hello/hello-git/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 命令查看

git-log

同样我们将hello-git添加到镜像中

IMAGE_INSTALL_append += "hello-git"

运行编译的系统,在终端执行 hello-git 。

2.3. yocto tips

系统开发人员需要的基本技能。

  • 处理企业代理

  • 将包装添加到图像

  • 了解配方和包装的区别

  • 自己构建一个包,为什么有用

  • 找出配方创建了哪些包装

  • 找出包装中的文件

  • 找出图像中有哪些文件

  • 将ssh服务器添加到映像(启用将文件传输到目标)

  • 知道食谱的解剖

  • 知道如何创建和使用图层

  • 查找配方(带有OpenEmbedded Layer索引)

  • 了解机器和发行版设置之间的区别

  • 查找并使用适合您硬件的正确BSP(机器)

  • 查找发行版功能的示例并知道在何处进行设置

  • 了解任务管道并执行单个任务

  • 了解devtool以及它如何简化您的工作流程

  • 通过共享下载和共享状态缓存提高构建速度

  • 生成并理解依赖图

  • 生成并了解比特烘烤环境

  • 构建用于应用程序开发的可扩展SDK