blob: 81fc84937a17b13e94a8b24e13ca5f9ada4362ab [file] [log] [blame]
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)