我正在使用yocto。它不支持基于ft5x06s的触摸屏,因此我决定添加一个补丁。但是,当我添加补丁文件时,出现以下错误:

ERROR: Command Error: exit status: 1  Output:
Applying patch 0026-imx6q-smx6-edt-ft5x06.patch
patching file Documentation/devicetree/bindings/input/touchscreen/edt-ft5x06.txt
patching file drivers/input/touchscreen/edt-ft5x06.c
Hunk #22 FAILED at 751.
Hunk #23 succeeded at 811 (offset -1 lines).
Hunk #24 FAILED at 922.
Hunk #25 FAILED at 959.
Hunk #26 FAILED at 995.
Hunk #27 FAILED at 1009.
Hunk #28 succeeded at 1077 (offset 17 lines).
5 out of 28 hunks FAILED -- rejects in file drivers/input/touchscreen/edt-ft5x06.c
Patch 0026-imx6q-smx6-edt-ft5x06.patch does not apply (enforce with -f)
ERROR: Function failed: patch_do_patch
ERROR: Logfile of failure stored in: /home/safedrive/test/build/tmp/work/smarc_samx6i-poky-linux-gnueabi/linux-smx6/3.10.17-r0/temp/log.do_patch.29885
ERROR: Task 70 (/home/safedrive/test/sources/meta-fsl-arm-extra/recipes-kernel/linux/linux-smx6_3.10.17.bb, do_patch) failed with exit code '1'

我该如何解决?

最佳答案

问题与 BitBake 执行的任务do_patch()有关,后者在Yocto中是任务调度程序和执行程序。
BitBake User Manual中阅读更多内容

但是您面临的错误不是Yocto组件引起的。
错误消息指出您的补丁程序无法应用到所需文件,因为它无效。

通常,.patch是通过diff工具生成的称为hunks的片段排序的。

一个大块的示例(来自Diff Utility article @ wiki)

@@ -5,16 +11,10 @@
be shown if it doesn't
change.  Otherwise, that
would not be helping to
-compress the size of the
-changes.
-This paragraph contains
-text that is outdated.
-It will be deleted in the
-near future.
+compress anything.

在Wiki文章中,您可以阅读如何解释这种大块体,但是要简短一些:带有-的行表示特定的补丁程序将删除它,带有+的行将由补丁程序添加。没有标记的行将作为参考(上下文),并且将保持不变。

现在,在您的错误消息中将其写为:

28个大块中的5个失败-在文件驱动程序/输入/触摸屏/edt-ft5x06.c中拒绝
修补程序0026-imx6q-smx6-edt-ft5x06.patch不适用(用-f强制)

这意味着您的补丁程序包含28个如上所述的块,并且其中5个块无效,因为无效-补丁工具无法应用这些更改,因为对应的行与您用作参考的文件中的行不同。

还可以看到,您的补丁程序编号为0026,因此失败的可能原因是在您更改文件结构之前应用了其他补丁程序:确保作为参考,您正在使用已应用所有现有补丁程序的源。

我假设您使用*.bbappend*.bb文件通过附加SRC_URI变量来添加补丁。应用补丁程序的顺序与列出文件的顺序相同。因此,如果您的补丁程序是最新的,则它应如下所示:
SRC_URI += "file://0001-<patch_name>.patch \
            file://0002-<patch_name>.patch \
            (...)
            file://0026-imx6q-smx6-edt-ft5x06.patch \
           "

最后一点:如果您使用的是Yocto版本> = 1.8,则有一个方便的叫做devtool(Yocto Mega Manual: devtool)的东西,它大大简化了使用临时源的工作。

编辑:
来自评论的问题:

是的,我想知道为什么bitbake返回此错误消息

仅仅是因为您的补丁不适合目标源而可以应用。
有关特定配方的一组任务,请参见:BitBake manual: Execution chapter。您可以通过传递列出任务:bitbake -c listtasks -f <recipe_name>do_patch()是常见任务之一,由于补丁错误而失败。

试试这个:
  • SRC_URI中删除您的补丁。
  • 执行:bitbake -c cleanall -f <recipe_name>
  • 执行:bitbake -c build -f <recipe_name>
  • 查找包含您需要修补的源的目录:bitbake -e <your_recipe_name> | grep ^S=并转到那里。
  • 复制您需要修补的文件。在需要的地方向他们添加您的更改。通过diff工具创建新补丁。作为参考,请使用一个或多个原始文件,并通过修改将其更改为一个或多个文件,例如:diff --ruN original_src modified_src > 0026-patch-name.patch
  • 将修补程序移动到适当的目录,并将其添加到SRC_URI中。
  • 重建目标配方:bitbake -c cleanall -f <recipe_name> && bitbake -c build -f <recipe_name>

  • 请注意:<recipe_name>应该不带.bb扩展名传递。

    关于embedded-linux - BitBake中的任务do_patch()期间失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37322435/

    10-11 19:19