diff options
author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2015-03-28 08:50:27 +0000 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2015-03-31 16:28:24 +0100 |
commit | 8ee36a5f2f9367550d28bf271afc53bca6ff3d5f (patch) | |
tree | abfc662b7804d92ee2082d69257a4d0465459e53 /meta | |
parent | e54f2569f4fb880387edc6a99d790b765ae33080 (diff) | |
download | openembedded-core-8ee36a5f2f9367550d28bf271afc53bca6ff3d5f.tar.gz openembedded-core-8ee36a5f2f9367550d28bf271afc53bca6ff3d5f.tar.bz2 openembedded-core-8ee36a5f2f9367550d28bf271afc53bca6ff3d5f.zip |
dpkg-native: Avoid 'file changed' errors from tar
Hardlink count duing do_package_write_deb can change causing dpkg-deb
failures. We don't care about this error case so avoid it by checking
the tar exit code.
[YOCTO #7529]
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta')
-rw-r--r-- | meta/recipes-devtools/dpkg/dpkg.inc | 2 | ||||
-rw-r--r-- | meta/recipes-devtools/dpkg/dpkg/tar-error-code.patch | 54 |
2 files changed, 56 insertions, 0 deletions
diff --git a/meta/recipes-devtools/dpkg/dpkg.inc b/meta/recipes-devtools/dpkg/dpkg.inc index bbbd881e47..5db1fde8f1 100644 --- a/meta/recipes-devtools/dpkg/dpkg.inc +++ b/meta/recipes-devtools/dpkg/dpkg.inc @@ -4,6 +4,8 @@ SECTION = "base" SRC_URI = "${DEBIAN_MIRROR}/main/d/dpkg/dpkg_${PV}.tar.xz" +SRC_URI_append_class-native = " file://tar-error-code.patch" + DEPENDS = "zlib bzip2 perl ncurses" DEPENDS_class-native = "bzip2-replacement-native zlib-native virtual/update-alternatives-native gettext-native perl-native" RDEPENDS_${PN} = "${VIRTUAL-RUNTIME_update-alternatives} xz run-postinsts perl" diff --git a/meta/recipes-devtools/dpkg/dpkg/tar-error-code.patch b/meta/recipes-devtools/dpkg/dpkg/tar-error-code.patch new file mode 100644 index 0000000000..7be2090206 --- /dev/null +++ b/meta/recipes-devtools/dpkg/dpkg/tar-error-code.patch @@ -0,0 +1,54 @@ +When running do_package_write_deb, we have trees of hardlinked files +such as the dbg source files in ${PN}-dbg. If something makes another +copy of one of those files (or deletes one), the number of links a file +has changes and tar can notice this, e.g.: + +| DEBUG: Executing python function do_package_deb +| dpkg-deb: building package `sed-ptest' in `/media/build1/poky/build/tmp/work/i586-poky-linux/sed/4.2.2-r0/deploy-debs/i586/sed-ptest_4.2.2-r0.3_i386.deb'. +| tar: ./usr/lib/sed/ptest/testsuite/tst-regex2: file changed as we read it +| dpkg-deb: error: subprocess tar -cf returned error exit status 1 + +Tar returns an error of 1 when files 'change' and other errors codes +in other error cases. We tweak dpkg-deb here so that it ignores an exit +code of 1 from tar. The files don't really change (and we have locking in +place to avoid that kind of issue). + +Upsteam-Status: Inappropriate +RP 2015/3/27 + +Index: dpkg-1.17.21/dpkg-deb/build.c +=================================================================== +--- dpkg-1.17.21.orig/dpkg-deb/build.c ++++ dpkg-1.17.21/dpkg-deb/build.c +@@ -398,7 +398,7 @@ do_build(const char *const *argv) + bool subdir; + char *tfbuf; + int arfd; +- int p1[2], p2[2], gzfd; ++ int p1[2], p2[2], gzfd, rc; + pid_t c1, c2; + + /* Decode our arguments. */ +@@ -493,7 +493,9 @@ do_build(const char *const *argv) + } + close(p1[0]); + subproc_reap(c2, "gzip -9c", 0); +- subproc_reap(c1, "tar -cf", 0); ++ rc = subproc_reap(c1, "tar -cf", SUBPROC_RETERROR); ++ if (rc && rc != 1) ++ ohshite(_("subprocess %s returned error exit status %d"), "tar -cf", rc); + + if (lseek(gzfd, 0, SEEK_SET)) + ohshite(_("failed to rewind temporary file (%s)"), _("control member")); +@@ -581,7 +583,10 @@ do_build(const char *const *argv) + /* All done, clean up wait for tar and gzip to finish their job. */ + close(p1[1]); + subproc_reap(c2, _("<compress> from tar -cf"), 0); +- subproc_reap(c1, "tar -cf", 0); ++ rc = subproc_reap(c1, "tar -cf", SUBPROC_RETERROR); ++ if (rc && rc != 1) ++ ohshite(_("subprocess %s returned error exit status %d"), "tar -cf", rc); ++ + /* Okay, we have data.tar as well now, add it to the ar wrapper. */ + if (deb_format.major == 2) { + char datamember[16 + 1]; |