当前位置: 首页 > 工具软件 > Poky > 使用案例 >

[yocto]poky环境搭建和基本概念

鞠嘉志
2023-12-01

poky本地搭建

环境搭建

source oe-init-build-env <builddir>
  • 后面的参数可以忽略。该脚本主要用来设置构建环境的目录结构和初始化核心集合的配置文件
  • 脚本新增了conf目录,并在conf里面新增了bblayers.conflocal.conf
  • local.conf : 设置变量以影响bitbake构建自定义的Linux操作系统

local.conf:

# Machine Selection   目标机器
MACHINE ??= "qemux86-64"
#
# Where to place downloads
## DL_DIR告诉bitbake把源下载到哪里 ${TOPDIR} TOPDIR变量包含到环境变量的完整路径
DL_DIR ?= "${TOPDIR}/downloads"
#
# Where to place shared-state files
SSTATE_DIR ?= "${TOPDIR}/sstate-cache"
## 包含到共享状态缓存的路径
#
# Where to place the build output
# The default is a tmp directory under TOPDIR.
#
TMPDIR = "${TOPDIR}/tmp"

启动构建

构建针对移动设备的带有用户界面的根文件系统镜像

bitbake core-image-sato

可以先下载所有源,而不编译

bitbake -c fetchall core-image-sato
  • 在下载完成后,可以断开互联网连接,离线构建

Yocto项目术语

  • append file(追加文件): 对现有菜谱进行扩展,追加的变量会覆盖之前的变量
  • bitbake: 构建引擎,是任务执行器和调度器;输入是元数据(confrecipe)
  • class: 是提供逻辑封装和基本继承机制,多个菜谱可继承一个class
  • cross-development toolchain: 交叉开发工具链
  • layer: 是组织文件哥目录结构的元数据(confrecipe)集合
  • metadata: 元数据包包括所有命令bitbake如何执行构建过程的文件
  • recipe: 类似于makefile文件,告诉bitbake如何获取数据,如何编译

打包

  • 打包是将软件、二进制文件和辅助文件打包到一起,用于在目标操作系统直接安装
    • 常见的linux发行包管理系统,RPM(RPM,最初是红帽包管理器)和dpkg(Debian的包管理程序)
    • 嵌入式系统,itsy包管理(ipkg)。Opkg(从ipkg派生出来的),以c语言编写
  • 安装打包不一定是连续的步骤,他们都是可选的

元数据

参考,https://gitee.com/lengjingzju/cbuild

配置文件

  • TOPDIR 目录 : 输出顶层目录
  • poky/meta/conf/bitbake.conf : 默认配置,大多数变量词汇在此定义
  • ${TOPDIR}/conf/local.conf : 本地配置,可以覆盖默认配置和定义自定义的环境变量
  • ${TOPDIR}/conf/bblayers.conf : 配置使用的层 提供BitBake关于什么层要包含在构建过程中以及在哪里找到文件路径的信息
  • meta-xxx/conf/layer.conf : 层配置,可以看到层下的配方文件如何找到
    • 每个层有自己的名字为layer.conf的配置文件
    • 这个文件包含了针对这个层的菜谱文件的路径设置和文件模式
    • 文件layer.conf可以在层的conf子目录中找到
  • meta-xxx/conf/machine/xxx.conf配置 : 机器配置,有机器配置的层是BSP层, ${TOPDIR}/conf/local.conf 里面的MACHINE设置的值的机器配置文件 值.conf必须存在

配方文件

