yocto系列讲解 (实战篇) 54 - 添加Qt5和生成带Qt5的SDK

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

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

我们的Qt5小目标

为了满足读者盆友想看yocto如何添加qt5的需求,今天就开始尝试添加meta-qt5。
今天的工作流程:

qt5相关的资源包
复位环境
添加layer
编译qtbase
编译toolchain SDK
固化劳动成果

对于Qt5而言,我给自己定几个小目标:

  1. 在目标机器上面可以运行qml程序;
  2. 目标机器上Qt自带的example测试程序要有;
  3. toolchain SDK带qt5需要的一些库、可以调用 qmake 编译 Qt5 程序;
  4. 将劳动成果固化成yocto应有的标准流程,无需另外的指令编译;

下载meta-qt5

考虑下载过程较长,我们可以在下载的过程中研究yocto如何正确添加qt5的资源。

吃过猪肉也见过猪跑,不卖关子,yocto有相应的 Qt5 meta layer,即 meta-qt5 , 有了这个meta layer我们无需做过多的工作。

先下载 meta-qt5 的layer,这里提供两个网址供参考下载:
https://github.com/
http://layers.openembedded.org/layerindex/branch/master/layer/meta-qt5/

我这里通过下面的方式下载:

poky]$ git clone https://github.com/meta-qt5/meta-qt5.git
  • 1

后记:也可以使用下面的命令,让yocto自己去找meta-qt5(就是在 http://layers.openembedded.org/layerindex 中查找)下载和添加进 conf/bblayers.conf

poky]$ source oe-init-build-env
build]$ bitbake-layers layerindex-fetch meta-qt5
  • 1
  • 2

复位环境

将自己的项目还原成原始的状态,即在yocto的qemux86-64虚拟机中添加qt5相关内容。基本上不需要做什么大的修改,首先就是修改 local.conf 配置文件,将我们的 MACHINE 改成 qemux86-64 。如果你有在poky目录中做个其他平台的的构建,想保留以前的内容,就可以修改TMPDIR变量重新指定一个构建目录。

poky]$ vim build/conf/local.conf
MACHINE ??= "qemux86-64"
#MACHINE = "msm8909"
...
TMPDIR = "${TOPDIR}/tmp-${MACHINE}" #构建的目录都放到这个poky/build/tmp-qemux86-64的目录里面
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

确认下版本是否匹配

meta-qt5下载完成后,首先确认下我们的yocto版本和这个meta-qt5的版本是否兼容,每个版本的yocto都有个别名,我们当前的版本是v3.2.2,对应的别名是 gatesgarth 。我们刚刚下载的meta-qt5的git分支中就有这个gatesgarth分支,如果你是其他版本的yocto,注意找到匹配对应的版本。

poky]$ cat meta/conf/layer.conf
...
LAYERSERIES_COMPAT_core = "gatesgarth" #yocto版本的别名
...
poky]$ cd meta-qt5/
meta-qt5]$ git branch
* master #当前我所处的是master分支
meta-qt5]$ cat conf/layer.conf 
LAYERSERIES_COMPAT_qt5-layer = "dunfell gatesgarth hardknott" #包含gatesgarth,说明兼容
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

可以看到我们meta-qt5所在的master分支是兼容这个yocto的 gatesgarth 版本的,因此我们就不去切换分支了,通常master是稳定更新。

添加meta-qt5进bblayers.bb

poky]$ source oe-init-build-env
build]$ bitbake-layers --help
add-layer           Add one or more layers to bblayers.conf.
...
build]$ bitbake-layers add-layer ../meta-qt5 #如果执行上面的bitbake-layers layerindex-fetch meta-qt5这一步可以省略
  • 1
  • 2
  • 3
  • 4
  • 5

先编译起来

找一个提纲挈领的Qt5的recipe来先编译起来, 我觉得在 meta-qt5/recipes-qt 目录中 qtbase 看着就挺像的~,那先bitbake这个qtbase吧!这样就有很多时间研究这个meta-qt5的layer了:

