yocto-第4篇-创建自己的meta layer

By: fulinux
E-mail: fulinux@sina.com
Blog: https://blog.csdn.net/fulinus
喜欢的盆友欢迎点赞和订阅!
你的喜欢就是我写作的动力!

返回总目录 Yocto开发讲解系列 - 总目录

创建自己的layer

在后续的讲解过程中我们会大量的创建新的项目和演示操作等,但是我们尽可能不去改动 poky 中的源码等内容,我也希望大家能有这种原则意识。因此,我们可以使用 bitbake-layers create-layer 命令创建一个自己的 layer ,我们就取名为 meta-mylayer 吧。过程演示如下:

$ cd poky/
$ source oe-init-build-env
$ bitbake-layers create-layer meta-mylayer
NOTE: Starting bitbake server...
Add your new layer with 'bitbake-layers add-layer meta-mylayer'
build]$ ls ../
#发现这个下面并没有meta-mylayer目录,但是它在poky/build/目录下面:
build]$ ls
bitbake-cookerdaemon.log  cache  conf  downloads  meta-mylayer  sstate-cache  tmp
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

但是,这个meta-mylayer是在build目录下,build只是一个临时的构建目录,我们应该将其放在与其他meta目录平级的poky目录下,执行删除操作:

build]$ rm meta-mylayer/ -rf
#重新开始创建meta-mylayer
build]$ bitbake-layers create-layer ../meta-mylayer
NOTE: Starting bitbake server...
Add your new layer with 'bitbake-layers add-layer ../meta-mylayer'
build]$ ls ../
bitbake  documentation         LICENSE.MIT  meta-altera   meta-selftest   oe-init-build-env  README.poky
build    LICENSE               MEMORIAM     meta-mylayer  meta-skeleton   README.hardware    README.qemu
contrib  LICENSE.GPL-2.0-only  meta         meta-poky     meta-yocto-bsp  README.OE-Core     scripts
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

创建完了,它提示你执行:

build]$ bitbake-layers add-layer ../meta-mylayer
#注意执行的路径是在build目录下,meta-mylayer在poky目录下,故而../meta-mylayer
  • 1
  • 2

简单讲下: bitbake-layers create-layer 会在先在poky目录下创建对于的文件夹,而 bitbake-layers add-layer 会将layer路径添加到 build/conf/bblayers.conf 文件中,是分两步的。

也有对于的命令去删除layer,比如:

build]$ bitbake-layers remove-layer ../meta-mylayer/
  • 1

只是讲 bblayers.conf 中的 meta-mylayer 配置,不会讲poky目录下的 meta-mylayer 子目录删除。如果有必要可以手动删除。

创建自己的layer最终命令

综上,创建自己的layer,严格安装下面的命令即可:

build]$ bitbake-layers create-layer ../meta-mylayer
build]$ bitbake-layers add-layer ../meta-mylayer
  • 1
  • 2

查看添加了那些layers

参考:

build]$ bitbake-layers show-layers
NOTE: Starting bitbake server...
WARNING: Layer meta-mybsp should set LAYERSERIES_COMPAT_meta-mybsp in its conf/layer.conf file to list the core layer names it is compatible with.
layer                 path                                      priority
==========================================================================
meta                  /home/peeta/poky/meta                     5
meta-poky             /home/peeta/poky/meta-poky                5
meta-yocto-bsp        /home/peeta/poky/meta-yocto-bsp           5
meta-mylayer          /home/peeta/poky/meta-mylayer             5
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

meta-mylayer图片结构

参考:
在这里插入图片描述
查看example_0.1.bb文件是 create-layer 时,自己创建的一个示例项目,简单看下这个bb文件内容:

build]$ cat ../meta-mylayer/recipes-example/example/example_0.1.bb 
SUMMARY = "bitbake-layers recipe"
DESCRIPTION = "Recipe created by bitbake-layers"
LICENSE = "MIT"

python do_build() {
    bb.plain("***********************************************");
    bb.plain("*                                             *");
    bb.plain("*  Example recipe created by bitbake-layers   *");
    bb.plain("*                                             *");
    bb.plain("***********************************************");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

可以看到example.bb文件中没有做什么事情,就是在编译的时候打印了字符串。

编译我们的example项目

build]$ bitbake example
Parsing recipes: 100% |##########################################################################################| Time: 0:00:09
Parsing of 780 .bb files complete (0 cached, 780 parsed). 1321 targets, 46 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies

Build Configuration:
BB_VERSION           = "1.46.0"
BUILD_SYS            = "x86_64-linux"
NATIVELSBSTRING      = "universal"
TARGET_SYS           = "x86_64-poky-linux"
MACHINE              = "qemux86-64"
DISTRO               = "poky"
DISTRO_VERSION       = "3.1.2"
TUNE_FEATURES        = "m64 core2"
TARGET_FPU           = ""
meta                 
meta-poky            
meta-yocto-bsp       = "my-yocto-3.1.2:569b1f5d67c57de957e243997c53ec2f81dc8dfe"
meta-altera          = "master:aa24dfcb39fce3619a87ee6eef6e4296e66d2099"
meta-mylayer         = "my-yocto-3.1.2:569b1f5d67c57de957e243997c53ec2f81dc8dfe"

Initialising tasks: 100% |#######################################################################################| Time: 0:00:00
Sstate summary: Wanted 7 Found 0 Missed 7 Current 128 (0% match, 94% complete)
NOTE: Executing Tasks
NOTE: Tasks Summary: Attempted 542 tasks of which 527 didn't need to be rerun and all succeeded.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

编译好像没有什么输出,中间文件都在:

build]$ cd build/tmp/work/core2-64-poky-linux/example/0.1-r0
[peeta@tommy-OptiPlex-7060 0.1-r0]$ ls
configure.sstate          example-0.1   license-destdir  pkgdata              pseudo                 source-date-epoch
deploy-rpms               example.spec  package          pkgdata-pdata-input  recipe-sysroot         sysroot-destdir
deploy-source-date-epoch  image         packages-split   pkgdata-sysroot      recipe-sysroot-native  temp
  • 1
  • 2
  • 3
  • 4
  • 5

打印不显示问题 - 后记

关于在bb文件中加打印信息没有任何显示的问题
修改 meta-mylayer/recipes-example/example/example_0.1.bb 文件:

SUMMARY = "bitbake-layers recipe"
DESCRIPTION = "Recipe created by bitbake-layers"
LICENSE = "MIT"

python do_compile() { #改成do_compile
    bb.plain("***********************************************");
    bb.plain("*                                             *");
    bb.plain("*  Example recipe created by bitbake-layers   *");
    bb.plain("*                                             *");
    bb.plain("***********************************************");
}

addtask compile #加上这一行
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

然后编译就可以看到打印了:

build]$ bitbake example
...
NOTE: Executing Tasks
***********************************************
*                                             *
*  Example recipe created by bitbake-layers   *
*                                             *
***********************************************
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

如果再次编译会看不到上述打印,是因为有了编译历史记录,而bb文件没有更新,所以do_compile任务就没有再次执行。需要做如下工作:

build]$ bitbake -c cleanall example
  • 1

deploy目录

所有生成的镜像文件包括bootloader、kernel镜像和文件系统等镜像都在这个目录下面:

build]$ cd tmp/deploy/images/qemux86-64/
qemux86-64]$ ls
bzImage
bzImage--5.4.50+git0+416566e1f0_94667198aa-r0-qemux86-64-20201003082353.bin
bzImage-qemux86-64.bin
core-image-sato-qemux86-64-20201003082353.qemuboot.conf
core-image-sato-qemux86-64-20201003082353.rootfs.ext4
core-image-sato-qemux86-64-20201003082353.rootfs.manifest
core-image-sato-qemux86-64-20201003082353.rootfs.tar.bz2
core-image-sato-qemux86-64-20201003082353.testdata.json
core-image-sato-qemux86-64.ext4
core-image-sato-qemux86-64.manifest
core-image-sato-qemux86-64.qemuboot.conf
core-image-sato-qemux86-64.tar.bz2
core-image-sato-qemux86-64.testdata.json
modules--5.4.50+git0+416566e1f0_94667198aa-r0-qemux86-64-20201003082353.tgz
modules-qemux86-64.tgz
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

文件系统在哪里

制作文件系统也是一个独立的任务叫core-image-sato,生成的中间文件目录在:

build]$ ls tmp/work/qemux86_64-poky-linux/core-image-sato/1.0-r0/rootfs/
bin  boot  dev  etc  home  lib  media  mnt  proc  run  sbin  sys  tmp  usr  var
  • 1
  • 2

这里面有个技巧就是你的程序有没有整合到文件系统中可以到这里面找找看,没有就说明有问题,就不需要实际刷机运行了。

希望帮我点个赞加关注,你的喜欢就是我持续更新的动力!

更新时间:2021年5月