summaryrefslogtreecommitdiff
path: root/src/mkheader.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mkheader.c')
-rw-r--r--src/mkheader.c92
1 files changed, 77 insertions, 15 deletions
diff --git a/src/mkheader.c b/src/mkheader.c
index 2fc5fad..7a38a1b 100644
--- a/src/mkheader.c
+++ b/src/mkheader.c
@@ -51,17 +51,27 @@ xfree (void *a)
static char *
-xstrdup (const char *string)
+xmalloc (size_t n)
{
char *p;
- size_t len = strlen (string) + 1;
- p = malloc (len);
+ p = malloc (n);
if (!p)
{
fputs (PGM ": out of core\n", stderr);
exit (1);
}
+ return p;
+}
+
+
+static char *
+xstrdup (const char *string)
+{
+ char *p;
+ size_t len = strlen (string) + 1;
+
+ p = xmalloc (len);
memcpy (p, string, len);
return p;
}
@@ -69,23 +79,31 @@ xstrdup (const char *string)
/* Return a malloced string with TRIPLET. If TRIPLET has an alias
return that instead. In general build-aux/config.sub should do the
- aliasing but some returned triplets are anyway identical and thus we
- use this function to map it to the canonical form. */
+ aliasing but some returned triplets are anyway identical and thus
+ we use this function to map it to the canonical form.
+ NO_VENDOR_HACK is for internal use; caller must call with 0. */
static char *
-canon_host_triplet (const char *triplet)
+canon_host_triplet (const char *triplet, int no_vendor_hack)
{
struct {
const char *name;
const char *alias;
} tbl[] = {
- {"i486-pc-linux-gnu", "i686-pc-linux-gnu" },
+ {"i486-pc-linux-gnu", "i686-unknown-linux-gnu" },
{"i586-pc-linux-gnu" },
- {"i486-pc-gnu", "i686-pc-gnu"},
+ {"i686-pc-linux-gnu" },
+ {"arc-oe-linux-uclibc" }, /* Other CPU but same struct. */
+
+ {"i486-pc-gnu", "i686-unknown-gnu"},
{"i586-pc-gnu"},
- {"i486-pc-kfreebsd-gnu", "i686-pc-kfreebsd-gnu"},
+ {"i686-pc-gnu"},
+
+ {"i486-pc-kfreebsd-gnu", "i686-unknown-kfreebsd-gnu"},
{"i586-pc-kfreebsd-gnu"},
+ {"i686-pc-kfreebsd-gnu"},
- {"x86_64-pc-linux-gnuhardened1", "x86_64-pc-linux-gnu" },
+ {"x86_64-pc-linux-gnuhardened1", "x86_64-unknown-linux-gnu" },
+ {"x86_64-pc-linux-gnu" },
{"powerpc-unknown-linux-gnuspe", "powerpc-unknown-linux-gnu" },
@@ -98,6 +116,7 @@ canon_host_triplet (const char *triplet)
};
int i;
const char *lastalias = NULL;
+ const char *s;
for (i=0; tbl[i].name; i++)
{
@@ -110,6 +129,36 @@ canon_host_triplet (const char *triplet)
return xstrdup (lastalias);
}
}
+ for (i=0, s=triplet; *s; s++)
+ if (*s == '-')
+ i++;
+ if (i > 2 && !no_vendor_hack)
+ {
+ /* We have a 4 part "triplet": CPU-VENDOR-KERNEL-SYSTEM where
+ * the last two parts replace the OS part of a real triplet.
+ * The VENDOR part is then in general useless because
+ * KERNEL-SYSTEM is specific enough. We now do a second pass by
+ * replacing VENDOR with "unknown". */
+ char *p;
+ char *buf = xmalloc (strlen (triplet) + 7 + 1);
+
+ for (p=buf,s=triplet,i=0; *s; s++)
+ {
+ *p++ = *s;
+ if (*s == '-' && ++i == 1)
+ {
+ memcpy (p, "unknown-",8);
+ p += 8;
+ for (s++; *s != '-'; s++)
+ ;
+ }
+ }
+ *p = 0;
+ p = canon_host_triplet (buf, 1);
+ xfree (buf);
+ return p;
+ }
+
return xstrdup (triplet);
}
@@ -558,7 +607,7 @@ write_special (const char *fname, int lnr, const char *tag)
int
main (int argc, char **argv)
{
- FILE *fp;
+ FILE *fp = NULL;
char line[LINESIZE];
int lnr = 0;
const char *fname, *s;
@@ -571,11 +620,22 @@ main (int argc, char **argv)
argc--; argv++;
}
- if (argc != 6)
+ if (argc == 1)
+ {
+ /* Print just the canonicalized host triplet. */
+ host_triplet = canon_host_triplet (argv[0], 0);
+ printf ("%s\n", host_triplet);
+ goto leave;
+ }
+ else if (argc == 6)
+ ; /* Standard operation. */
+ else
{
fputs ("usage: " PGM
" host_os host_triplet template.h config.h"
- " version version_number\n",
+ " version version_number\n"
+ " " PGM
+ " host_triplet\n",
stderr);
return 1;
}
@@ -586,7 +646,7 @@ main (int argc, char **argv)
hdr_version = argv[4];
hdr_version_number = argv[5];
- host_triplet = canon_host_triplet (host_triplet_raw);
+ host_triplet = canon_host_triplet (host_triplet_raw, 0);
srcdir = malloc (strlen (fname) + 2 + 1);
if (!srcdir)
@@ -677,13 +737,15 @@ main (int argc, char **argv)
"End:\n"
"*/\n", stdout);
+ leave:
if (ferror (stdout))
{
fprintf (stderr, PGM ": error writing to stdout: %s\n", strerror (errno));
return 1;
}
- fclose (fp);
+ if (fp)
+ fclose (fp);
xfree (host_triplet);
return 0;