Bitbake配方未按预期应用补丁

3

我有一个tarball src.tar.gz,其中的内容已经解压到src/目录下,并且使用以下命令生成了该源代码的补丁:

$ diff -Nurp src/ src_mod/ > my.patch

The patch header starts with this three lines:

 diff -Nurp src/path/to/file src_PATCHED/path/to/file
 --- src/path/to/file  2012-10-22 05:52:59.000000000 +0200
 +++ src_PATCHED/path/to/file  2016-03-14 12:27:52.892802283 +0100

我的bitbake配方使用以下SRC_URI引用路径和tarball文件:

SRC_URI = " \
    file://my.patch \
    file://src.tar.gz \
"

do_fetch和do_unpack任务按预期工作,将my.patch和src/保留在${S}目录中,即:

${S}/my.path
${S}/src.tar.gz

但是do_patch任务失败,并显示以下错误消息:
ERROR: Command Error: exit status: 1  Output:
Applying patch my.patch
can't find file to patch at input line 4
Perhaps you used the wrong -p or --strip option?

我已经尝试了不同的替代方案,例如像下面展示的设置“patchdir”属性:
SRC_URI = " \
    file://my.patch;patchdir=${S}/src \
    file://src.tar.gz \
"

我原以为"patchdir"和使用"patch -d dir"是一样的。但实际上并不是这样,它总是返回同样的错误信息。我做错了什么?
2个回答

13

我的变量${S}在我的配方中被重新定义,其内容为:

S = "${WORKDIR}/${PN}-${PV}"

但是fetcher会在${WORKDIR}目录下下载my.patch和src/,而不是在${S}目录下,因此:
${WORKDIR}/my.path
${WORKDIR}/src.tar.gz

同时,tarball也被解压在${WORKDIR}

${WORKDIR}/src/

修复方法是正确设置 "patchdir" 属性,将 ${S} 替换为 ${WORKDIR}
SRC_URI = " \
    file://my.patch;patchdir=${WORKDIR}/src \
    file://src.tar.gz \
"

那已经在运行了!


2
虽然作者提供了自己的解决方案来解决他们独特的问题,但是当搜索Yocto构建中“找不到要打补丁的文件”错误的解决方案时,这个问题是第一个结果,因此我想分享一个产生相同错误输出的不同情况的解决方案。
在我的情况下,我尝试使用.bbappend文件将覆盖控制的补丁应用于现有的配方,并收到“找不到要打补丁的文件”的错误。在https://community.nxp.com/thread/474138上的帖子确定了解决方案:使用'_append'语法而不是'+='语法。也就是说,使用以下内容:
SRC_URI_append_machineoverride = " file://my.patch"

与其

SRC_URI_machineoverride += "file://my.patch"

请注意,使用“_append”需要一个前导空格(与上面链接的线程中提到的尾随空格相反)。我还没有足够的调查来解释为什么需要这种语法,但我认为这仍然是对这个问题记录的有价值的补充。

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