BitBake 實(shí)用指南

本文首發(fā)于本人博客 sunyongfeng.com坝冕。

  1. 譯者序

本文譯自 A practical guide to BitBake

如果你發(fā)現(xiàn) bug、不清楚的章節(jié)孩擂、打印錯(cuò)誤或其他建議,請(qǐng)郵件告知我箱熬,我的郵箱是 sunnogo@gmail.com类垦。

注意:由于 task 和 recipe 是 BitBake 的基礎(chǔ)概念。個(gè)人覺(jué)得翻譯成任務(wù)和配方不免有誤解之處城须,因此文中基本不對(duì)這兩個(gè)詞做翻譯蚤认。類(lèi)似的還有 configure。

  1. 序言

1.1 關(guān)于本教程

如果你閱讀本教程糕伐,說(shuō)明你已經(jīng)知道 BitBake 是一種類(lèi)似 make 的構(gòu)建工具砰琢,主要用于 OpenEmbedded 和 Yocto 工程構(gòu)建 Linux 發(fā)行版本。你可能也已經(jīng)意識(shí)到 BitBake 的學(xué)習(xí)曲線有點(diǎn)陡良瞧,本文可讓這個(gè)曲線變平緩一些陪汽。

本文不會(huì)告訴你 BitBake 的一切,但是會(huì)嘗試解釋使用 BitBake 時(shí)用到的一些基本功能莺褒。理解這些基礎(chǔ)可幫助你開(kāi)始寫(xiě)自己的 BitBake recipe掩缓。

1.2 本教程的目標(biāo)

本教程展示如何創(chuàng)建一個(gè)最小工程,并一步步擴(kuò)展遵岩,說(shuō)明 BitBake 如何運(yùn)作你辣。

1.3 致謝

感謝 Tritech 給我時(shí)間準(zhǔn)備本文檔。同時(shí)感謝大家在問(wèn)題跟蹤站點(diǎn)報(bào)告的問(wèn)題與打印錯(cuò)誤尘执。

1.4 反饋

如果你發(fā)現(xiàn) bug舍哄、不清楚的章節(jié)、打印錯(cuò)誤或其他建議誊锭, 請(qǐng)使用 issue tracker https://bitbucket.org/a4z/bitbakeguide/issues表悬,不需要注冊(cè)。
同時(shí)也可以使用本文底部的 Disqus 評(píng)論功能丧靡。

  1. BitBake

2.1 什么是 BitBake

以下內(nèi)容有助于理解 BitBake:

基本上蟆沫,BitBake是一個(gè)Python程序籽暇,它由用戶(hù)創(chuàng)建的配置驅(qū)動(dòng),可以為用戶(hù)指定的目標(biāo)執(zhí)行用戶(hù)創(chuàng)建的任務(wù)饭庞,即所謂的配方(recipes)戒悠。

2.1.1 Config、tasks 與 recipes

通過(guò)一種 BitBake 領(lǐng)域特定語(yǔ)言寫(xiě) Config舟山、tasks 與 recipes绸狐,這種語(yǔ)言包含變量與可執(zhí)行的 shell、python 代碼累盗。所以理論上寒矿,BitBake 可以執(zhí)行代碼,你也可以用 BitBake 做除構(gòu)建軟件之外的事情若债,但是并不推薦這么做符相。

BitBake 是一種構(gòu)建軟件的工具,因此有一些特殊的功能蠢琳,比如可以定義依賴(lài)關(guān)系主巍。BitBake 可以解決依賴(lài)關(guān)系,并將其任務(wù)以正確順序運(yùn)行挪凑。此外,構(gòu)建軟件包通常包含相同或相似的任務(wù)逛艰。比如常見(jiàn)的任務(wù):下載源代碼包躏碳,解壓源代碼,跑 configure散怖,跑 make菇绵,或簡(jiǎn)單的輸出 log。Bitbake 提供一種機(jī)制镇眷,可通過(guò)一種可配置的方式咬最,抽象、封裝和重用這個(gè)功能欠动。

  1. 配置 BitBake

BitBake 可以從這里下載:https://github.com/openembedded/bitbake永乌。選擇一個(gè)版本的分支,并下載 zip具伍。解壓 zip 包翅雏,可找到一個(gè) bitbake-$version 目錄。

注意:本文使用的 Bitbake 版本是 bitbake-1.22人芽,因此適合本教程的 bitbake 版本應(yīng)該大于或等于1.22望几。
注意:譯者使用 bitbake-1.27.0,因此文中樣例為 1.27.0 版本 bitbake 樣例萤厅。
提示:如果使用 Yocto橄抹,則不需要安裝 BitBake靴迫,Yocto 源代碼本身捆綁了 BitBake。Yocto 要求你 source 一個(gè)腳本楼誓,這個(gè)腳本和我們這里做的一樣玉锌,安裝 BitBake 到我們的環(huán)境中。

3.1 安裝 BitBake

安裝過(guò)程很簡(jiǎn)單:

  • 添加 bitbake-$version/bin 目錄到 PATH
  • 添加 bitbake-$version/lib 目錄到 PYTHONPATH

即執(zhí)行:

export PATH=/path/to/bbtutor/bitbake/bin:$PATH
export PYTHONPATH=/path/to/bbtutor/bitbake/lib:$PYTHONPATH

這基本和 yocto init 腳本一致慌随。yocto init 腳本同時(shí)也創(chuàng)建 build 目錄芬沉,我們將在一會(huì)兒創(chuàng)建。

首先檢測(cè)是不是一切正常阁猜、bitbake 是否安裝成功丸逸。通過(guò)執(zhí)行以下 bitbake 命令:

bitbake --version

運(yùn)行結(jié)果應(yīng)該類(lèi)似:

BitBake Build Tool Core version 1.27.0

3.2 BitBake 文檔

最實(shí)際的版本帶有源代碼。

在終端中剃袍,cd 到 bitbake-$version/doc 目錄并執(zhí)行以下命令黄刚,生成 doc/bitbake-user-manual/bitbake-user-manual.html。

make html DOC=bitbake-user-manual

這個(gè)文檔可與本教程并行閱讀民效,在讀完本教程后也需要閱讀該文檔憔维。

yocto 工程文檔 也有一個(gè) bitbake 章節(jié)。

  1. 創(chuàng)建工程

4.1 Bitbake 工程布局

通過(guò) BitBake 工程通過(guò) layers 目錄與一個(gè) build 目錄組織畏邢,layer 目錄包含配置文件和 meta data业扒。

4.1.1 Layer 目錄

Layer 目錄包含配置、任務(wù)和目標(biāo)描述舒萎。常用 meta-'something' 命名 Layer 目錄程储。

4.1.2 Build 目錄

Build 目錄是 bitbake 命令被執(zhí)行的地方。在這里臂寝,BitBake 期望能找到其初始配置文件章鲤,并將其生成的所有文件放在這個(gè)目錄。

為了讓 BitBake 運(yùn)行時(shí)出現(xiàn)有任何錯(cuò)誤咆贬,我們需要?jiǎng)?chuàng)建一個(gè) build 目錄和一個(gè) layer 目錄败徊,并在此存放一些需要的配置文件。

4.2 最小工程

最小的配置看起來(lái)像這樣:

bbTutorial/
├── build
│   ├── bitbake.lock
│   └── conf
│       └── bblayers.conf
└── meta-tutorial
    ├── classes
    │   └── base.bbclass
    └── conf
        ├── bitbake.conf
        └── layer.conf

需要?jiǎng)?chuàng)建這 4 個(gè)文件:

  • bblayers.conf
  • base.bbclass
  • bitbake.conf
  • layer.conf

4.2.1 需要的配置文件

首先描述需要的文件掏缎,然后簡(jiǎn)要說(shuō)明其內(nèi)容皱蹦。

build/conf/bblayers.conf,BitBake 在其工作目錄(即 build 目錄)期望找到的第一個(gè)文件∮悖現(xiàn)在我們以以下內(nèi)容創(chuàng)建一個(gè) bblayers.conf:

BBPATH := "${TOPDIR}"
BBFILES ?= ""
BBLAYERS = "/path/to/meta-tutorial"

meta-tutorial/conf/layer.conf潦俺,每個(gè) layer 需要一個(gè) conf/layer.conf 文件∮镌螅現(xiàn)在我們以以下內(nèi)容創(chuàng)建它:

BBPATH .= ":${LAYERDIR}"
BBFILES += ""

meta-tutorial/classes/base.bbclass
meta-tutorial/conf/bitbake.conf
現(xiàn)在乔外,這些文件可以從 BitBake 安裝目錄中獲取考赛。這些文件位于文件夾 bitbake-$version/conf 和 bitbake-$version/classes中。只需將它們復(fù)制到 tutorial 項(xiàng)目中。

4.2.2 創(chuàng)建文件的一些注意事項(xiàng)

build/conf/bblayers.conf

  • 添加當(dāng)前目錄到 BBPATH嫌拣,TOPDIR 被 BitBake 設(shè)置為當(dāng)前工作目錄柔袁。
  • 初始設(shè)置 BBFILES 變量為空,Recipes 在后面會(huì)添加异逐。
  • 添加我們 meta-tutorial 的路徑到 BBLAYERS 變量捶索。當(dāng) BitBake 開(kāi)始執(zhí)行時(shí),它會(huì)搜索所有給定的 layer 目錄灰瞻,以便獲得其他配置腥例。

meta-tutorial/conf/layer.conf

  • LAYERDIR 是 BitBake 傳給其所加載 Layer 的變量。我們添加該路徑到 BBPATH 變量酝润。
  • BBFILES 告訴 BitBake recipes 在哪燎竖,現(xiàn)在我們沒(méi)有添加任何東西,但是一會(huì)兒我們會(huì)改變它要销。

注意事項(xiàng)构回。“.=” 和“+=” 以不添加空格疏咐、添加空格的方式纤掸,將追加值附給一個(gè)變量。

conf/bitbake.conf
conf/bibake.conf 包含 一系列我們討論的變量浑塞。

classes/base.bbclass
一個(gè) *.bbclass 文件包含共享功能借跪。我們的 base.bbclass 包含一些我們一會(huì)兒使用的 log 函數(shù),以及一個(gè) buld 任務(wù)酌壕。
并不是很有用垦梆,但是 BitBake 有需求,因?yàn)槿绻麤](méi)有任何具體業(yè)務(wù)時(shí)仅孩,BitBake 默認(rèn)需求的。我們隨后將改變此功能印蓖。

4.2.3 BitBake 搜索路徑

對(duì)于 BitBake 來(lái)講辽慕,有許多 BBPATH 非法和文件路徑。這說(shuō)明如果我們告訴 BitBake 探索一些路徑時(shí)赦肃,它會(huì)搜索 BBPATH溅蛉。
我們添加 TOPDIR 和 LAYERDIR 到 BBPATH,放在 classes/base.bbclass 或 conf/bitbake.conf 中的任意一個(gè)他宛。
當(dāng)然船侧,我們會(huì)添加 meta-tutorial 目錄。
編譯目錄不應(yīng)含有通用文件厅各。只有像 local.conf 對(duì)實(shí)際編譯是有效的镜撩,后面我們會(huì)用到 local.conf。

第一次運(yùn)行

創(chuàng)建上述四個(gè)配置文件后队塘,在終端 cd 到 build 目錄袁梗,這是我們的工作目錄宜鸯。我們一直在 build 目錄運(yùn)行 bitbake 命令,以便 bitbake 可以找到相應(yīng)的 conf/bblayers.conf 文件遮怜。

現(xiàn)在淋袖,在 build 目錄,不帶任何參數(shù)運(yùn)行 bitbake 命令:

bitbake

如果先前的步驟正確锯梁,則控制臺(tái)會(huì)輸出:

Nothing to do.  Use 'bitbake world' to build everything, or run 'bitbake --help' for usage information.

這沒(méi)什么用即碗,但是一個(gè)好的開(kāi)始。

這里介紹一個(gè)很有用的命令標(biāo)志:輸出一些 debug 信息陌凳。
執(zhí)行 bitbake -vDD剥懒,然后查看其輸出,它告訴我們大量關(guān)于 BitBake 如何動(dòng)作的信息冯遂。

DEBUG: Found bblayers.conf (~/bbTutorial/build/conf/bblayers.conf)
DEBUG: LOAD ~/bbTutorial/build/conf/bblayers.conf
DEBUG: Adding layer ~/bbTutorial/meta-tutorial
DEBUG: LOAD ~/bbTutorial/meta-tutorial/conf/layer.conf
DEBUG: LOAD ~/bbTutorial/meta-tutorial/conf/bitbake.conf
DEBUG: BB configuration INHERITs:0: inheriting ~/bbTutorial/meta-tutorial/classes/base.bbclass
DEBUG: BB ~/bbTutorial/meta-tutorial/classes/base.bbclass: handle(data, include)
DEBUG: LOAD ~/bbTutorial/meta-tutorial/classes/base.bbclass
DEBUG: Clearing SRCREV cache due to cache policy of: clear
DEBUG: Using cache in '~/bbTutorial/build/tmp/cache/local_file_checksum_cache.dat'
DEBUG: Using cache in '~/bbTutorial/build/tmp/cache/bb_codeparser.dat'

你在注意到 BitBake 創(chuàng)建了一個(gè) bitbake.log 文件和一個(gè) tmp 目錄蕊肥?

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ ls
bitbake.lock  conf  tmp

提示,所有的樣例代碼都可從 https://bitbucket.org/a4z/bitbakeguide 獲取蛤肌。本樣例在 ch04壁却。

  1. 第一個(gè) recipe

BitBake 需要 recipes 定義要做些什么,現(xiàn)在這里什么都沒(méi)有裸准。
我們可以通過(guò) bitbake -s 確認(rèn)運(yùn)行時(shí)什么也沒(méi)做:

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake -s
ERROR: no recipe files to build, check your BBPATH and BBFILES?

Summary: There was 1 ERROR message shown, returning a non-zero exit code.
NOTE: Not using a cache. Set CACHE = <directory> to enable.
Recipe Name                                    Latest Version         Preferred Version
===========                                    ==============         =================

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ 

這告訴我們兩個(gè)信息:

  1. 沒(méi)有定義任何 cache展东;
  2. BitBake 真的沒(méi)事可做,只顯示了一個(gè)空的 recipe 列表

5.1 cache 位置

BitBake 緩存 meta data 在一個(gè)目錄炒俱,即 cache 目錄盐肃。這會(huì)幫助加速后面執(zhí)行的命令。

我們可通過(guò)簡(jiǎn)單添加一個(gè)變量到 bitbake.conf 文件权悟,解決 cache 找不到的問(wèn)題砸王。因此,我們編輯 meta-tutorial/conf/bitbake.conf 文件峦阁,并在底部添加:

CACHE = "${TMPDIR}/cache/default"

添加后運(yùn)行 bitbake -s 的結(jié)果:

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake -s
ERROR: no recipe files to build, check your BBPATH and BBFILES?

Summary: There was 1 ERROR message shown, returning a non-zero exit code.

注意:在實(shí)現(xiàn)項(xiàng)目中谦铃,比如 Yocto,這些變量已經(jīng)設(shè)置好榔昔,我們不用關(guān)心驹闰。通常 cache 路徑由不同的變量組成,在名稱(chēng)中包含實(shí)際的構(gòu)建配置撒会,如 debug 或 release嘹朗。

下一步是添加一個(gè) recipe,需要兩個(gè)步驟:

  1. 使 bitbake 可以找到 recipes
  2. 寫(xiě)第一個(gè) recipe

5.2 添加一個(gè) recipe 到 tutorial layer

BitBake 需要知道一個(gè) layer 提供哪些 recipes诵肛,可通過(guò)編輯 meta-tutorial/conf/layer.conf 文件屹培,使用通配符告訴 BitBake 加載所有的 recipe:

BBPATH .= ":${LAYERDIR}"
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb"

現(xiàn)在可以使用先前在 build/conf/bblayers.conf 定義的變量。recipe 文件的擴(kuò)展名是 .bb,如果我們通過(guò)通配符的方式惫谤,只用一行就可以告訴 BitBake 加載所有 recipes壁顶。

通常 recipes 有自己的目錄,并以 groups 的形式收集在一起溜歪,也就是說(shuō)把有關(guān)聯(lián)的 recipes 放在同一個(gè)目錄若专。

注意:通常使用 recipes-'group' 命令這些目錄,這里 group 名表示一個(gè) category 或一些程序蝴猪。

現(xiàn)在 BitBake 已經(jīng)知道從哪找 recipe调衰,我們可以開(kāi)始添加第一個(gè) recipe 了。

按通常的做法自阱,我們創(chuàng)建目錄 meta-tutorial/recipes-tutorial/first嚎莉,并在此創(chuàng)建第一個(gè) recipe。 Recipe 文件也有通用的命名方法:{recipe}_{version}.bb

5.3 創(chuàng)建第一個(gè) recipe 和 task

我們的第一個(gè) recipe 只打印一些 log 信息沛豌。將它放在 tutorial group趋箩,版本為 0.1。所以我們的第一個(gè) recipe 是:
meta-tutorial/recipes-tutorial/first/first_0.1.bb

DESCRIPTION = "I am the first recipe"
PR = "r1"
do_build () {
  echo "first: some shell script running as build"
}
  • task do_build 覆蓋 base.bbclass 中的全局 build task加派。
  • PR 是內(nèi)部修訂數(shù)據(jù)叫确,在每次修訂后應(yīng)被更新。
  • 設(shè)置 description 可解釋該 recipe 的用途芍锦。

如果上面都做對(duì)了竹勉,可以通過(guò) bitbake -s 列出可用的 recipes。

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake -s
Parsing recipes: 100% |################################################################################| Time: 00:00:00
Parsing of 1 .bb files complete (0 cached, 1 parsed). 1 targets, 0 skipped, 0 masked, 0 errors.
Recipe Name                                    Latest Version         Preferred Version
===========                                    ==============         =================

first                                                 :0.1-r1                          

然后就可以執(zhí)行 bitbake first 編譯 first 組件娄琉。

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake first
Parsing recipes: 100% |################################################################################| Time: 00:00:00
Parsing of 1 .bb files complete (0 cached, 1 parsed). 1 targets, 0 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
NOTE: Preparing RunQueue
NOTE: Executing RunQueue Tasks
NOTE: Tasks Summary: Attempted 1 tasks of which 0 didn't need to be rerun and all succeeded.

現(xiàn)在檢查 tmp/work/first-0.1-r1/temp 目錄次乓,里面有一些有趣的文件:

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ ls -al tmp/work/first-0.1-r1/temp/
total 20
drwxrwxr-x 2 sunyongfeng sunyongfeng 4096 10月 20 11:19 .
drwxrwxr-x 3 sunyongfeng sunyongfeng 4096 10月 20 11:19 ..
lrwxrwxrwx 1 sunyongfeng sunyongfeng   18 10月 20 11:19 log.do_build -> log.do_build.17314
-rw-rw-r-- 1 sunyongfeng sunyongfeng  123 10月 20 11:19 log.do_build.17314
-rw-rw-r-- 1 sunyongfeng sunyongfeng   37 10月 20 11:19 log.task_order
lrwxrwxrwx 1 sunyongfeng sunyongfeng   18 10月 20 11:19 run.do_build -> run.do_build.17314
-rwxrwxr-x 1 sunyongfeng sunyongfeng  909 10月 20 11:19 run.do_build.17314

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ cat tmp/work/first-0.1-r1/temp/log.do_build.17314 
DEBUG: Executing shell function do_build
first: some shell script running as build
DEBUG: Shell function do_build finished
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ cat tmp/work/first-0.1-r1/temp/log.task_order 
do_build (17314): log.do_build.17314
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ cat tmp/work/first-0.1-r1/temp/run.do_build
#!/bin/sh

# Emit a useful diagnostic if something fails:
bb_exit_handler() {
    ret=$?
    case $ret in
    0)  ;;
    *)  case $BASH_VERSION in
        "")   echo "WARNING: exit code $ret from a shell command.";;
        *)    echo "WARNING: ${BASH_SOURCE[0]}:${BASH_LINENO[0]} exit $ret from
  "$BASH_COMMAND"";;
        esac
        exit $ret
    esac
}
trap 'bb_exit_handler' 0
set -e
export HOME="/home/sunyongfeng"
export SHELL="/bin/bash"
export LOGNAME="sunyongfeng"
export USER="sunyongfeng"
export PATH="/home/sunyongfeng/ops-build.test/yocto/poky/scripts:/home/sunyongfeng/ops-build.test/yocto/poky/bitbake/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"
export TERM="linux"
do_build() {
  echo "first: some shell script running as build"

}

cd '/home/sunyongfeng/workshop/test/tutorial/build'
do_build

# cleanup
ret=$?
trap '' 0
exit $?
  1. Classes 和 functions

下一步將:

  • 添加一個(gè) class
  • 添加一個(gè)使用 class 的 recipe
  • 探索 functions

6.1 創(chuàng)建 mybuild class

創(chuàng)建一個(gè)不同的 build 函數(shù),并共享孽水。先在 tutorial layer 創(chuàng)建 class票腰,如 meta-tutorial/classes/mybuild.bbclass

addtask build
mybuild_do_build () {
 
  echo "running mybuild_do_build."
 
}
 
EXPORT_FUNCTIONS do_build

在 base.class 中,我們添加了一個(gè) build task女气,它也是一個(gè)簡(jiǎn)單的 shell 函數(shù)丧慈。mybuild_do 前綴的依據(jù)是 class 中 task 定義的規(guī)范 classname_do_functionname。

EXPORT_FUNCTIONS 使該 build 函數(shù)可被這個(gè) class 的使用者使用主卫,如果不添加這行,則它不會(huì)覆蓋 base class 中的 build 函數(shù)鹃愤。

現(xiàn)在簇搅,已可在第二個(gè) recipe 中使用這個(gè) class。

6.2 在第二個(gè) recipe 中使用 myclass

這里添加一個(gè)小目標(biāo)软吐,在 build 任務(wù)前先運(yùn)行一個(gè) patch 函數(shù)瘩将,這里需要一些 python 的用法。

依據(jù) bitbake 的命名規(guī)范,我們添加一個(gè)新的 recipe 目錄姿现,并在該目錄內(nèi)添加一個(gè) recipe 文件 meta-tutorial/recipes-tutorial/second/second_1.0.bb

DESCRIPTION = "I am he second recipe"
PR = "r1"                       (1)
inherit mybuild                 (2)
 
def pyfunc(o):                  (3)
    print dir (o)
 
python do_mypatch () {          (4)
  bb.note ("runnin mypatch")
  pyfunc(d)                     (5)
}
 
addtask mypatch before do_build (6)
  1. 像 first recipe 那樣定義 DESCRIPTION 和 PR肠仪;
  2. 繼承 mybuild class,讓 myclass_do_build 成為默認(rèn) build task备典;
  3. 純 python 函數(shù) pyfunc 獲取一些參數(shù)异旧,并根據(jù)該入?yún)⑦\(yùn)行 python dir 函數(shù);
  4. bitbake python 函數(shù) my_patch 添加并注冊(cè)成一個(gè) task提佣,該 task 要在 build 函數(shù)前執(zhí)行吮蛹。
  5. mypatch 函數(shù)調(diào)用 pyfunc 函數(shù),并傳入全局 bitbake 變量 d拌屏。d (datastore) 由 bitbake 定義潮针,并一直可用。
  6. mypatch 函數(shù)被注冊(cè)成一個(gè) task倚喂,并要求在 build 函數(shù)前執(zhí)行每篷。

這就是一個(gè)使用 python 函數(shù)的樣例。

注意:函數(shù)部分的內(nèi)容在 bitbake 手冊(cè) 3.4 節(jié)端圈。

6.3 探索 recipes 和 tasks

現(xiàn)在我們有兩個(gè) recipes 可用焦读,可探索一些新的 bitbake 命令選項(xiàng)。我們可以獲取BitBake 運(yùn)行時(shí) recipes 及其 tasks枫笛、控制過(guò)程的信息吨灭。

6.3.1 顯示 recipes 和 tasks 列表

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake -s
Parsing recipes: 100% |################################################################################| Time: 00:00:00
Parsing of 2 .bb files complete (0 cached, 2 parsed). 2 targets, 0 skipped, 0 masked, 0 errors.
Recipe Name                                    Latest Version         Preferred Version
===========                                    ==============         =================

first                                                 :0.1-r1                          
second                                                :1.0-r1 

如果想看某個(gè) recipe 提供哪些 tasks,可以通過(guò) bitbake -c listtasks recipe_name 查看:

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake -c listtasks second
Parsing recipes: 100% |################################################################################| Time: 00:00:00
Parsing of 2 .bb files complete (0 cached, 2 parsed). 2 targets, 0 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
NOTE: Preparing RunQueue
NOTE: Executing RunQueue Tasks
do_showdata
do_build
do_mypatch
do_listtasks
NOTE: Tasks Summary: Attempted 1 tasks of which 0 didn't need to be rerun and all succeeded.

6.4 執(zhí)行 tasks 或完整構(gòu)建

有些選項(xiàng)可在 recipes 執(zhí)行 builds 或特定任務(wù)時(shí)使用刑巧。

  • 構(gòu)建一個(gè) recipe喧兄。使用 bitbade recipe-name 執(zhí)行該 recipe 的所有 tasks。
  • 執(zhí)行一個(gè) task啊楚。使用 bitbake -c your-task recipe-name 只運(yùn)行 recipe 中的某個(gè) task吠冤。
  • 構(gòu)建所有 recipe。使用 bitbake world 運(yùn)行所有 recipes 的所有 tasks恭理。

可以玩玩這些命令拯辙,看會(huì)出現(xiàn)什么。

6.4.1 確認(rèn)構(gòu)建過(guò)程中的 log

Bitbake 創(chuàng)建一個(gè) tmp/work 目錄存放所有的 log 文件颜价。這些 log 文件包含一些有趣的信息涯保,值得一學(xué)。第一次執(zhí)行完 bitbake world 周伦,其輸出為:

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake world
Parsing recipes: 100% |################################################################################| Time: 00:00:00
Parsing of 2 .bb files complete (0 cached, 2 parsed). 2 targets, 0 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
NOTE: Preparing RunQueue
NOTE: Executing RunQueue Tasks
NOTE: Tasks Summary: Attempted 3 tasks of which 0 didn't need to be rerun and all succeeded.
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ tree tmp/work/           
tmp/work/
├── first-0.1-r1
│   └── temp
│       ├── log.do_build -> log.do_build.17657
│       ├── log.do_build.17657
│       ├── log.task_order
│       ├── run.do_build -> run.do_build.17657
│       └── run.do_build.17657
└── second-1.0-r1
    ├── second-1.0
    └── temp
        ├── log.do_build -> log.do_build.17659
        ├── log.do_build.17659
        ├── log.do_mypatch -> log.do_mypatch.17656
        ├── log.do_mypatch.17656
        ├── log.task_order
        ├── run.do_build -> run.do_build.17659
        ├── run.do_build.17659
        ├── run.do_mypatch -> run.do_mypatch.17656
        └── run.do_mypatch.17656

這些 log 文件包含很多有用的信息夕春,比如 BitBake 如何運(yùn)行,執(zhí)行 tasks 輸出了什么专挪。

  1. BitBake layers

典型 BitBake 工程包含多個(gè) layer及志。通常 layer 包含一個(gè)特定主題片排,比如基礎(chǔ)系統(tǒng)、圖像系統(tǒng)等速侈。一些工程可以包括不止一個(gè)構(gòu)建目標(biāo)率寡,每個(gè)目標(biāo)由不同的 layers 組成。例如倚搬,構(gòu)建一個(gè)帶 GUI 組件或不帶 GUI 組件的 Linux 發(fā)行版本冶共。

Layers 可以被使用、擴(kuò)展潭枣、配置比默,也可能部分覆蓋已有的 layers。這很重要盆犁,因?yàn)樗试S根據(jù)實(shí)際要求重用或自定義命咐。

多個(gè) layers 共同動(dòng)作是通用的例子,因此我們會(huì)添加一個(gè)額外的層次到工程谐岁。

7.1 添加一個(gè) layer

通過(guò)以下步驟添加一個(gè)新的 layer:

  1. 創(chuàng)建一個(gè)新的 layer 目錄
  2. 創(chuàng)建 layer 配置
  3. 告訴 BitBake 有新的 layer
  4. 添加 recipes 到 layer

7.1.1 添加新的 layer 目錄

創(chuàng)建一個(gè)新的目錄叫 meta-two:

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial$ ls
build  meta-tutorial  meta-two

7.1.2 配置新 layer

添加 meta-two/conf/layer.conf 文件醋奠,該文件和 tutorial layer 的一樣:

BBPATH .= ":${LAYERDIR}"
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb"

7.1.3 告訴 BitBake 有新的 layer

編輯 build/conf/bblayers.conf,擴(kuò)展 BBLAYERS 變量:

BBLAYERS = " \
  ${TOPDIR}/../meta-tutorial \
  ${TOPDIR}/../meta-two \
"

bitbake-layer 命令

通過(guò) bitbake-layer 命令檢查新 layer 配置伊佃。
首先使用 show-layers 選項(xiàng)窜司,顯示該工程的 layers、layers 路徑和優(yōu)先級(jí)航揉。這里優(yōu)先級(jí)都是 0塞祈,后面會(huì)嘗試改一下。

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake-layers show-layers
layer                 path                                      priority
==========================================================================
meta-tutorial         /home/sunyongfeng/workshop/test/tutorial/build/../meta-tutorial  0
meta-two              /home/sunyongfeng/workshop/test/tutorial/build/../meta-two  0

bitbake-layers 命令還有其他有用的選項(xiàng)帅涂,可通過(guò) -h 選項(xiàng)顯示议薪。

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake-layers -h
usage: bitbake-layers [-h] [-d] [-q] <subcommand> ...

BitBake layers utility

optional arguments:
  -h, --help            show this help message and exit
  -d, --debug           Enable debug output
  -q, --quiet           Print only errors

subcommands:
  <subcommand>
    show-layers         show current configured layers
    add-layer           Add a layer to bblayers.conf
    remove-layer        Remove a layer from bblayers.conf
    show-overlayed      list overlayed recipes (where the same recipe exists
                        in another layer)
    show-recipes        list available recipes, showing the layer they are
                        provided by
    show-appends        list bbappend files and recipe files they apply to
    flatten             flatten layer configuration into a separate output
                        directory.
    show-cross-depends  Show dependencies between recipes that cross layer
                        boundaries.
    layerindex-fetch    Fetches a layer from a layer index along with its
                        dependent layers, and adds them to conf/bblayers.conf.
    layerindex-show-depends
                        Find layer dependencies from layer index.

Use bitbake-layers <subcommand> --help to get help on a specific command

7.3 擴(kuò)展 layer 配置

在 layer 的 layer.conf 文件中,定義優(yōu)化級(jí)和其他配置值媳友。為配置 layer 的優(yōu)先級(jí)斯议,需要添加新的定義到已有的 layer.conf。以 meta-tutorial/conf/layer.conf 開(kāi)始醇锚,添加:

# append layer name to list of configured layers                                                       
BBFILE_COLLECTIONS += "tutorial"                                                                       
# and use name as suffix for other properties                                                          
BBFILE_PATTERN_tutorial = "^${LAYERDIR}/"                                                              
BBFILE_PRIORITY_tutorial = "5" 

使用的變量在 BitBake 使用手冊(cè)有很好的說(shuō)明哼御,這里不重復(fù)。

模式應(yīng)是清楚的焊唬,這里定義 layer 名恋昼,并使用這個(gè)名字做為其他變量的后綴。這種在 BitBake 變量名中使用用戶(hù)定義的域后綴機(jī)制赶促,在 BitBake 的很多地方可以看到液肌。

同樣的,修改 meta-two/conf/layer.conf:

# append layer name to list of configured layers                                                       
BBFILE_COLLECTIONS += "tutorial"                                                                       
# and use name as suffix for other properties                                                          
BBFILE_PATTERN_tutorial = "^${LAYERDIR}/"                                                              
BBFILE_PRIORITY_tutorial = "5" 

如果此時(shí)運(yùn)行 bitbake-layers show-layers芳杏,結(jié)果是:

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake-layers show-layers     
layer                 path                                      priority
==========================================================================
meta-tutorial         /home/sunyongfeng/workshop/test/tutorial/build/../meta-tutorial  5
meta-two              /home/sunyongfeng/workshop/test/tutorial/build/../meta-two  5
  1. 共享和重用配置

截止目前矩屁,我們使用 classes 和 config 文件封裝配置和 tasks。但是還有更多的方法重用和擴(kuò)展 tasks 和配置:

  • class 繼承
  • bbappend 文件
  • include 文件

為說(shuō)明如何使用這些方法爵赵,我們將添加 class 到 layer-two吝秕,新的 class 將介紹一個(gè) configure-build 鏈并使用 class 繼承重用現(xiàn)存的 mybuild class。然后在新的 recipe 中使用這個(gè)新 class空幻,最后通過(guò) append 方法擴(kuò)展現(xiàn)有的 recipe烁峭。

8.1 class 繼承

為實(shí)現(xiàn) configure-build 鏈,這里創(chuàng)建一個(gè) class秕铛,該 class 繼承 mybuild约郁,并簡(jiǎn)單添加一個(gè) configure task,讓 build task 依賴(lài) configure task但两。

meta-two/classes/confbuild.bbclass

inherit mybuild                            (1)
 
confbuild_do_configure () {                (2)
 
  echo "running configbuild_do_configure."
 
}
 
addtask do_configure before do_build       (3)
 
EXPORT_FUNCTIONS do_configure              (4)
  1. 以 mybuild class 為基礎(chǔ)鬓梅;
  2. 創(chuàng)建新的函數(shù);
  3. 定義函數(shù)的順序谨湘,configre 在 build 之前绽快;
  4. export 剛創(chuàng)建的函數(shù)使之可用。

然后創(chuàng)建 third recipe 使用 confbuild class紧阔。
meta-two/recipes-base/third_01.bb

DESCRIPTION = "I am the third recipe"
PR = "r1"
inherit confbuild

這時(shí)運(yùn)行 bitabke third 會(huì)執(zhí)行 configure 和 build task坊罢。

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake third
Parsing recipes: 100% |######################################################################################################################################| Time: 00:00:00
Parsing of 3 .bb files complete (0 cached, 3 parsed). 3 targets, 0 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
NOTE: Preparing RunQueue
NOTE: Executing RunQueue Tasks
NOTE: Tasks Summary: Attempted 2 tasks of which 0 didn't need to be rerun and all succeeded.
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ cat tmp/work/third-01-r1/temp/
log.do_build            log.do_configure        log.task_order          run.do_build.19728      run.do_configure.19726  
log.do_build.19728      log.do_configure.19726  run.do_build            run.do_configure        
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ cat tmp/work/third-01-r1/temp/log.task_order 
do_configure (19726): log.do_configure.19726
do_build (19728): log.do_build.19728
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ cat tmp/work/third-01-r1/temp/log.do_configure
DEBUG: Executing shell function do_configure
running configbuild_do_configure.
DEBUG: Shell function do_configure finished
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ cat tmp/work/third-01-r1/temp/log.do_build
DEBUG: Executing shell function do_build
running mybuild_do_build.
DEBUG: Shell function do_build finished

8.2 bbappend 文件

append 文件可以添加函數(shù)到已有 class 中,而不需要?jiǎng)?chuàng)建一個(gè)新 class擅耽。它向同名 class 添加 append 文件的文本活孩。需要設(shè)置 layer 配置,才能加載到對(duì)應(yīng)的 append 文件乖仇。因此需要改變 layer 的配置憾儒,添加加載 *.bbappend 文件的配置到 BBFILES 變量。例如:
meta-two/conf/layer.conf

BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
${LAYERDIR}/recipes-*/*/*.bbappend"

現(xiàn)在擴(kuò)展已有的 first recipe这敬,讓它在 build task 前先運(yùn)行一個(gè) patch 函數(shù)航夺。為做對(duì)比,將對(duì)應(yīng)的 recipe 和 append 文件放到 meta-two/recipes-base/first 目錄崔涂。
meta-two/recipes-base/first/first_0.1.bbappend

python do_patch () {
  bb.note ("first:do_patch")
}
 
addtask patch before do_build

此時(shí)若列出 first recipe 的 task 列表阳掐,可以看到 patch task。運(yùn)行 bitbake first 可看到運(yùn)行了 patch 和 build冷蚂。

添加前:

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake -c listtasks first
Parsing recipes: 100% |################################################################################| Time: 00:00:00
Parsing of 3 .bb files complete (0 cached, 3 parsed). 3 targets, 0 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
NOTE: Preparing RunQueue
NOTE: Executing RunQueue Tasks
do_showdata
do_build
do_listtasks
NOTE: Tasks Summary: Attempted 1 tasks of which 0 didn't need to be rerun and all succeeded.

添加 append 文件后:

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake -c listtasks first
Parsing recipes: 100% |################################################################################| Time: 00:00:00
Parsing of 3 .bb files complete (0 cached, 3 parsed). 3 targets, 0 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
NOTE: Preparing RunQueue
NOTE: Executing RunQueue Tasks
do_showdata
do_build
do_listtasks
do_patch
NOTE: Tasks Summary: Attempted 1 tasks of which 0 didn't need to be rerun and all succeeded.

運(yùn)行 bitbake first 結(jié)果:

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake first
Parsing recipes: 100% |################################################################################| Time: 00:00:00
Parsing of 3 .bb files complete (0 cached, 3 parsed). 3 targets, 0 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
NOTE: Preparing RunQueue
NOTE: Executing RunQueue Tasks
NOTE: Tasks Summary: Attempted 2 tasks of which 0 didn't need to be rerun and all succeeded.
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ cat tmp/work/first-0.1-r1/temp/
log.do_build            log.do_listtasks.20111  run.do_build            run.do_listtasks.20111
log.do_build.20152      log.do_patch            run.do_build.20152      run.do_patch
log.do_listtasks        log.do_patch.20151      run.do_listtasks        run.do_patch.20151
log.do_listtasks.20001  log.task_order          run.do_listtasks.20001  
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ cat tmp/work/first-0.1-r1/temp/log.task_order 
do_listtasks (20001): log.do_listtasks.20001
do_listtasks (20111): log.do_listtasks.20111
do_patch (20151): log.do_patch.20151
do_build (20152): log.do_build.20152
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ 

提示:如果你愿意缭保,現(xiàn)在就可以構(gòu)建一個(gè) recipe,使用 confbuild class 和一個(gè) append 文件蝙茶,運(yùn)行 patch艺骂、configure 和 build 任務(wù)。

8.3 include 文件

BitBake 有兩種指令引用文件:

  • include filename隆夯,這是一種可選引用钳恕,如果 filename 找不到别伏,不會(huì)有 error 產(chǎn)生;
  • require filename忧额,如果 filename 沒(méi)找到厘肮,會(huì)產(chǎn)生 error。

值得一提的是睦番,include 和 require 都是在 BBPATH 中指定的目錄查找 filename类茂。

8.3.1 添加 local.conf 用于引用文件

BitBake 工程通常使用 bitbake.conf 引用一個(gè)位于 build 目錄內(nèi)的 local.conf 文件。local.conf 文件可能包含一些當(dāng)前構(gòu)建目標(biāo)相關(guān)的特殊設(shè)置托嚣。典型的樣例是 Yocto 的設(shè)置巩检。

這里模仿 local.conf 的典型應(yīng)用,讓 bitbake.conf require 引用 local.conf示启,添加以下內(nèi)容到 meta-tutorial/conf/bitbake.conf:

require local.conf
include conf/might_exist.conf

如果此時(shí)執(zhí)行構(gòu)建命令兢哭,BitBake 會(huì)產(chǎn)生類(lèi)似以下的錯(cuò)誤信息:

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake world
ERROR: Traceback (most recent call last):
  File "/home/sunyongfeng/ops-build.test/yocto/poky/bitbake/lib/bb/cookerdata.py", line 175, in wrapped
    return func(fn, *args)
  File "/home/sunyongfeng/ops-build.test/yocto/poky/bitbake/lib/bb/cookerdata.py", line 185, in parse_config_file
    return bb.parse.handle(fn, data, include)
  File "/home/sunyongfeng/ops-build.test/yocto/poky/bitbake/lib/bb/parse/__init__.py", line 107, in handle
    return h['handle'](fn, data, include)
  File "/home/sunyongfeng/ops-build.test/yocto/poky/bitbake/lib/bb/parse/parse_py/ConfHandler.py", line 148, in handle
    statements.eval(data)
  File "/home/sunyongfeng/ops-build.test/yocto/poky/bitbake/lib/bb/parse/ast.py", line 39, in eval
    statement.eval(data)
  File "/home/sunyongfeng/ops-build.test/yocto/poky/bitbake/lib/bb/parse/ast.py", line 61, in eval
    bb.parse.ConfHandler.include(self.filename, s, self.lineno, data, "include required")
  File "/home/sunyongfeng/ops-build.test/yocto/poky/bitbake/lib/bb/parse/parse_py/ConfHandler.py", line 98, in include
    raise ParseError("Could not %(error_out)s file %(fn)s" % vars(), parentfn, lineno)
ParseError: ParseError at /home/sunyongfeng/workshop/test/tutorial/build/../meta-tutorial/conf/bitbake.conf:53: Could not include required file local.conf

ERROR: Unable to parse conf/bitbake.conf: ParseError at /home/sunyongfeng/workshop/test/tutorial/build/../meta-tutorial/conf/bitbake.conf:53: Could not include required file local.conf

添加一個(gè) local.conf 文件到 build 目錄可解決此問(wèn)題。注意 include 語(yǔ)句包含的文件可有可無(wú)丑搔。

  1. 使用變量

可定義變量并在 recipes 中使用厦瓢,讓 BitBake 具有很強(qiáng)的靈活性∑≡拢可將可配置部分使用變量的方式編寫(xiě) recipe煮仇,這種 recipe 的用戶(hù)可以給出那些將由 recipe 使用的變量值。一個(gè)典型的例子是給 recipe 傳遞額外的配置或標(biāo)志谎仲。通過(guò)正確使用變量浙垫,不需要編輯和更改 recipe,因?yàn)槟承┖瘮?shù)只需要一些特殊的參數(shù)郑诺。

9.1 全局變量

全局變量可以通過(guò)使用者設(shè)置夹姥,recipe 可以使用。

9.1.1 定義全局變量

剛才已經(jīng)創(chuàng)建一個(gè)空的 local.conf辙诞,現(xiàn)在在這個(gè)文件加一些變量辙售。比如添加一行:

MYVAR="hello from MYVAR"

9.1.2 訪問(wèn)全局變量

可以在 recipes 或 classes 中訪問(wèn) MYVAR 變量。這里創(chuàng)建一個(gè)新的 recipes 組 recipes-vars飞涂,及一個(gè) recipe myvar旦部。
meta-two/recipes-vars/myvar/myvar_0.1.bb

DESCRIPTION = "Show access to global MYVAR"
PR = "r1"
 
do_build(){
  echo "myvar_sh: ${MYVAR}"                        (1)
}
 
python do_myvar_py () {
  print "myvar_py:" + d.getVar('MYVAR', True)      (2)
}
 
addtask myvar_py before do_build
  1. 在類(lèi) bash 語(yǔ)法中訪問(wèn)變量;
  2. 通過(guò)全局?jǐn)?shù)據(jù)存儲(chǔ)訪問(wèn)變量较店。

現(xiàn)在運(yùn)行 bitbake myvar士八,檢查 tmp 目錄的輸出,則可以看到我們確實(shí)訪問(wèn)了全局 MYVAR 變量梁呈。

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake myvar
Parsing recipes: 100% |################################################################################| Time: 00:00:00
Parsing of 4 .bb files complete (0 cached, 4 parsed). 4 targets, 0 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
NOTE: Preparing RunQueue
NOTE: Executing RunQueue Tasks
NOTE: Tasks Summary: Attempted 2 tasks of which 0 didn't need to be rerun and all succeeded.
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ 
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ cat tmp/work/myvar-0.1-r1/temp/log.task_order 
do_myvar_py (4595): log.do_myvar_py.4595
do_build (4596): log.do_build.4596
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ cat tmp/work/myvar-0.1-r1/temp/log.do_myvar_py
DEBUG: Executing python function do_myvar_py
myvar_py:hello from MYVAR
DEBUG: Python function do_myvar_py finished
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ cat tmp/work/myvar-0.1-r1/temp/log.do_build
DEBUG: Executing shell function do_build
myvar_sh: hello from MYVAR
DEBUG: Shell function do_build finished

9.2 本地變量

典型的 recipe 只包含一些本地變量婚度,這些變量用于其繼承的 classes 中的函數(shù)設(shè)置。

先創(chuàng)建 meta-two/classes/varbuild.bbclass

varbuild_do_build () {
  echo "build with args: ${BUILDARGS}"
}
 
addtask build
 
EXPORT_FUNCTIONS do_build

然后在 meta-two/recipes-vars/varbuld/varbuild_0.1.bb 中使用:

DESCRIPTION = "Demonstrate variable usage \
  for setting up a class task"
PR = "r1"
 
BUILDARGS = "my build arguments"
 
inherit varbuild

運(yùn)行 bitbake varbuild官卡,輸出的 log 顯示 build 任務(wù)使用了 recipe 設(shè)置的變量值蝗茁。

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake varbuild
Parsing recipes: 100% |################################################################################| Time: 00:00:00
Parsing of 5 .bb files complete (0 cached, 5 parsed). 5 targets, 0 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
NOTE: Preparing RunQueue
NOTE: Executing RunQueue Tasks
NOTE: Tasks Summary: Attempted 1 tasks of which 0 didn't need to be rerun and all succeeded.
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ cat tmp/work/varbuild-0.1-r1/temp/log.task_order 
do_build (4760): log.do_build.4760
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ cat tmp/work/varbuild-0.1-r1/temp/log.do_build
DEBUG: Executing shell function do_build
build with args: my build arguments
DEBUG: Shell function do_build finished
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ 

這是使用 BitBake的典型方法醋虏。通用 task 由 class 定義,比如下載源代碼哮翘、configure灰粮、make 和其他操作,recipe 設(shè)置這些 task 所需要的變量忍坷。

  1. 附目錄樹(shù)

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial$ tree ./*
./build
├── bitbake.lock
├── conf
│   └── bblayers.conf
└── local.conf
./meta-tutorial
├── classes
│   ├── base.bbclass
│   └── mybuild.bbclass
├── conf
│   ├── bitbake.conf
│   └── layer.conf
└── recipes-tutorial
    ├── first
    │   └── first_0.1.bb
    └── second
        └── second_1.0.bb
./meta-two
├── classes
│   ├── confbuild.bbclass
│   └── varbuild.bbclass
├── conf
│   ├── bitbake.conf
│   └── layer.conf
├── recipes-base
│   ├── first
│   │   └── first_0.1.bbappend
│   └── third
│       └── third_01.bb
└── recipes-vars
    ├── myvar
    │   └── myvar_0.1.bb
    └── varbuild
        └── varbuild_0.1.bb

14 directories, 17 files
  1. 總結(jié)

以上是本教程的所有內(nèi)容,感謝你一直看到這里熔脂,希望你喜歡佩研。
學(xué)習(xí)完教程,你應(yīng)該對(duì) BitBake 的基本概念有基本理解霞揉。本教程涉及的內(nèi)容有:

  • BitBake 是一個(gè)執(zhí)行 python 和 shell 腳本的引擎旬薯;
  • 常見(jiàn)的 BitBake 工程設(shè)計(jì)與一些默認(rèn)文件的位置;
  • BitBake 使用的 5 種文件類(lèi)型(.bb适秩,.bbclass绊序,.bbappend,.conf 和 include 文件)秽荞;
  • BitBake 函數(shù)和 task骤公,說(shuō)明如何組織、分組和調(diào)用它們扬跋;
  • BitBake 變量及其基本使用方法 阶捆。

熟悉這些內(nèi)容后,希望你可以開(kāi)始使用類(lèi)似 Yocto 的工程钦听,并繼續(xù)深入理解洒试。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市朴上,隨后出現(xiàn)的幾起案子垒棋,更是在濱河造成了極大的恐慌,老刑警劉巖痪宰,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叼架,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡酵镜,警方通過(guò)查閱死者的電腦和手機(jī)碉碉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)淮韭,“玉大人垢粮,你說(shuō)我怎么就攤上這事】糠啵” “怎么了蜡吧?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵毫蚓,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我昔善,道長(zhǎng)元潘,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任君仆,我火速辦了婚禮翩概,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘返咱。我一直安慰自己钥庇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布咖摹。 她就那樣靜靜地躺著评姨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪萤晴。 梳的紋絲不亂的頭發(fā)上吐句,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音店读,去河邊找鬼嗦枢。 笑死,一個(gè)胖子當(dāng)著我的面吹牛屯断,可吹牛的內(nèi)容都是我干的净宵。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼裹纳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼择葡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起剃氧,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤敏储,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后朋鞍,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體已添,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年滥酥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了更舞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坎吻,死狀恐怖缆蝉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤刊头,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布黍瞧,位于F島的核電站,受9級(jí)特大地震影響原杂,放射性物質(zhì)發(fā)生泄漏印颤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一穿肄、第九天 我趴在偏房一處隱蔽的房頂上張望年局。 院中可真熱鬧,春花似錦咸产、人聲如沸某宪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蔼囊,卻和暖如春焚志,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背畏鼓。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工酱酬, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人云矫。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓膳沽,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親让禀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挑社,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)巡揍,斷路器痛阻,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,498評(píng)論 25 707
  • Ubuntu的發(fā)音 Ubuntu糜工,源于非洲祖魯人和科薩人的語(yǔ)言弊添,發(fā)作 oo-boon-too 的音。了解發(fā)音是有意...
    螢火蟲(chóng)de夢(mèng)閱讀 99,156評(píng)論 9 467
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評(píng)論 6 342
  • 天空上閃著幾顆星星捌木,來(lái)不及看清油坝。 我們?cè)陉?yáng)臺(tái)上聊了很久的天,阿曾很開(kāi)心的跟我聊起來(lái)他大學(xué)那會(huì)兒去新加坡交換的日子。...
    哆寶萌噠噠閱讀 338評(píng)論 0 0