当前位置: 首页 > article >正文

yocto的xxx.bb文件在什么时候会拷贝文件到build目录

在 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 会将最终的文件系统(根文件系统)打包并构建为镜像(例如 ext4tar 格式等)。这是通过 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}/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 阶段是决定文件最终拷贝到哪里并打包的关键部分。


http://www.kler.cn/a/430227.html

相关文章:

  • Angular生命周期
  • web作业
  • 测试覆盖率
  • 点击底部的 tabBar 属于 wx.switchTab 跳转方式,目标页面的 onLoad 不会触发(除非是第一次加载)
  • el-table表格合并某一列
  • Apache Traffic存在SQL注入漏洞(CVE-2024-45387)
  • Java设计模式 —— 【创建型模式】建造者模式详解
  • 鸿蒙 Next 可兼容运行 Android App,还支持出海 GMS?
  • VLM-OCR-Demo:一个使用VLM用于OCR任务的示例
  • Java 设计模式~工厂模式
  • 工业—使用Flink处理Kafka中的数据_EnvironmentData2
  • 【爬虫】– 抓取原创力文档数据
  • Python 类的设计(以植物大战僵尸为例)
  • 3D Gaussian Splatting代码详解(一):模型训练、数据加载
  • 单片机 PCB 设计要点
  • 数据结构(Queue队列)
  • Linux:network:添加ip的时候自动添加一个本地路由
  • 针对一个系统的权限管理这样的业务场景,使用各设计模式解说
  • YOLOv8-ultralytics-8.2.103部分代码阅读笔记-augment.py
  • MQTT消息服务器mosquitto介绍及说明
  • zerotier实现内网穿透(访问内网服务器)
  • 得物新一代可观测性架构:海量数据下的存算分离设计与实践
  • 期末复习-Hadoop综合复习
  • 力扣--LCR 134.Pow(x,n)
  • K8S存储实战案例:NFS+StorageClass+PV/PVC+Deployment
  • CSS滑动门与粘性定位