quilt 工具增加 patch 方法

如果源码模块是git仓库的型式(远程的或者本地的mirror型式),直接使用git diff来生成patch就可以了。
模块源码为压缩包的型式,可以使用quilt工具来生成patch文件。拿imax6平台gstreamer的imx插件模块imx-gst1.0-plugin为例:

#第一步,使用quilt工具生成patch文件

  • 配置构建环境后,使用如下命令解压源码包并打入已经存在的patch:
$ cd /home/zyliu/imax6-linux
$ source envsetup.sh
...
$ pwd
/home/zyliu/imax6-linux/build-xwayland
$ bitbake imx-gst1.0-plugin -c cleanall -f
$ bitbake imx-gst1.0-plugin -c patch -f
  • 进入到源码的构建路径:
$ cd tmp/work/imx6qsabresd-poky-linux-gnueabi/imx-gst1.0-plugin/4.1.6-r0
  • 进入到源码路径:
  • 使用quilt工具创建一个新的patch文件:
$ quilt new 20181126-gstvpudec-force-low-latency-mode.patch
Patch patches/20181126-gstvpudec-force-low-latency-mode.patch is now on top
  • 增加一个需要打patch的源文件到quilt工作列表:
$ quilt add plugins/vpu/gstvpudec.c
File plugins/vpu/gstvpudec.c added to patch patches/20181126-gstvpudec-force-low-latency-mode.patch
  • 然后,对文件进行修改,之后刷新patch文件:
$ vi plugins/vpu/gstvpudec.c
$ quilt refresh
Refreshed patch patches/20181126-gstvpudec-force-low-latency-mode.patch
  • patch完成,路径为 patches/20181126-gstvpudec-force-low-latency-mode.patch,内容如下:
Index: imx-gst1.0-plugin-4.1.6/plugins/vpu/gstvpudec.c
===================================================================
--- imx-gst1.0-plugin-4.1.6.orig/plugins/vpu/gstvpudec.c
+++ imx-gst1.0-plugin-4.1.6/plugins/vpu/gstvpudec.c
@@ -282,13 +282,13 @@ gst_vpu_dec_set_format (GstVideoDecoder
   }
   gst_query_unref (query);

- if (is_live) {
+ // if (is_live) {
     GST_INFO_OBJECT (dec, "Pipeline is live, set VPU to low latency mode.\n");
     GST_VPU_DEC_LOW_LATENCY (dec->vpu_dec_object) = TRUE;
- } else {
- GST_INFO_OBJECT (dec, "Pipeline isn't live, set VPU to non-latency mode.\n");
- GST_VPU_DEC_LOW_LATENCY (dec->vpu_dec_object) = FALSE;
- }
+ // } else {
+ // GST_INFO_OBJECT (dec, "Pipeline isn't live, set VPU to non-latency mode.\n");
+ // GST_VPU_DEC_LOW_LATENCY (dec->vpu_dec_object) = FALSE;
+ // }

   return gst_vpu_dec_object_config (dec->vpu_dec_object, bdec, state);
 }

#第二步,增加patch文件到bitbake构建步骤中

  • 找到imx-gst1.0-plugin模块的bb文件位置为:
 /home/zyliu/imax6-linux/sources/meta-fsl-bsp-release/imx/meta-bsp/recipes-multimedia/gstreamer/imx-gst1.0-plugin_4.1.6.bb
  • 在同目录下新建imx-gst1.0-plugin目录,并将上一步中生成的patch文件复制进去:
$ cd /home/zyliu/imax6-linux/sources/meta-fsl-bsp-release/imx/meta-bsp/recipes-multimedia/gstreamer
$ mkdir imx-gst1.0-plugin
$ cp /home/zyliu/imax6-linux/tmp/work/imx6qsabresd-poky-linux-gnueabi/imx-gst1.0-plugin/4.1.6-r0/20181126-gstvpudec-force-low-latency-mode.patch ./imx-gst1.0-plugin
  • 同目录下,增加一个imx-gst1.0-plugin_%.bbappend文件,内容如下:
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
SRC_URI_append = " file://20181126-gstvpudec-force-low-latency-mode.patch"

