Unbreak short-circuited binary builds (#1434235).
This commit is contained in:
parent
bc4decbc5f
commit
0277786e14
171
0022-unbreak-short-circuit.patch
Normal file
171
0022-unbreak-short-circuit.patch
Normal file
@ -0,0 +1,171 @@
|
|||||||
|
commit eea78b023539875309b7d38e4c8924f647644924
|
||||||
|
Author: Panu Matilainen <pmatilai@redhat.com>
|
||||||
|
Date: Thu Jan 5 13:47:28 2017 +0200
|
||||||
|
|
||||||
|
Unbreak short-circuited binary builds
|
||||||
|
|
||||||
|
Commit bbfe1f86b2e4b5c0bd499d9f3dd9de9c9c20fff2 broke short-circuited
|
||||||
|
binary builds (which can be handy for testing when working on large
|
||||||
|
packages), eg:
|
||||||
|
rpmbuild -bi foo.spec; rpmbuild -bb --short-circuit foo.spec
|
||||||
|
|
||||||
|
The problem is that in a short-circuited build all the links already
|
||||||
|
exist and point to the right place, but the code doesn't realize this
|
||||||
|
and creates new links instead, which leaves the old links unowned
|
||||||
|
in the buildroot which ultimately causes the build to fail with
|
||||||
|
"Installed (but unpackaged) file(s) found" for the previously created
|
||||||
|
build-id links.
|
||||||
|
|
||||||
|
When checking for pre-existing links see if they already point to
|
||||||
|
the right file and in that case just reuse it instead of creating new ones.
|
||||||
|
Keep track of duplicate build-ids found by noticing existing links that
|
||||||
|
point to different targets. But don't do this for compat links, they should
|
||||||
|
just point to the last (duplicate) main build-id symlink found.
|
||||||
|
|
||||||
|
Signed-off-by: Mark Wielaard <mark@klomp.org>
|
||||||
|
|
||||||
|
diff --git a/build/files.c b/build/files.c
|
||||||
|
index cca14b9..93021d1 100644
|
||||||
|
--- a/build/files.c
|
||||||
|
+++ b/build/files.c
|
||||||
|
@@ -1592,11 +1592,12 @@ exit:
|
||||||
|
|
||||||
|
static int addNewIDSymlink(FileList fl,
|
||||||
|
char *targetpath, char *idlinkpath,
|
||||||
|
- int isDbg, int isCompat)
|
||||||
|
+ int isDbg, int *dups)
|
||||||
|
{
|
||||||
|
const char *linkerr = _("failed symlink");
|
||||||
|
int rc = 0;
|
||||||
|
int nr = 0;
|
||||||
|
+ int exists = 0;
|
||||||
|
char *origpath, *linkpath;
|
||||||
|
|
||||||
|
if (isDbg)
|
||||||
|
@@ -1606,6 +1607,26 @@ static int addNewIDSymlink(FileList fl,
|
||||||
|
origpath = linkpath;
|
||||||
|
|
||||||
|
while (faccessat(AT_FDCWD, linkpath, F_OK, AT_SYMLINK_NOFOLLOW) == 0) {
|
||||||
|
+ /* We don't care about finding dups for compat links, they are
|
||||||
|
+ OK as is. Otherwise we will need to double check if
|
||||||
|
+ existing link points to the correct target. */
|
||||||
|
+ if (dups == NULL)
|
||||||
|
+ {
|
||||||
|
+ exists = 1;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ char ltarget[PATH_MAX];
|
||||||
|
+ ssize_t llen;
|
||||||
|
+ /* In short-circuited builds the link might already exist */
|
||||||
|
+ if ((llen = readlink(linkpath, ltarget, sizeof(ltarget)-1)) != -1) {
|
||||||
|
+ ltarget[llen] = '\0';
|
||||||
|
+ if (rstreq(ltarget, targetpath)) {
|
||||||
|
+ exists = 1;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (nr > 0)
|
||||||
|
free(linkpath);
|
||||||
|
nr++;
|
||||||
|
@@ -1613,21 +1634,16 @@ static int addNewIDSymlink(FileList fl,
|
||||||
|
isDbg ? ".debug" : "");
|
||||||
|
}
|
||||||
|
|
||||||
|
- char *symtarget = targetpath;
|
||||||
|
- if (nr > 0 && isCompat)
|
||||||
|
- rasprintf (&symtarget, "%s.%d", targetpath, nr);
|
||||||
|
-
|
||||||
|
- if (symlink(symtarget, linkpath) < 0) {
|
||||||
|
+ if (!exists && symlink(targetpath, linkpath) < 0) {
|
||||||
|
rc = 1;
|
||||||
|
rpmlog(RPMLOG_ERR, "%s: %s -> %s: %m\n",
|
||||||
|
- linkerr, linkpath, symtarget);
|
||||||
|
+ linkerr, linkpath, targetpath);
|
||||||
|
} else {
|
||||||
|
fl->cur.isDir = 0;
|
||||||
|
rc = addFile(fl, linkpath, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* Don't warn (again) if this is a compat id-link, we retarget it. */
|
||||||
|
- if (nr > 0 && !isCompat) {
|
||||||
|
+ if (nr > 0) {
|
||||||
|
/* Lets see why there are multiple build-ids. If the original
|
||||||
|
targets are hard linked, then it is OK, otherwise warn
|
||||||
|
something fishy is going on. Would be nice to call
|
||||||
|
@@ -1656,8 +1672,8 @@ static int addNewIDSymlink(FileList fl,
|
||||||
|
free(origpath);
|
||||||
|
if (nr > 0)
|
||||||
|
free(linkpath);
|
||||||
|
- if (nr > 0 && isCompat)
|
||||||
|
- free(symtarget);
|
||||||
|
+ if (dups != NULL)
|
||||||
|
+ *dups = nr;
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
@@ -1897,6 +1913,7 @@ static int generateBuildIDs(FileList fl)
|
||||||
|
|| (rc = addFile(fl, buildidsubdir, NULL)) == 0) {
|
||||||
|
char *linkpattern, *targetpattern;
|
||||||
|
char *linkpath, *targetpath;
|
||||||
|
+ int dups = 0;
|
||||||
|
if (isDbg) {
|
||||||
|
linkpattern = "%s/%s";
|
||||||
|
targetpattern = "../../../../..%s";
|
||||||
|
@@ -1908,7 +1925,7 @@ static int generateBuildIDs(FileList fl)
|
||||||
|
buildidsubdir, &ids[i][2]);
|
||||||
|
rasprintf(&targetpath, targetpattern, paths[i]);
|
||||||
|
rc = addNewIDSymlink(fl, targetpath, linkpath,
|
||||||
|
- isDbg, 0);
|
||||||
|
+ isDbg, &dups);
|
||||||
|
|
||||||
|
/* We might want to have a link from the debug
|
||||||
|
build_ids dir to the main one. We create it
|
||||||
|
@@ -1931,16 +1948,30 @@ static int generateBuildIDs(FileList fl)
|
||||||
|
&& build_id_links == BUILD_IDS_COMPAT) {
|
||||||
|
/* buildidsubdir already points to the
|
||||||
|
debug buildid. We just need to setup
|
||||||
|
- the symlink to the main one. */
|
||||||
|
+ the symlink to the main one. There
|
||||||
|
+ might be duplicate IDs, those are found
|
||||||
|
+ by the addNewIDSymlink above. Target
|
||||||
|
+ the last found duplicate, if any. */
|
||||||
|
free(linkpath);
|
||||||
|
free(targetpath);
|
||||||
|
- rasprintf(&linkpath, "%s/%s",
|
||||||
|
- buildidsubdir, &ids[i][2]);
|
||||||
|
- rasprintf(&targetpath,
|
||||||
|
- "../../../.build-id%s/%s",
|
||||||
|
- subdir, &ids[i][2]);
|
||||||
|
+ if (dups == 0)
|
||||||
|
+ {
|
||||||
|
+ rasprintf(&linkpath, "%s/%s",
|
||||||
|
+ buildidsubdir, &ids[i][2]);
|
||||||
|
+ rasprintf(&targetpath,
|
||||||
|
+ "../../../.build-id%s/%s",
|
||||||
|
+ subdir, &ids[i][2]);
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ rasprintf(&linkpath, "%s/%s.%d",
|
||||||
|
+ buildidsubdir, &ids[i][2], dups);
|
||||||
|
+ rasprintf(&targetpath,
|
||||||
|
+ "../../../.build-id%s/%s.%d",
|
||||||
|
+ subdir, &ids[i][2], dups);
|
||||||
|
+ }
|
||||||
|
rc = addNewIDSymlink(fl, targetpath, linkpath,
|
||||||
|
- 0, 1);
|
||||||
|
+ 0, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rc == 0 && isDbg
|
||||||
|
@@ -1978,7 +2009,7 @@ static int generateBuildIDs(FileList fl)
|
||||||
|
rasprintf(&targetpath, "../../../../..%s",
|
||||||
|
targetstr);
|
||||||
|
rc = addNewIDSymlink(fl, targetpath,
|
||||||
|
- linkpath, 0, 0);
|
||||||
|
+ linkpath, 0, &dups);
|
||||||
|
free(targetstr);
|
||||||
|
}
|
||||||
|
}
|
6
rpm.spec
6
rpm.spec
@ -29,7 +29,7 @@
|
|||||||
Summary: The RPM package management system
|
Summary: The RPM package management system
|
||||||
Name: rpm
|
Name: rpm
|
||||||
Version: %{rpmver}
|
Version: %{rpmver}
|
||||||
Release: %{?snapver:0.%{snapver}.}14%{?dist}
|
Release: %{?snapver:0.%{snapver}.}15%{?dist}
|
||||||
Group: System Environment/Base
|
Group: System Environment/Base
|
||||||
Url: http://www.rpm.org/
|
Url: http://www.rpm.org/
|
||||||
Source0: http://rpm.org/releases/%{srcdir}/%{name}-%{srcver}.tar.bz2
|
Source0: http://rpm.org/releases/%{srcdir}/%{name}-%{srcver}.tar.bz2
|
||||||
@ -93,6 +93,7 @@ Patch267: 0018-update-build-id-endian.patch
|
|||||||
Patch268: 0019-fix-sed-build-id-match-test.patch
|
Patch268: 0019-fix-sed-build-id-match-test.patch
|
||||||
Patch269: 0020-build-files-exec-build-id.patch
|
Patch269: 0020-build-files-exec-build-id.patch
|
||||||
Patch270: 0021-debugedit-Fix-off-by-one-adding-DW_FORM_string-repla.patch
|
Patch270: 0021-debugedit-Fix-off-by-one-adding-DW_FORM_string-repla.patch
|
||||||
|
Patch271: 0022-unbreak-short-circuit.patch
|
||||||
|
|
||||||
# OpenSSL backend
|
# OpenSSL backend
|
||||||
Patch300: 0001-Add-OpenSSL-support-for-digest-and-signatures.patch
|
Patch300: 0001-Add-OpenSSL-support-for-digest-and-signatures.patch
|
||||||
@ -597,6 +598,9 @@ exit 0
|
|||||||
%doc doc/librpm/html/*
|
%doc doc/librpm/html/*
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Mar 27 2017 Mark Wielaard <mjw@redhat.com> - 4.13.0.1-15
|
||||||
|
- Unbreak short-circuited binary builds (#1434235).
|
||||||
|
|
||||||
* Tue Mar 21 2017 Mark Wielaard <mjw@redhat.com> - 4.13.0.1-14
|
* Tue Mar 21 2017 Mark Wielaard <mjw@redhat.com> - 4.13.0.1-14
|
||||||
- Add fix for off by one adding DW_FORM_string replacement (#1434347).
|
- Add fix for off by one adding DW_FORM_string replacement (#1434347).
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user