| 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: Pending |
| |
| 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) |