build]$ ls ../meta-qt5/recipes-qt/qt5/qtbase_git.bb
build]$ bitbake qtbase
Build Configuration:
BB_VERSION           = "1.48.0"
BUILD_SYS            = "x86_64-linux"
NATIVELSBSTRING      = "ubuntu-16.04"
TARGET_SYS           = "x86_64-poky-linux"
MACHINE              = "qemux86-64"
DISTRO               = "poky"
DISTRO_VERSION       = "3.2.2"
TUNE_FEATURES        = "m64 core2"
TARGET_FPU           = ""
meta                 
meta-poky            
meta-yocto-bsp       = "my-yocto-3.2.2:d5d6286a66f46f4523e35e0e3f20cd7396195fdc"
meta-mybsp           = "master:aa14cafb3b17d37ba979ff058bb6d0b97602d562"
meta-qt5             = "master:41027a6188fb851b35425b7ffecaa6eb420d3f01"
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

研究meta-qt5

趁着编译的时间,我们可以粗略的看看meta-qt5的组成。

meta-qt5]$ ls
classes  COPYING.MIT  lib       README.md             recipes-devtools  recipes-qt
conf     files        licenses  recipes-connectivity  recipes-python
  • 1
  • 2
  • 3

该目录下有一些文件和目录,虽然很多,但是经过我们前期的了解,我们知道像classes、conf、files等目录下的内容都是其辅助功能的,我们需要的是找到我们需要的recipes,看目录名初步定位就是在recipes-qt目录中。我对于Qt5的了解不是很全面,但是知道如果想使用Qt5和QML等编程,需要用到的软件包就包含qtbase、qtdeclarative和qtquickcontrols2等。那我们就到recipes-qt目录中搜索这些关键词吧。

recipes-qt]$ grep -in "qtquickcontrols2" -r .
./qt5/qtwebengine_git.bb:22:    qtbase qtdeclarative qtxmlpatterns qtquickcontrols qtquickcontrols2 \
./qt5/qttranslations_git.bb:27:    ${PN}-qtquickcontrols2 \
./qt5/qttranslations_git.bb:69:FILES_${PN}-qtquickcontrols2 = " \
./qt5/qttranslations_git.bb:70:    ${OE_QMAKE_PATH_TRANSLATIONS}/qtquickcontrols2_*.qm \
./qt5/ogl-runtime_git.bb:10:DEPENDS += "qtbase qtdeclarative qtquickcontrols2"
./qt5/qtquick3d_git.bb:9:DEPENDS += "qtbase qtdeclarative qtquickcontrols2"
./packagegroups/packagegroup-qt5-toolchain-target.bb:99:    qtquickcontrols2 \
./packagegroups/packagegroup-qt5-toolchain-target.bb:100:    qtquickcontrols2-dev \
./packagegroups/packagegroup-qt5-toolchain-target.bb:101:    qtquickcontrols2-mkspecs \
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

通过观察发现这个 packagegroup-qt5-toolchain-target.bb 文件名中带有toolchain,说明这个用于构建交叉编译器包含Qt5的SDK时用到的一个目标recipe。分析下这个文件内容:

meta-qt5]$ ls recipes-qt/packagegroups/
nativesdk-packagegroup-qt5-toolchain-host.bb  packagegroup-qt5-toolchain-target.bb
packagegroup-qt5-qtcreator-debug.bb
  • 1
  • 2
  • 3

上面的 recipes-qt/packagegroups/ 目录中一共有三个文件,重点看下packagegroup-qt5-toolchain-target.bb文件。

recipes-qt]$ cat packagegroups/packagegroup-qt5-toolchain-target.bb
... #略
RDEPENDS_${PN} += " \
	... #略, 还有很多其他的组件
	qtbase-dev \
	qtdeclarative-dev \
	qtquickcontrols2 \
	qtquickcontrols2-dev \
    qtquickcontrols2-mkspecs \
	... #略
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

说明 packagegroup-qt5-toolchain-target.bb 文件基本上包含了我们所需的软件包。另外提一点 RDEPENDS 变量的含义是运行是依赖的软件包,而且必须被安装(到镜像中),因为运行时少不了,比如一些程序依赖的库。
我们看到这个 packagegroup-qt5-toolchain-target.bb 很重要,那先看看哪里有没有用到它:

