2020年10月29日 星期四

BitBake 簡介


BitBake 是一種類似 make 的程式編譯工具,主要用於 OpenEmbedded 和 Yocto 專案建構 Linux 發行版本。


BitBake

基本上,BitBake 是一個 Python 程序,由使用者建立的配置設定啟動,可以為使用者指定的目標專案執行建構的任務,即所謂的配方(recipes)。

Config、tasks 與 recipes

通過 BitBake 執行特定目的的設定檔 Config、tasks 與 recipes,這些設定檔包含變量與可執行的 shell、python 代碼。

所以理論上,BitBake 可以執行代碼,你也可以使用 BitBake 執行建構專案程式之外的事情,但是並不推薦這麼做。

BitBake 是一種建構專案程式的工具,因此有一些特殊的功能,比如可以定義依賴關係。

BitBake 可以解決依賴關係,並將其任務以正確順序運行。

此外,建構專案程式包通常包含相同或相似的任務。

比如常見的任務:
下載原始代碼,解壓原始代碼,執行 configure,執行 make,或簡單的輸出 log。

Bitbake 提供一種機制,可通過一種可配置的方式,抽象、封裝和重用這個功能。

下載
$git clone git://git.openembedded.org/bitbake

安裝
$export PATH=/home/<your directory>/bitbake/bin:$PATH
$export PYTHONPATH=/home/<your directory>/bitbake/lib:$PYTHONPATH

當我們啟動 bitbake 時,它會試著去找 medtata files。
而 BBPATH 就是指示那些檔案放那的變數。
如果沒有設定它,bitbake 會不知道去那找 .conf 和 .bb。


build/
     ├── mytarget
     │   ├── bitbake.lock
     │   └── conf
     │       └── bblayers.conf
     └── mylayer
         ├── classes
         │   └── base.bbclass
         └── conf
             ├── bitbake.conf
             └── layer.conf


(=> bblayer path)
(=> mylayer 的檔名不限定為 mylayer)
build/mylayer/conf/layer.conf
build/mylayer/conf/bitbake.conf
(=> bbclass)
build/mylayer/class/base.bbclass

layer.conf
--------------------
BBPATH .= ":${LAYERDIR}"                      (=> BBPATH  是用來搜尋 conf 和 class 的設定文件)
BBFILES += "${LAYERDIR}/*.bb"                 (=> BBFILES 是用來搜尋 bb 和 bbappend 設定文件)
--------------------

base.bbclass 和 bitbake.conf 可以從 bitbake 安裝目錄中取得或是參考改寫。

bitbake.conf
--------------------
TMPDIR  = "${TOPDIR}/tmp"                     (=> 在 build 資料夾下)(TOPDIR => build directory)
CACHE   = "${TMPDIR}/cache"                   (=> 在 TMPDIR 下,儲存 Meatadata 的 cache,讓 Bitbake 不用每次重新 parse)
STAMP   = "${TMPDIR}/stamps"                  (=> 用來建立 recipe stamp files)
T       = "${TMPDIR}/work"                    (=> 用來放暫存檔的地方,大多是 task logs and scripts。)
B       = "${TMPDIR}"                         (=> 建置 recipes 時,執行 functions 的地方)
--------------------


(=> target path)
(=> local.conf 的檔名不限定為 local)
build/mytarget/conf/bblayers.conf

bblayers.conf
--------------------
(=> BBPATH  是用來搜尋 conf 和 class 的設定文件)
BBPATH := "${TOPDIR}"

(=> BBFILES 是用來搜尋 bb 和 bbappend 設定文件)
BBFILES ?= ""

(=> BBLAYERS 是一個layer目錄的list,會引用list指向的layer層的conf設定)
(list 裡面的每個變量值指向一個layer目錄。這個目錄下面又有conf/layer.conf。layer.conf裡面又有BBPATH以及當前層的一些配置。)
BBLAYERS ?= "/home/<your directory>/mylayer"

(=> 程式編譯的目標,目標可以多個)
BBFILE_COLLECTIONS += "mytarget mytarget1 mytarget2"
(=> 程式編譯的目錄位置)
BBFILE_PATTERN_mytarget := "^${LAYERDIR}/"

MACHINE = " "
DISTRO  = " "
--------------------

顯示 bitbake 輔助文件。
bitbake --help

顯示 recipes 和 tasks 列表。
$bitbake -s

運行所有 recipes 的所有 tasks。
bitbake world

編譯目標映像。(-k 盡可能往前編譯,即使遇到錯誤)
bitbade -k <image-name>
(e.g.)
bitbake som6x80-image-qt5

列出跟目標映像有相依性的 package。
bitbake <image-name> -g -u depexp
(e.g.)
$bitbake fsl-image-gui -g -u depexp

取得目標映像的原始碼。
bitbake <image-name> -c fetchall

執行編譯目標 package 中的某個 task 任務。
bitbake <package> -c <task>
(e.g.)
$bitbake linux-imx
$bitbake linux-imx -f -c compile

構建一個 recipe,執行該 recipe 的所有 tasks。
bitbade <package>

顯示特定 package 提供的 task。
bitbake <package> -c listtasks

開啟包含編譯目標 package 所需系統環境的新 shell。
bitbake <package> -c devshell

列出所有 layer
bitbake-layers show-layers

列出所有 recipes
bitbake-layers show-recipes

列出跟 image 有關的所有 recipes
bitbake-layers show-recipes "*-image-*"

開啟編譯核心的設定

bitbake virtual/kernel -c menuconfig 

資料來源: https://welkinchen.pixnet.net/blog/post/67122477-bitbake-%E7%B0%A1%E4%BB%8B

yocto 概念


這篇文章紀錄我對於 yocto 的概念. 以下用的版本為 2.4 (rocko). 一開始介紹幾個用詞. 接著述說架構的運作流程. 最後再介紹 bitbake 指令用法.

名詞定義

[2]摘錄比較常看到的名詞定義
  • BitBake: The task executor and scheduler used by the OpenEmbedded build system to build images. For more information on BitBake, see the BitBake User Manual.

  • Task: A unit of execution for BitBake (e.g. do_compile, do_fetch, do_patch, and so forth).

  • Recipe: A set of instructions for building packages. A recipe describes where you get source code, which patches to apply, how to configure the source, how to compile it and so on. Recipes also describe dependencies for libraries or for other recipes. Recipes represent the logical unit of execution, the software to build, the images to build, and use the .bb file extension.
    P.S recipe 在 yocto 用 .bb 檔案表示. 而 .bbappend 用於修改 .bb 的設定

  • Metadata: The files that BitBake parses when building an image. In general, Metadata includes recipes, classes, and configuration files. In the context of the kernel ("kernel Metadata"), the term refers to the kernel config fragments and features contained in the yocto-kernel-cache Git repository.

我對於後三個的關係是. metadata 包含許多 recipes. recipe 則記載著哪些 tasks 可以使用. recipe 在根據規範或需求實作 tasks. 所以 bitbake 運行時候會在適當時機呼叫 recipe 所屬的 task 來執行其工作.
e.g. meta layer 目錄底下有許多的 recipe-bsp, recipe-core, etc., 每個 recipe-xxx 底下有許多 recipe 檔案. 這些檔案皆有實作所需的 tasks, 如 do_compile, do_fetch, 等等.

