On 09/18/2017 06:56 PM, Mark Wielaard wrote:
Debuginfo packages are useful without debugsource files. But it is often
useful to also have the debugsourc files. So make debuginfo packages that
don't contain sources recommend the debugsource package (or the main
debuginfo one if the sources are not in a separate debugsource package).
Rename addPackageRequires to addPackageRequiresRecommends with an argument
to indicate whether the package is required or recommended. Move up so it
can be used with filterDebuginfoPackage. Add Package dbgsrc as argument to
filterDebuginfoPackage so it can be added as recommendation. Add a new
function findDebugsourcePackage. Use it to add a requires to the main
debuginfo file and/or the debuginfo subpackages.
Extend the various rpmbuild.at tests that create debugsource and/or
debuginfo subpackages to check the debugsource (or main debuginfo)
package is recommended.
No objections to the functionality, but some style nits + suggestions
below...
Signed-off-by: Mark Wielaard <m...@klomp.org>
---
build/files.c | 59 ++++++++++++++++++++++++++++++++++++++++---------------
tests/rpmbuild.at | 46 ++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 88 insertions(+), 17 deletions(-)
diff --git a/build/files.c b/build/files.c
index 5e84532..86ec80a 100644
--- a/build/files.c
+++ b/build/files.c
@@ -2773,6 +2773,21 @@ static void patchDebugPackageString(Package dbg, rpmTag
tag, Package pkg, Packag
_free(newsubst);
}
+/* add a requires or recommends for package "to" into package "from". */
+static void addPackageRequiresRecommends(Package from, Package to,
+ bool recommends)
+{
+ const char *name;
+ char *evr, *isaprov;
+ enum rpmTag_e tag = recommends ? RPMTAG_RECOMMENDNAME : RPMTAG_REQUIRENAME;
+ name = headerGetString(to->header, RPMTAG_NAME);
+ evr = headerGetAsString(to->header, RPMTAG_EVR);
+ isaprov = rpmExpand(name, "%{?_isa}", NULL);
+ addReqProv(from, tag, isaprov, evr, RPMSENSE_EQUAL, 0);
+ free(isaprov);
+ free(evr);
+}
Moving an entire function while also changing it is a bit of a no-no,
because it's makes it hard to see what actually changed. Moving things
around also obfuscates git history, which is why I prefer adding a
prototype to the top of the file instead. But if you need to move stuff
around (such as different file entirely), do so in a separate commit
that doesn't change anything and also state this in the commit message.
Also please split refactoring changes like this to separate commits:
one commit that does the necessary enhancements/changes to
addPackageRequires() and updates existing callers, and another commit to
add the new functionality. It just makes things the diffs so much more
obvious and nicer to review.
+
/* create a new debuginfo subpackage for package pkg from the
* main debuginfo package */
static Package cloneDebuginfoPackage(rpmSpec spec, Package pkg, Package
maindbg)
@@ -2805,7 +2820,8 @@ static Package cloneDebuginfoPackage(rpmSpec spec,
Package pkg, Package maindbg)
/* collect the debug files for package pkg and put them into
* a (possibly new) debuginfo subpackage */
static void filterDebuginfoPackage(rpmSpec spec, Package pkg,
- Package maindbg, char *buildroot, char *uniquearch)
+ Package maindbg, Package dbgsrc,
+ char *buildroot, char *uniquearch)
{
rpmfi fi;
ARGV_t files = NULL;
@@ -2914,6 +2930,8 @@ static void filterDebuginfoPackage(rpmSpec spec, Package
pkg,
else {
Package dbg = cloneDebuginfoPackage(spec, pkg, maindbg);
dbg->fileList = files;
+ /* Recommend the debugsource package (or the main debuginfo). */
+ addPackageRequiresRecommends(dbg, dbgsrc ?: maindbg, true);
Omitting middle operand of conditional expressions is a gcc extension,
those are best avoided in general and especially when there's no actual
need to use one.
[...]
@@ -3038,6 +3056,12 @@ rpmRC processBinaryFiles(rpmSpec spec, rpmBuildPkgFlags
pkgFlags,
if (rpmExpandNumeric("%{?_unique_debug_names}"))
uniquearch = rpmExpand("-%{VERSION}-%{RELEASE}.%{_arch}", NULL);
}
+ } else if (dbgsrcpkg != NULL) {
+ /* We have a debugsource package, but no debuginfo subpackages.
+ The main debuginfo package should recommend the debugsource one. */
+ Package dbgpkg = findDebuginfoPackage(spec);
+ if (dbgpkg)
+ addPackageRequiresRecommends(dbgpkg, dbgsrcpkg, true);
}
for (pkg = spec->packages; pkg != NULL; pkg = pkg->next) {
@@ -3055,6 +3079,8 @@ rpmRC processBinaryFiles(rpmSpec spec, rpmBuildPkgFlags
pkgFlags,
deplink = extradbg;
if (addDebugSrc(extradbg, buildroot))
deplink = extradbg;
+ if (dbgsrcpkg != NULL)
+ addPackageRequiresRecommends(extradbg, dbgsrcpkg, true);
maindbg = NULL; /* all normal packages processed */
}
@@ -3071,9 +3097,10 @@ rpmRC processBinaryFiles(rpmSpec spec, rpmBuildPkgFlags pkgFlags,
goto exit;
if (maindbg)
- filterDebuginfoPackage(spec, pkg, maindbg, buildroot, uniquearch);
+ filterDebuginfoPackage(spec, pkg, maindbg, dbgsrcpkg,
+ buildroot, uniquearch);
else if (deplink && pkg != deplink)
- addPackageRequires(pkg, deplink);
+ addPackageRequiresRecommends(pkg, deplink, false);
Hmm, I think this would be both more obvious and generally useful if you
just call the function addPackageDeps() and pass the relevant dependency
tag instead of true/false for require/recommend, eg
addPackageDeps(pkg, deplink, RPMTAG_REQUIRENAME);
addPackageDeps(extradbg, dbgsrcpkg, RPMTAG_RECOMMENDNAME);
vs
addPackageRequiresRecommends(pkg, deplink, false);
addPackageRequiresRecommends(extradbg, dbgsrcpkg, true);
That way we wont end up with
addPackageRequiresRecommendsConflictsObsoltetes() one day :)
- Panu -
_______________________________________________
Rpm-maint mailing list
Rpm-maint@lists.rpm.org
http://lists.rpm.org/mailman/listinfo/rpm-maint