By: fu linux
E-mail: fulinux@sina.com
Blog: https://blog.csdn.net/fulinus
喜欢的盆友欢迎点赞和订阅!
你的喜欢就是我写作的动力!
返回总目录 : Yocto开发讲解系列 - 总目录
我们的Qt5小目标
为了满足读者盆友想看yocto如何添加qt5的需求,今天就开始尝试添加meta-qt5。
今天的工作流程:
对于Qt5而言,我给自己定几个小目标:
- 在目标机器上面可以运行qml程序;
- 目标机器上Qt自带的example测试程序要有;
-
toolchain SDK带qt5需要的一些库、可以调用
qmake
编译Qt5
程序; - 将劳动成果固化成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
综上,它们有这样的继承关系:
细心的读者看到这个
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 5月 2 19:26 poky-glibc-x86_64-meta-toolchain-core2-64-qemux86-64-toolchain-3.2.2.sh
-rwxr-xr-x 2 peeta peeta 1338818451 5月 2 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 5月 11 20:17 poky-glibc-x86_64-meta-toolchain-core2-64-qemux86-64-toolchain-3.2.2.sh
-rwxr-xr-x 2 peeta peeta 1338818451 5月 2 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 5月 12 17:44 poky-glibc-x86_64-meta-toolchain-core2-64-qemux86-64-toolchain-3.2.2.sh
-rwxr-xr-x 2 peeta peeta 1338818451 5月 2 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
您的点赞和留言是我持续更新的动力!欢迎关注!