概述流程

下方以 bitbake 編譯流程和使用yocto文件[2]的架構流程圖互相搭配解說. 首先我們依照官網[1]所說的, 經由 oe-init-build-env script 配置好環境以及工作目錄 build. build 目錄為設定檔以及編譯所存放檔案的地方

[yijyun@localhost Github]$ git clone -b rocko git://git.yoctoproject.org/poky.git
[yijyun@localhost Github]$ cd poky/
[yijyun@localhost poky]$ . 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'

[yijyun@localhost build]$ ls
bitbake-cookerdaemon.log  cache  codes  conf  downloads  sstate-cache  tmp  workspace

在看一下官方文件[2]第三章所述說的架構流程, 如下所示.


圖片來自於[2]第三章

執行 bitbake core-image-minimal 來進行編譯動作, 產生的資訊如下.

[yijyun@localhost build]$ bitbake core-image-minimal
Parsing recipes: 100% |##########################################################################################################| Time: 0:00:41
Parsing of 820 .bb files complete (0 cached, 820 parsed). 1277 targets, 44 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies

Build Configuration:
BB_VERSION           = "1.36.0"
BUILD_SYS            = "x86_64-linux"
NATIVELSBSTRING      = "centos-7"
TARGET_SYS           = "i586-poky-linux"
MACHINE              = "qemux86"
DISTRO               = "poky"
DISTRO_VERSION       = "2.4.2"
TUNE_FEATURES        = "m32 i586"
TARGET_FPU           = ""
meta
meta-poky
meta-yocto-bsp       = "rocko:50189fdf620bc9ca42065998ce8c5a796ad8c331"

NOTE: Fetching uninative binary shim from http://downloads.yoctoproject.org/releases/uninative/1.7/x86_64-nativesdk-libc.tar.bz2;sha256sum=ed033c868b87852b07957a4400f3b744c00aef5d6470346ea1a59b6d3e03075e
Initialising tasks: 100% |#######################################################################################################| Time: 0:00:03
NOTE: Executing SetScene Tasks
NOTE: Executing RunQueue Tasks
WARNING: libmpc-native-1.0.3-r0 do_fetch: Failed to fetch URL http://www.multiprecision.org/mpc/download/mpc-1.0.3.tar.gz, attempting MIRRORS if available
Currently  4 running tasks (99 of 2470)   3% |###                                                                                              |
0: binutils-cross-i586-2.29.1-r0 do_fetch (pid 2411)   6% |####                                                                        | 1.59M/s
1: gcc-source-7.3.0-7.3.0-r0 do_fetch (pid 4633)  17% |#############                                                                    | 746K/s
2: xz-native-5.2.3-r0 do_configure - 2s (pid 18637)
3: gmp-native-6.1.2-r0 do_configure - 2s (pid 18769)                   
or                                                    
0: binutils-cross-i586-2.29.1-r0 do_fetch (pid 2411)  25% |###################                                                          | 583K/s
1: linux-libc-headers-4.12-r0 do_fetch (pid 21075)  22% |#################                                                             | 1.02M/s
2: glibc-initial-2.26-r0 do_fetch (pid 21452)   3% |##                                                                                  | 390K/s
3: sqlite3-native-3_3.20.0-r0 do_compile - 1s (pid 2812)

接下來就描述這些步驟與上方架構流程圖的關係.

  1. 執行 source oe-init-build-env 來設置環境. 此 script 會產生一個 build 目錄. 底下的 conf 目錄存放 user config(local.conf) 與 layers (bblayers.conf). local.conf 可以設定編譯的target(kernel, machine)以及加入相關套件 image 等等之類的設定. bblayers.conf 則紀錄所要使用的 layers.

  2. 執行 bitbake core-image-minimal 也就是執行 core-image-minimal recipe. 此 recipe 擁有產生 image 相關的 tasks. 但是在執行之前, bitbake 根據 bblayer.conf. 把所有 layers 裡面的 recipes 都給讀進來做分析. 之後才正式執行 core-image-minimal. 這部分如上方圖裡面的 Parsing of 820 .bb files complete (0 cached, 820 parsed). 1277 targets, 44 skipped, 0 masked, 0 errors.

  3. bitbake 執行 target recipe(core-image-minimal) 時會尋找其依賴的 recipes, 並執行其所擁有的 tasks (do_fetch, do_compile, etc.). 這邊 recipe 所擁有的 tasks 可參閱[2]第九章. 基本上的流程都是先抓取 source codes, 接著 configure 和編譯. 把編譯完的檔案存放於 ${WORKDIR}. 然後把這些檔案封包成 package 的格式 (rpm, deb, etc.) 存放於 ${WORKDIR}/deploy-xxxx. 同樣也會存放於 ${DEPLOY_DIR}

  4. [yijyun@localhost build]$ ls  tmp/work/i586-poky-linux/acl/2.2.52-r0/
    0001-Added-configure-option-to-enable-disable-static-libr.patch  pkgdata
    acl-2.2.52                                                       pseudo
    acl-fix-the-order-of-expected-output-of-getfacl.patch            recipe-sysroot
    acl.spec                                                         recipe-sysroot-native
    configure.sstate                                                 relative-libdir.patch
    debugsources.list                                                run-ptest
    deploy-rpms                                                      sysroot-destdir
    image                                                            temp
    license-destdir                                                  test-fix-directory-permissions.patch
    Makefile-libacl-should-depend-on-include.patch                   test-fix-insufficient-quoting-of.patch
    package                                                          test-fixups-on-SELinux-machines-for-root-testcases.patch
    packages-split
    
    [yijyun@localhost build]$ ls  tmp/work/i586-poky-linux/acl/2.2.52-r0/deploy-rpms/i586/
    acl-2.2.52-r0.i586.rpm      acl-doc-2.2.52-r0.i586.rpm        acl-locale-fr-2.2.52-r0.i586.rpm  acl-locale-sv-2.2.52-r0.i586.rpm
    …
    
    [yijyun@localhost build]$ ls  tmp/deploy/rpm/i586/ | grep acl
    acl-2.2.52-r0.i586.rpm
    acl-dbg-2.2.52-r0.i586.rpm
    acl-dev-2.2.52-r0.i586.rpm
    …
    
  5. do_compile task 以及 do_package task 完畢之後, 接著就是執行 image 的部分, bitbake 會執行 do_image 相關的部分, 來產生所需要的 image 檔案. 相關檔案會存放於 ${DEPLOY_DIR_IMAGE}

  6. [yijyun@localhost build]$ ls tmp/deploy/images/qemux86/
    bzImage
    bzImage--4.12.19+git0+44a22d45cb_257f843ea3-r0-qemux86-20180219113211.bin
    bzImage-qemux86.bin
    core-image-minimal-qemux86-20180219113211.qemuboot.conf
    core-image-minimal-qemux86-20180219113211.rootfs.ext4
    core-image-minimal-qemux86-20180219113211.rootfs.manifest
    core-image-minimal-qemux86-20180219113211.rootfs.tar.bz2
    core-image-minimal-qemux86-20180219113211.testdata.json
    core-image-minimal-qemux86.ext4
    core-image-minimal-qemux86.manifest
    core-image-minimal-qemux86.qemuboot.conf
    core-image-minimal-qemux86.tar.bz2
    core-image-minimal-qemux86.testdata.json
    modules--4.12.19+git0+44a22d45cb_257f843ea3-r0-qemux86-20180219113211.tgz
    modules-qemux86.tgz
    

