在 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}是目标文件系统的根目录(通常是一个临时目录),它模拟了最终的文件系统结构。示例:
bash
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() 示例,展示了如何将文件从构建目录拷贝到目标目录:
bash
do_install() {
# 安装二进制文件
install -d ${D}${bindir}
install -m 0755 ${S}/myapp ${D}${bindir}/
# 安装配置文件
install -d ${D}${sysconfdir}/myapp
install -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 阶段是决定文件最终拷贝到哪里并打包的关键部分。