在 Yocto 中,.bb
?文件用于描述如何構建和安裝一個軟件包,而文件在構建過程中的拷貝操作通常會在某些特定的步驟中進行。具體來說,文件會在以下幾個階段被拷貝到?build
?目錄(或者更準確地說,拷貝到目標目錄?${D}
,這是 BitBake 過程中的一個工作目錄,通常與?build
?目錄相對應):
1.?下載階段(Fetch Phase)
在構建開始時,Yocto 會從源代碼管理系統(例如 Git)或者 URL 下載源代碼,或者將本地文件拷貝到構建目錄。這個階段發生在?do_fetch
?步驟,具體步驟包括:
- 如果你的?
SRC_URI
?是從 Git 倉庫拉取代碼,Yocto 會在?do_fetch
?階段拉取代碼。 - 如果你的?
SRC_URI
?是指向一個本地的壓縮包或文件,Yocto 會將這個文件拷貝到?${WORKDIR}
。
在這個階段,文件并不會被拷貝到目標目錄(即最終的安裝路徑),它們只是拷貝到?${WORKDIR}
,即構建工作目錄。${WORKDIR}
?是 Yocto 中源代碼和中間文件的存放位置。
2.?解壓和準備階段(Extract Phase)
在?do_fetch
?后,Yocto 會解壓文件(如果需要),并在?do_unpack
?階段準備源代碼。這個步驟主要是對源代碼進行解包,并將文件放置到?${WORKDIR}
?下的相應位置。
- 如果源文件是一個壓縮包(如?
.tar.gz
),Yocto 會在這個階段解壓縮并存放在?${WORKDIR}
?目錄中。
3.?構建階段(Build Phase)
在構建階段(如?do_compile
),Yocto 會根據配方文件中的構建系統(比如 CMake、Makefile 等)進行實際的構建操作。此時的目標文件仍然存放在?${WORKDIR}
?中。構建過程并不會將文件直接拷貝到最終的安裝目錄,而是生成中間構建產物(例如?.o
、.a
、.so
?文件等)。
4.?安裝階段(Install Phase)
文件最終被拷貝到目標目錄(如?/usr/bin
、/usr/lib
、/etc
)是在?do_install
?階段。此時,源代碼中生成的二進制文件、配置文件和資源文件將被拷貝到構建目錄中的?${D}
?目錄。
-
do_install()
?是一個關鍵的階段,在這個階段你需要手動指定如何將構建產物安裝到?${D}
?目錄。${D}
?是目標文件系統的根目錄(通常是一個臨時目錄),它模擬了最終的文件系統結構。示例:
-
do_install() {install -d ${D}${bindir}install -m 0755 ${S}/myapp ${D}${bindir}/install -m 0644 ${S}/myapp.conf ${D}${sysconfdir}/ }
在這個階段,Yocto 會將你在?do_install()
?中指定的文件拷貝到?${D}
?目錄。
5.?打包階段(Package Phase)
do_package
?階段是在安裝后,Yocto 將文件打包成最終的二進制包(例如?.ipk
、.rpm
?或?.deb
),這些包將被部署到目標系統上。此時,Yocto 會將?${D}
?中的文件(即你在?do_install()
?階段拷貝的文件)打包成一個軟件包。
6.?其他階段(例如 do_rootfs)
在某些情況下,Yocto 會將最終的文件系統(根文件系統)打包并構建為鏡像(例如?ext4
、tar
?格式等)。這是通過?do_rootfs
?階段完成的。在這個階段,Yocto 會將已經安裝到?${D}
?目錄中的所有文件合并并生成最終的文件系統鏡像。
重要目錄說明
${WORKDIR}
: 用于存放源代碼和中間構建文件,通常在?do_fetch
?和?do_unpack
?階段使用。${S}
: 指定源代碼所在的位置,通常是?${WORKDIR}
?下的源代碼目錄。${D}
: 目標文件系統的安裝目錄,在?do_install()
?階段使用。最終文件將被安裝到這個目錄中,之后將被打包到?.ipk
、.rpm
?或?.deb
?包中。${bindir}
、${libdir}
、${sysconfdir}
: 這些是標準的文件系統路徑,用于指定二進制文件、庫文件和配置文件的安裝位置。例如:${bindir}
:二進制可執行文件的安裝目錄(如?/usr/bin
)${libdir}
:庫文件的安裝目錄(如?/usr/lib
)${sysconfdir}
:配置文件的安裝目錄(如?/etc
)
示例?.bb
?文件的安裝部分
下面是一個簡單的?do_install()
?示例,展示了如何將文件從構建目錄拷貝到目標目錄:
do_install() {# 安裝二進制文件install -d ${D}${bindir}install -m 0755 ${S}/myapp ${D}${bindir}/# 安裝配置文件install -d ${D}${sysconfdir}/myappinstall -m 0644 ${S}/myapp.conf ${D}${sysconfdir}/myapp/# 安裝庫文件install -d ${D}${libdir}install -m 0755 ${S}/libmylib.so ${D}${libdir}/
}
總結
- 文件拷貝到?
build
?目錄:主要發生在?do_install()
?階段,文件會被從構建目錄(${WORKDIR}
)拷貝到目標目錄(${D}
),然后生成安裝包。 - 構建階段和安裝階段的區別:構建階段(如?
do_compile
)主要是生成中間文件,而安裝階段(如?do_install
)是將這些生成的文件拷貝到模擬的目標文件系統目錄(${D}
)中。
在?.bb
?文件中,do_install
?階段是決定文件最終拷貝到哪里并打包的關鍵部分。