yocto系列讲解 (技巧篇) 61 - 定制自己的发行版本解决基础配置问题

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

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

问题概述

在上面的一节中我们通过在 meta-mylayer/conf 目录中新建了自己的模板配置, 将系统的首进程由原来的sysvinit改成systemd的配置写在模板中,通过source时使用local.conf.sample模板生成build/conf/local.conf配置文件,实现了我们的预期目标。
但是这个做法的缺陷也是很明显的,对于多平台怎么处理?比如我们的目标有多种(例如qemux86或beaglebone),如果每次都去修改local.conf配置或模板文件,那就相当的麻烦。

再有,我们的目标是不改动原生的代码,那又该如何解决修改 poky 目录下原生的 .templateconf 文件的冲突问题呢?

那么有没有一个比较稳妥的做法,只在 meta-mylayer 、或者其他定制的 meta-* 目录中进行修改,能适应多种平台的要求呢?

发行版配置

首先,我们要解决的问题就是如何将一些底层的、全局性质的相关配置从 build/conf/local.conf 配置中脱离出来。如何做呢?
有的盆友可能会说我们前面不是学习了机器的配置文件和发行版的配置文件知识,可以修改类似 conf/machine/qemux86-64.conf 或者 conf/distro/poky.conf 文件就可以。
但是,这两个文件是在 meta 或者 meta-poky 目录下啊?要是能违背我们不修改原生代码的原则,那么前面也就不费那个力气添加临时模板配置了。

那有没有方法在 meta-mylayer/conf 的目录中也添加机器或者发行版的配置呢?这是个好的思路,但是添加同名的conf配置文件吗?那怎么处理冲突问题?

有没有类似 bb 文件的 bbappend 的方法呢?目前我没见过。

那能不能将原始的 conf 配置文件复制到自己的 meta 中来,并添加自己的其他配置,然后改个其他的名字呢?理论上是可以的哈
不过这种做法不免太麻烦。日后原生的 conf 配置有新的更新,如何处理这种变动,而且对于很多盆友来说像 poky.conf 这样的配置太过复杂,可能带来依赖等相关的问题。

下面我讲述自己琢磨出来的一种做法,比如在发行版本配置文件中将系统的首进程改成 systemd 的做法,虽然没有类似 bbappend 的那种追加的配置做法,但是可以包含其他的 conf 配置的做法。比如我们自定义一个 mypoky.conf 文件,然后在其中包含(继承) poky.conf 文件的配置,参考如下的做法:

poky]$ mkdir -p meta-mylayer/conf/distro/
poky]$ cd meta-mylayer/conf/distro/
distro]$ vim mypoky.conf
#Distro configuration
require conf/distro/poky.conf #包含了poky.conf文件
DISTRO = "mypoky"
DISTROOVERRIDES = "poky:mypoky" #包含DISTRO中的字符串还有被poky.conf文件中的DISTRO字符串,用冒号分隔
DISTRO_VERSION = "1.0.0" #定义自己的版本
DISTRO_NAME ?= "fulinux.blog.csdn.net(Reference Distro)"

PACKAGE_CLASSES ?= "package_ipk" #这个是原来build/conf/local.conf中的配置

#下面就是配置systemd的首进程
# Use systemd init manager.
#DISTRO_FEATURES_remove = "sysvinit"
DISTRO_FEATURES_append = " systemd"
VIRTUAL-RUNTIME_init_manager = "systemd"
DISTRO_FEATURES_BACKFILL_CONSIDERED += "sysvinit"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

完成了这一步之后,只要在 build/conf/local.conf 文件中将 DISTRO 的值改成 mypoky 即可。

poky]$ vim build/conf/local.conf
...
DISTRO ?= "mypoky"
...
  • 1
  • 2
  • 3
  • 4

然后呢开始构建我们的目标:

build]$ bitbake core-image-sato
Build Configuration:
BB_VERSION           = "1.48.0"
BUILD_SYS            = "x86_64-linux"
NATIVELSBSTRING      = "universal"
TARGET_SYS           = "x86_64-poky-linux"
MACHINE              = "qemux86-64"
DISTRO               = "mypoky" #不是原来的poky了
DISTRO_VERSION       = "1.0.0" #这里变成了1.0.0
TUNE_FEATURES        = "m64 core2"
TARGET_FPU           = ""
meta                 
meta-poky            
meta-yocto-bsp       = "my-yocto-3.2.2:d5d6286a66f46f4523e35e0e3f20cd7396195fdc"
meta-mybsp           = "master:cd2cccd784b576b9b1ab0cdefa3ae550267dd831"
meta-mylayer         = "master:05441a0ccc4b950ce619530f5037014f82418920"
meta-qt5             = "master:41027a6188fb851b35425b7ffecaa6eb420d3f01"
workspace            = "my-yocto-3.2.2:d5d6286a66f46f4523e35e0e3f20cd7396195fdc"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

只是改变了一些我们要改变的内容,文件系统的构建内容与原来的poky.conf没有什么差异。

添加自己的source脚本文件

其实我们很多时候不用去手动修改 build/conf/local.conf 文件,可以在执行bitbake前定义自己的MACHINE和DISTRO等变量,比如:

build]$ MACHINE="qemux86-64" DISTRO="poky" bitbake core-image-sato 
Build Configuration:
BB_VERSION           = "1.48.0"
BUILD_SYS            = "x86_64-linux"
NATIVELSBSTRING      = "universal"
TARGET_SYS           = "x86_64-poky-linux"
MACHINE              = "qemux86-64"
DISTRO               = "poky"
DISTRO_VERSION       = "3.2.2"
TUNE_FEATURES        = "m64 core2"
TARGET_FPU           = ""
meta                 
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

但是这样做的弊端就是命令太长了,可能还有很多更为复杂的赋值语句,搞不好就忘了。
据我的经验所知很多OEM厂商都会定义自己的source脚本文件,我们也参考做一个,这样就不用每次都去修改 build/conf/local.conf 文件了。

poky]$ vim meta-mylayer/conf/set-my-build-env
# Find build templates from meta-mylayer.
export TEMPLATECONF="meta-mylayer/conf"

# Find where the global conf directory is...
scriptdir="$(dirname "${BASH_SOURCE}")"

# Find where the workspace is...
CURDIR=$(readlink -f $scriptdir/../..)

function build-qemux86-64-sato-image() {
        export MACHINE="qemux86-64"
        export DISTRO="mypoky"
        bitbake core-image-sato
}

. ${CURDIR}/oe-init-build-env
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

上面自添加了一个函数,用户可以自行定制更多的函数。使用方法如下:

poky]$ source meta-mylayer/conf/set-my-build-env
build]$ build-qemux86-64-sato-image
Build Configuration:
BB_VERSION           = "1.48.0"
BUILD_SYS            = "x86_64-linux"
NATIVELSBSTRING      = "universal"
TARGET_SYS           = "x86_64-poky-linux"
MACHINE              = "qemux86-64"
DISTRO               = "mypoky"
DISTRO_VERSION       = "1.0.0"
TUNE_FEATURES        = "m64 core2"
TARGET_FPU           = ""
meta                 
meta-poky            
meta-yocto-bsp       = "my-yocto-3.2.2:d5d6286a66f46f4523e35e0e3f20cd7396195fdc"
meta-mybsp           = "master:cd2cccd784b576b9b1ab0cdefa3ae550267dd831"
meta-mylayer         = "master:05441a0ccc4b950ce619530f5037014f82418920"
meta-qt5             = "master:41027a6188fb851b35425b7ffecaa6eb420d3f01"
workspace            = "my-yocto-3.2.2:d5d6286a66f46f4523e35e0e3f20cd7396195fdc"
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

感谢阅读!您的点赞加收藏就是我持续更新的动力!