如何在Buildroot中为软件包应用补丁?

11

我正在开发一个嵌入式系统,使用buildroot作为构建内核和根文件系统的工具。我想对这个内核源码树应用一些补丁,有人可以告诉我buildroot如何应用补丁吗?

4个回答

10

补充@pradeepchhentri的答案。Quilt将查找位于*.mk文件相同文件夹中的文件。构造适当的文件:

  1. 将源包与原始包进行差异对比,并将其写入名为

    packagename-number-description.patch 的文件中。

    其中

    packagename - 必须与软件包名称相同

    number - 如果要应用多个补丁,则是应用补丁的顺序(否则将按字母顺序应用)

    description - 可以是任意自由文本

  2. 将此文件放置在与[packagename].mk文件和package / Config.in文件相同级别的软件包中。

不要忘记清除生成的文件,或者如果这样做,请进行[package]-rebuild操作。如果正确执行,应该会看到"Patching..."消息。


1
一个小技巧帮助了我,所以我在这里分享一下:从Github下载提交作为补丁 - user4780495

4

使用*_OVERRIDE_SRCDIR并在子模块中跟踪所有内容

与其使用补丁,我强烈建议您采用以下方法:

myproject/
  .git/
  submodules/buildroot/
  submodules/source_of_my_package/

只需在子模块中跟踪指向您的补丁项目的分支,即可跟踪源代码。

这将使所有内容更加清晰易懂,并且易于跟踪。

更多信息请查看:如何修改Buildroot软件包的源代码以进行软件包开发?

BR2_GLOBAL_PATCH_DIR外部补丁

目录结构:

添加到配置中:

BR2_GLOBAL_PATCH_DIR=../global_patch_dir

然后使用以下命令构建:

cd buildroot
make

补丁应该在构建之前应用到output/build/packagename-1.0.0/目录中。

4

关于buildroot项目中的补丁文件的一些细节:

  1. you have to

    diff -u "old_file" "new_file" > file.patch
    

当站在包含你的tar.gz软件包的位置上时,执行以下操作:

PACKAGE_NAME_SOURCE

这意味着你的文件路径必须包括提取的软件包文件夹名称。
如果你想知道“old_file”路径是否与原始路径不同,不用担心,重要的是“new_file”路径和名称,它应该与提取的软件包相匹配。
构建根目录中已使用/定义的补丁命名规则(所有部分均以“-”符号分隔):
- 4位数字补丁优先级(从0001开始) - 目标文件名 - 打补丁的原因 - .patch扩展名
例如:
0001-configure.ac-convert-AC_TRY_COMPILE-AC_COMPILE_IFELS.patch
  1. 将补丁文件放在buildroot/package/"你的包名"/文件夹中。

不需要修改配置文件,所有的补丁都会自动尝试应用。

  1. 如果失败了,拒绝补丁文件(与要打补丁的文件类似但扩展名为.rej)将被放置在软件包提取后的文件夹中。

3
在研究了buildroot架构后,我了解到buildroot使用quilt工具来应用补丁。quilt跟踪所有补丁的文件名为“series”,该文件位于“patches”目录中。您需要将补丁放在此目录中,并按照要应用补丁的顺序,将补丁条目添加到系列文件中,并将要应用的补丁置于顶部。
这样当您运行buildroot makefile时,它将自动应用系列文件中列出的补丁。

Buildroot 这些年来并没有使用 quilt(至少目前为止还没有使用)。 - Jérôme Pouiller
buildroot文档提到了由quilt使用的“系列”文件。 - Session
目前https://buildroot.org/downloads/manual/manual.html#_providing_patches的声明为:“以前,可以在软件包目录中添加一个像quilt使用的系列文件。在这种情况下,系列文件定义了补丁的应用顺序。这已过时,并将在未来被删除。不要使用系列文件。”所以这个答案很快就会过时。 - heine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接