iT邦幫忙

2024 iThome 鐵人賽

DAY 7
0
佛心分享-SideProject30

門外漢的嵌入式地獄系列 第 7

Day 7 。初入嵌入式開發-MetaData

  • 分享至 

  • xImage
  •  

metadata

metadata 被用來控制編譯的過程,可以區分為兩種類型:

  • 變數 : 被賦值 or 有表達式的

  • 可執行的資料 : 具有函數or任務的檔案

這兩種metadata又可以構成五類檔案 , 關係如下:

https://ithelp.ithome.com.tw/upload/images/20240804/20146325WQMKtjuxx2.png

設定文件 (.conf)

放在設定文件當中的所有 metadata 都是 global 的 , 通常只會包含各種變數而已。

假如有相同的變數在多個設定文件當中被賦值,會有優先權決定哪個生效。

🪄 bitbake.conf 最低優先權 , build/conf具有最高的優先權

Recipe 文件 (.bb)

recipe 當中有說明特定軟件包與編譯用的 metadata , 通常 recipe 當中的 metadata 是 Task 形式 (do_install() )用於下載、解壓縮、打patch 等等。

類文件 (.bbclass)

類文件提供了讓 recipe 可以繼承來自不同 recipe 的指令。 BitBake 會在 layer 當中的classes搜尋類文件, recipe 可以透過inherit 指令, 用 類文件的名稱來引用類文件。

# custom_tasks.bbclass --> 會在 classes 資料夾底下

# 定義一個函數用來配置
do_custom_configure() {
    echo "Custom configuration tasks..."
    # 可以在這裡執行特定的配置任務,ex 設置環境變數 or 複製配置文件等等
}

# 定義一個函數用於編譯
do_custom_compile() {
    echo "Custom compilation tasks..."
    # 可以在這裡執行編譯相關的任務,編譯 source code 等等
}

# 定義一個變數用來指定安裝目錄
CUSTOM_INSTALL_DIR = "${D}/opt/myapp"
# myapp.bb --> 這是一個 recipe 的檔案

SUMMARY = "範例應用程式"
LICENSE = "MIT"
SRC_URI = "git://example.com/myapp.git"

# 引用 custom_tasks 類別 (classes 的繼承概念)
inherit custom_tasks

# 指定配置階段
do_configure() {
    # 呼叫 custom_tasks 類別中的配置函式
    do_custom_configure
}

# 指定編譯任務
do_compile() {
    # 呼叫 custom_tasks 類別中的編譯函式
    do_custom_compile
}

# 指定安裝路徑
FILES_${PN} += "${CUSTOM_INSTALL_DIR}"

追加文件 (.bbappend)

追加文件(.bbappend)是用於擴展recipe文件的概念。通常,這些文件用於在不修改原始recipe的情況下擴展或修改其他層中的recipe。.bbappend 文件必須具有與它所擴展的recipe相同的基本名稱,但後綴為 .bbappend 而不是 .bb。此外,.bbappend 文件的相對於層根目錄的路徑必須與它所擴展的recipe相同。

meta-example/
├── recipes-example/
│   └── recipes-myapp/
│       ├── myrecipe.bb       # 原始recipe文件
│       └── myrecipe.bbappend # 擴展recipe文件
# myapp.bb --> recipe 文件

SUMMARY = "範例應用程式"
LICENSE = "MIT"
SRC_URI = "git://example.com/myapp.git"

do_install() {
    install -d ${D}/usr/bin
    install -m 0755 ${S}/myapp ${D}/usr/bin/
}

假如希望在不修改 myapp.bb 的情況下,添加一些額外的操作,比如增加一個啟動腳本。我們可以創建一個 myapp.bbappend 文件來實現這一點:

# myapp.bbappend

# 設置了一個額外的文件搜索路徑,以便在 SRC_URI 中引用 myapp-start.sh。
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" 

# SRC_URI_append 將 myapp-start.sh 腳本添加到原始 SRC_URI 中。
SRC_URI_append = " file://myapp-start.sh" 

# do_install_append() 函數將安裝 myapp-start.sh 腳本到 ${D}/etc/init.d 目錄下。
do_install_append() { # _append 表示追加函數
		# 這些install 會追加到原先函數後面運行 , 不會覆蓋掉。
    install -d ${D}/etc/init.d
    install -m 0755 ${WORKDIR}/myapp-start.sh ${D}/etc/init.d/
}