#第三步,验证一下

$ cd /home/zyliu/imax6-linux
$ source envsetup.sh
$ bitbake imx-gst1.0-plugin -c cleanall -f
$ bitbake imx-gst1.0-plugin -c patch -f
$ cat tmp/work/imx6qsabresd-poky-linux-gnueabi/imx-gst1.0-plugin/4.1.6-r0/temp/log.do_patch.5120

DEBUG: Executing python function do_patch
DEBUG: Executing python function patch_do_patch
DEBUG: Searching for 20181126-gstvpudec-force-low-latency-mode.patch in paths:
    /home/zyliu/imax6-linux/sources/meta-fsl-bsp-release/imx/meta-bsp/recipes-multimedia/gstreamer/imx-gst1.0-plugin/poky-ivi-systemd
    ...
    /home/zyliu/imax6-linux/sources/meta-fsl-bsp-release/imx/meta-bsp/recipes-multimedia/gstreamer/files/
NOTE: Applying patch '20181126-gstvpudec-force-low-latency-mode.patch' (../sources/meta-fsl-bsp-release/imx/meta-bsp/recipes-multimedia/gstreamer/imx-gst1.0-plugin/20181126-gstvpudec-force-low-latency-mode.patch)
DEBUG: Python function patch_do_patch finished
DEBUG: Python function do_patch finished

可见,20181126-gstvpudec-force-low-latency-mode.patch已经成功打入。


20190603 补充

今天使用quilt工具打patch遇到问题了,记录一下解决过程。
首先,还是采用之前的流程做了个patch文件,然后bitbake在do_patch时报错如下:

ERROR: Command Error: exit status: 1  Output:
Applying patch 20190613-AddVendorElementsToAssocResp.patch
can't find file to patch at input line 5
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|Index: hostapd-2.4/src/ap/ap_drv_ops.c
|===================================================================
|--- hostapd-2.4.orig/src/ap/ap_drv_ops.c
|+++ hostapd-2.4/src/ap/ap_drv_ops.c
--------------------------
No file to patch.  Skipping patch.
1 out of 1 hunk ignored
Patch 20190613-AddVendorElementsToAssocResp.patch does not apply (enforce with -f)

意思是找不到需要被打patch的文件。
花了一点时间trace了一下bitbake打patch的代码流程,主要相关的文件有2个,如下:

poke/meta/classes/patch.bbclass
poke/meta/lib/oe/patch.py

python函数patch_do_patch()中会根据配置先选择一个patchset的类和一个resolver的类,如果没有指定PATCHTOOL的话(有些模块可能会指定PATCHTOOL为git),默认是采用oe.patch.QuiltTree这个类来处理patch文件。

QuiltTree在构造时会指定一个patchdir(如果没有指定的话,默认为${S}的值),QuiltTree会先Import所有的patch文件,其实是在${patchdir}/patches/中制作一个link文件,链接到我们的patch文件上。最后通过在${patchdir}路径下执行quilt push来完成打patch的动作。

所以,这个patchdir的值就比较关键了,之前默认情况我都是去bitbake工作路径下的源码目录中使用quilt来做patch的。也就是默认了源码目录就是${S}的情况。

今天搞hostapd模块时遇到问题了:

${S}=…/tmp/work/cortexa7-vfp-neon-telechips-linux-gnueabi/hostapd/2.4-r0/hostapd-2.4/hostapd/

而我的源码unpack的路径其实是:

…/tmp/work/cortexa7-vfp-neon-telechips-linux-gnueabi/hostapd/2.4-r0/hostapd-2.4/

所以,我需要明确的指定一下patchdir这个值,方式如下:

FILESEXTRAPATHS_append := ":${THISDIR}/hostapd-${PV}"
MY_PATCH_DIR="${WORKDIR}/hostapd-${PV}"
SRC_URI += "file://20190613-AddVendorElementsToAssocResp.patch;patchdir=${MY_PATCH_DIR}/"

就是在patch文件后增加一个字段,patchdir=${MY_PATCH_DIR}


原文链接:https://blog.csdn.net/Miss_yuan/article/details/86544493

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值