lib/rpmrc.c: Update --target processing to support full GNU canonical arch

Prior to this patch, when using --target, RPM supported the format:
  <arch>
  <arch>-<os>
  <arch>-<os>-gnu
  <arch>-<arbitrary items>-<os>
  <arch>-<arbitrary items>-<os>-gnu

This patch changes the list of supported items to:
  <arch>
  <arch>-<os>
  <arch>-<os>-gnu
  <arch>-<vendor>-<os>
  <arch>-<vendor>-<os>-<extension>

Upstream-Status: Submitted [RPM5 maintainer]

Signed-off-by: Mark Hatle <mark.hatle@windriver.com>

Index: rpm-5.4.14/lib/rpmrc.c
===================================================================
--- rpm-5.4.14.orig/lib/rpmrc.c
+++ rpm-5.4.14/lib/rpmrc.c
@@ -925,8 +925,8 @@ static void getMachineInfo(int type, /*@
 
 static void rpmRebuildTargetVars(const char ** target, const char ** canontarget)
 {
-
-    char *ca = NULL, *co = NULL, *ct = NULL;
+    /* ca = arch, cv = vendor, co = os, ce = extension, ct = canon target */
+    char *ca = NULL, *cv = NULL, *co = NULL, *ce = NULL, *ct = NULL;
     int x;
 
     /* Rebuild the compat table to recalculate the current target arch.  */
@@ -936,23 +936,60 @@ static void rpmRebuildTargetVars(const c
     rpmSetTables(RPM_MACHTABLE_BUILDARCH, RPM_MACHTABLE_BUILDOS);
 
     if (target && *target) {
+	/* GNU canonical format is:
+	 *  <arch>-<vendor>-<os>[-extension]
+	 *
+	 * We support the both the GNU canonical format
+	 * as well as the traditional RPM formats: 
+	 *  <arch>
+	 *  <arch>-<os>[-gnu]
+	 */
 	char *c;
 	/* Set arch and os from specified build target */
 	ca = xstrdup(*target);
-	if ((c = strchr(ca, '-')) != NULL) {
+	if ((c = strchr(ca, '-')) == NULL) {
+	    /* Format is <arch> */
+	    ;
+	} else {
 	    *c++ = '\0';
-	    
-	    if ((co = strrchr(c, '-')) == NULL) {
-		co = c;
+	    cv = c;
+
+	    if ((c = strchr(c, '-')) == NULL) {
+		/* Format is <arch>-<os> */
+		co = cv;
+		cv = NULL;
 	    } else {
-		if (!xstrcasecmp(co, "-gnu"))
-		    *co = '\0';
-		if ((co = strrchr(c, '-')) == NULL)
-		    co = c;
-		else
-		    co++;
+		*c++ = '\0';
+		co = c;
+
+		if ((c = strchr(c, '-')) == NULL) {
+		    /* Might be:
+		     *  <arch>-<vendor>-<os>
+		     *  <arch>-<os>-gnu
+		     */
+		    if (!xstrcasecmp(co, "gnu")) {
+			/* Format was <arch>-<os>-gnu */
+			ce = co;
+			co = cv;
+			cv = NULL;
+		    }
+		} else {
+		    /* Format was <arch>-<vendor>-<os>-<extension> */
+		    *c++ = '\0';
+		    ce = c;
+		}
 	    }
+	    if (cv != NULL) cv = xstrdup(cv);
 	    if (co != NULL) co = xstrdup(co);
+	    if (ce != NULL) {
+		/* We need to prefix it with a "-" */
+		char * lce = NULL;
+
+		lce = xmalloc(strlen(ce) + sizeof("-"));
+		sprintf(lce, "-%s", ce);
+
+		ce = lce;
+	    }
 	}
     } else {
 	const char *a = NULL;
@@ -995,8 +1032,16 @@ static void rpmRebuildTargetVars(const c
     addMacro(NULL, "_target", NULL, ct, RMIL_RPMRC);
     delMacro(NULL, "_target_cpu");
     addMacro(NULL, "_target_cpu", NULL, ca, RMIL_RPMRC);
+    if (cv) {
+	delMacro(NULL, "_target_vendor");
+	addMacro(NULL, "_target_vendor", NULL, cv, RMIL_RPMRC);
+    }
     delMacro(NULL, "_target_os");
     addMacro(NULL, "_target_os", NULL, co, RMIL_RPMRC);
+    if (ce) {
+	delMacro(NULL, "_gnu");
+	addMacro(NULL, "_gnu", NULL, ce, RMIL_RPMRC);
+    }
 
     if (canontarget)
 	*canontarget = ct;
@@ -1004,8 +1049,12 @@ static void rpmRebuildTargetVars(const c
 	ct = _free(ct);
     ca = _free(ca);
     /*@-usereleased@*/
+    cv = _free(cv);
+    /*@-usereleased@*/
     co = _free(co);
     /*@=usereleased@*/
+    ce = _free(ce);
+    /*@-usereleased@*/
 }
 
 void rpmFreeRpmrc(void)
