iT邦幫忙

2024 iThome 鐵人賽

DAY 9
0
佛心分享-SideProject30

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

Day 9 。初入嵌入式開發-創建自己的recipe

  • 分享至 

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

創建一個 layer

  • 透過 bitbake-layers 工具 創建一個 layer
bitbake-layers create-layer meta-test-layer
  • 接著我們要將她加入倒 bblayers 當中 , 讓 bitbake 可以知道這個 layer
bitbake-layers add-layer meta-test-layer

新增 recipe 到當中

有2種方式可以去產生recipe

  • devtool : 可以產生不用太多修改的 recipe
  • recipe tool : 透過這個方式 只會有 .h 與 src file , 會需要自己修改

devtool 指令

比較適用於你從 git 或遠端倉庫抓下來的時候

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

  1. 透過 devtool 指令將遠端的下載下來 , 會在 build / workspace / 底下
devtool add giflib git://git.code.sf.net/p/giflib/code
ls . workspace/recipes/giflib/
  1. 接著假如沒要修改可以直接編 (這邊要記得是使用的一樣是devtool 而不是 bitbake)
devtool build-image core-image-minimal
  1. 編譯完成後確認沒問題可以使用 finish , 把 recipe 加入到自己建立的 meta-layer 底下
devtool finish giflib meta-layer

recipetool 指令

  1. 建立檔案結構

🪄 通常 recipe 的結構會是

meta-layer/
├── /recipes-example/
│ ├── example
│ ├── files/
│ │ ├── hello.c
│ │ └── LICENSE
│ └── hello-world_1.0.bb
└── conf/layer.conf

🪄 存放檔案的資料夾要取名為 files , yocto 預設搜尋路徑的原因。

📰 可以透過這個指令來建立.bb文件
recipetool create -o <output.bb> <files/directory>

recipetool create -o myproject.bb files

-o <output.bb>:指定要生成的 .bb 文件的輸出路徑和文件名。
<files/directory>:指定要添加到配方的文件或目錄。這些文件將用於自動檢測依賴關係並生成相應的配方。

  1. 假如有編譯檔案連結檔案的需求 , 可以透過 MakeFile 來做 (可選)

    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)/
    
  2. .bb 文件 : 假如我們是想要將某個檔案安裝到image當中而已 , 參照如下

    # 前2行固定 內容隨意 
    # License 沒有就寫 CLOSED
    SUMMARY = "bitbake-layers recipe"
    DESCRIPTION = "Recipe created by bitbake-layers"
    LICENSE = "CLOSED"
    # file:// 開頭 表示我們要撈 local 端的檔案
    # 這個檔案會在跟此 bb文件同一層的 files 底下
    SRC_URI = "file://codesyscontrol \
    		file://CODESYSControl.cfg \
    "
    # S 代表的是我們socure code 的目錄 
    # WORKDIR 是在編譯過程中 yocto 用來存臨時文件or源碼的目錄 (tmp / work / 之類的路徑)
    # WORKDIR 由yocto 自動管理 我們不用理他 , 只是路徑我們要知道而已
    # 展開會是 /yocto 目錄/build/tmp/work/stm32mp2_rt/你的package name/1.0-r0/
    # 這樣寫是 yocto 建議的 , 這樣設定可以讓整個配方中的相關文件(如源碼、中間產物)都能夠在同一個目錄結構中管理。
    # 後續的 do_unpack ,do_patch 等階段,以及後續的編譯、安裝和打包過程中,${WORKDIR} 中的文件可以直接使用。
    S = "${WORKDIR}"
    
    # 安裝任務
    do_install() { 
    		#{D} 代表安裝目錄根路徑 -> 如果要將文件安裝到目標系統的 /usr/bin 目錄,則應將它們安裝到 ${D}/usr/bin 中。
    		# 在 etc (${sysconfdir}) 底下創建 codesys
        install -d ${D}${sysconfdir}/codesys
        # 給權限 -m 0755 並且將我們的檔案[${WORKDIR}/codesyscontrol] 安裝到 [${D}${sysconfdir}/codesys]
        install -m 0755 ${WORKDIR}/codesyscontrol ${D}${sysconfdir}/codesys
        install -m 0755 ${WORKDIR}/CODESYSControl.cfg ${D}${sysconfdir}/codesys
    }
    
    do_install() {
        # 假設要安裝一個名為 myfile 的文件到根目錄
        install -m 644 ${S}/myfile ${D}/myfile
        # 安裝一個名為 myconfig 的配置文件到 /etc 目錄
        install -d ${D}/etc
        install -m 644 ${S}/myconfig ${D}/etc/myconfig
    }
    

    ⚠️ 這邊要注意壓縮檔這樣做會有問題 , yocto 會自動解壓縮 。 所以假如我們希望將整個壓縮檔放進去要加上
    ;unpack=0 例如 SRC_URI = "file://mybinaryfile.bin;unpack=0”

  3. 最後一步 當我們都寫好了後 , 記得在 local.conf 當中新增

    IMAGE_INSTALL:append = " <package name>"
    # IMAGE_INSTALL:append = " dtbo-stm32mp25x-swch"
    # 假如沒有特別設定 PACKAGENAME變數 , 那你的 package name 就是你的 .bb 文件名稱扣掉 _xx.bb
    

$file_{PN}

有時候編譯時會報錯 : ERROR: zm-bsp-0.1-r0 do_package: QA Issue: zm-bsp: Files/directories were installed but not shipped in any package: , 這種類似的錯誤 , 應該與找不到相關的安裝路徑有關 , 可以在 .bb 文件中加上 $file_{PN} 。

FILES_${PN} 變量的目的是指定應打包到特定軟件包(package)中的文件。${PN} 是一個特殊變量,代表配方(recipe)的名稱。通過設置 FILES_${PN},你可以明確定義哪些文件應該包含在這個包中。

通常在配方文件(.bb 文件)中設置 FILES_${PN} 變量。例如:

FILES_${PN} = "/usr/bin/myapp /etc/myapp.conf" # 表示 myapp 軟件包將包含 /usr/bin/myapp 和 /etc/myapp.conf 文件。 要安裝的目標當中會有這些路徑與檔案
FILES_${PN} = "/usr/myapp/*" #表示 myapp 包將包含 /usr/myapp/ 目錄下的所有文件和子目錄。
# 假如我們要在 image 當中加入 /tmp/vlan.sh 檔案 , 做法如下
install -d ${D}/tmp
install -m 0755 vlan.sh ${D}/tmp
# 接著就需要指定目標路徑確保會被正確打包
FILES_${PN} += "/tmp/vlan.sh"
#=========================================================#
${D} : 對應安裝目錄的臨時目錄 /
${base_sbindir} : 對應安裝目標的目錄 /usr/sbin
${base_libdir}:對應安裝目標的目錄 /lib
${sbindir}:對應安裝目標的目錄 /usr/sbin
${libdir}:對應安裝目標的目錄 /usr/lib
${sysconfdir}:對應安裝目標的目錄 /etc

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

尚未有邦友留言

立即登入留言