Blob Blame History Raw
From b1c99cc21dd8dc984734cd2a66e48a5676280dee Mon Sep 17 00:00:00 2001
Message-ID: <b1c99cc21dd8dc984734cd2a66e48a5676280dee.1692617135.git.pmatilai@redhat.com>
From: Panu Matilainen <pmatilai@redhat.com>
Date: Mon, 21 Aug 2023 13:42:43 +0300
Subject: [PATCH] Behave more consistently when target arch %optflags are not
 defined

You're about to fall into a deep dark hole, proceed at your own risk.

When building for a target architecture with no defined %optflags
(such as noarch), one would think that %optflags would be empty. Not so in
rpm, instead we get %optflags for the detected architecture, and there
are packages which rely on this behavior. And in this particular dark
corner, buildarchtranslate is not applied so one can get drastically
different %optflags than you'd get without an explicit --target, on the
same system. Which can break builds.

None of this makes any sense whatsoever, but lets at least try to be
consistent about it. When we fall back to detected architecture
%optflags, at least use the ones after buildarchtranslate to return
consistent data within a host.

This supposedly fixes the case where our newly added x86_64
subarchitecture definitions haven't been overridden in vendor config and
somebody's noarch package uses cmake to install data, and falls over due
to nonsensical optflags from rpm. Or something like that.

Initial report: https://bugzilla.redhat.com/show_bug.cgi?id=2231727
---
 lib/rpmrc.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/lib/rpmrc.c b/lib/rpmrc.c
index 8a829709b..f8a7aee8c 100644
--- a/lib/rpmrc.c
+++ b/lib/rpmrc.c
@@ -1685,6 +1685,13 @@ static void rpmRebuildTargetVars(rpmrcCtx ctx,
  * XXX Make sure that per-arch optflags is initialized correctly.
  */
   { const char *optflags = rpmGetVarArch(ctx, RPMVAR_OPTFLAGS, ca);
+    /*
+     * If not defined for the target arch, fall back to current arch
+     * definitions, with buildarchtranslate applied.
+     */
+    if (optflags == NULL) {
+	optflags = rpmGetVarArch(ctx, RPMVAR_OPTFLAGS, NULL);
+    }
     if (optflags != NULL) {
 	rpmPopMacro(NULL, "optflags");
 	rpmPushMacro(NULL, "optflags", NULL, optflags, RMIL_RPMRC);
-- 
2.41.0