[yocto]bitbake使用详解
bitbake安装
git clone git://git.openembedded.org/bitbake ./bitbake
- 安装完成
tree -L 1
.
├── AUTHORS
├── bin
├── ChangeLog
├── classes
├── conf
├── contrib
├── doc
├── lib
├── LICENSE
├── LICENSE.GPL-2.0-only
├── LICENSE.MIT
├── MANIFEST.in
├── README
├── toaster-requirements.txt
└── TODO
- 设置环境变量
export PATH=/home/xxx/Poky/test/bitbake/bin:$PATH
- 简单测试
bitbake --version
BitBake Build Tool Core version 2.2.0
bitbake执行环境
conf/bblayer.conf
- 在开始执行时,bitbake首先在当前工作目录中寻找
conf/bblayer.conf
- 文件非必须,但是所有使用层的运行环境中都包括该文件
BBLAYERS
变量 指向所有层的路径
- 在开始执行时,bitbake首先在当前工作目录中寻找
conf/layer.conf
- 每个层都有自己层配置文件,
bblayer.conf
中指定的路径下可以检索出层独有的层配置文件 BBPATH
bittbake使用该变量检索.class
(classes
文件夹)和.conf
(conf
文件夹)文件BBFILES
指定菜谱文件BBFILE_COLLECTIONS
通过+=追加当前层的名字BBFILE_PATTERN_xxx
指定xxx层菜谱文件路径BBFILE_PRIORITY_xxx
指定xxx层的优先级- 数值越大优先级越高
- 如果多个层中出现同名菜谱,bitbake选择高优先级的菜谱进行编译
- 优先级也决定了追加菜谱文件的顺序
- 每个层都有自己层配置文件,
任务 task
bitbake
可以在配方文件中定义shell
或者python
函数作为可执行元数据,而具体实现依靠task完成
bitbake
把特殊函数当作任务,任务被定义在菜谱和类文件中- 针对特殊菜谱直接从
bitbake
命令行调用 定义格式为:
do_xxxxx
do_configure () { # Specify any needed configure commands here } addtask configure do_compile () { # You will almost certainly need to add additional arguments here oe_runmake -f makefile } addtask compile before do_install after do_configure do_install () { oe_runmake -f makefile install } addtask install after compile python do_clean(){ ##可以添加匿名python函数task #python function } add clean
- 执行task: bitbake task.bb -c clean 上述task放在task.bb
- 菜谱中使用before和after指令一起增加任务install 和 configure,创建执行链
- bitbake task.bb -c compile
- 首先执行configure 再compile 最后install
- 假如别的task也是用before和after 那么链接关系仍然执行
- 菜谱中使用before和after指令一起增加任务install 和 configure,创建执行链
bitbake 命令
bitbake packagename
编译packagenamebitbake -c taskname packagename
执行packagename的taskname任务bitbake -e packagename
显示生成的任务环境脚本
依赖
依赖类型
- 构建依赖
- 运行时依赖
配置
- 菜谱使用
PROVIDDES
变量来声名他们的名字和功能性,然后其他菜谱文件可以用其来表达对软件包的依赖 - 配置类型
- 隐式配置·:假如不显式设置
PN
、PV
和PR
,那么bitbake
会根据包名自动设置三个变量 - 显式配置
- 符号配置
- 隐式配置·:假如不显式设置
- 菜谱使用
依赖
DEPENDS
编译依赖- 强制依赖: 构建包的菜谱的所有任务完成之后,依赖于那个包的菜谱才开始第一个task
- 元数据属性deptsak :
do_compile[deptask]= “do_pre_compile”
- 包含在
DEPENDS
中的每个菜谱的do_pre_compile
任务都必须在这个菜谱的do_compile
运行之前完成
- 包含在
RDEPENDS
运行时依赖,不强制要求在编译阶段就依赖- 元数据属性rdeptsak :
do_package_r[deptask]= “do_package”
do_package_r
任务不能在运行时所依赖的所有包完成其打包步骤之前运行
- 元数据属性rdeptsak :
- 变量所依赖的包都需要
PROVIDDES
变量提供他们的名字
多个提供器
通过符号配置,多个包可以满足另一个包的构建或运行时依赖
- 例如多个来源的
opencv
,但是只需要一个有效即可
source1.bb: PROVIDES = "opencv" source2.bb: PROVIDES = "opencv"
- 例如多个来源的
- 配置
PREFERRED_PROVIDER
: 选择一个目标依赖使用PREFERRED_PROVIDER_opencv = "source1"
变量
内部获取的变量
- 从当前的上下文获取针对以下变量的值
FILE
:bitbake
正在处理的文件的完整路径- 文件可以是一个配置文件、一个菜谱、一个类等
LAYERDIR
:当BitBake
处理那一层时,它把这个变量设置为到当前层的目录的完整路径TOPDIR
:项目顶层目录
项目特定的变量
-bitbake
特有
-BBFILES
:空格分隔的针对菜谱的路径列表- 层
layer.conf
配置文件扩展这个变量检索层下的所有配方文件
- 层
BBLAYERS
:当BitBake
处理那一层时,它把这个变量设置为到当前层的目录的完整路径BBPATH
:BitBake
使用这个变量在一个名为classe
s的子目录中定位类(.bbclass
文件);在一个名为conf的子目录中定位配置文件(.conf文件
)以及在其他子目录中定位文件- 变量包含一个由冒号(:)分隔的目录路径列表。层通常增加它们的顶级目录到这个变量:
BBPATH.=":${LAYERDIR}"
。
- 变量包含一个由冒号(:)分隔的目录路径列表。层通常增加它们的顶级目录到这个变量:
# We have a conf and classes directory, add to BBPATH
BBPATH .= ":${LAYERDIR}"
# We have recipes-* directories, add to BBFILES
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
${LAYERDIR}/recipes-*/*/*.bbappend \
${LAYERDIR}/recipes-*/*/*/*.bb \
${LAYERDIR}/recipes-*/*/*/*.bbappend \
"
标准运行时变量
- 这些变量通常被conf/bitbake.conf文件初始化
- 路径
- poky/meta/conf/bitbake.conf
- openembedded-core/meta/conf/bitbake.conf
B
:到bitbake
构建一个源包所在的目录的完整路径BUILD_ARCH
:构建主机的CPU
架构CACHE
:到用于元数据缓存的目录的完整路径,它通常存在于构建环境的内部- 当
bitbake
在一个构建环境中第一次被运行时,它解析所有元数据文件和菜谱并且创建一个在后续运行时从那里读取的缓存 - 这改进了执行速度
- 一个元数据变化使缓存失效并且导致bitbake重新创建它
- 当
DEPENDS
:包依赖性DEPLOY_DIR
:放置所有用于部署的文件所在的基础目录的完整路径- 例如目标镜像、包源和许可程序清单
DEPLOY_DIR_IMAGE
:复制目标二进制镜像所在目录的完整路径DL_DIR
:下载文件存放目录FILE_DIRNAME
:到包含BitBake正在处理的文件的目录的路径FILESDIR
:bitbake
寻找本地文件所在目录的完整路径BitBake
仅仅当它不能在任何列于FILESPATH中的目录中找到文件时使用这个变量- 对这个变量的最常见的用例在追加文件中(.bbappend)
FILESPATH
:这个变量包含一个冒号分隔的、bitbake的本地获取器为了匹配本地文件所搜索的完整目录路径列表MKTEMPCMD
: bitbake用来创建临时文件的命令MKTEMPDIRCMD
: bitbake用来创建临时目录的命令OVERRIDES
:冒号分隔的条件覆盖的优先级列表- bitbake从右到左处理这个列表,所以后面列出的有更高优先级
P
:用横线(-)连接的包名、版本:P="${PN}-${PV}"
PERSISTENT_DIR
:持久存储文件所在目录路径CACHE和PERSISTENT_DIR
变量可以互换使用。其中之一必须被设置。- 如果
PERSISTENT_DIR
没有被设置,使用CACHE
PF
:用横线(-)连接的包名、版本和修订PN
:包名(默认从菜谱文件名中获取/或显式设置)PR
:包修订(默认从菜谱文件名中获取/或显式设置)PROVIDES
:空格分隔的、声明一个包提供了什么的名字列表- 其他菜谱可以使用这些名字来声明它们对这个包的依赖
PV
:包版本(默认从菜谱文件名中获取/或显式设置)S
:放置已解压文件目录TARGET_ARCH
:CPU
架构TMPDIR
:构建输出的顶级目录;WORKDIR
:bitbake
包储存路径并且存储所有与包的构建过程相关的日志信息
菜谱常用变量 : 以
gettext_0.21.bb
为例
SUMMARY = "Utilities and libraries for producing multi-lingual messages"
DESCRIPTION = "GNU gettext is a set of tools that provides a framework to help other programs produce multi-lingual messages. \
These tools include a set of conventions about how programs should be written to support message catalogs, a directory and file \
naming organization for the message catalogs themselves, a runtime library supporting the retrieval of translated messages, and \
a few stand-alone programs to massage in various ways the sets of translatable and already translated strings."
HOMEPAGE = "http://www.gnu.org/software/gettext/gettext.html"
SECTION = "libs"
LICENSE = "GPL-3.0-or-later & LGPL-2.1-or-later"
LIC_FILES_CHKSUM = "file://COPYING;md5=c678957b0c8e964aa6c70fd77641a71e"
# without libxml in PACKAGECONFIG vendor copy of the lib will be used
LICENSE:append = " ${@bb.utils.contains('PACKAGECONFIG', 'libxml', '', '& MIT', d)}"
LIC_FILES_CHKSUM:append = " ${@bb.utils.contains('PACKAGECONFIG', 'libxml', '', 'file://libtextstyle/lib/libxml/COPYING;md5=2044417e2e5006b65a8b9067b683fcf1', d)}"
# without croco in PACKAGECONFIG vendor copy of the lib will be used
LIC_FILES_CHKSUM:append = " ${@bb.utils.contains('PACKAGECONFIG', 'croco', '', 'file://libtextstyle/lib/libcroco/libcroco.h;md5=915a46e7307c2f7f8d2b9c503fc434ed;beginline=10;endline=28', d)}"
# without glib in PACKAGECONFIG vendor copy of the lib will be used
LIC_FILES_CHKSUM:append = " ${@bb.utils.contains('PACKAGECONFIG', 'glib', '', 'file://libtextstyle/lib/glib/ghash.c;md5=af89a160226edf0b276b6183888037d0;beginline=10;endline=27', d)}"
DEPENDS = "gettext-native virtual/libiconv"
DEPENDS:class-native = "gettext-minimal-native"
PROVIDES = "virtual/libintl virtual/gettext"
PROVIDES:class-native = "virtual/gettext-native"
RCONFLICTS:${PN} = "proxy-libintl"
SRC_URI = "${GNU_MIRROR}/gettext/gettext-${PV}.tar.gz \
file://parallel.patch \
file://use-pkgconfig.patch \
file://run-ptest \
file://serial-tests-config.patch \
file://0001-tests-autopoint-3-unset-MAKEFLAGS.patch \
file://0001-init-env.in-do-not-add-C-CXX-parameters.patch \
file://mingw.patch \
file://0001-msgmerge-29-Add-executable-file-mode-bits.patch \
file://0001-libtextstyle-fix-builds-with-automake-1.16.4-and-new.patch \
"
SRC_URI[sha256sum] = "c77d0da3102aec9c07f43671e60611ebff89a996ef159497ce8e59d075786b12"
inherit autotools texinfo pkgconfig ptest
EXTRA_OECONF += "--without-lispdir \
--disable-csharp \
--disable-libasprintf \
--disable-java \
--disable-native-java \
--disable-openmp \
--disable-acl \
--without-emacs \
--without-cvs \
--without-git \
--cache-file=${B}/config.cache \
"
EXTRA_OECONF:append:class-target = " \
--with-bisonlocaledir=${datadir}/locale \
gt_cv_locale_fr_utf8=fr_FR \
gt_cv_locale_fr=fr_FR.ISO-8859-1 \
gt_cv_locale_de_utf8=de_DE \
gt_cv_locale_de=de_DE.ISO-8859-1 \
"
PACKAGECONFIG ??= "croco glib libxml"
PACKAGECONFIG:class-native = ""
PACKAGECONFIG:class-nativesdk = ""
PACKAGECONFIG[croco] = "--without-included-libcroco,--with-included-libcroco,libcroco"
PACKAGECONFIG[glib] = "--without-included-glib,--with-included-glib,glib-2.0"
PACKAGECONFIG[libxml] = "--without-included-libxml,--with-included-libxml,libxml2"
# Need paths here to avoid host contamination but this can cause RPATH warnings
# or problems if $libdir isn't $prefix/lib.
PACKAGECONFIG[libunistring] = "--with-libunistring-prefix=${STAGING_LIBDIR}/..,--with-included-libunistring,libunistring"
PACKAGECONFIG[msgcat-curses] = "--with-libncurses-prefix=${STAGING_LIBDIR}/..,--disable-curses,ncurses,"
acpaths = '-I ${S}/gettext-runtime/m4 \
-I ${S}/gettext-tools/m4'
do_install:append:libc-musl () {
rm -f ${D}${libdir}/charset.alias
rm -f ${D}${includedir}/libintl.h
rm -f ${D}${libdir}/libintl.la
}
# these lack the .x behind the .so, but shouldn't be in the -dev package
# Otherwise you get the following results:
# 7.4M glibc/images/ep93xx/Angstrom-console-image-glibc-ipk-2008.1-test-20080104-ep93xx.rootfs.tar.gz
# 25M uclibc/images/ep93xx/Angstrom-console-image-uclibc-ipk-2008.1-test-20080104-ep93xx.rootfs.tar.gz
# because gettext depends on gettext-dev, which pulls in more -dev packages:
# 15228 KiB /ep93xx/libstdc++-dev_4.2.2-r2_ep93xx.ipk
# 1300 KiB /ep93xx/uclibc-dev_0.9.29-r8_ep93xx.ipk
# 140 KiB /armv4t/gettext-dev_0.14.1-r6_armv4t.ipk
# 4 KiB /ep93xx/libgcc-s-dev_4.2.2-r2_ep93xx.ipk
PACKAGES =+ "libgettextlib libgettextsrc"
FILES:libgettextlib = "${libdir}/libgettextlib-*.so*"
FILES:libgettextsrc = "${libdir}/libgettextsrc-*.so*"
PACKAGES =+ "gettext-runtime gettext-runtime-dev gettext-runtime-doc"
FILES:${PN} += "${libdir}/${BPN}/*"
# The its/Makefile.am has defined:
# itsdir = $(pkgdatadir)$(PACKAGE_SUFFIX)/its
# not itsdir = $(pkgdatadir), so use wildcard to match the version.
FILES:${PN} += "${datadir}/${BPN}-*/*"
FILES:gettext-runtime = "${bindir}/gettext \
${bindir}/ngettext \
${bindir}/envsubst \
${bindir}/gettext.sh \
${libdir}/libasprintf.so* \
${libdir}/GNU.Gettext.dll \
"
FILES:gettext-runtime-dev += "${libdir}/libasprintf.a \
${includedir}/autosprintf.h \
"
FILES:gettext-runtime-doc = "${mandir}/man1/gettext.* \
${mandir}/man1/ngettext.* \
${mandir}/man1/envsubst.* \
${mandir}/man1/.* \
${mandir}/man3/* \
${docdir}/gettext/gettext.* \
${docdir}/gettext/ngettext.* \
${docdir}/gettext/envsubst.* \
${docdir}/gettext/*.3.html \
${datadir}/gettext/ABOUT-NLS \
${docdir}/gettext/csharpdoc/* \
${docdir}/libasprintf/autosprintf.html \
${infodir}/autosprintf.info \
"
do_install:append() {
rm -f ${D}${libdir}/preloadable_libintl.so
}
do_install:append:class-native () {
rm ${D}${datadir}/aclocal/*
rm ${D}${datadir}/gettext/config.rpath
rm ${D}${datadir}/gettext/po/Makefile.in.in
rm ${D}${datadir}/gettext/po/remove-potcdate.sin
create_wrapper ${D}${bindir}/msgfmt \
GETTEXTDATADIR="${STAGING_DATADIR_NATIVE}/gettext-${PV}/"
}
do_compile_ptest() {
cd ${B}/gettext-tools/tests/
sed -i '/^buildtest-TESTS: /c buildtest-TESTS: $(TESTS) $(check_PROGRAMS)' Makefile
oe_runmake buildtest-TESTS
cd -
}
do_install_ptest() {
if [ ${PTEST_ENABLED} = "1" ]; then
mkdir -p ${D}${PTEST_PATH}/tests
mkdir -p ${D}${PTEST_PATH}/src
mkdir -p ${D}${PTEST_PATH}/po
mkdir -p ${D}${PTEST_PATH}/misc
mkdir -p ${D}${PTEST_PATH}/its
mkdir -p ${D}${PTEST_PATH}/styles
mkdir -p ${D}${PTEST_PATH}/gnulib-lib
mkdir -p ${D}${PTEST_PATH}/examples
cp -rf ${S}/gettext-tools/its/* ${D}${PTEST_PATH}/its
cp -rf ${S}/gettext-tools/styles/* ${D}${PTEST_PATH}/styles
cp -rf ${S}/gettext-tools/gnulib-lib/gettext.h ${D}${PTEST_PATH}/gnulib-lib
cp -rf ${S}/gettext-tools/examples/hello-c ${D}${PTEST_PATH}/examples
cp -rf ${S}/gettext-tools/tests/* ${D}${PTEST_PATH}/tests
cp -rf ${B}/gettext-tools/tests/.libs/* ${D}${PTEST_PATH}/tests
cp -rf ${B}/gettext-runtime/intl/.libs/libgnuintl.so.8* ${D}${libdir}/
cp -rf ${B}/gettext-tools/tests/Makefile ${D}${PTEST_PATH}/tests
cp -rf ${B}/gettext-tools/tests/init-env ${D}${PTEST_PATH}/tests
sed -i '/^Makefile:/c Makefile:' ${D}${PTEST_PATH}/tests/Makefile
sed -i -e 's:lang-c lang-c++:lang-c++:g' ${D}${PTEST_PATH}/tests/Makefile
install ${S}/gettext-tools/src/msgunfmt.tcl ${D}${PTEST_PATH}/src
install ${S}/gettext-tools/src/project-id ${D}${PTEST_PATH}/src
install ${B}/gettext-runtime/src/gettext.sh ${D}${PTEST_PATH}/src
install ${B}/gettext-runtime/src/ngettext ${D}${PTEST_PATH}/src
install ${B}/gettext-runtime/src/envsubst ${D}${PTEST_PATH}/src
install ${B}/gettext-runtime/src/gettext ${D}${PTEST_PATH}/src
install ${B}/gettext-tools/src/.libs/cldr-plurals ${D}${PTEST_PATH}/src
install ${S}/gettext-tools/po/gettext-tools.pot ${D}${PTEST_PATH}/po
install ${B}/gettext-tools/misc/* ${D}${PTEST_PATH}/misc
find ${D}${PTEST_PATH}/ -name "*.o" -exec rm {} \;
chmod 0755 ${D}${PTEST_PATH}/tests/lang-vala ${D}${PTEST_PATH}/tests/plural-1 ${D}${PTEST_PATH}/tests/xgettext-tcl-4 \
${D}${PTEST_PATH}/tests/xgettext-vala-1 ${D}${PTEST_PATH}/tests/xgettext-po-2
sed -i -e 's|${DEBUG_PREFIX_MAP}||g' ${D}${PTEST_PATH}/tests/init-env
fi
}
RDEPENDS:${PN}-ptest += "make xz"
RDEPENDS:${PN}-ptest:append:libc-glibc = "\
glibc-gconv-big5 \
glibc-charmap-big5 \
glibc-gconv-cp1251 \
glibc-charmap-cp1251 \
glibc-charmap-iso-8859-9 \
glibc-gconv-iso8859-9 \
glibc-charmap-koi8-r \
glibc-gconv-koi8-r \
glibc-gconv-iso8859-2 \
glibc-charmap-iso-8859-2 \
glibc-gconv-iso8859-1 \
glibc-charmap-iso-8859-1 \
glibc-gconv-euc-kr \
glibc-charmap-euc-kr \
glibc-gconv-euc-jp \
glibc-charmap-euc-jp \
locale-base-de-de \
locale-base-fr-fr \
"
RRECOMMENDS:${PN}-ptest:append:libc-glibc = "\
locale-base-de-de.iso-8859-1 \
locale-base-fr-fr.iso-8859-1 \
"
INSANE_SKIP:${PN}-ptest += "ldflags"
INSANE_SKIP:${PN}-ptest += "rpaths"
BBCLASSEXTEND = "native nativesdk"
SECTION
: 给包进行分类,用于软件包管理LICENSE
: 配方源文件(源码)的LICENSE
列表LIC_FILES_CHKSUM
:LICENSE
文本文件校验码- 配方文件使用append追加了需要使用的其他源
- DEPENDS:配文构建时所需要配置的依赖
RDEPENDS
: 配方包目标运行时所需要的依赖
PROVIDES
:给配方起别名- 配方自己的包名
{PN}
已经包含在PROVIDES
变量的列表中;别名等效于{PN}
,可被其他配方使用(依赖项) PROVIDES:class-native
RCONFLICTS_${PN}
: 提供包名的别名列表
- 配方自己的包名
RCONFLICTS:${PN}
: 指定和当前软件包冲突的包列表- 安装目标包前需要先删除冲突的包,否则目标包不会被安装
SRC_URI
:源,本地或者远程SRC_URI[sha256sum]
:源校验inherit
: 继承类classEXTRA_OECONF
: 指定用于configure配置脚本的参数EXTRA_OECONF:append:class-target
PACKAGECONFIG
: 变量提供了在配方上启用或禁用配方的feature的方法PACKAGECONFIG ??= "croco glib libxml"
指定feature列表
PACKAGECONFIG[croco] = "--without-included-libcroco,--with-included-libcroco,libcroco" PACKAGECONFIG[glib] = "--without-included-glib,--with-included-glib,glib-2.0" PACKAGECONFIG[libxml] = "--without-included-libxml,--with-included-libxml,libxml2"
指定每个feature的行为,最多指定六个参数,每个参数需要按顺序指定
- 1.如果启用了feature功能,则应将额外的参数添加到配置脚本参数列表 (EXTRA_OECONF)
- 2.如果禁用了feature功能,应该将额外的参数添加到EXTRA_OECONF
- 3.如果启用了feature功能,则应添加附加的构建时依赖关系(DEPENDS)
- 4.如果启用了feature功能,应该添加附加的运行时依赖关系(RDEPENDS)
- 5.其他运行时建议 (推荐)应添加,如果 该功能已启用
- 6.此功能的任何冲突(即互斥)
PACKAGECONFIG
设置
针对
PACKAGECONFIG[gtk] = "--with-gtk3,--without-gtk3,gtk+3" librsvggtk
- 仅当功能是启用时,feature被添加到脚本参数列表(
EXTRA_OECONF
)和(DEPENDS
)中 - 如果通过使用
.bbappend
文件禁用该功能,则第二个参数被添加到脚本参数列表(EXTRA_OECONF)中 - 修改现有的
PACKAGECONFIG
方法:- 1.附加文件:在层中创建一个
.bbappend
附加文件,并覆盖PACKAGECONFIG
的值
或者,添加PACKAGECONFIG = "f4 f5"
PACKAGECONFIG:append = " f4"
- 2.配置文件:如果没有修改
local.conf
或mydistro.conf
文件,此方法与通过附加文件更改块相同;
或者,追加PACKAGECONFIG:pn-recipename = "f4 f5"
PACKAGECONFIG:append:pn-recipename = " f4"
- 1.附加文件:在层中创建一个
FILES
: 指定需要放入包中的目录或者文件的列表;使用FILES需要和包名结合- 指定的路径需要根据
meta/conf/bitbake.conf
所指定的相对路径来标识路径,而不是绝对路径FILES:${PN} += "${datadir}/${BPN}-*/*"
- 指定的路径需要根据
SYSTEMD_SERVICE
: 如果配方继承了systemd类,那么变量为配方生成包指定了systemd的服务名称
SYSTEMD_SERVICE:$ {PN} =“connman.service”
RRECOMMENDS
: 扩展软件包可用性的软件包列表建立;正在构建的包不依赖于此列表 包为了成功构建,而是将它们用于扩展的可用性
RRECOMMENDS:${PN}-dev += "wireless_package_name"
FILESEXTRAPATHS
:扩展用于由FILESPATH定义的额外本地文件的构建系统的搜索路径- 这个变量最常以
FILESEXTRAPATHS_prepend:="${THISDIR}/${PN}"
形式被用于追加文件中,它导致构建系统在由
- 这个变量最常以
EXCLUDE_FROM_WORLD
:将当前配方从BitBake world 中排除- 如果需要BitBake world不构建当前配方,在配方中将
EXCLUDE_FROM_WORLD
变量设置为“1” - 如果有其他配方依赖于设置
EXCLUDE_FROM_WORLD
的值为1的配方,则此配方仍然可能被BitBake world构建 - 将
EXCLUDE_FROM_WORLD
设置为1,仅确保配方未显式添加到BitBake world的构建目标列表中
- 如果需要BitBake world不构建当前配方,在配方中将
PACKAGES
: 配方所创建的包列表- 在打包过程中,
do_package
任务遍历PACKAGES
并使用与每个包对应的FILES变量将文件分配给包 - 如果文件与多个文件的
FILES
变量匹配包中的包,最早会分配给 (最左边)包 - 变量列表中的包为空(即没有pkg中的模式与
do_install
任务安装的任何文件匹配)不会生成, 除非通过ALLOW_EMPTY变量强制生成 - 默认值
${PN}-src ${PN}-dbg ${PN}-staticdev ${PN}-dev ${PN}-doc ${PN}-locale ${PACKAGE_BEFORE_PN} ${PN}
- 在打包过程中,
变量赋值
bitbake
使用的变量均为无类型,所有赋值给变量的值都视作字符串变量赋值
=
:直接赋值?=
: 默认赋值- 假如变量之前未被赋值,则赋值为目标值;否则(被赋值过),保留原值,赋值无效
??=
: 弱默认赋值- 赋值在解析过程结束才会发生,即多个??=只有最后一个会生效
:=
: 直接变量扩展- 变量扩展直到变量被使用才会发生,直接扩展就是立刻进行变量扩展
v1 = "1" v2 = "${v1} + 2" v1 = "11" v3 = "${v1} + 3" v4 := "${v2} + 4" 结果:v4 "11 + 2 + 4"
+=
:追加,并且新增空格=+
:前新增变量,并且新增空格v1 = "1" v1 += " 2" v2 = "11" v2 =+ "33" 结果:v1: 1 2 v2: 33 11
+=
:追加,不新增空格=+
:前新增变量,不新增空格v1 = "1" v1 .= " 2" v2 = "11" v2 =. "33" 结果:v1: 12 v2: 3311
_append
:追加,使用在变量名上,不包含空格_prepend
:前新增变量,使用在变量名上,不包含空格v1 = "11" v1_append .= " 22" v2 = "aa" v2_prepend =. "bb" 结果:v1: 12 v2: bbaa
_remove
:去除,使用在变量名上,去除变量中的右值目标除非额外增加空格,不然空格仍然保留,目标变量是第一个除外1
v1 = "11 aa cccccc qq 1234 00" v1_remove .= " qq" v1_remove .= "1234" 结果:v1: aa cccccc 1234 00
变量引用
- 和
shell
脚本用法类似,可以使用${}
来引用变量的内容 var1 = "You" ; var2 = "${var1} and me"
- 和
变量条件赋值
OVEREIDES = "cond1:cond2:dond3"
- bitbake从右向左处理,右边优先级高于左边
变量属性
- 类似于数组用法,变量名为数组名,数组中的值为该属性的值
日志文件
通用日志文件
bitbake
把通用日志文件存储在由LOG_DIR
变量指定的目录中。- 默认
LOG_DIR = "${TMPDIR}/log"
WARNING: You are using a local hash equivalence server but have configured an sstate mirror. This will likely mean no sstate will match from the mirror. You may wish to disable the hash equivalence use (BB_HASHSERVE), or use a hash equivalence server alongside the sstate mirror.
NOTE: Resolving any missing task queue dependencies
Build Configuration:
BB_VERSION = "2.0.0" //bitbake版本号
BUILD_SYS = "x86_64-linux" //构建系统的类型(使用的构建工具)
NATIVELSBSTRING = "ubuntu-20.04"
TARGET_SYS = "aarch64-poky-linux" //目标构建系统的类型
MACHINE = "xxxx"
DISTRO = "poky"
DISTRO_VERSION = "4.0.6"
TUNE_FEATURES = "aarch64 armv8a crc cortexa53 crypto" //针对目标CPU架构的优化参数
TARGET_FPU = ""
meta
meta-poky
meta-yocto-bsp = "HEAD:9006ef9075811a541ada61c509346f04241f40d3" //层的提交ID
meta-oecore = "HEAD:76ddcd64e327b6b840804c04f62cb9e6e81d07ef"
meta-oe
meta-python
meta-multimedia = "HEAD:aa20821f171471cd59c38a3d4b1c3cbb5d90b311"
meta-selinux = "HEAD:a401f4b2816a0b41ce8d9351542658c721935bcd"
meta-ambabsp
meta-ambalib
meta-ambaapp
meta-thirdparty
meta-external = "HEAD:0fbffff03e295a026bb4522874ef0a990e4ba658"
NOTE: Fetching uninative binary shim http://downloads.yoctoproject.org/releases/uninative/3.7/x86_64-nativesdk-libc-3.7.tar.xz;sha256sum=b110bf2e10fe420f5ca2f3ec55f048ee5f0a54c7e34856a3594e51eb2aea0570 (will check PREMIRRORS first)
Sstate summary: Wanted 22 Local 0 Mirrors 22 Missed 0 Current 0 (100% match, 0% complete)
NOTE: Executing Tasks
任务日志文件
bitbake为每个菜谱的每个文件创建日志文件
T变量指定输出路径
T = "${WORKDIR}/tmp"
- 日志文件被存储到根据其执行菜谱的包名命名的子目录中
temp/work/cortexa53-crypto-poky-linux/speexdsp/1.2.0-r0/temp/log.do_package_write_rpm_setscene
clear
任务日志路径T_task_clean = "${LOGDIR}/cleanlogs/{PN}"
- 因为
clean
任务会删除工作目录和其子目录,所以日志保存路径特殊
- 因为
增加打印信息在配方文件中
打印消息级别
Plain
:完全按照传递的方式记录消息而不带任何额外信息Debug
:记录前缀了DEBUG:的消息Note
:通知Warn
:它们不导致构建失败Error
:构建可以继续直到没有需要构建的任务Fatal
:致命条件使得bitbake
在消息已经被记录后立即终止构建过程
bitbake
的调试级别是通过增加-D
参数到bitbake
的命令行来设置的
- 普通消息永远不会打印到控制台
bitbake -D <target> bitbake -DD <target> bitbake -DDD <target>
配方文件使用
python
- python函数作为bitbake库的一部分实现
python do_configure(){ bb.debug(1, "debug") bb.fatal("fatal") }
- python函数作为bitbake库的一部分实现
shell
- shell函数是由logging.bbclass实现的,logging.bbclass是由OpenEmbedded核心元数据层提供的
do_configure(){ bbdebug 1 "debug" bbfatal "fatal" }
- shell函数是由logging.bbclass实现的,logging.bbclass是由OpenEmbedded核心元数据层提供的
菜谱任务执行
列出目标菜谱任务清单
bitbake linux-xxxx -c listtasks
NOTE: Executing Tasks
do_build Default task for a recipe - depends on all other normal tasks required to 'build' a recipe
do_buildclean
do_bundle_initramfs Combines an initial ramdisk image and kernel together to form a single image
do_checkuri Validates the SRC_URI value
do_clean Removes all output files for a target
do_cleanall Removes all output files, shared state cache, and downloaded source files for a target
do_cleansstate Removes all output files and shared state cache for a target
do_compile Compiles the source in the compilation directory
do_compile_kernelmodules Compiles loadable modules for the Linux kernel
do_config_analysis
do_configure Configures the source by enabling and disabling any build-time and configuration options for the software being built
do_deploy Writes deployable output files to the deploy directory
do_deploy_source_date_epoch
do_devshell Starts a shell with the environment set up for development/debugging
do_diffconfig Compares the old and new config files after running do_menuconfig for the kernel
do_fetch Fetches the source code
do_install Copies files from the compilation directory to a holding area
do_kernel_configme Assembles the kernel configuration for a linux-yocto style kernel
do_kernel_link_images Creates a symbolic link in arch/$arch/boot for vmlinux and vmlinuz kernel images
do_kernel_metadata
do_kernel_version_sanity_check
do_listtasks Lists all defined tasks for a target
do_menuconfig Runs 'make menuconfig' for the kernel
do_package Analyzes the content of the holding area and splits it into subsets based on available packages and files
do_package_qa Runs QA checks on packaged files
do_package_write_rpm Creates the actual RPM packages and places them in the Package Feed area
do_packagedata Creates package metadata used by the build system to generate the final packages
do_populate_lic Writes license information for the recipe that is collected later when the image is constructed
do_populate_sysroot Copies a subset of files installed by do_install into the sysroot in order to make them available to other recipes
do_prepare_recipe_sysroot
do_pydevshell Starts an interactive Python shell for development/debugging
do_savedefconfig Creates a minimal Linux kernel configuration file
do_shared_workdir
do_sizecheck Checks the size of the kernel image against KERNEL_IMAGE_MAXSIZE (if set)
do_strip Strips unneeded sections out of the Linux kernel image
do_symlink_kernsrc
do_transform_kernel
do_unpack Unpacks the source code into a working directory
NOTE: Tasks Summary: Attempted 1 tasks of which 0 didn't need to be rerun and all succeeded.
软件包构建流程
- 获取
checkuri,fetch
- 解压
unpack
- 打补丁
- 配置
configure
- 构建(编译)
compile
- 安装
install
- 复制二进制和辅助文件到他们再模拟的系统环境中的目标目录
- 打包
package
- 分享
- 举报
-
浏览量:3237次2020-08-20 11:09:57
-
浏览量:686次2024-07-31 19:46:13
-
浏览量:11478次2022-03-18 09:00:47
-
浏览量:12314次2020-12-02 22:49:48
-
浏览量:5385次2022-03-05 09:00:11
-
浏览量:13739次2022-03-25 09:00:11
-
浏览量:656次2024-07-15 18:31:13
-
浏览量:3320次2020-08-05 20:46:02
-
浏览量:11634次2021-12-27 09:00:26
-
浏览量:51991次2020-10-27 15:37:01
-
浏览量:6768次2022-04-01 09:00:15
-
浏览量:15594次2020-12-02 22:47:42
-
浏览量:1481次2020-08-07 17:15:53
-
浏览量:5197次2021-09-15 13:50:22
-
浏览量:601次2024-02-23 17:34:00
-
浏览量:3686次2023-04-14 11:03:17
-
浏览量:2271次2019-12-23 09:42:26
-
浏览量:656次2023-08-22 17:56:52
-
浏览量:1509次2019-11-20 09:10:33
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
保持微笑
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明