meta-qt5]$ grep -in packagegroup-qt5-toolchain-target -r .
classes/populate_sdk_qt5.bbclass:6:TOOLCHAIN_TARGET_TASK_append = " packagegroup-qt5-toolchain-target"
recipes-qt/qt5/qt5-creator_git.bb:86:    packagegroup-qt5-toolchain-target \
  • 1
  • 2
  • 3

当我看到这个populate_sdk_qt5时,让我想起了populate_sdk,通常这个相当于一个任务或者函数,来编译某个目标的toolchain SDK, 例如这样:

build]$ bitbake core-image-sato -c populate_sdk #不要执行这个哦
  • 1

由于 populate_sdk_qt5.bbclass 是一个bb的class类文件,因此还有其他地方调用这个类,看下面:

meta-qt5]$ grep -in populate_sdk_qt5 -r .
./recipes-qt/meta/meta-toolchain-qt5.bb:6:inherit populate_sdk populate_sdk_qt5
...
  • 1
  • 2
  • 3

说明我们的 meta-toolchain-qt5 是继承了 populate_sdk_qt5 ,因为这个是一个recipe的bb文件,是可以独立编译的,那我们先编译起来(前提是前面的bitbake qtbase结束了):

#小知识点:查看有哪些目标带有toolchain关键词
build]$ bitbake -s | grep toolchain
meta-extsdk-toolchain                                 :1.0-r0                          
meta-go-toolchain                                     :1.0-r0                          
meta-toolchain                                        :1.0-r7                          
meta-toolchain-qt5                                    :1.0-r0  #以后记不住meta-toolchain-qt5记住关键词toolchain就可以看到目标recipe                        
nativesdk-icecc-toolchain                             :0.1-r0                          
nativesdk-packagegroup-qt5-toolchain-host             :1.0-r0                          
packagegroup-qt5-toolchain-target                     :1.0-r0

build]$ bitbake meta-toolchain-qt5
#这个比较耗时间,先编译起来让其下载源码包和编译,我们继续分析
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

综上,它们有这样的继承关系:

recipes: qtquickcontrols2/qtdeclarative/qtbase
packagegroup-qt5-toolchain-target.bb
populate_sdk_qt5.bbclass
meta-toolchain-qt5.bb

细心的读者看到这个 meta-toolchain-qt5 应该会联想到我们source的时候出现的 meta-toolchain ,如下:

poky]$ source oe-init-build-env 

### Shell environment set up for builds. ###

You can now run 'bitbake <target>'

Common targets are:
    core-image-minimal
    core-image-sato
    meta-toolchain
    meta-ide-support

You can also run generated qemu images with a command like 'runqemu qemux86'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

meta-toolchain 就是我们用来编译目标的toolchain的SDK。那我们的 meta-toolchain-qt5 怎么和这个关联起来呢,我们看下 meta-toolchain.bb 文件:

poky]$ cat meta/recipes-core/meta/meta-toolchain.bb    
SUMMARY = "Meta package for building a installable toolchain"
LICENSE = "MIT"

PR = "r7"

inherit populate_sdk
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

我们看到 meta-toolchain.bb 文件内容很简单,它主要是继承了 populate_sdk ,我怀疑 meta-toolchain-qt5.bb 是不是也简单了继承了 populate_sdk_qt5 呢?我们看下:

meta-qt5]$ cat recipes-qt/meta/meta-toolchain-qt5.bb    
SUMMARY = "Meta package for building an installable Qt5 toolchain and SDK"
LICENSE = "MIT"

LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"

inherit populate_sdk populate_sdk_qt5
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

哦,果然是简单继承了 populate_sdk_qt5 ,同时还继承了 populate_sdk 。(可以看到meta-toolchain-qt5是包含meta-toolchain的实际内容的,前者大于后者)

构建带有Qt5的toolchain SDK

这样一看就简单了,我们在构建带有Qt5的toolchain SDK的时候只需要这样就可以了:

build]$ bitbake meta-toolchain-qt5
  • 1

