[PATCH] Warn when macro options evaporate silently

Alexey Tourbin alexey.tourbin at gmail.com
Mon Jan 21 23:20:17 UTC 2013


In the %name form, when the name is invalid or when the macro does
not exist, a silent fall-back is provisioned to as-is substitution.
On the contrary, the %-o form has %?name semantics, that is, implies
an existent test.  Hence at the top level, i.e. in specfile sections,
options always evaporate silently.  Given the ambiguity of the %-o form,
this deserves a warning.

For example, the following line found in FC18 xfce4-taskmanager.spec:
- Add patch to fix 0%-CPU bug
gets actually expanded to:
- Add patch to fix 0PU bug
This will now produce the warning:
warning: %-CPU parsed as %{-C}PU
---
 rpmio/macro.c | 33 ++++++++++++++-------------------
 1 file changed, 14 insertions(+), 19 deletions(-)

diff --git a/rpmio/macro.c b/rpmio/macro.c
index 2abdbd4..a2778d1 100644
--- a/rpmio/macro.c
+++ b/rpmio/macro.c
@@ -1178,6 +1178,18 @@ expandMacro(MacroBuf mb, const char *src, size_t slen)
 			continue;
 		}
 		se = fe;
+		/* beware: options evaporate silently */
+		if (*f == '-' && mb->depth == 1) {
+			/* show how the whole token is parsed */
+			const char *te = se;
+			while (*te && !risspace(*te))
+				te++;
+			rpmlog(RPMLOG_WARNING,
+				_("%%%.*s parsed as %%{%.*s}%.*s\n"),
+				(int)(te - s), s,
+				(int)(se - s), s,
+				(int)(te - se), se);
+		}
 		/* For "%name " macros ... */
 		if ((c = *fe) && isblank(c))
 			if ((lastc = strchr(fe,'\n')) == NULL)
@@ -1338,8 +1350,8 @@ expandMacro(MacroBuf mb, const char *src, size_t slen)
 	mep = findEntry(mb->mc, f, fn);
 	me = (mep ? *mep : NULL);
 
-	/* XXX Special processing for flags */
-	if (*f == '-') {
+	/* Special processing for getopt flags and macro existence */
+	if (*f == '-' || chkexist) {
 		if (me)
 			me->used++;	/* Mark macro as used */
 		if ((me == NULL && !negate) ||	/* Without -f, skip %{-f...} */
@@ -1358,23 +1370,6 @@ expandMacro(MacroBuf mb, const char *src, size_t slen)
 		continue;
 	}
 
-	/* XXX Special processing for macro existence */
-	if (chkexist) {
-		if ((me == NULL && !negate) ||	/* Without -f, skip %{?f...} */
-		    (me != NULL && negate)) {	/* With -f, skip %{!?f...} */
-			s = se;
-			continue;
-		}
-		if (g && g < ge) {		/* Expand X in %{?f:X} */
-			rc = expandMacro(mb, g, gn);
-		} else
-		if (me && me->body && *me->body) { /* Expand %{?f}/%{?f*} */
-			rc = expandMacro(mb, me->body, 0);
-		}
-		s = se;
-		continue;
-	}
-	
 	if (me == NULL) {	/* leave unknown %... as is */
 		/* XXX hack to permit non-overloaded %foo to be passed */
 		c = '%';	/* XXX only need to save % */
-- 
1.8.1



More information about the Rpm-list mailing list