137 lines
3.5 KiB
Diff
Executable File
137 lines
3.5 KiB
Diff
Executable File
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)
|