我在想一个问题,就是如果我们想使用原始的 meta-toolchain 来编译我们的SDK,同时带Qt5怎么处理呢?

meta-toolchain如何编译带Qt5的软件包?

下面简单演示下:

poky]$ cat build/conf/bblayers.conf 
BBLAYERS ?= " \
  /home/peeta/poky/meta \
  /home/peeta/poky/meta-poky \
  /home/peeta/poky/meta-yocto-bsp \
  /home/peeta/poky/meta-mybsp \ #这个是前面添加的,你的没有不要紧
  /home/peeta/poky/meta-mylayer \ #确保下有这个哦
  /home/peeta/poky/meta-qt5 \
  "
poky]$ cd meta-mylayer/  #这个是我们自己之前创建的一个layer目录,不清楚的可以看前面的内容哈
meta-mylayer]$ mkdir -p recipes-mytoolchain/meta #创建一个目录,名字没多大关系,meta,我是看meta和meta-qt5中放meta-toolchain*都是前面有个meta子目录的,因此这里也加上
meta-mylayer]$ vim recipes-mytoolchain/meta/meta-toolchain.bbappend
inherit populate_sdk_qt5 #添加这一行,继承这个qt5的类
#创建一个bb的append的文件,为的是不影响原始版本中的meta/recipes-core/meta/meta-toolchain.bb文件,关于bbappend文件前面的文章有讲述。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

我们是在自己的layer(即meta-mylayer)中添加bbappend的,原则上我们不会去修改yocto和Qt5的layers中的内容,避免以后移植上的麻烦。
上面我是手动添加的方式,使用devtool方式不行,提示不支持sdk:

build]$ devtool modify meta-toolchain
...
Summary: There were 5 WARNING messages shown.
ERROR: The meta-toolchain recipe is an SDK, and therefore is not supported by this tool
  • 1
  • 2
  • 3
  • 4

添加完后,尝试编译:

poky]$ source oe-init-build-env 
build]$ bitbake meta-toolchain
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.
ERROR: Layer meta-mylayer is not compatible with the core layer which only supports these series: gatesgarth (layer is compatible with rocko)
  • 1
  • 2
  • 3
  • 4

出错了,出现mylayer不兼容的问题,简单:

build]$ vim ../meta-mylayer/conf/layer.conf 
LAYERSERIES_COMPAT_meta-mylayer = "rocko gatesgarth" #添加gatesgarth
  • 1
  • 2

再次编译:

build]$ bitbake meta-toolchain
  • 1

编译是成功了,但是看实际的SDK文件却是大小相差很多。

build]$ ls -l tmp-qemux86-64/deploy/sdk/
-rwxr-xr-x 2 peeta peeta   116774907 52 19:26 poky-glibc-x86_64-meta-toolchain-core2-64-qemux86-64-toolchain-3.2.2.sh
-rwxr-xr-x 2 peeta peeta 1338818451 52 19:26 poky-glibc-x86_64-meta-toolchain-qt5-core2-64-qemux86-64-toolchain-3.2.2.sh
  • 1
  • 2
  • 3

那说明一点就是 bitbake meta-toolchain bitbake meta-toolchain-qt5 编译出来的SDK相差很多,前者可能就没有整合进Qt5。对比测试时,我修改 meta/recipes-core/meta/meta-toolchain.bb 文件,编译出来的SDK大小相差不大:

poky]$ vim meta/recipes-core/meta/meta-toolchain.bb
inherit populate_sdk populate_sdk_qt5 #追加了这个populate_sdk_qt5
#看编译的SDK大小:
build]$ ls -l tmp-qemux86-64/deploy/sdk/
-rwxr-xr-x 2 peeta peeta 1338803395 511 20:17 poky-glibc-x86_64-meta-toolchain-core2-64-qemux86-64-toolchain-3.2.2.sh
-rwxr-xr-x 2 peeta peeta 1338818451 52 19:26 poky-glibc-x86_64-meta-toolchain-qt5-core2-64-qemux86-64-toolchain-3.2.2.sh
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

那问题就很奇怪了,问题出在哪里呢?
将上面 meta/recipes-core/meta/meta-toolchain.bb 中的修改撤销,继续研究。