编写配方文件 (xxx.bb)

  • cmd
    • recipetool create -o <xxx.bb> <package_src_dir> 创建一个基本配方,例子中手动增加的条目说明如下
  • 包依赖
    • 包依赖其他包时需要使用 DEPENDS += “package1 package2” 说明
    • 链接其它包时 (LDFLAGS += -lname1 -lname2) 需要增加 RDEPENDS:${PN} += “package1 package2” 说明
  • 编译继承类
    • 使用 menuconfig 需要继承 inherit kconfig
    • 如果是 make -f wrapper.mk menuconfig,需要设置 KCONFIG_CONFIG_COMMAND = “-f wrapper.mk menuconfig”
    • 如果 .config 输出目录是编译输出目录,需要设置 KCONFIG_CONFIG_PATH = “${OUT_PATH}/.config”
    • 使用 Makefile 编译应用继承 inherit sanity,使用 cmake 编译应用继承 inherit cmake
    • 编译外部内核模块继承 inherit module
    • 编译主机本地工具继承 inherit native
  • 安装和打包
    • includedir 指 xxx/usr/include
    • base_libdir 指 xxx/lib; libdir指 xxx/usr/lib; bindir指 xxx/usr/bin; datadir 指 xxx/usr/share
    • 有时候需要精确指定打包的文件而不是目录,防止多个打包的目录有重合导致打包出错
    • 更多目录信息参考poky工程的 meta/conf/bitbake.conf 文件
FILES:${PN}-dev = "${includedir}"
FILES:${PN} = "${base_libdir} ${libdir} ${bindir} ${datadir}"
  • 继承 inherit sanity 或 inherit cmake 时需要按实际情况指定打包的目录,否则 do_package 任务出错
  • 继承 inherit module 不需要指定头文件和模块文件的打包的目录,但如果安装其它文件时,需要指定这个文件的打包目录
  • 忽略某些警告和错误
    • ALLOW_EMPTY:${PN} = “1” 忽略包安装的文件只有头文件或为空,生成镜像时 do_rootfs 错误
    • INSANE_SKIP:${PN} += “dev-so” 忽略安装的文件是符号链接的错误

编写配方附加文件 (xxx.bbappend)

  • 配方附加文件作用和配方文件作用相同,但是会覆盖对应配方文件中的相同变量
  • EXTERNALSRC: 源码目录,编译会对这个目录做校验决定是否重新编译
    • 如果源码不全在 EXTERNALSRC 目录内,我们需要追加文件或目录做校验,追加任务的 file-checksums 标记,否则源码修改后没有重新编译
    • 用户可以继承类 extrasrc.bbclass 来做追加,可设置的变量
      • EXTRASRC_CONFIGURE: 追加做 do_configure 任务校验的文件或目录
      • EXTRASRC_COMPILE: 追加做 do_compile 任务校验的文件或目录
      • EXTRASRC_INSTALL: 追加做 do_install 任务校验的文件或目录
  • EXTERNALSRC_BUILD: 运行 make 命令的目录,可以和 EXTERNALSRC 不同

tmp目录(编译输出)

  • buildstats 存储根据构建目标和目标被构建时的日期/时间戳组织的构建统计
  • cache bitbake解析元数据所生成的缓存
    • 只要元数据没有被改变,bitbake下次编译就直接从这个文件夹中获取数据信息
  • deploy 针对部署的构建输出,例如目标文件系统镜像、包仓库和许可信息,被包含在deploy子目录中
  • logcooker进程创建的BitBake日志信息
  • sstate-control 包含用于根据架构/目标和任务组织的共享状态缓存的程序清单文件
  • stamps BitBake把针对每个任务、根据架构/目标组织的完成标签和签名数据以及包名放在这个子目录中
  • sysroots 这个子目录包含根据架构/目标组织的根文件系统
    • 包括针对构建主机的,包含交叉工具链、QEMU和在构建过程中用到的很多工具的根文件系统
  • work 在这个目录中,BitBake创建根据架构/目标组织的、它在这里构建实际软件包的子目录
  • work-shared 这个子目录和work类似,但是针对共享的软件包

注意

  • 构建环境,尤其是tmp目录不可以简单得被迁移,但是bitbake本质上可以从共享状态缓存重新创建tmp目录的所有内容
  • 共享状态缓存存储自其输入元数据(例如任务代码、变量等)创建的签名所识别的任务的中间输出
    • 只要输入不变,那么签名就不变,使得BitBake使用来自共享状态缓存的输出而不是运行任务
 类似资料: