上篇文章說明了 yocto 的基本概念 , 今天會說明 conf 檔案的變數以及它的用途
在build/conf 當中有個叫做 local.conf 的檔案,這是 bitbake 編譯時讀取的第一個檔案。會依照裡面所寫的內容來進行後續編譯與連結的過程。以下會紀錄一些常用的指令與寫法,例如當我們要新增一些額外的套件該如何做。
因為我們編譯的是 core-image-minimal , 所以很多套件都沒有安裝
例如假設我們需要做效能測試 , 就會使用到循環測試的指令或是htop,但編譯的 image 當中沒有該如何做呢?
//要做效能測試需要再 conf/local.conf 裡面加上
IMAGE_INSTALL:append = " util-linux"
改過檔案後需要重新編譯。
接著就可以進到開發板去測試看看指令是否安裝
cyclictest --mlockall -t -a --priority=99 --interval=200 --distance=0 -l 1000
taskset -c 1 cyclictest -p 99 -i 1000 -H 200 -D 900
-c 1 : 指定將 cyclictest
進程綁定到 CPU 1(即使用第1個CPU核心)。這意味著 cyclictest
只會在這個指定的核心上運行。
-p : 優先權 0~99 (99最高)
-i : 兩次測試之間的時間間隔,單位是微秒(µs)
-d: 設定多個測試週期之間的最小時間間隔,假如是100
-H : 參數設置一個硬延遲閾值(以微秒為單位)。在這裡,200
表示如果測試的延遲超過 200 微秒,則會報告為硬延遲(hard latency)。這個參數可以用來檢測和記錄系統中的高延遲事件。
-D : 測試時間 秒為單位
安裝其餘的相關套件,例如是 package manager
# 安裝相關套件
CORE_IMAGE_EXTRA_INSTALL += " \
htop \
util-linux \
openssh-sftp-server \
dropbear \
iproute2 \
gptfdisk \
mmc-utils \
e2fsprogs \
coreutils \
can-utils \
libgpiod \
e2fsprogs \
e2fsprogs-resize2fs \
"
# MIB file
CORE_IMAGE_EXTRA_INSTALL += " \
ieee-8021-bridge-mib \
ieee-8021-mstp-mib \
ieee8021qbridgemib \
"
# tools
CORE_IMAGE_EXTRA_INSTALL += " \
linuxptp \
linuxptp-configs \
iperf3 \
iproute2-tc \
iproute2-devlink \
tcpdump \
ebtables \
"
# kernel addons
CORE_IMAGE_EXTRA_INSTALL += " \
kernel-module-edge \
kernel-module-st-stm32-deip \
kernel-modules \
"
# 啟用 套件管理包
IMAGE_FEATURES += "package-management"
主要的寫法就是透過 CORE_IMAGE_EXTRA_INSTALL 與 IMAGE_INSTALL,後面如果接上 :append ,代表的是追加功能,不會去覆蓋前面的,並且後續用雙引號框住,每個 tool 之間要使用 \ 來分隔開。這樣才重新編譯一次,就會發現已經安裝上去拉。
調用 bitbake 的時候會在我們的 build 目錄中尋找 conf / bblayers.conf 的設定檔案。
當中會放著有關 Layers 的資料 , 像是 BBLAYERS
這個變數會存放我們每一個layers 的路徑
同時在每一個 layers 當中都可以在 conf / layer.conf 的檔案。
每一個 layer 當中的 layer.conf 要設定變數 BBPATH 與 BBFILES 才可以讓 bitbake 在這個layer當中找到對應的 recipe , class , config。
在Bitbake 當中使用這個變數在名為 classes 的子目錄定位類別 (.bbclass) , 與在 conf 的目錄當中定位設定檔案 (.conf) 與子目錄等等。
#Sample1
# 由冒號 : 分隔路徑
# .= 是一個賦值運算符,表示在現有的 BBPATH 變數值的基礎上,追加新的路徑。 (連接字串)
# 就是將當前層(即 ${LAYERDIR} 變數所指向的路徑)的路徑添加到現有的 BBPATH 變數中。
BBPATH .= ":${LAYERDIR}"
# 假如當前的 BBPATH = "/path/to/bitbake/classes:/path/to/bitbake/conf"
# 而 ${LAYERDIR} 的值是 /path/to/meta-example
# 上面的做法結果就會是 BBPATH = "/path/to/bitbake/classes:/path/to/bitbake/conf:/path/to/meta-example"
#Sample2
BBPATH = "/path/to/layer1/classes:/path/to/layer1/conf"
#classes : 存放 BitBake 類文件(.bbclass 文件)的路徑
#conf : 存放 BitBake 配置文件(.conf 文件)及其它相關文件的路徑。
layer通常會將本身路徑加入到 BBPATH 的路徑當中 , 並且當 bitbake 在解析某一個layer的時候也會自動的設定 LAYERDIR,這個 LAYERDIR 會是當前的 layer 的路徑。
# meta-example --> layer 底下有個叫做 example.conf 的檔案
/path/to/meta-example -> layer 路徑
/path/to/meta-example/conf/example.conf -> example.conf 路徑
#------------------------------------------------------------------#
# example.conf 當中
VAR s1 = "t1"
VAR s2 = "t2"
# 這個 ${LAYERDIR} 展開會是 /path/to/meta-example
include ${LAYERDIR}/conf/some.inc
這個變數用來定位 recipe 與 通配符的路徑 (e.g, *.txt )
通常 recipe 會有兩層目錄 recipe / pkg1 / 各種檔案
# meta-example layer 底下有個 recipe-test 的目錄
/path/to/meta-example -> layer 路徑
/path/to/meta-example/recipe-test -> recipe 路徑
# 檔案結構
meta-example/
├── recipes-test/
│ ├── package1/
│ │ ├── package1.bb
│ │ └── package1.inc
│ ├── package2/
│ │ ├── package2.bb
│ │ └── package2.inc
│ └── ...
如果我們希望將 meta-example 當中的所有 recipe 放到 BBFILES 的變數中 , 可以像下方這樣做
BBFILES += "/path/to/meta-example/recipes-test/*/*.bb"
// 假如有很多 recipe 的話
BBFILES += "/path/to/meta-example/recipes1/*/*.bb"
BBFILES += "/path/to/meta-example/recipes2/*/*.bb"
// 更懶惰的寫法
BBFILES := $(shell find /path/to/meta-example/recipes1 /path/to/meta-example/recipes2 -type f -name '*.bb')
這樣所有的 recipe-test 目錄下的 .bb 檔案都會被放到BBFILES當中。
這個列表由 BitBake 使用,以在它的數據目錄中找到其他與該層相關BBFILE_* 變量。每個layer會將它自己的名字加到 BBFILE_COLLECTIONS 中。目的是讓 BitBake 知道該層的存在,並能夠正確地解析和使用該層中的recipes與其他元數據。
# 假如有三個 layer : meta-yocto , meta-openembedded , meta-custom
BBFILE_COLLECTIONS += "yocto"
BBFILE_COLLECTIONS += "openembedded"
BBFILE_COLLECTIONS += "custom"
# 在每個 layer 當中的 layer.conf 內
BBFILE_COLLECTIONS += "yocto"
...... 以此類推
讓 bitbake 知道怎麼從 BBFILE 定位到特定layer中的 recipes , 變數名稱後方需要加上該layer 的名字 。(BBFILE_PATTERN_custom)
# meta-test/conf/layer.conf
BBFILE_PATTERN_test = "^meta-test/"
# ^ 符號 用來確保 bitbake 只在 meta-test/開頭的路徑下查找 recipe
優先權 (數字越大 優先權越高) , 當多個layer 擁有相同名稱的 recipe 時,根據這個參數來決定使用哪一layer 的配方
# meta-yocto/conf/layer.conf
BBFILE_PRIORITY_yocto = "5"
# meta-openembedded/conf/layer.conf
BBFILE_PRIORITY_openembedded = "6"
# meta-test/conf/layer.conf
BBFILE_PRIORITY_test = "10" <----- 優先選擇
BBLayers 我們比較少會去手動更改她,反而是 local.conf 當我們需要新增自己寫的 recipe 或是安裝額外的套件的時候,會需要手動去修改。在調用 bitbake 時才可以正確的安裝,ˋ這篇文章主要紀錄一些變數與常用的一些指令。