经过一番折腾后发现需要先做clean状态的操作,再编译,例如:

build]$ bitbake meta-toolchain -c cleansstate
build]$ bitbake meta-toolchain
build]$ ls -l tmp-qemux86-64/deploy/sdk/
-rwxr-xr-x 2 peeta peeta 1338777843 512 17:44 poky-glibc-x86_64-meta-toolchain-core2-64-qemux86-64-toolchain-3.2.2.sh
-rwxr-xr-x 2 peeta peeta 1338818451 52 19:26 poky-glibc-x86_64-meta-toolchain-qt5-core2-64-qemux86-64-toolchain-3.2.2.sh
  • 1
  • 2
  • 3
  • 4
  • 5

OK~ Qt5的SDK本篇先不演示如何使用了(前面的文章中也有提及如何使用SDK)。这里我们要记住,我们的这个meta-qt5 layer每次都是需要自行下载的,如果没有下载meta-qt5,在添加和使用meta-mylayer构建自己的SDK的时候会出现问题,因为没有 populate_sdk_qt5 。我的感觉是如果添加了meta-qt5, 可以直接使用下面的方式编译Qt的SDK,可能会更加简单:

build]$ bitbake meta-toolchain-qt5
  • 1

文件系统中如何添加Qt5软件包

讲到上面制作Qt5的SDK后,我们的任务还没有完成~,我们先看下面的问题:
编译完整目标:

build]$ bitbake core-image-sato
  • 1

看下文件系统里面有没有Qt相关的软件包:

build]$ ls tmp-qemux86-64/work/qemux86_64-poky-linux/core-image-sato/1.0-r0/rootfs/usr/lib/ | grep -i qt5
  • 1

或者,在ubuntu桌面环境下打开终端环境(同时按Ctrl + Alt + T可以打开终端),执行下面的命令:

~]$ cd poky
poky]$ source oe-init-build-env 
build]$ runqemu qemux86-64
  • 1
  • 2
  • 3

此时会有一个虚拟机的弹窗。窗口中我们不方便看文件系统中是否有Qt5相关的内容,于是,我们通过终端登录到虚拟机中,如下:

build]$ ssh-keygen -f "/home/peeta/.ssh/known_hosts" -R 192.168.7.2 #这个地址是qemu模拟网卡的虚拟地址
build]$ ssh root@192.168.7.2
The authenticity of host '192.168.7.2 (192.168.7.2)' can't be established.
RSA key fingerprint is SHA256:UR9/kVwrsURWL9Wi/wHhm4CaBc2K8FpPfhI3OYpOX6I.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.7.2' (RSA) to the list of known hosts.
root@qemux86-64:~# 
#看下/usr/lib下面是否有Qt相关的内容:
root@qemux86-64:~# ls /usr/lib/ | grep -i "Qt"
#空的说明Qt5是没有进文件系统的
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

通过上面的测试和验证,我们发现我们的项目并没有添加Qt5相关的任何软件包。这是因为我们的target recipe没有添加Qt5相关内容的安装。应该怎么做呢?
可不可以在相关的配置文件中添加这个呢?

IMAGE_INSTALL_append = " \
    qtbase \
    qtdeclarative \
    qtquickcontrols2  \
    ...
"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

可以,不过这个方法总感觉有些笨拙,因为我们对Qt5认识不够,也并不清楚Qt5需要安装哪些软件包,贸然的用这种方式很可能会导致后续很多的其他问题,我们继续研究下应有的标准做法。

首先我们研究下这个core-image-sato目标,为啥其他软包可以通过这个目标被安装进文件系统的:

