bitbake-layers create-layer meta-test-layer
bitbake-layers add-layer meta-test-layer
有2種方式可以去產生recipe
比較適用於你從 git 或遠端倉庫抓下來的時候
devtool 產生 recipe 時候, 會先建立一個 workspace layer, 並在目錄底下產生 giflib recipe. 由於 source code 格式符合 yocto, 產生出來的 recipe 並不需要額外修改.
devtool add giflib git://git.code.sf.net/p/giflib/code
ls . workspace/recipes/giflib/
devtool build-image core-image-minimal
devtool finish giflib meta-layer
🪄 通常 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>
-o <output.bb>
:指定要生成的 .bb
文件的輸出路徑和文件名。<files/directory>
:指定要添加到配方的文件或目錄。這些文件將用於自動檢測依賴關係並生成相應的配方。
假如有編譯檔案連結檔案的需求 , 可以透過 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)/
.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”
最後一步 當我們都寫好了後 , 記得在 local.conf 當中新增
IMAGE_INSTALL:append = " <package name>"
# IMAGE_INSTALL:append = " dtbo-stm32mp25x-swch"
# 假如沒有特別設定 PACKAGENAME變數 , 那你的 package name 就是你的 .bb 文件名稱扣掉 _xx.bb
有時候編譯時會報錯 : 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