diff -Naur gcc-2.95.4.orig/gcc/cccp.c gcc-2.95.4/gcc/cccp.c --- gcc-2.95.4.orig/gcc/cccp.c Fri Aug 16 20:05:22 2002 +++ gcc-2.95.4/gcc/cccp.c Mon Aug 19 11:43:37 2002 @@ -978,7 +978,7 @@ static void print_help PROTO((void)); extern char *replace(char*, char*); -extern int find_family_cpu(char **); +extern int find_family_cpu(char *, char **); extern char *get_std_prefix(); /* Read LEN bytes at PTR from descriptor DESC, for file FILENAME, @@ -1202,8 +1202,8 @@ int ind = 0; - if (!find_family_cpu(&family_cpu)) { - fatal("The CROSS_COMPILE environment variable is not set"); + if (!find_family_cpu(argv[0], &family_cpu)) { + fatal("CROSS_COMPILE variable is not set or invalid"); } /* Set new standard prefix to use instead of /cdt */ diff -Naur gcc-2.95.4.orig/gcc/find_cross.c gcc-2.95.4/gcc/find_cross.c --- gcc-2.95.4.orig/gcc/find_cross.c Fri Aug 16 20:05:22 2002 +++ gcc-2.95.4/gcc/find_cross.c Mon Aug 19 11:46:48 2002 @@ -214,11 +214,12 @@ } int -find_family_cpu(char **family_cpu) +find_family_cpu(char * program_name, char **family_cpu) { - char *p; + char *p, *ep, *tmp = 0; int len; + *family_cpu = 0; p = getenv("CROSS_COMPILE"); if (p && *p) { @@ -228,7 +229,33 @@ strcpy(*family_cpu, p); if ((*family_cpu)[len - 1] == '-') (*family_cpu)[len - 1] = '\0'; + } + + /* try to determine family_cpu using program name */ + p = basename(program_name); + ep = strrchr(p, '-'); + if (ep && strchr(p, '_')) { + len = ep - p; + tmp = (char *) xmalloc(len + 1); + strncpy(tmp, p, len); + tmp[len] = '\0'; + } + + if (! *family_cpu && !tmp) { + /* No way to set family_cpu - error */ + return 0; + } + if (tmp) { + if (*family_cpu) { + if (strcmp(tmp, *family_cpu)) { + /* CROSS_COMPILER value is inconsistent with program name */ + return 0; + } + free(tmp); return 1; } - return 0; + *family_cpu = tmp; + setenv("CROSS_COMPILE", tmp, 0); + return 1; + } } diff -Naur gcc-2.95.4.orig/gcc/gcc.c gcc-2.95.4/gcc/gcc.c --- gcc-2.95.4.orig/gcc/gcc.c Fri Aug 16 20:05:22 2002 +++ gcc-2.95.4/gcc/gcc.c Mon Aug 19 11:43:37 2002 @@ -513,7 +513,7 @@ char *family_cpu; extern char *replace(char *, char *); -extern int find_family_cpu(char **); +extern int find_family_cpu(char *, char **); static void cross_update_cpu(int *, char ***, char*); /* This defines which switch letters take arguments. */ @@ -4710,8 +4710,8 @@ --p; programname = p; - if (! find_family_cpu(&family_cpu)) { - fatal("The CROSS_COMPILE environment variable is not set"); + if (! find_family_cpu(programname, &family_cpu)) { + fatal("CROSS_COMPILE variable is not set or invalid"); } #ifdef HAVE_LC_MESSAGES diff -Naur gcc-2.95.4.orig/gcc/protoize.c gcc-2.95.4/gcc/protoize.c --- gcc-2.95.4.orig/gcc/protoize.c Fri Aug 16 20:05:22 2002 +++ gcc-2.95.4/gcc/protoize.c Mon Aug 19 11:43:37 2002 @@ -4532,8 +4532,8 @@ char *cross_dir; char *family_cpu; - if (! find_family_cpu(&family_cpu)) { - notice ("%s: the CROSS_COMPILE environment variable is not set\n", + if (! find_family_cpu(argv[0], &family_cpu)) { + notice ("%s: CROSS_COMPILE variable is not set or invalid\n", pname); exit (FATAL_EXIT_CODE); }