bitbake 常用指令

從[3]摘要一些小技巧, 用來快速查詢 recipe, 檔案位置, 依賴關係, 等等一些常用的方法.

bitbake [recipename/target recipe:do_task ...]

執行某個 recipe (or target) 所有的 tasks

[yijyun@localhost build]$ bitbake acl

bitbake [recipename/target recipe:do_task ...] -c [cmd]

執行 recipe 裡的某個 task. 可以先使用 listtasks 列出 recipe 可用的 tasks

# -c CMD, --cmd=CMD     Specify the task to execute. The exact options available depend on the metadata. Some examples might be 'compile' or 'populate_sysroot' or 'listtasks' may give a list of the tasks available.
[yijyun@localhost build]$ bitbake acl -c listtasks
Loading cache: 100% |###################################################################################| Time: 0:00:00
...
Initialising tasks: 100% |##################################################################################| Time: 0:00:01
NOTE: Executing RunQueue Tasks
do_build                       Default task for a recipe - depends on all other normal tasks required to 'build' a recipe
do_checkuri                    Validates the SRC_URI value
...
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.

bitbake -s

根據設定檔, 列出所有 recipe 的版本資訊. 可以搭配 grep 來找是否存在某個 recipe 以及版本.

# -s, --show-versions   Show current and preferred versions of all recipes.
[yijyun@localhost build]$ bitbake -s | grep linux-yocto
linux-yocto                         :4.12.19+gitAUTOINC+44a22d45cb_257f843ea3-r0

bitbake -e [recipename/target recipe:do_task ...]

列出此 recipe 相關的環境變數資訊. 此方式可以找出 ${S}, ${WORKDIR}, 等等的資訊.

# -e, --environment     Show the global or per-recipe environment complete with information about where variables wereset/changed.
[yijyun@localhost build]$ bitbake -e acl | grep ^WORKDIR=
WORKDIR="/media/disk1-1/Github/poky/build/tmp/work/i586-poky-linux/acl/2.2.52-r0"

Reference

  1. Yocto Project Quick Start 2.4.1
  2. Yocto Project Reference Manual 2.4.1
  3. Yocto实用技巧

 

資料來源: http://yi-jyun.blogspot.com/2018/02/yocto-1.html

yocto recipe : (2) 撰寫 bbappend

 

前言

xxx.bb 檔案是用來描述一個 recipe. 然而 xxx.bb 會因為 patch codes、新增 tasks、等等的因素修改. 這邊介紹如何使用 xxx.bbappend[1] 檔案. 以不修改 xxx.bb 的情況下擴充需求. 文章將以 patch codes 為例子, 並個別以 devtool 工具和手動的方式示範.

bbapend 簡介

.bbappend 是擴充 .bb 的方式. 藉由 .bbappend 來新增 tasks、patch code、新增/修改變數等等諸此之類的事. 其名稱必須跟所要修改的相同, 而版本號則依據需求寫.

舉例:
bb file 名稱: giflib_5.1.4.bb
bbappend 名稱: giflib_5.1.4.bbappend 或 giflib_%.bbappend.

%: 表示萬用字元

使用 .bbappend 的情況, 我個人認為有以下情況再使用
(1) 當 recipe 已存在 yocto 最基本的 layer, 不應隨便修改. 舉例: u-boot_2017.09.bb 存在於 yocto 的 meta layer
(2) 某些 layers 會共用此 recipe 的情況下. 舉例: meta-raspberrypi 與 meta-ti 分別各自使用自己的 xserver-xf86-config_0.1.bbappend 來對 yocto meta layer 的 xserver-xf86-config_0.1.bb 做擴充修改.

bbappend 範例

事前準備

用 giflib [4] 作為測試程式. 先下載 giflib-5.1.4.tar.bz2. 接著使用 bitbake-layer 建立 meta-custom layer, 再透過 recipetool 把產生的 giflib_5.1.4.bb 存放於此 layer.

# 執行 oe-init-build-env 進行 yocto 編譯環境設定
[yijyun@localhost poky]$ . oe-init-build-env
# 建立 3rd-pkgs, 並把 giflib 放至此
[yijyun@localhost build]$ mkdir 3rd-pkgs; cd 3rd-pkgs/
[yijyun@localhost 3rd-pkgs]$ ls
giflib-5.1.4.tar.bz2
# 建立 meta-custom, 並加入yocto 環境
[yijyun@localhost build]$ bitbake-layers create-layer meta-custom
[yijyun@localhost build]$ bitbake-layers add-layer meta-custom
# 在底下建立 giflib  目錄
[yijyun@localhost build]$ cd meta-custom/recipes-example
yijyun@localhost recipes-example]$ rm -rf example/
[yijyun@localhost recipes-example]$ mkdir giflib
# 透過 recipetool 產生 bb
[yijyun@localhost recipes-example]$ cd ../../
[yijyun@localhost build]$ recipetool create -o meta-custom/recipes-example/giflib/giflib_5.1.4.bb  3rd-pkgs/giflib-5.1.4.tar.bz2

以 devtool 產生 .bbappend

新增 meta-custom-devtool-patch layer 來存放 devtool 之後產生的 bbappend.

# 建立 meta-custom-devtool-patch layer
[yijyun@localhost build]$ bitbake-layers create-layer meta-custom-devtool-patch
[yijyun@localhost build]$ bitbake-layers add-layer meta-custom-devtool-patch
# 建立  giflib 目錄
[yijyun@localhost build]$ mkdir meta-custom-devtool-patch/recipes-example/giflib

使用 devtool 修改 source code 會產生 workspace layer, 並複製一份 giflib code 至 workspace/source
這邊針對 util/giffix.c 修改. 於 main 函數裡添加 printf("devtool hello !!\n");

# 藉由 devtool 來修改 code
[yijyun@localhost build]$ devtool modify giflib
NOTE: Source tree extracted to /media/disk1-1/Github/poky/build/workspace/sources/giflib
NOTE: Recipe giflib now set up to build from /media/disk1-1/Github/poky/build/workspace/sources/giflib