poky]$ cat meta/recipes-sato/images/core-image-sato.bb 
inherit core-image #继承了core-image.bbclass,我们再跟踪下这个文件:
poky]$ cat meta/classes/core-image.bbclass 
FEATURE_PACKAGES_x11 = "packagegroup-core-x11"
FEATURE_PACKAGES_x11-base = "packagegroup-core-x11-base"
FEATURE_PACKAGES_x11-sato = "packagegroup-core-x11-sato"
FEATURE_PACKAGES_tools-debug = "packagegroup-core-tools-debug"
FEATURE_PACKAGES_eclipse-debug = "packagegroup-core-eclipse-debug"
FEATURE_PACKAGES_tools-profile = "packagegroup-core-tools-profile"
FEATURE_PACKAGES_tools-testapps = "packagegroup-core-tools-testapps"
FEATURE_PACKAGES_tools-sdk = "packagegroup-core-sdk packagegroup-core-standalone-sdk-target" #这个语句记一下
FEATURE_PACKAGES_nfs-server = "packagegroup-core-nfs-server"
FEATURE_PACKAGES_nfs-client = "packagegroup-core-nfs-client"
FEATURE_PACKAGES_ssh-server-dropbear = "packagegroup-core-ssh-dropbear"
FEATURE_PACKAGES_ssh-server-openssh = "packagegroup-core-ssh-openssh"
FEATURE_PACKAGES_hwcodecs = "${MACHINE_HWCODECS}"
MACHINE_HWCODECS ??= ""

CORE_IMAGE_BASE_INSTALL = '\
    packagegroup-core-boot \
    packagegroup-base-extended \
    \
    ${CORE_IMAGE_EXTRA_INSTALL} \
    '

CORE_IMAGE_EXTRA_INSTALL ?= ""

IMAGE_INSTALL ?= "${CORE_IMAGE_BASE_INSTALL}"

inherit image
  • 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
  • 26
  • 27
  • 28
  • 29
  • 30

我们重点看下 meta/classes/core-image.bbclass 文件中的 FEATURE_PACKAGES 变量赋值了很多拥有这个 packagegroup-core-* 字眼的值,结合我们前面研究meta-qt5这个layer中也有一个 packagegroup-core-* 字眼开头的文件,即 packagegroup-qt5-toolchain-target.bb ,这个文件名中带有toolchain和target字眼,前者的意思是交叉编译器的SDK,而后者可能就是给目标镜像用来安装的一个“软件包组合”:

poky]$ ls meta-qt5/recipes-qt/packagegroups/
nativesdk-packagegroup-qt5-toolchain-host.bb #这个是ubuntu host上运行的软件包组合,我们先不管
packagegroup-qt5-toolchain-target.bb #就是这个,感兴趣的可以看下该文件内容,上面也有提及。
packagegroup-qt5-qtcreator-debug.bb #qtcreator是Qt的IDE工具,可能与开发Qt软件有关,我们也先不管
  • 1
  • 2
  • 3
  • 4

那么我们现在大体了解了是怎么回事了哈,我们需要在目标的配置文件中添加这么个赋值语句:

FEATURE_PACKAGES_qt5 = "packagegroup-qt5-toolchain-target"
  • 1

然后,通过 FEATURE 相关变量使能qt5这个FEATURE即可。

本着不修改yocto poky和meta-qt5目录下代码的情况下,我们在自己的meta-mylayer中进行添加,依旧采用老方法:

创建和使用一个bbappend文件:

poky]$ cd meta-mylayer/
meta-mylayer]$ mkdir -p recipes-sato/images/
meta-mylayer]$ cat recipes-sato/images/core-image-sato.bbappend
# add Qt5 packagegroup
EXTRA_IMAGE_FEATURES_qt5 = "packagegroup-qt5-toolchain-target" #添加这个
  • 1
  • 2
  • 3
  • 4
  • 5

在哪里添加qt5这个FEATURE呢?修改qemux86-64.conf的配置?不不,这个会动poky源码。
我们看看能不能直接在 core-image-sato.bbappend 中做修改呢?
我们可以去掉其中的qt5字眼,直接添加,比如:

meta-mylayer]$ cat recipes-sato/images/core-image-sato.bbappend
# add Qt5 packagegroup
IMAGE_FEATURES += "packagegroup-qt5-toolchain-target" #添加这个
  • 1
  • 2
  • 3

或者使用 EXTRA_IMAGE_FEATURES 变量:

meta-mylayer]$ cat recipes-sato/images/core-image-sato.bbappend
# add Qt5 packagegroup
EXTRA_IMAGE_FEATURES += "qt5"
IMAGE_FEATURES_qt5 = "packagegroup-qt5-toolchain-target" #添加这个
  • 1
  • 2
  • 3
  • 4