包含文件(.inc)

在 Yocto Project 中,.inc 文件用於包含和共享元數據,這些文件通常提供多個元數據文件共享的功能。透過使用 includerequire 指令,可以將一個 .inc 文件包含到另一個元數據文件(如 .bb.bbappend 文件)中。

# custom_functions.inc --> 這是一個 .inc 檔案

# 自定義函數
custom_do_something() {
    echo "Doing something custom..."
}

# 自定義變數
CUSTOM_VAR = "custom_value"

我們可以在一個 .bb.bbappend 文件中,可以使用 include 指令來引入 custom_functions.inc 中的功能:

# myapp.bbappend

# 引入 custom_functions.inc 文件
include custom_functions.inc

# 在 do_install 函數中使用自定義函數
do_install() {
    custom_do_something # inc 文件中的函數 不用加上 ()
    echo "The value of CUSTOM_VAR is ${CUSTOM_VAR}"
    install -d ${D}/usr/bin
    install -m 0755 ${S}/myapp ${D}/usr/bin/
}

補充說明-變數縮寫

變數/縮寫 描述和用途
${PN} 軟體包名稱(Package Name),表示目前 BitBake recipe 定義的軟體包名稱。例如,如果 recipe 名稱為 myapp.bb,則 ${PN} 將是 myapp。
${D} 構建臨時目錄(Build Directory),表示目前軟體包在構建過程中的臨時目錄。在 ${D} 下可以找到所有構建生成的檔案和目錄。
${S} 源碼目錄(Source Directory),表示軟體包源碼的存放目錄。
${WORKDIR} 工作目錄(Working Directory),表示 BitBake 在構建過程中使用的工作目錄,通常是 ${TMPDIR}/work/${MULTIMACH_TARGET_SYS}/${PN}/${EXTENDPE}${PV}-${PR}。
${TMPDIR} 臨時目錄(Temporary Directory),表示 BitBake 在構建過程中使用的頂層臨時目錄。
${PKG} 打包目錄(Package Directory),表示軟體包安裝的臨時目錄,用於打包成部署包。
${PF} 軟體包完整名稱(Package Full Name),結合 ${PN}、-${PV} 和 -${PR},表示軟體包的完整版本。
${PN}-${PV} 完整軟體包版本(Package Name-Version),表示軟體包的名稱和版本號的組合。
${PN}-${PV}-${PR} 完整軟體包版本和修訂號(Package Name-Version-Revision),表示軟體包的名稱、版本號和修訂號的組合。

補充說明-Linux 權限

🪄 數字權限表示法:在 Linux 和 Unix 系統中,檔案和目錄的權限用一個三位的八進位數字來表示。每個數字代表了不同的權限位。

  • 第一位:檔案所有者(Owner)的權限。
  • 第二位:與檔案所屬群組的用戶(Group)的權限。
  • 第三位:其他用戶(Others)的權限。

每一位權限可以用以下方式表示:

  • 4:讀取權限(r)
  • 2:寫入權限(w)
  • 1:執行權限(x)

因此,不同的數字組合代表不同的權限設置。例如:

  • 0755:表示檔案所有者具有讀取、寫入、執行權限(4 + 2 + 1 = 7),與檔案所屬群組的用戶和其他用戶具有讀取、執行權限(4 + 1 = 5)。

這樣設置權限意味著:

  • 檔案所有者可以讀取、寫入和執行該檔案。
  • 檔案所屬群組的用戶可以讀取和執行該檔案。
  • 其他用戶也可以讀取和執行該檔案。

總結

  1. BitBake 編譯流程

    調用 BitBake 命令 → 找尋 build/conf/local.conf / 找尋 build/conf/bbla.conf → 依照設定檔找到 layer → 進入layer/conf/layer.conf → 找到設定的recipe/class/config

  2. .bbclass 可以寫成一個類別 其中的函數 變數 ,可以透過 inherit 指令來讓其他 recipe 繼承。

  3. .inc 檔可以理解為 include 的 header 檔 , 透過 include custom.increquire custom.inc 指令來引用。


上一篇
Day 6 。初入嵌入式開發- conf 說明
下一篇
Day 8 。初入嵌入式開發-MetaData 語法
系列文
門外漢的嵌入式地獄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言