###### 修改 workspace/source/giflib/util/giffix.c  #########
int main(int argc, char **argv)
{
    printf("hello !!! (devtool)\n");      ///< 新增此行
    int i, j, NumFiles, ExtCode, Row, Col, Width, Height, ErrorCode,
    DarkestColor = 0, ColorIntens = 10000;

完畢之後, 至 source code 目錄下進行 git add 與 git commit. 最後在 devtool finish 即可產生 bbappend.

# git add 與 commit
[yijyun@localhost giflib]$ git add util/giffix.c
[yijyun@localhost giflib]$ git commit -m "use devtool to create bbappend"
# 最後 devtool finish 表示完成修改, 把更新至於 meta-custom-devtool-patch
[yijyun@localhost sources]$ cd -
[yijyun@localhost sources]$ devtool finish giflib meta-custom-devtool-patch
# ls 查看相關檔案
yijyun@localhost build]$ ls meta-custom-devtool-patch/recipes-example/giflib/*
meta-custom-devtool-patch/recipes-example/giflib/giflib_%.bbappend

meta-custom-devtool-patch/recipes-example/giflib/giflib:
0001-use-devtool-to-create-bbappend.patch

手動撰寫 .bbapend

新增 meta-custom-manual-patch layer 來存放自己建立的 bbappend 和 patch.
因此在 recipes-example 底下建立 giflib 與 giflib/giflib. 其中 giflib/giflib 是 yocto 預設會搜尋的目錄
可以修改 FILEPATHS(常用於 .bb) or FILESEXTRAPATHS(常用於 .bbappend) 來符合自己的需求.

# 新增 meta-custom-manual-patch layer 於環境
[yijyun@localhost build]$ bitbake-layers create-layer meta-custom-manual-patch
[yijyun@localhost build]$ bitbake-layers add-layer meta-custom-manual-patch
# 建立 giflib 相關目錄
[yijyun@localhost build]$ mkdir meta-custom-manual-patch/recipes-example/giflib/ meta-custom-manual-patch/recipes-example/giflib/giflib

這邊在 3rd-pkgs 手動複製一份 giflib, 並於 util/giffix.c 中添加 printf("hellow !! (manual)\n");.
接著在兩個 giflib 的目錄下, 使用 diff 產生出 patch. 把 patch 放置 meta-custom-manual-patch layer

# 複製一份 giflib
[yijyun@localhost build] cd 3rd-pkgs
[yijyun@localhost 3rd-pkgs]$ cp -fa giflib-5.1.4 giflib-5.1.4_modify
# 修改過 code, 使用 diff 產生 patch
[yijyun@localhost 3rd-pkgs]$ diff -Naur giflib-5.1.4/util/giffix.c giflib-5.1.4_modify/util/giffix.c  > 00_giflib_util_giffix.patch
# 把 patch 放置 meta-custom-manual-patch
[yijyun@localhost 3rd-pkgs]$ cd ..
[yijyun@localhost build]$ mv 3rd-pkgs/00_giflib_util_giffix.patch meta-custom-manual-patch/recipes-example/giflib/giflib/

###### 修改 giflib-5.1.4_modify/util/giffix.c  ##########
int main(int argc, char **argv)
{
    printf("hellow !! (manual)\n");       ///< 新增此程式
    int i, j, NumFiles, ExtCode, Row, Col, Width, Height, ErrorCode,
    DarkestColor = 0, ColorIntens = 10000;

注意: 使用 diff 記得在 source code 的上一層, 不然 yocto 用 pacth 標示的檔案路徑時候會找不到對應檔案.
以下為 00_giflib_util_giffix.patch 裡的檔案路徑

(ok)
--- giflib-5.1.4/util/giffix.c  2016-01-07 06:08:12.000000000 -0500
+++ giflib-5.1.4_modify/util/giffix.c   2018-04-28 08:13:52.209101817 -0400
<error>
--- giffix.c  2016-01-07 06:08:12.000000000 -0500
+++ giffix.c   2018-04-28 08:13:52.209101817 -0400

於 meta-custom-manual-patch 新增 giflib_5.1.4.bbappend. 填寫以下參數, 便完成以手動建立 bbappend.

# 建立 giflib_5.1.4.bbappend
[yijyun@localhost build]$ vim meta-custom-manual-patch/recipes-example/giflib/giflib_5.1.4.bbappend

############# 以下為 giflib_5.1.4.bbappend 內容################
# 告知 bitbake 把 recipe 目錄給加入
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
# 告知 patch 名稱
SRC_URI_append = "\
    file://00_giflib_util_giffix.patch \
"

驗證

可於 tmp/work/i586-poky-linux/giflib/5.1.4-r0 查看是否有相關的 patch. 以及 於tmp/work/i586-poky-linux/giflib/5.1.4-r0/giflib-5.1.4/util/giffix.c 看 source code 是否有被修改

# 檢查是否有 patch 檔案
[yijyun@localhost build]$ ls tmp/work/i586-poky-linux/giflib/5.1.4-r0/
00_giflib_util_giffix.patch  configure.sstate   deploy-rpms   giflib.spec
...
package          pkgdata         recipe-sysroot  sysroot-destdir

# 查看 source code 是否已被修改
[yijyun@localhost build]$ head -n 38 tmp/work/i586-poky-linux/giflib/5.1.4-r0/giflib-5.1.4/util/giffix.c  | tail -n 4
int main(int argc, char **argv)
{
 printf("hellow !! (manual)\n");
    int i, j, NumFiles, ExtCode, Row, Col, Width, Height, ErrorCode,

Reference

  1. Yocto Project Development Tasks Manual - using-bbappend-files
  2. Yocto Project Application Development and the Extensible Software Development Kit - 2. Using the Extensible SDK
  3. Yocto - devtool
  4. giflib

資料來源: http://yi-jyun.blogspot.com/2018/04/yocto-3-bbappend.html

yocto recipe : (1) 撰寫 recipe

 

此篇文章介紹如何透過 yocto 的 utilities 來產生 recipe. 而完成的 recipe 又如何加入到 image.

yocto 相關工具介紹

有三個適用於 layer 與 recipe 相關的 utilities.

  1. bitbake-layers: 負責 (1) 建立 layer. (2) 修改 bblayers.conf. (3) 查看 layer 底下的 recipes
  2. recipetool: 用於建立一個 recipe 和新增/修改 recipe. 這邊 recipe 在 yocto 即是 xx.bb 或 xx.bbappend 檔案
  3. devtool: 定位在開發測試上. devtool 會建立一個獨立的 workspace layer. 讓開發者於此建立/修改 recipe 與 patch source code. 在不修改原有設定下與現有 layers 進行整合測試. 完畢之後可以再透過 devtool 新增或更新到 layer 裡

利用 utilities 撰寫 recipe 的時候. 要確保所屬的 layer 是存在於 bblayer.conf. 不然執行 bitbake [recipe basename] 會找不到相關的 recipe.

yocto 事前準備

以 core-image-miniaml recipe 為例子. core-image-miniaml 會產生系統所需的 image 相關檔案. 接著利用 bitbake-layers 建立自己的 layer 於 build 目錄底下. 再透過 bitbake-layers 把 layer 加入到 bblayers.conf 設定檔.

[yijyun@localhost poky]$ . oe-init-build-env
[yijyun@localhost build]$ bitbake core-image-minimal
[yijyun@localhost build]$ bitbake-layers create-layer meta-layer
[yijyun@localhost build]$ bitbake-layers add-layer meta-layer
[yijyun@localhost build]$ ls
bitbake-cookerdaemon.log  cache  conf  downloads  meta-layer  sstate-cache  tmp

新增 recipe

以 devtool 與 recipetool 個別示範如何產生 recipe. 步驟有參閱[1][2][3]在做些修改. 經由工具產生 recipe 的時候, 若是 source code 來源(e.g. git, ftp, tar, etc.)以及編譯方式(cmake, make, etc.)是可以被解析的. 經工具所產生的 recipe 幾乎都不需要多做修改. 而以下說明兩個範例各自的情境:

  • devtool 範例: 使用 GIFLIB 套件. 由於 GIFLIB 基於 autotool, configure 與 Makefile. devtool 可以分析並幫助我們產生無須修改的 recipe.
  • recipetool 範例: 這邊以自身撰寫程式的經驗. 程式只會有 header file 與 source file. 並搭配 Makefile 來編譯的專案. 所以 recipetool 產生的 recipe 需要修改.

1. devtool 指令

devtool 產生 recipe 時候, 會先建立一個 workspace layer, 並在目錄底下產生 giflib recipe. 由於 source code 格式符合 yocto, 產生出來的 recipe 並不需要額外修改.

[yijyun@localhost build]$ devtool add giflib git://git.code.sf.net/p/giflib/code
[yijyun@localhost build]$ ls . workspace/recipes/giflib/
.:
bitbake-cookerdaemon.log  cache  conf  downloads  meta-layer  sstate-cache  tmp  workspace

workspace/recipes/giflib/:
giflib_git.bb

接著 devtool build giflib 來進行編譯. 這邊只有單純進行編譯的動作而已.

[yijyun@localhost build]$ devtool build giflib
[yijyun@localhost build]$ ls tmp/work/i586-poky-linux/giflib/5.1.4+git999-r0/
configure.sstate   giflib-5.1.4+git999  package         pkgdata  recipe-sysroot         sysroot-destdir
debugsources.list  image                packages-split  pseudo   recipe-sysroot-native  temp

執行 devtool build-image core-image-minimal 把 giflib 打包成 rpm package 並加入到 core-image-minimal 的 image 裡面. 之後可以看到 giflib ${WORKDIR} 底下多了 deploy-rpms 目錄. 同樣在 tmp/deploy/rpm/i586/ 目錄與 core-image-minimal 的 rootfs 目錄底下皆有 giflib 的相關檔案

[yijyun@localhost build]$ devtool build-image core-image-minimal

[yijyun@localhost build]$ ls tmp/work/i586-poky-linux/giflib/5.1.4+git999-r0/deploy-rpms/i586/
giflib-5.1.4+git999-r0.i586.rpm  giflib-dbg-5.1.4+git999-r0.i586.rpm  giflib-dev-5.1.4+git999-r0.i586.rpm

[yijyun@localhost build]$ ls tmp/deploy/rpm/i586/ | grep giflib
giflib-5.1.4+git999-r0.i586.rpm
giflib-dbg-5.1.4+git999-r0.i586.rpm
giflib-dev-5.1.4+git999-r0.i586.rpm

[yijyun@localhost build]$ ls tmp/work/qemux86-poky-linux/core-image-minimal/1.0-r0/rootfs/usr/lib/
libgif.so.7  libgif.so.7.0.0  libkmod.so.2  libkmod.so.2.3.2  opkg

上述過程都沒有任何問題後. 再用 devtool finish giflib meta-layer. 把 giflib recipe 加入到自己建立的 meta-layer 底下. 以上就是經由 devtool 完成 recipe 的過程

[yijyun@localhost build]$ devtool finish giflib meta-layer

[yijyun@localhost build]$ ls meta-layer/recipes-giflib/giflib/
giflib_git.bb

2. recipetool 指令

以自行撰寫的 hello project 為例子. 首先建立 meta-layer/recipes-myproject/myproject/files 目錄, 並把程式放置於此. 程式的內容如下:

yijyun@yijyun-wd-disk:/root/GitHub_Code/poky/build$ ls meta-layer/recipes-myproject/myproject/files/
hello.c  hello.h  hellolib.c  Makefile

補充:
這邊目錄名稱取為 files. 主要是 yocto 預設搜尋檔案的路經關係. 可用 bitbake -e myproject| grep ^FILESPATH= 來觀看

yijyun@yijyun-wd-disk:/root/GitHub_Code/poky/build$ bitbake -e myproject| grep ^FILESPATH= | sed 's/:/\n/g'
FILESPATH="/root/GitHub_Code/poky/build/meta-layer/recipes-myproject/myproject/myproject-1.0/poky
...
/root/GitHub_Code/poky/build/meta-layer/recipes-myproject/myproject/files/"

hello.h header file 純粹 extern hellowlib.c 的 LibHellowWorld 函數.

#ifndef HELLO_EXAMPLE_H
#define HELLO_EXAMPLE_H
/*
 * Example function
 */
extern void LibHelloWorld(void);

#endif /* HELLO_EXAMPLE_H */
 

hellolib.c 實作 LibHellowWorld 函數. 單純輸出訊息

#include <stdio.h>
#include "hello.h"

void LibHelloWorld()
{
  printf("Hello World (from a shared library!)\n");
}

hell.c. 輸出訊息並引用 lib 的輸出函數

#include <stdlib.h>
#include "hello.h"

int main(int argc, char *argv[])
{
  printf("Hello Yocto World...\n");
  LibHelloWorld();
  return 0;
}

Makefile 撰寫如何編譯此專案的規則. 若是編譯過程有發生 No GNU_HASH in the elf binary 錯誤. 可參閱 [6]

SRCS := $(wildcard *.c)
OBJS := $(SRCS:.c=.o)
# hello
HELLO_OBJS := $(filter hello%.o, $(OBJS))
TARGET_HELLO := hello
# targets
TARGET :=  $(TARGET_HELLO)
# varables used in yocto
bindir ?= /usr/bin

LIBS :=

.PHONY: clean all

all: $(TARGET)

%.o : %.c
 $(CC) -c $< -o $@ ${LDFLAGS} ${LIBS}

$(TARGET_HELLO) : $(OBJS)
 $(CC) $(HELLO_OBJS) -o $@ ${LIBS} ${LDFLAGS}

install:
 install -d $(DESTDIR)$(bindir)
 install -m 755 $(TARGET_HELLO) $(DESTDIR)$(bindir)/

最後需要修改 myproject.bb 檔案. 由於採用 Makefile 格式, 只需要修改兩個地方即可.
(1) 修改 SRC_URI 為 file://*. 由於只存在 source codes 於 files 目錄. 但是並沒有指定是那些檔案. 所以用 * 來表示所有檔案
(2) 設定 S 為 ${WORKDIR}. 指定 build 的目錄所在位置.

LICENSE = "CLOSED"
LIC_FILES_CHKSUM = ""

# modify SRC_URI from "" to "file://*"
SRC_URI = "file://*"

# add this line.
# P.S. S => The location in the Build Directory where unpacked recipe source code resides.
S = "${WORKDIR}"

do_configure () {
}
do_compile () {
 oe_runmake
}
do_install () {
 oe_runmake install 'DESTDIR=${D}'
}

在執行 bitbke myproject 進行編譯. 可以看到編譯成功以及所產生的相關檔案. 以上就是 recipetool 的方法.

yijyun@yijyun-wd-disk:/root/GitHub_Code/poky/build$ bitbake myproject
yijyun@yijyun-wd-disk:/root/GitHub_Code/poky/build$ ls tmp/work/i586-poky-linux/myproject/1.0-r0/
...
hello              hellolib.c  image       myproject-1.0    packages-split  pseudo   root

新增 recipe 於 image

新的 recipe 撰寫完畢後, 便要想辦法加入到 image 裡面. 而 [4] 有列出幾種方式.
然而我的目標是不修改其他 recipe下, 把新的 recipe 加入到 image 裡, 所以採用修改 local.conf 的方式, 如下所示

  • 修改 local.conf
  • 在 local.conf 的 IMAGE_INSTALL 變數中添加所需的 recipe
    IMAGE_INSTALL_append = " [recipe_basename]" (文件不推薦這種寫法 IMAGE_INSTALL += "[recipe_basename]")
    # e.g. IMAGE_INSTALL_append = " strace"

    若如果想限制於特定產生 image 的 recipe
    IMAGE_INSTALL_append_pn-core-image-minimal = " [recipe_basename]"
    # e.g. IMAGE_INSTALL_append_pn-core-image-minimal = " strace"

    IMAGE_INSTALL 定義:
    Specifies the packages to install into an image. The IMAGE_INSTALL variable is a mechanism for an image recipe and you should use it with care to avoid ordering issues.

以上述的兩個 recipes 來說, 只需要在 build/local.conf 加入此行

# append this line on build/local.conf
IMAGE_INSTALL_append = " giflib myproject"

先查看 rootfs 底下的檔案. 目前是沒有 giflib 與 myproject. 接著 bitbake core-image-minimal. 再次查看就會看到相關的檔案被安裝了.

yijyun@yijyun-wd-disk:/root/GitHub_Code/poky/build$ ls tmp/work/qemux86-poky-linux/core-image-minimal/1.0-r0/rootfs/usr/lib/
libkmod.so.2  libkmod.so.2.3.2  opkg

yijyun@yijyun-wd-disk:/root/GitHub_Code/poky/build$ bitbake core-image-minimal

yijyun@yijyun-wd-disk:/root/GitHub_Code/poky/build$ ls tmp/work/qemux86-poky-linux/core-image-minimal/1.0-r0/rootfs/usr/lib/
libgif.so.7  libgif.so.7.0.0  libkmod.so.2  libkmod.so.2.3.2  opkg
yijyun@yijyun-wd-disk:/root/GitHub_Code/poky/build$ ls tmp/work/qemux86-poky-linux/core-image-minimal/1.0-r0/rootfs/usr/bin/
cmp         env       gifclrmp  hello           less           nc        readlink   shuf     time        unzip                wall.sysvinit
...
clear     dumpleases  gifbuild  head      last.sysvinit   mkfifo         printf    sha256sum  tftp     unlink      wall                 yes

Reference

  1. Building your own recipes from first principles
  2. Yocto Project Development Tasks Manual - 4.3. Writing a New Recipe
  3. Yocto Project Linux Kernel Development Manual - 2.4. Using devtool to Patch the Kernel
  4. Yocto Project Development Tasks Manual - 4.2. Customizing Images
  5. BitBake User Manual
  6. How to fix : ERROR: do_package_qa: QA Issue: No GNU_HASH in the elf binary

資料來源: http://yi-jyun.blogspot.com/2018/02/yocto-2-recipe.html

bitbake 使用指南

 

  如果說Linux 系統鏡像是你想吃的一桌飯菜,那麼Yocto 就是一家餐廳,Poky 就是廚房,BitBake 就是廚師。那麼,如果我們想定制自己的Linux,我們應該學會怎麼用好BitBake,或者說把我們的意圖告訴BitBake。總而言之,如果你想定制Linux 系統的願望跟你想吃一桌好吃的飯菜一樣強烈的話(或者更強烈),你應該好好了解了解BitBake。


1. 認識BitBake

  OE BitBake是一個軟件組建自動化工具程序,像所有的build工具一樣(比如make,ant,jam)控制如何去構建系統並且解決構建依賴。但是又區別於功能單一的工程管理工具(比如make),bitbake不是基於把依賴寫死了的makefile,而是收集和管理大量之間沒有依賴關係的描述文件(這裡我們稱為包的配方),然後自動按照正確的順序進行構建。oe代表OpenEmbedded,而openembedded是一些用來交叉編譯,安裝和打包的metadata(元數據)。
  OpenEmbedded是一些腳本(shell和python腳本)和數據構成的自動構建系統。腳本實現構建過程,包括下載(fetch)、解包(unpack)、打補丁(patch)、配置(configure)、編譯(compile)、安裝(install)、打包(package)、staging、做安裝包(package_write_ipk )、構建文件系統等。

  OE 編譯順序:

do_setscene
do_fetch
do_unpack
do_path
do_configure
do_qa_configure
do_compile
do_stage
do_install
do_package
do_populate_staging
do_package_write_deb
do_package_write
do_distribute_sources
do_qa_staging
do_build
do_rebuild
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

注意:do_compile 這些函數都是在OpenEmbedded 的classes 中定義的,而bitbake 中並沒有對這些進行定義。這說明,bitbake 只是OE 更底層的一個工具,也就是說,OE 是基於bitbake 架構來完成的。

  數據主要提供兩個方面的信息:

  • 特定軟件包的構建信息
      怎樣獲取源代碼和補丁?怎樣構建,用Makefile還是Autotool?需要向目標編譯環境輸出哪些文件?需要安裝哪些文件?每個軟件包都需要描述文件。事實上,每個軟件包的不同版本都有一個描述文件。
  • 軟件包之間的依賴關係
      構建軟件包A需要先構建什麼主機平台工具,什麼目標平台工具?軟件包A在編譯時依賴哪些軟件包?軟件包A在運行時依賴哪些軟件包?一個目標應包含那些軟件包,這些依賴關係把幾百個軟件包聯繫在一起,構成了一個完整的系統。

基於bitbake,OE可以滿足以下所有要求:

  • 解決交叉編譯
  • 解決包之間的依賴關係
  • 必須支持包的管理(tar,rpm,ipk)
  • 必須支持將包作成鏡像
  • 必須支持高度的可定制性,以滿足不同的機器,主機發行版和架構需求
  • 編寫元數據必須是容易的,並且可重用性要好

  OE 的主要功能是為各種工程項目的需要編譯源碼。不管是什麼工程,以下任務都是需要做的:

  1. 下載源碼包,還有其他的系統支持文件(比如初始化腳本)
  2. 解壓源碼包,然後打上需要的補丁
  3. 如果需要,對軟件包進行配置(比如運行configure 腳本)
  4. 編譯所有的東西
  5. 把編譯好的文件打成各種格式的包,然後準備安裝

  其實這些並沒有什麼不尋常的,困難的是:

  1. 交叉編譯:交叉編譯是困難的,大部分軟件包根本不支持交叉編譯,OE 裡包含的都是支持交叉編譯的。
  2. 目標系統和主機是不同的:這意味著你不能編譯一個程序就直接運行它,因為它要運行在目標板上。很多軟件包在編譯的時候會編譯並且運行一些幫助或者測試程序,這在交叉編譯時會導致失敗。
  3. 工具鏈總是很難編譯的,交叉工具鏈更是如此。通常情況下,你可能會選擇去下載一個別人做好的,但是使用OE你就不需要如此。在OE裡整個工具鏈在編譯系統的時候都會被創建,OE
    的這種方式或許在開始的時候會帶來一些困難和不便。但是如果你需要打上補丁或者對工具鏈做些調整就會很容易。

  當然,除此之外,OE 還有很多的功能,其中包括:

  • 同時支持glibc 和uclibc
  • 只使用OE 一個工具你就可以為多種目標機器構建系統
  • 自動編譯一切構建時和編譯時依賴的包
  • 直接創建各種可以在目標機器上直接運行的鏡像(包括jffs2、ext2.gz、squashfs 等等)
  • 支持各種打包格式
  • 自動構建交叉工具鏈
  • 支持構建“本地包”(本地包指為了完成編譯而給主機編譯的包,最終不會用到目標板上)

2. 文件系統裡的OpenEmbedded

OE環境中最重要的目錄有3個:
(1)放工具的bitbake目錄
(2)放元數據的目錄
(3)執行構建的build目錄

2.1 bitbake 目錄

這個目錄裡的是我們的廚師(或理解為烹飪工具)——bitbake,我們使用它,但通常不需要訪問、修改它。

2.2 元數據目錄

在poky 中元數據目錄是meta,Openmoko 中元數據目錄是openembedded。在元數據目錄中,有3個目錄裡是真正的元數據,它們是:classes、conf 和packages。

2.2.1 packages 目錄

  所有的配方(recipes)文件(後綴為.bb)都放在package目錄,每個相對獨立的軟件包或構建任務在package目錄下都有自己的子目錄。在一個子目錄中可以有多個配方(recipes)文件,它們可能是同一個軟件包的不同版本,也可能描述了基於同一個軟件包的不同構建目標。
  有的配方(recipes)簡單,有的配方(recipes)複雜。簡單的配方僅描述一個軟件包的構建,最複雜的是要求構建文件系統的配方,這個配方文件本身並不長,甚至還很短,但它通過依賴關係將幾百個甚至幾千個其它配方文件捲入了構建過程。packages目錄的images子目錄下就是這些要求構建文件系統的配方(recipes)。

2.2.2 classes 目錄

  這個目錄放的是配方(recipes)的類文件(後綴為.bbclass)。類文件包含了一些bitbake 任務的定義,例如怎麼配置、怎麼安裝。配方文件繼承類文件,也就繼承了這些任務的定義。例如:我們如果增加一個使用autotool 的軟件包,只要在配方文件中繼承autotools.bbclass:

inherit autotools
  • 1

  bitbake就知道怎樣使用autotool工具配置、編譯、安裝了。所有的配方文件都自動繼承了base.bbclass。base.bbclass提供了大部分bitbake任務的默認實現。
  一個配方文件可以繼承多個類文件。以後的文章會介紹bitbake的任務,屆時會更詳細地討論bitbake的繼承。目前,我們只要知道繼承類文件是一種構建過程的複用方式就可以了。

2.2.3 conf 目錄

  conf 目錄包含編譯系統的配置文件(後綴為.conf)。bitbake 在啟動時會執行bitbake.conf,bitbake.conf 會裝載用戶提供的local.conf,然後根據用戶在local.conf 中定義的硬件平台(MACHINE)和發布目標(DISTRO)裝載machine 子目錄和distro 子目錄的配置文件。machine 子目錄裡是與硬件平台相關的配置文件,distro 子目錄裡是與發布目標相關的配置文件。配置文件負責設置bitbake 內部使用的環境變量,這些變量會影響整個構建過程。

2.3 build 目錄

  build是我們烹飪嵌入式系統的地方(可以想像成餐館的大廚房),整個構建過程就是在build目錄的tmp子目錄完成的。build目錄的conf子目錄裡是用戶的配置文件local.conf。
  tmp目錄有7個子目錄:cache、cross、rootfs、staging、work、deploy和stamps目錄。其中cache是bitbake內部使用的緩存目錄。cross是構建過程中產生的交叉編譯器(所謂交叉編譯器就是在主機平台運行,用於編譯目標平台代碼的編譯器)。rootfs是製作文件系統映像前臨時建立的根文件系統。我們的工作中通常不需要訪問這3個目錄,我們訪問比較多的是其它4個目錄:staging、work、deploy和stamps目錄。

2.3.1 staging 目錄

  軟件包B在構建時可能依賴軟件包A提供的頭文件、庫文件,也可能要使用軟件包C生成的工具。staging目錄就是放這些輸出文件的地方。
  我們必須在配方文件中用“DEPENDS”變量聲明構建時的依賴關係。bitbake就會在構建軟件包B前先構建軟件包A和軟件包C,並將軟件包B需要的頭文件、庫文件、和工具放在staging目錄。這樣,在構建軟件包時,就可以從staging目錄得到需要的頭文件、庫文件和工具。

2.3.2 work 目錄

  所有軟件包的解包、打補丁、配置、編譯、安裝等工作都是在work目錄進行的。所以work目錄包含了整個嵌入式系統的完整源代碼。
  work目錄下按照硬件平台、發行人、目標平台的不同又分了幾個目錄。所有軟件包都被放在對應的子目錄中,每個軟件包都有一個獨立的目錄。因為軟件包總是根據一個配方文件構建的,所以軟件包所在的目錄就是對應配方文件的工作目錄。在討論bitbake和配方文件時我們還會回來,更仔細地觀察配方文件的工作。

2.3.3 deploy 目錄

  這是保存輸出成果的目錄。其中images 目錄保存構建成功後產生的文件系統映像、內核映像,ipk 目錄保存每個軟件包的安裝包。我們在修改、構建軟件包後,可以在目標平台手工安裝ipk 目錄下的對應安裝包,確認沒有問題後,再製作文件系統映像。

2.3.4 stamps 目錄

  和work 目錄類似,stamp 目錄也按照硬件平台、發行人、目標平台的不同又分了幾個子目錄。軟件包在完成每個bitbake 任務後都會在對應子目錄裡touch 一個對應任務的時間戳,有時我們會手工刪除某個軟件包的時間戳,強制bitbake 重新構建這個軟件包。

2.3.5 sources 目錄

  OE 環境的sources 目錄是一個儲藏間,用來放從網上下載的源代碼包。fetch 任務負責下載代碼,放到sources 目錄。


3. BitBake 命令

3.1 查看bitbake 命令

$ bitbake -h
Usage: bitbake [options] [recipename/target recipe:do_task ...]

    Executes the specified task (default is 'build') for a given set of target recipes (.bb files).
    It is assumed there is a conf/bblayers.conf available in cwd or in BBPATH which
    will provide the layer, BBFILES and other configuration information.

Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -b BUILDFILE, --buildfile=BUILDFILE
                        Execute tasks from a specific .bb recipe directly.
                        WARNING: Does not handle any dependencies from other
                        recipes.
  -k, --continue        Continue as much as possible after an error. While the
                        target that failed and anything depending on it cannot
                        be built, as much as possible will be built before
                        stopping.
  -a, --tryaltconfigs   Continue with builds by trying to use alternative
                        providers where possible.
  -f, --force           Force the specified targets/task to run (invalidating
                        any existing stamp file).
  -c CMD, --cmd=CMD     Specify the task to execute. The exact options
                        available depend on the metadata. Some examples might
                        be 'compile' or 'populate_sysroot' or 'listtasks' may
                        give a list of the tasks available.
  -C INVALIDATE_STAMP, --clear-stamp=INVALIDATE_STAMP
                        Invalidate the stamp for the specified task such as
                        'compile' and then run the default task for the
                        specified target(s).
  -r PREFILE, --read=PREFILE
                        Read the specified file before bitbake.conf.
  -R POSTFILE, --postread=POSTFILE
                        Read the specified file after bitbake.conf.
  -v, --verbose         Output more log message data to the terminal.
  -D, --debug           Increase the debug level. You can specify this more
                        than once.
  -n, --dry-run         Don't execute, just go through the motions.
  -S SIGNATURE_HANDLER, --dump-signatures=SIGNATURE_HANDLER
                        Dump out the signature construction information, with
                        no task execution. The SIGNATURE_HANDLER parameter is
                        passed to the handler. Two common values are none and
                        printdiff but the handler may define more/less. none
                        means only dump the signature, printdiff means compare
                        the dumped signature with the cached one.
  -p, --parse-only      Quit after parsing the BB recipes.
  -s, --show-versions   Show current and preferred versions of all recipes.
  -e, --environment     Show the global or per-recipe environment complete
                        with information about where variables were
                        set/changed.
  -g, --graphviz        Save dependency tree information for the specified
                        targets in the dot syntax.
  -I EXTRA_ASSUME_PROVIDED, --ignore-deps=EXTRA_ASSUME_PROVIDED
                        Assume these dependencies don't exist and are already
                        provided (equivalent to ASSUME_PROVIDED). Useful to
                        make dependency graphs more appealing
  -l DEBUG_DOMAINS, --log-domains=DEBUG_DOMAINS
                        Show debug logging for the specified logging domains
  -P, --profile         Profile the command and save reports.
  -u UI, --ui=UI        The user interface to use (depexp, goggle, knotty or
                        ncurses - default knotty).
  -t SERVERTYPE, --servertype=SERVERTYPE
                        Choose which server type to use (process or xmlrpc -
                        default process).
  --token=XMLRPCTOKEN   Specify the connection token to be used when
                        connecting to a remote server.
  --revisions-changed   Set the exit code depending on whether upstream
                        floating revisions have changed or not.
  --server-only         Run bitbake without a UI, only starting a server
                        (cooker) process.
  -B BIND, --bind=BIND  The name/address for the bitbake server to bind to.
  --no-setscene         Do not run any setscene tasks. sstate will be ignored
                        and everything needed, built.
  --setscene-only       Only run setscene tasks, don't run any real tasks.
  --remote-server=REMOTE_SERVER
                        Connect to the specified server.
  -m, --kill-server     Terminate the remote server.
  --observe-only        Connect to a server as an observing-only client.
  --status-only         Check the status of the remote bitbake server.
  -w WRITEEVENTLOG, --write-log=WRITEEVENTLOG
                        Writes the event log of the build to a bitbake event
                        json file. Use '' (empty string) to assign the name
                        automatically.
  • 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
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83

3.2 bitbake 常用命令

BitBake 參數描述示例備註
<target>直接編譯/執行一個recipebitbake core-image-minimal
-c <task> <target>執行某個recipe 的某個任務bitbake -c build glibc示例表示執行glibc的do_build任務

<task>表示要執行的任務:
fetch表示從recipe中定義的地址拉取軟件到本地
compile表示重新編譯鏡像或軟件包
deploy表示部署鏡像或軟件包到目標rootfs內
cleanall表示清空整個構建目錄
-c listtasks <target>顯示某個recipe 可執行的任務bitbake -c listtasks glibc如果你不確定target 支持哪些任務,就可以用listtasks 來查詢
-b <xx.bb>用BitBake直接執行這個.bb文件bitbake -b rtl8188eu-driver_0.1.bb單獨編譯rtl8188eu-driver 任務
-k有錯誤發生時也繼續構建
-e <target>顯示當前的執行環境查找包的原路徑:
bitbake -e hello | grep ^SRC_URI
查找包的安裝路徑:
bitbake -e hello | grep ^S=
-s顯示所有可以bitbake 的包bitbake -s | grep hello例如如果自己在一個Layer下面安裝了一個hello.bb,可以查看hello 這個package 能否被bitbake
-v顯示執行過程
-vDDDD打印一些調試信息(v 後面可以加多個D)bitbake -vDDDD -c build glibc
-g <target>顯示一個包在BitBake 時與其他包的依賴關係,生成依賴圖bitbake -g glibc在當前目錄生成一些文件:
task-depends.dot(任務之間的依賴關係)
package-depends.dot(運行時的目標依賴)
pn-depends.dot(構建時的依賴)
pn-buildlist(包含需要構建的任務列表)

*.dot文件可以通過xdot工具打開

3.3 使用舉例

單獨編譯kernel、模塊、設備樹

  MYS-6ULX-IOT 開發闆對應的kernel 是linux-mys6ulx:

$ bitbake -c menuconfig -f -v linux-mys6ulx
$ bitbake -c compile -f -v linux-mys6ulx
$ bitbake -c compile_kernelmodules -f -v linux-mys6ulx
$ bitbake -c deploy -f -v linux-mys6ulx
  • 1
  • 2
  • 3
  • 4

  也有一些資料用virtual/kernel 來指定kernel,命令變成這樣了:

$ bitbake -c menuconfig virtual/kernel
$ bitbake -c compile -f -v virtual/kernel
$ bitbake -c compile_kernelmodules -f -v virtual/kernel
$ bitbake -c deploy -f -v virtual/kernel
  • 1
  • 2
  • 3
  • 4

  通過sources/meta-myir-imx6ulx/conf/machine/include/mys6ulx-base.inc和
sources/meta-myir-imx6ulx/conf/distro/include/myir-imx-preferred-evn.inc文件,我們可以看出一些端倪:

MACHINE_ARCH_FILTER = "virtual/kernel"

# Handle default kernel
IMX_DEFAULT_KERNEL = "linux-mys6ulx"
IMX_DEFAULT_KERNEL_mx6ul = "linux-mys6ulx"
IMX_DEFAULT_KERNEL_mx6ull = "linux-mys6ulx"
PREFERRED_PROVIDER_virtual/kernel ??= "${IMX_DEFAULT_KERNEL}"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

單獨編譯u-boot

$ bitbake -c compile -f -v u-boot-mys6ulx
$ bitbake -c deploy -f -v u-boot-mys6ulx
  • 1
  • 2

編譯文件系統

$ bitbake core-image-minimal
$ bitbake core-image-base
$ bitbake fsl-image-gui
$ bitbake fsl-image-qt5
$ bitbake fsl-image-multimedia
  • 1
  • 2
  • 3
  • 4
  • 5

清除編譯結果

$ bitbake -c clean -v linux-mys6ulx
  • 1

清除還包括clean、cleanall、cleanstate


參考
http://blog.sina.com.cn/s/blog_7880d3350102wvio.html
https://www.kancloud.cn/digest/yocto/138623

Yocto Project上的BitBake用戶手冊:
https://www.yoctoproject.org/docs/1.6/bitbake-user-manual/bitbake-user-manual.html

資料來源: https://blog.csdn.net/lu_embedded/article/details/80634368