tips:
EXTRA_IMAGE_FEATURES和IMAGE_FEATURES变量的作用:
指定要包含在目标镜像中的FEATURE(特性),通常就是指定的一些软件包。
要从目标镜像recipe之外启用额外的特性(外部软件包),建议使用EXTRA_IMAGE_FEATURES变量。

看效果:

build]$ bitbake -e core-image-sato | grep EXTRA_IMAGE_FEATURES=
EXTRA_IMAGE_FEATURES="debug-tweaks qt5"
build]$ bitbake -e core-image-sato | grep FEATURE_PACKAGES
# $FEATURE_PACKAGES_eclipse-debug
FEATURE_PACKAGES_eclipse-debug="packagegroup-core-eclipse-debug"
# $FEATURE_PACKAGES_hwcodecs
FEATURE_PACKAGES_hwcodecs=""
# $FEATURE_PACKAGES_nfs-client
FEATURE_PACKAGES_nfs-client="packagegroup-core-nfs-client"
# $FEATURE_PACKAGES_nfs-server
FEATURE_PACKAGES_nfs-server="packagegroup-core-nfs-server"
# $FEATURE_PACKAGES_package-management
FEATURE_PACKAGES_package-management="opkg "
# $FEATURE_PACKAGES_qt5
FEATURE_PACKAGES_qt5="packagegroup-qt5-toolchain-target" #看这里
# $FEATURE_PACKAGES_splash
FEATURE_PACKAGES_splash="psplash"
# $FEATURE_PACKAGES_ssh-server-dropbear
FEATURE_PACKAGES_ssh-server-dropbear="packagegroup-core-ssh-dropbear"
# $FEATURE_PACKAGES_ssh-server-openssh
FEATURE_PACKAGES_ssh-server-openssh="packagegroup-core-ssh-openssh"
# $FEATURE_PACKAGES_tools-debug
FEATURE_PACKAGES_tools-debug="packagegroup-core-tools-debug"
# $FEATURE_PACKAGES_tools-profile
FEATURE_PACKAGES_tools-profile="packagegroup-core-tools-profile"
# $FEATURE_PACKAGES_tools-sdk
FEATURE_PACKAGES_tools-sdk="packagegroup-core-sdk packagegroup-core-standalone-sdk-target"
# $FEATURE_PACKAGES_tools-testapps
FEATURE_PACKAGES_tools-testapps="packagegroup-core-tools-testapps"
# $FEATURE_PACKAGES_x11
FEATURE_PACKAGES_x11="packagegroup-core-x11"
# $FEATURE_PACKAGES_x11-base
FEATURE_PACKAGES_x11-base="packagegroup-core-x11-base"
# $FEATURE_PACKAGES_x11-sato
FEATURE_PACKAGES_x11-sato="packagegroup-core-x11-sato"
       if var.startswith("FEATURE_PACKAGES_"):
  • 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
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

编译目标镜像:

build]$ bitbake core-image-sato
  • 1

编译完成后,我们看下文件系统中有没有库文件:

build]$ ls tmp-qemux86-64/work/qemux86_64-poky-linux/core-image-sato/1.0-r0/rootfs/usr/lib/ | grep -i qt5
...
libQt53DCore.so
...
libQt5Gui.so
...
libQt5Concurrent.so
libQt5Core.so
...
libQt5Quick.so
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

可见,通过上面的方式是可以安装Qt5相关的软件包的。
至此,我的的添加Qt5和带Qt5的SDK任务就算基本完成了,下一篇讲解如何编译和添加自己的Qt程序。

如何同时编译目标镜像和SDK

假设一个场景:夜深了,该下班了,我需要在服务器空档期编译target镜像和带Qt5的SDK,但是我不想等一个编译完了再调用另一个命令编译,用什么方式好呢?参考下面的方式

bitbake core-image-sato && bitbake meta-toolchain
  • 1

您的点赞和留言是我持续更新的动力!欢迎关注!
在这里插入图片描述