Backport fixes for debuginfo subpackages

Signed-off-by: Igor Gnatenko <ignatenkobrain@fedoraproject.org>
This commit is contained in:
Igor Gnatenko 2017-07-28 19:35:07 +02:00
parent 908fe913e5
commit 53960f5052
9 changed files with 395 additions and 37 deletions

View File

@ -1,32 +0,0 @@
From 64c70fcdd9751cf1e8d25f1240fa7a0ea4e353fc Mon Sep 17 00:00:00 2001
From: Mark Wielaard <mark@klomp.org>
Date: Wed, 26 Jul 2017 02:37:17 +0200
Subject: [PATCH] Make sure that debugsourcefiles.list is generated in the
build dir.
The %_debugsource_template expects the debugsourcefiles.list file
to be in the (current) build dir. Make sure that is always the case
even if find-debuginfo.sh was invoked in a different (sub) directory
by adding the build dir path as explicit argument to -S.
Signed-off-by: Mark Wielaard <mark@klomp.org>
---
macros.in | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/macros.in b/macros.in
index f71fcc103..d882fa794 100644
--- a/macros.in
+++ b/macros.in
@@ -185,7 +185,7 @@
%{?_unique_debug_srcs:--unique-debug-src-base "%{name}-%{VERSION}-%{RELEASE}.%{_arch}"} \\\
%{?_find_debuginfo_dwz_opts} \\\
%{?_find_debuginfo_opts} \\\
- %{?_debugsource_packages:-S debugsourcefiles.list} \\\
+ %{?_debugsource_packages:-S "%{_builddir}/%{?buildsubdir}/debugsourcefiles.list"} \\\
"%{_builddir}/%{?buildsubdir}"\
%{nil}
--
2.13.3

View File

@ -0,0 +1,24 @@
From 726e2bb66c16e3a70664185b246de910dc5b9010 Mon Sep 17 00:00:00 2001
From: Igor Gnatenko <i.gnatenko.brain@gmail.com>
Date: Fri, 28 Jul 2017 14:32:20 +0200
Subject: [PATCH] remove duplicated call to strlen()
It is already done few lines above.
Signed-off-by: Igor Gnatenko <i.gnatenko.brain@gmail.com>
---
build/files.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/build/files.c b/build/files.c
index 9b1d2cd98..2238c2453 100644
--- a/build/files.c
+++ b/build/files.c
@@ -2764,7 +2764,6 @@ static void filterDebuginfoPackage(rpmSpec spec, Package pkg,
int namel = strlen(name);
/* strip trailing .debug like in find-debuginfo.sh */
- namel = strlen(name);
if (namel > 6 && !strcmp(name + namel - 6, ".debug"))
namel -= 6;

View File

@ -0,0 +1,64 @@
From 90007b550cf585c9cb9427e1fd0b2d8f56c9c2b5 Mon Sep 17 00:00:00 2001
From: Igor Gnatenko <i.gnatenko.brain@gmail.com>
Date: Fri, 28 Jul 2017 14:33:29 +0200
Subject: [PATCH] store path of excluded files
We will need this in next commit so we know which files
were excluded and we will exclude respective debug files.
Signed-off-by: Igor Gnatenko <i.gnatenko.brain@gmail.com>
---
build/files.c | 6 +++++-
build/rpmbuild_internal.h | 1 +
build/spec.c | 2 ++
3 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/build/files.c b/build/files.c
index 2238c2453..988b3b315 100644
--- a/build/files.c
+++ b/build/files.c
@@ -1060,7 +1060,11 @@ static void genCpioListAndHeader(FileList fl, Package pkg, int isSrc)
}
/* Skip files that were marked with %exclude. */
- if (flp->flags & RPMFILE_EXCLUDE) continue;
+ if (flp->flags & RPMFILE_EXCLUDE)
+ {
+ argvAdd(&pkg->fileExcludeList, flp->diskPath);
+ continue;
+ }
/* Collect on-disk paths for archive creation */
pkg->dpaths[npaths++] = xstrdup(flp->diskPath);
diff --git a/build/rpmbuild_internal.h b/build/rpmbuild_internal.h
index 1c3332faf..5978a6d32 100644
--- a/build/rpmbuild_internal.h
+++ b/build/rpmbuild_internal.h
@@ -118,6 +118,7 @@ struct Package_s {
ARGV_t fileFile;
ARGV_t fileList; /* If NULL, package will not be written */
+ ARGV_t fileExcludeList;
ARGV_t removePostfixes;
ARGV_t policyList;
diff --git a/build/spec.c b/build/spec.c
index 7cb264abd..c33cde7eb 100644
--- a/build/spec.c
+++ b/build/spec.c
@@ -101,6 +101,7 @@ Package newPackage(const char *name, rpmstrPool pool, Package *pkglist)
p->autoProv = 1;
p->autoReq = 1;
p->fileList = NULL;
+ p->fileExcludeList = NULL;
p->fileFile = NULL;
p->policyList = NULL;
p->pool = rpmstrPoolLink(pool);
@@ -143,6 +144,7 @@ static Package freePackage(Package pkg)
}
pkg->fileList = argvFree(pkg->fileList);
+ pkg->fileExcludeList = argvFree(pkg->fileExcludeList);
pkg->fileFile = argvFree(pkg->fileFile);
pkg->policyList = argvFree(pkg->policyList);
pkg->removePostfixes = argvFree(pkg->removePostfixes);

View File

@ -0,0 +1,46 @@
From 651d9355f6db9f4d1305c25af5a953289dc8ef47 Mon Sep 17 00:00:00 2001
From: Igor Gnatenko <i.gnatenko.brain@gmail.com>
Date: Fri, 28 Jul 2017 15:21:00 +0200
Subject: [PATCH] exclude respective debug files for files which are excluded
Closes: https://github.com/rpm-software-management/rpm/issues/284
Signed-off-by: Igor Gnatenko <i.gnatenko.brain@gmail.com>
---
build/files.c | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/build/files.c b/build/files.c
index 988b3b315..a29730998 100644
--- a/build/files.c
+++ b/build/files.c
@@ -1062,7 +1062,7 @@ static void genCpioListAndHeader(FileList fl, Package pkg, int isSrc)
/* Skip files that were marked with %exclude. */
if (flp->flags & RPMFILE_EXCLUDE)
{
- argvAdd(&pkg->fileExcludeList, flp->diskPath);
+ argvAdd(&pkg->fileExcludeList, flp->cpioPath);
continue;
}
@@ -2802,6 +2802,21 @@ static void filterDebuginfoPackage(rpmSpec spec, Package pkg,
}
path = _free(path);
}
+ /* Exclude debug files for files which were excluded in respective non-debug package */
+ for (ARGV_const_t excl = pkg->fileExcludeList; excl && *excl; excl++) {
+ const char *name = *excl;
+
+ /* generate path */
+ rasprintf(&path, "%s%s%s%s.debug", buildroot, DEBUG_LIB_DIR, name, uniquearch);
+ /* Exclude only debuginfo files which actually exist */
+ if (access(path, F_OK) == 0) {
+ char *line = NULL;
+ rasprintf(&line, "%%exclude %s", path + buildrootlen);
+ argvAdd(&files, line);
+ _free(line);
+ }
+ path = _free(path);
+ }
/* add collected directories to file list */
if (dirs) {

View File

@ -0,0 +1,125 @@
From f1e03904fc7173c772cb5795f6df30591f790b01 Mon Sep 17 00:00:00 2001
From: Igor Gnatenko <i.gnatenko.brain@gmail.com>
Date: Fri, 28 Jul 2017 18:30:37 +0200
Subject: [PATCH] store mapping for renamed files
We will need this in next commit so we know which original name
files had, so we can reference appropriate debug file.
Signed-off-by: Igor Gnatenko <i.gnatenko.brain@gmail.com>
---
build/files.c | 40 +++++++++++++++++++++++++++++-----------
build/rpmbuild_internal.h | 12 ++++++++++++
build/spec.c | 2 ++
3 files changed, 43 insertions(+), 11 deletions(-)
diff --git a/build/files.c b/build/files.c
index a29730998..2387a2e5b 100644
--- a/build/files.c
+++ b/build/files.c
@@ -50,6 +50,17 @@
#define DEBUG_ID_DIR "/usr/lib/debug/.build-id"
#define DEBUG_DWZ_DIR "/usr/lib/debug/.dwz"
+#undef HASHTYPE
+#undef HTKEYTYPE
+#undef HTDATATYPE
+#define HASHTYPE fileRenameHash
+#define HTKEYTYPE const char *
+#define HTDATATYPE char *
+#include "lib/rpmhash.C"
+#undef HASHTYPE
+#undef HTKEYTYPE
+#undef HTDATATYPE
+
/**
*/
enum specfFlags_e {
@@ -982,19 +993,26 @@ static void genCpioListAndHeader(FileList fl, Package pkg, int isSrc)
}
/* Adjust paths if needed */
- if (!isSrc && pkg->removePostfixes)
- for (i = 0, flp = fl->files.recs; i < fl->files.used; i++, flp++) {
- char * cpiopath = flp->cpioPath;
-
- for (ARGV_const_t postfix_p = pkg->removePostfixes; *postfix_p; postfix_p++) {
- int len = strlen(*postfix_p);
- int plen = strlen(cpiopath);
- if (len <= plen && !strncmp(cpiopath+plen-len, *postfix_p, len)) {
- cpiopath[plen-len] = '\0';
- if (plen-len > 0 && cpiopath[plen-len-1] == '/') {
- cpiopath[plen-len-1] = '\0';
+ if (!isSrc && pkg->removePostfixes) {
+ pkg->fileRenameMap = fileRenameHashCreate(fl->files.used,
+ rstrhash, strcmp,
+ (fileRenameHashFreeKey)rfree, (fileRenameHashFreeData)rfree);
+ for (i = 0, flp = fl->files.recs; i < fl->files.used; i++, flp++) {
+ char * cpiopath = flp->cpioPath;
+ char * cpiopath_orig = xstrdup(cpiopath);
+
+ for (ARGV_const_t postfix_p = pkg->removePostfixes; *postfix_p; postfix_p++) {
+ int len = strlen(*postfix_p);
+ int plen = strlen(cpiopath);
+ if (len <= plen && !strncmp(cpiopath+plen-len, *postfix_p, len)) {
+ cpiopath[plen-len] = '\0';
+ if (plen-len > 0 && cpiopath[plen-len-1] == '/') {
+ cpiopath[plen-len-1] = '\0';
+ }
}
}
+ if (strcmp(cpiopath_orig, cpiopath))
+ fileRenameHashAddEntry(pkg->fileRenameMap, xstrdup(cpiopath), cpiopath_orig);
}
}
diff --git a/build/rpmbuild_internal.h b/build/rpmbuild_internal.h
index 5978a6d32..b4247ae61 100644
--- a/build/rpmbuild_internal.h
+++ b/build/rpmbuild_internal.h
@@ -6,6 +6,17 @@
#include <rpm/rpmstrpool.h>
#include "build/rpmbuild_misc.h"
+#undef HASHTYPE
+#undef HTKEYTYPE
+#undef HTDATATYPE
+#define HASHTYPE fileRenameHash
+#define HTKEYTYPE const char *
+#define HTDATATYPE char *
+#include "lib/rpmhash.H"
+#undef HASHTYPE
+#undef HTKEYTYPE
+#undef HTDATATYPE
+
struct TriggerFileEntry {
int index;
char * fileName;
@@ -120,6 +131,7 @@ struct Package_s {
ARGV_t fileList; /* If NULL, package will not be written */
ARGV_t fileExcludeList;
ARGV_t removePostfixes;
+ fileRenameHash fileRenameMap;
ARGV_t policyList;
Package next;
diff --git a/build/spec.c b/build/spec.c
index c33cde7eb..eaa5dce61 100644
--- a/build/spec.c
+++ b/build/spec.c
@@ -104,6 +104,7 @@ Package newPackage(const char *name, rpmstrPool pool, Package *pkglist)
p->fileExcludeList = NULL;
p->fileFile = NULL;
p->policyList = NULL;
+ p->fileRenameMap = NULL;
p->pool = rpmstrPoolLink(pool);
p->dpaths = NULL;
@@ -148,6 +149,7 @@ static Package freePackage(Package pkg)
pkg->fileFile = argvFree(pkg->fileFile);
pkg->policyList = argvFree(pkg->policyList);
pkg->removePostfixes = argvFree(pkg->removePostfixes);
+ pkg->fileRenameMap = fileRenameHashFree(pkg->fileRenameMap);
pkg->cpioList = rpmfilesFree(pkg->cpioList);
pkg->dpaths = argvFree(pkg->dpaths);

View File

@ -0,0 +1,36 @@
From d145899932ed040cdaaed70a7ce2ea0f11757ab6 Mon Sep 17 00:00:00 2001
From: Igor Gnatenko <i.gnatenko.brain@gmail.com>
Date: Fri, 28 Jul 2017 18:32:06 +0200
Subject: [PATCH] reference proper debug files whenever RemovePathPostfixes is
used
Closes: https://github.com/rpm-software-management/rpm/issues/280
Signed-off-by: Igor Gnatenko <i.gnatenko.brain@gmail.com>
---
build/files.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/build/files.c b/build/files.c
index 2387a2e5b..a4b5cd6e8 100644
--- a/build/files.c
+++ b/build/files.c
@@ -2788,6 +2788,19 @@ static void filterDebuginfoPackage(rpmSpec spec, Package pkg,
/* strip trailing .debug like in find-debuginfo.sh */
if (namel > 6 && !strcmp(name + namel - 6, ".debug"))
namel -= 6;
+
+ /* fileRenameMap doesn't necessarily have to be initialized */
+ if (pkg->fileRenameMap) {
+ char **names = NULL;
+ int namec = 0;
+ fileRenameHashGetEntry(pkg->fileRenameMap, name, &names, &namec, NULL);
+ if (namec) {
+ if (namec > 1)
+ rpmlog(RPMLOG_WARNING, _("%s was mapped to multiple filenames"), name);
+ name = *names;
+ namel = strlen(name);
+ }
+ }
/* generate path */
rasprintf(&path, "%s%s%.*s%s.debug", buildroot, DEBUG_LIB_DIR, namel, name, uniquearch);

View File

@ -0,0 +1,32 @@
From 56c2885d708bc3485cad2b14205224e082ff2d01 Mon Sep 17 00:00:00 2001
From: Igor Gnatenko <i.gnatenko.brain@gmail.com>
Date: Fri, 28 Jul 2017 07:42:38 +0200
Subject: [PATCH] find-debuginfo.sh: make sure that debugsourcefiles.list is
generated under the builddir
The %_debugsource_template expects the debugsourcefiles.list file
to be in the (current) build dir. Make sure that is always the case
even if find-debuginfo.sh was invoked in a different (sub) directory
by prepending $BUILDDIR to the output file as written in description
"All file names in switches are relative to builddir (. if not given).".
Closes: https://github.com/rpm-software-management/rpm/issues/279
Based-on-patch-by: Mark Wielaard <mark@klomp.org>
Signed-off-by: Igor Gnatenko <i.gnatenko.brain@gmail.com>
(cherry picked from commit 436b6ce0ddf33f90f8efd967f0457efce23bd71f)
---
scripts/find-debuginfo.sh | 1 +
1 file changed, 1 insertion(+)
diff --git a/scripts/find-debuginfo.sh b/scripts/find-debuginfo.sh
index b83e4c6db..af065cd23 100644
--- a/scripts/find-debuginfo.sh
+++ b/scripts/find-debuginfo.sh
@@ -566,6 +566,7 @@ if [ -d "${RPM_BUILD_ROOT}/usr/lib" -o -d "${RPM_BUILD_ROOT}/usr/src" ]; then
fi
if [ -n "$srcout" ]; then
+ srcout="$BUILDDIR/$srcout"
> "$srcout"
if [ -d "${RPM_BUILD_ROOT}/usr/src/debug" ]; then
(cd "${RPM_BUILD_ROOT}/usr"

View File

@ -0,0 +1,50 @@
From c32af0184db82f74bf506873ec9a69970299dd18 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
Date: Thu, 19 Nov 2015 13:38:19 +0000
Subject: [PATCH] Avoid redundant processing for RemovePathPostfixes
Only iterate over the file list if RemovePathPostfixes: has been specified.
Also don't bother reallocating the paths as the existing path modified in
place will suffice.
(cherry picked from commit 8e8571a7f33d1ecc5a0c0b62196fd79b26a6052e)
---
build/files.c | 11 ++---------
1 file changed, 2 insertions(+), 9 deletions(-)
diff --git a/build/files.c b/build/files.c
index 29274926c..9b1d2cd98 100644
--- a/build/files.c
+++ b/build/files.c
@@ -980,29 +980,22 @@ static void genCpioListAndHeader(FileList fl, Package pkg, int isSrc)
digestalgo);
digestalgo = defaultalgo;
}
-
+
/* Adjust paths if needed */
+ if (!isSrc && pkg->removePostfixes)
for (i = 0, flp = fl->files.recs; i < fl->files.used; i++, flp++) {
- int changed = 0;
char * cpiopath = flp->cpioPath;
- if (!isSrc && pkg->removePostfixes)
for (ARGV_const_t postfix_p = pkg->removePostfixes; *postfix_p; postfix_p++) {
int len = strlen(*postfix_p);
int plen = strlen(cpiopath);
if (len <= plen && !strncmp(cpiopath+plen-len, *postfix_p, len)) {
cpiopath[plen-len] = '\0';
- changed = 1;
if (plen-len > 0 && cpiopath[plen-len-1] == '/') {
cpiopath[plen-len-1] = '\0';
}
}
}
- if (changed) {
- char * tmp = xstrdup(cpiopath);
- _free(flp->cpioPath);
- flp->cpioPath = tmp;
- }
}
/* Sort the big list */

View File

@ -29,7 +29,7 @@
Summary: The RPM package management system
Name: rpm
Version: %{rpmver}
Release: %{?snapver:0.%{snapver}.}38%{?dist}
Release: %{?snapver:0.%{snapver}.}39%{?dist}
Group: System Environment/Base
Url: http://www.rpm.org/
Source0: http://ftp.rpm.org/releases/%{srcdir}/%{name}-%{srcver}.tar.bz2
@ -155,14 +155,24 @@ Patch335: 0059-Fix-error-handling-in-rpmio-Python-binding-test-case.patch
# Finally make sure that test results are not ignored ;)
Patch340: 0060-Return-error-exit-status-when-make-check-is-failed.patch
# Fix for generation of debugsourcefiles.list in subdirectory
Patch341: 0061-find-debuginfo.sh-make-sure-that-debugsourcefiles.li.patch
# Trivial improvement for RemovePathPostfixes
Patch342: 0062-Avoid-redundant-processing-for-RemovePathPostfixes.patch
# These are not yet upstream
# Enable debugsource and debuginfo subpackages by default
Patch900: 0001-macros-enable-debugsource-and-debuginfo-subpkgs-by-d.patch
# Fixes for debugsource/debuginfo-ubspackages
Patch901: 0001-Make-sure-that-debugsourcefiles.list-is-generated-in.patch
Patch902: rpm-4.7.1-geode-i686.patch
# debuginfo_subpackages fixes
Patch901: 0001-remove-duplicated-call-to-strlen.patch
Patch902: 0002-store-path-of-excluded-files.patch
Patch903: 0003-exclude-respective-debug-files-for-files-which-are-e.patch
Patch904: 0004-store-mapping-for-renamed-files.patch
Patch905: 0005-reference-proper-debug-files-whenever-RemovePathPost.patch
Patch906: rpm-4.7.1-geode-i686.patch
# Probably to be upstreamed in slightly different form
Patch904: rpm-4.13.90-ldflags.patch
Patch907: rpm-4.13.90-ldflags.patch
# Partially GPL/LGPL dual-licensed and some bits with BSD
# SourceLicense: (GPLv2+ and LGPLv2+ with exceptions) and BSD
@ -657,6 +667,9 @@ exit 0
%doc doc/librpm/html/*
%changelog
* Fri Jul 28 2017 Igor Gnatenko <ignatenkobrain@fedoraproject.org> - 4.13.0.1-39
- Backport fixes for debuginfo subpackages
* Wed Jul 26 2017 Igor Gnatenko <ignatenkobrain@fedoraproject.org> - 4.13.0.1-38
- Backport trivial fix for debugsourcefiles.list ending up in random dir