目录
什么是 BitBake
以下内容有助于理解 BitBake:
基本上,BitBake是一个Python程序,它由用户创建的配置驱动,可以为用户指定的目标执行用户创建的任务,即所谓的配方(recipes)
Config、tasks 与 recipes
通过一种 BitBake 领域特定语言写 Config、tasks 与 recipes,这种语言包含变量与可执行的 shell、python 代码。所以理论上,BitBake 可以执行代码,你也可以用 BitBake 做除构建软件之外的事情,但是并不推荐这么做。
BitBake 是一种构建软件的工具,因此有一些特殊的功能,比如可以定义依赖关系。BitBake 可以解决依赖关系,并将其任务以正确顺序运行。此外,构建软件包通常包含相同或相似的任务。比如常见的任务:
-
下载源代码包,
-
解压源代码,
-
跑 configure,跑 make,或简单的输出 log。
Bitbake 提供一种机制,可通过一种可配置的方式,抽象、封装和重用这个功能。
安装和配置BitBake
Amlogic的Yocto SDK已经包含了bitbake。
安装bitbake
-
添加 bitbake-$version/bin 目录到 PATH
-
添加 bitbake-$version/lib 目录到 PYTHONPATH
也就是执行
export PATH=/path/to/bbtutor/bitbake/bin:$PATH export
PYTHONPATH=/path/to/bbtutor/bitbake/lib:$PYTHONPATH
yocto init脚本
包含了安装bitbake的操作。
bitbake --version可以看到是否安装成功。
P1_Yocto_0903/build$ bitbake --version BitBake Build Tool Core version 1.46.0
执行完init脚本后,会生成build目录,并切换到build目录。
BitBake 工程
通过layers目录和build目录组织,layers目录包含配置文件,和metadata。
Layer 目录
Layer 目录包含配置、任务和目标描述。常用 meta-'something' 命名 Layer 目录。
Build 目录
Build 目录是 bitbake 命令被执行的地方。bitbake将其生成的所有文件放在这个目录。在这里有bitbake初始配置文件bblayers.conf。下面是执行init脚本后生成的build目录:
├── bitbake-cookerdaemon.log
├── cache
│ ├── bb_persist_data.sqlite3
│ ├── hashserv.db
│ ├── hashserv.db-shm
│ └── hashserv.db-wal
├── conf
│ ├── bblayers.conf
│ ├── local.conf
│ └── templateconf.cfg
└── tmp
├── hosttools
└── log
build/conf/bblayers.conf
bitbake在其工作目录(build目录)期望找到的第一个文件,在amlogic的yocto项目中,由init脚本创建。
POKY_BBLAYERS_CONF_VERSION = "2" OEROOT := "${@os.path.abspath(os.path.dirname(d.getVar('FILE', True)) + '/../..')}" BBPATH = "${TOPDIR}" BBFILES ?= "" BBLAYERS ?= " \ /mnt/fileroot/fei.zhang/buildroot/P1_Chip_bringup/P1_Yocto_0903/poky/meta \ /mnt/fileroot/fei.zhang/buildroot/P1_Chip_bringup/P1_Yocto_0903/meta-meson \ "
-
添加当前目录到 BBPATH,TOPDIR 被 BitBake 设置为当前工作目录。
-
初始设置 BBFILES 变量为空,Recipes 在后面会添加。
-
添加我们 meta-meson的路径到 BBLAYERS 变量。当 BitBake 开始执行时,它会搜索所有给定的 layer 目录,以便获得其他配置。
meta-meson目录
├── aml-setenv.sh
├── classes
├── conf
├── lib
├── license
├── oe-init-build-env-meson
├── recipes-bsp
├── recipes-cas
├── recipes-common
├── recipes-connectivity
├── recipes-core
├── recipes-devtools
├── recipes-drm
├── recipes-graphics
├── recipes-kernel
├── recipes-multimedia
├── recipes-rtos
├── recipes-shared
├── recipes-support
└── scripts
每个layer都有两个重要的文件,layer.conf, bblayer.class
meta-meson/conf/layer.conf poky/meta/classes/base.bbclass poky/meta/conf/bitbake.conf
meta-meson/conf/layer.conf
# We have a conf and classes directory, add to BBPATH BBPATH .= ":${LAYERDIR}" # We have a recipes-* directories, add to BBFILES BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \ ${LAYERDIR}/recipes-*/*/*.bbappend" BBFILE_COLLECTIONS += "meson" BBFILE_PATTERN_meson = "^${LAYERDIR}/" BBFILE_PRIORITY_meson = "6" LICENSE_PATH += "${LAYERDIR}/license" #SPDXLICENSEMAP[AMLOGIC] = "LICENSE.AML"
-
LAYERDIR 是 BitBake 传给其所加载 Layer 的变量。我们添加该路径到 BBPATH 变量。
-
BBFILES 告诉 BitBake 需要编译哪些recipes,这里用到了通配符。
注意事项。“.=” 和“+=” 以不添加空格、添加空格的方式,将追加值附给一个变量。
poky/meta/classes/base.bbclass
一个 *.bbclass 文件包含共享功能。我们的 base.bbclass 是属于一个基础类的class,包含一些默认的任务。BitBake 有需求,如果子类没有任何具体task时,BitBake 默认的任务。子类可以覆盖task的实现。
poky/meta/conf/bitbake.conf
conf/bibake.conf 包含 一系列我们讨论的变量。
BitBake 搜索路径
对于 BitBake 来讲,有许多 BBPATH 非法和文件路径。这说明如果我们告诉 BitBake 探索一些路径时,它会搜索 BBPATH。 我们添加 TOPDIR 和 LAYERDIR 到 BBPATH,放在 classes/base.bbclass 或 conf/bitbake.conf 中的任意一个。 当然,我们会添加 meta-tutorial 目录。 编译目录不应含有通用文件。只有像 local.conf 对实际编译是有效的,后面我们会用到 local.conf。
Recipe
BitBake 需要 recipes 定义要做些什么,现在这里什么都没有。我们可以通过
bitbake -s 列出编译目标的recipe 列表。
添加一个recipe
BitBake 需要知道一个 layer 提供哪些 recipes,可通过编辑 meta-tutorial/conf/layer.conf 文件,使用通配符告诉 BitBake 加载所有的 recipe。这个不用修改。
通常 recipes 有自己的目录,并以 groups 的形式收集在一起,把有关联的 recipes 放在同一个目录。
注意:通常使用 recipes-'group' 命令这些目录,这里 group 名表示一个 category 或一些程序。
meta-meson layer下面有很多group:
├── recipes-bsp
├── recipes-common
├── recipes-core
├── recipes-devtools
现在 BitBake 已经知道从哪找 recipe,我们可以开始添加第一个 recipe 了。
按通常的做法,我们创建目录 meta-tutorial/recipes-tutorial/first,并在此创建第一个 recipe。 Recipe 文件也有通用的命名方法:{recipe}_{version}.bb
1634

被折叠的 条评论
为什么被折叠?



