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

沒有留言: