How to patch in YOCTO

本文详细介绍了在YOCTO编译系统中为.c文件打patch的五个步骤,包括获取干净源码、定位编译文件、修改源代码、生成patch以及在meta-XXXX/recipe-/目录下添加bbappend文件。关键操作包括使用diff或git命令生成patch,并在bbappend文件中指定patch路径。

本文将介绍如何在YOCTO编译系统中成功打上patch的一种方法,主要通过查找打patch前的最后编译 文件,修改此文件生成patch的方法。


其中共包含五步(本文以给.c 文件打patch 为例):


1. 取一份完全干净的sourcecode确保打patch前可以成功编译),然后执行bitbake 相应的 xx.bb文件(xx代表文件名,下文中的xx表示此处的bb文件名)


2.找到 ~/build/tmp/work/ 目录下以xx.bb文件名xx命名的文件夹,在该目录下 执行

grep  -nr   文件名.c

找到最终用于编译的.c文件。

tips:

a.如果是.c文件 在该.c 文件目录下一般会有相应的.o 文件。

b. 如果是采用git 做的,此处应该先

git add 文件名.c

git commit -m " biubiu"

以此确保,在接下来生成的patch是在此最终形态上的修改。

3.在编译最终的.c 文件目录下,修改该文件,改成最终代码

4.生成patch

a. 第一种,通过diff生成patch:

diff -uN ~origina/l.c ~atest/l.c > diff_patch

b.第二种,通过git命令生成patch:

git add 文件名.c

git commit  -m "hiahiahia"

git format-patch -1

5.在对应的~/meta-XXXX /recipe-/目录下 添加 bb文件对应的  xx,bbappend 文件,并根据自己的编译目录需求添加 相应的patch。例如在某个bbappend文件中添加如下指令


FILESEXTRAPATHS_prepend := "${THISDIR}/file:"

SRC_URI_append = " \
                   file://0001-hello.patch;patch=1 \

0001-hello.patch放入bbappend 目录下的file 文件中,bitbake xx.bb的时候就回去寻找xx.bbappend 然后可以去搜集到这个patch。



最后执行bitbake 验证,patch是否成功。

caution:如果打patch失败

原因:1.查看patch被导入后,bb文件指定的source文件存放的路径,在我用的host上是_PKG_SRC_DIR。如果指定的路径跟git format-patch 生成的指定路径不同,可以用diff 生成patch。

    2. 不能给.bb 文件打patch!可以通过加bbappend 来实现相应功能,换而言之,yocto 打patch 只能给sourcecode打patch,不能对编译系统本身的code打patch。


<think>我们正在处理一个关于Yocto项目的问题:用户希望在编译之前找到自定义文件的DTS(设备树源)文件的位置。 在Yocto项目中,设备树源文件(.dts)通常位于内核源码树中。用户可能已经添加了自定义的DTS文件,或者修改了现有的DTS文件,并希望在编译之前确认它们的位置。 步骤: 1. 确定使用的内核配方(kernel recipe)。Yocto项目支持多种内核,因此首先需要确定用户使用的是哪个内核配方。 通常,内核配方由变量`PREFERRED_PROVIDER_virtual/kernel`指定,或者通过`MACHINE`配置选择默认的内核。 2. 内核配方中的DTS文件通常位于内核源码的`arch/${ARCH}/boot/dts/`目录下。其中`${ARCH}`是架构,如arm、arm64等。 3. 在Yocto中,内核源码通常通过`git`获取,并放置在构建目录的`tmp/work-shared/`下,但是请注意,这个目录在编译后会被清理。因此,我们需要在编译之前找到它们。 4. 实际上,在编译之前,Yocto会解压内核源码到工作目录(`tmp/work/<machine>/<kernel recipe>/<version>/build`),但用户可能希望更早地定位。 5. 用户自定义的DTS文件可能通过bbappend文件添加到内核配方中。因此,我们需要查找用户自定义的层(layer)中是否有对内核配方的bbappend文件,并在其中添加了补丁或文件。 6. 另一种方法:Yocto提供了`devtool`工具,可以用于修改内核配方并提取源码。 具体方法: 方法一:使用devtool修改内核配方 ``` devtool modify virtual/kernel ``` 该命令会将内核源码解压到一个工作区(默认在`workspace/sources/<kernel recipe>`),然后用户可以在该目录下的`arch/${ARCH}/boot/dts/`中找到DTS文件。 方法二:直接查找内核配方中的文件 在用户的自定义层中,可能已经将DTS文件放在一个目录中,并通过bbappend文件中的`FILESEXTRAPATHS`或`SRC_URI`添加。因此,可以搜索用户层中的`.bbappend`文件,查看是否添加了DTS文件。 方法三:在配置文件中确定内核源码位置 在编译过程中,Yocto会下载和解压内核源码。用户可以在构建目录中执行以下命令来获取内核源码路径(但注意,在编译之前,源码可能尚未解压): ``` bitbake -e virtual/kernel | grep ^S= ``` 或者 ``` bitbake -e virtual/kernel | grep ^WORKDIR= ``` 但是,这些路径在编译阶段才会被填充。 因此,推荐在编译之前使用`devtool`来获取源码。 另外,用户可能希望知道如何添加自定义DTS文件。如果用户还没有添加,我们可以提供步骤: 1. 在内核配方的bbappend文件中(例如`linux-yocto_%.bbappend`)添加自定义DTS文件: ``` FILESEXTRAPATHS_prepend := "${THISDIR}/files:" SRC_URI += "file://my-custom.dts" ``` 2. 将自定义的DTS文件放在bbappend文件所在目录的files子目录中。 3. 然后,需要确保内核配置中编译该DTS。通常,内核会编译所有在`arch/${ARCH}/boot/dts/`目录下的dts文件,但也可以通过设备树覆盖(`DTC_OVERLAY`)或者修改内核配置来指定。 总结:为了在编译前定位DTS文件,使用`devtool`修改内核配方是最直接的方法。 相关问题: 1. 如何在Yocto中添加自定义设备树文件? 2. 如何修改Yocto内核配方以包含自定义DTS? 3. 在Yocto中,设备树文件是如何被编译和打包到镜像中的?</think>### 定位 Yocto 镜像编译前的 DTS 文件 在 Yocto 项目中,设备树源文件(DTS)通常位于内核源码目录中。以下是定位自定义 DTS 文件的步骤: #### 1. **确定内核配方** - 在 `conf/local.conf` 或机器配置文件中查看内核配方名称: ```bash grep PREFERRED_PROVIDER conf/local.conf ``` 或通过 BitBake 查询: ```bash bitbake -e virtual/kernel | grep ^PREFERRED_PROVIDER= ``` 常见配方如 `linux-yocto` 或自定义内核(如 `linux-raspberrypi`)。 #### 2. **定位内核源码路径** 内核源码解压路径通常在构建目录的 `tmp/work-shared/` 下: ```bash bitbake -e virtual/kernel | grep ^WORKDIR= ``` 示例输出: ``` WORKDIR=/path/to/build/tmp/work-shared/<machine>/kernel-build-artifacts ``` #### 3. **查找 DTS 文件** - 进入内核源码的 DTS 目录(架构相关): ```bash cd ${WORKDIR}/arch/<ARCH>/boot/dts/ ``` 其中 `<ARCH>` 是目标架构(如 `arm`, `arm64`, `powerpc`)。 - 使用 `find` 命令搜索: ```bash find . -name "*.dts" -o -name "*.dtsi" ``` #### 4. **自定义 DTS 的添加位置** 若需添加自定义 DTS: - 在自定义层(如 `meta-custom`)中创建: ``` meta-custom/recipes-kernel/linux/linux-yocto/ ├── files/ │ └── custom-board.dts # 自定义 DTS 文件 └── linux-yocto_%.bbappend ``` - 在 `bbappend` 文件中添加: ```bitbake FILESEXTRAPATHS:prepend := "${THISDIR}/files:" SRC_URI:append = " file://custom-board.dts" ``` #### 5. **验证 DTS 包含关系** - 检查内核配置中的设备树路径: ```bash bitbake -c menuconfig virtual/kernel ``` 在菜单中查看 `Device Tree Source` 路径(通常在 **Boot options** → **Default DTS**)。 [^1] ### 相关问题 1. **如何修改 Yocto 中的默认设备树文件?** > 通过 `bbappend` 覆盖原 DTS 或修改内核配置的 `DEFAULT_DTB` 变量。 2. **Yocto 编译时如何确保自定义 DTS 被正确应用?** > 检查构建日志:`tmp/work/<machine>/<kernel-recipe>/<version>/temp/log.do_compile` 中的 DTS 编译条目。 3. **设备树文件(DTS)和设备树 Blob(DTB)在 Yocto 中有何区别?** > DTS 是源码(`.dts`),DTB 是编译后的二进制(`.dtb`)。Yocto 在 `do_compile` 阶段调用 DTC 编译器转换。 4. **如何为特定硬件平台添加多组 DTS 文件?** > 在 `SRC_URI` 中添加多个文件,并通过 `MACHINE_OVERLAYS` 指定条件加载。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值