在后续的讲解过程中我们会大量的创建新的项目和演示操作等,但是我们尽可能不去改动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
但是,这个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
创建完了,它提示你执行:
build]$ bitbake-layers add-layer ../meta-mylayer
#注意执行的路径是在build目录下,meta-mylayer在poky目录下,故而../meta-mylayer
简单讲下:bitbake-layers create-layer会在先在poky目录下创建对于的文件夹,而bitbake-layers add-layer会将layer路径添加到build/conf/bblayers.conf文件中,是分两步的。
也有对于的命令去删除layer,比如:
build]$ bitbake-layers remove-layer ../meta-mylayer/
只是讲bblayers.conf中的meta-mylayer配置,不会讲poky目录下的meta-mylayer子目录删除。如果有必要可以手动删除。

创建自己的layer最终命令

综上,创建自己的layer,严格安装下面的命令即可:
build]$ bitbake-layers create-layer ../meta-mylayer
build]$ bitbake-layers add-layer ../meta-mylayer

查看添加了那些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

meta-mylayer图片结构

参考:
image.png
查看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(“*“); }
可以看到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.
编译好像没有什么输出,中间文件都在:
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

打印不显示问题 - 后记

关于在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 #加上这一行
然后编译就可以看到打印了:
build]$ bitbake example
… NOTE: Executing Tasks * Example recipe created by bitbake-layers *
如果再次编译会看不到上述打印,是因为有了编译历史记录,而bb文件没有更新,所以do_compile任务就没有再次执行。需要做如下工作:
build]$ bitbake -c cleanall example

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

文件系统在哪里

制作文件系统也是一个独立的任务叫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
这里面有个技巧就是你的程序有没有整合到文件系统中可以到这里面找找看,没有就说明有问题,就不需要实际刷机运行了