[yocto]bitbake使用详解

[yocto]bitbake使用详解 保持微笑 2024-02-21 14:48:36 242

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变量 指向所有层的路径
  • 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 那么链接关系仍然执行

bitbake 命令

  • bitbake packagename 编译packagename
  • bitbake -c taskname packagename 执行packagename的taskname任务
  • bitbake -e packagename 显示生成的任务环境脚本

依赖

  • 依赖类型

    • 构建依赖
    • 运行时依赖
  • 配置

    • 菜谱使用PROVIDDES变量来声名他们的名字和功能性,然后其他菜谱文件可以用其来表达对软件包的依赖
    • 配置类型
      • 隐式配置·:假如不显式设置PNPVPR,那么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任务不能在运行时所依赖的所有包完成其打包步骤之前运行
    • 变量所依赖的包都需要PROVIDDES变量提供他们的名字
  • 多个提供器

    • 通过符号配置,多个包可以满足另一个包的构建或运行时依赖

      • 例如多个来源的opencv,但是只需要一个有效即可
      source1.bb: PROVIDES = "opencv"
      source2.bb: PROVIDES = "opencv"
      
    • 配置PREFERRED_PROVIDER: 选择一个目标依赖使用
      PREFERRED_PROVIDER_opencv =  "source1"
      

变量

  • 内部获取的变量

    • 从当前的上下文获取针对以下变量的值
    • FILEbitbake正在处理的文件的完整路径
      • 文件可以是一个配置文件、一个菜谱、一个类等
    • LAYERDIR:当BitBake处理那一层时,它把这个变量设置为到当前层的目录的完整路径
    • TOPDIR:项目顶层目录
  • 项目特定的变量
    -bitbake 特有
    -BBFILES:空格分隔的针对菜谱的路径列表

    • layer.conf配置文件扩展这个变量检索层下的所有配方文件
  • BBLAYERS:当BitBake处理那一层时,它把这个变量设置为到当前层的目录的完整路径

  • BBPATHBitBake使用这个变量在一个名为classes的子目录中定位类(.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正在处理的文件的目录的路径
    • FILESDIRbitbake寻找本地文件所在目录的完整路径
      • 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_ARCHCPU架构
    • TMPDIR:构建输出的顶级目录;
    • WORKDIRbitbake包储存路径并且存储所有与包的构建过程相关的日志信息
  • 菜谱常用变量 : 以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: 继承类class
  • EXTRA_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.confmydistro.conf文件,此方法与通过附加文件更改块相同;
        PACKAGECONFIG:pn-recipename = "f4 f5"
        
        或者,追加
        PACKAGECONFIG:append:pn-recipename = " f4"
        
  • 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的构建目标列表中
  • 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")
      }
      
  • shell

    • shell函数是由logging.bbclass实现的,logging.bbclass是由OpenEmbedded核心元数据层提供的
        do_configure(){
         bbdebug 1 "debug"
         bbfatal "fatal"
      }
      

菜谱任务执行

列出目标菜谱任务清单
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
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 点赞 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
保持微笑
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区