Wed Jun  9 16:57:11 1999  Mumit Khan  <khan@xraylith.wisc.edu>

	* gcc.c (STANDARD_BINDIR_PREFIX): Provide default.

Fri Feb  5 14:22:01 1999  Mumit Khan  <khan@xraylith.wisc.edu>
        
	* gcc.c (make_relative_prefix): Handle the HAVE_EXECUTABLE_SUFFIX
	case.

Fri Mar 13 17:54:04 1998  Michael Meissner  <meissner@cygnus.com>

        * gcc.c (DIR_UP): If not defined, define as "..".
        (standard_bindir_prefix): New static, holds target location to
        install binaries.
        (split_directories): New function to split a filename into
        component directories.
        (free_split_directories): New function, release memory allocated
        by split_directories.
        (make_relative_prefix): New function, make a relative pathname if
        the compiler is not in the expected location.
        (process_command): Use GET_ENVIRONMENT to read GCC_EXEC_PREFIX.
        If GCC_EXEC_PREFIX was not specified, see if we can figure out an
        appropriate prefix from argv[0].

        * Makefile.in (gcc.o): Define STANDARD_BINDIR_PREFIX.

Mon May 10 09:11:23 1993  Ian Lance Taylor  (ian@cygnus.com)

	* Makefile.in (cccp.o): Use $(libsubdir)/$(unlibsubdir) for
	LOCAL_INCLUDE_DIR, so that a native compiler can find assert.h via
	GCC_EXEC_PREFIX.

Fri May  7 09:16:10 1993  Ian Lance Taylor  (ian@cygnus.com)

	* Makefile.in (gcc.o): Pass STANDARD_STARTFILE_PREFIX as
	$(unlibsubdir) rather than $(libdir) so that native compilations can
	find $(libdir).

Index: gcc-2.95.2/gcc/Makefile.in
===================================================================
RCS file: /homes/khan/src/CVSROOT/gcc-2.95.2/gcc/Makefile.in,v
retrieving revision 1.1.1.1
diff -u -3 -p -r1.1.1.1 Makefile.in
--- gcc-2.95.2/gcc/Makefile.in	1999/11/05 01:09:41	1.1.1.1
+++ gcc-2.95.2/gcc/Makefile.in	1999/11/05 05:34:35
@@ -1407,11 +1407,12 @@ c-common.o : c-common.c $(CONFIG_H) syst
 # Language-independent files.
 
 DRIVER_DEFINES = \
-  -DSTANDARD_STARTFILE_PREFIX=\"$(libdir)/\" \
+  -DSTANDARD_STARTFILE_PREFIX=\"$(unlibsubdir)/\" \
   -DSTANDARD_EXEC_PREFIX=\"$(libdir)/gcc-lib/\" \
   -DDEFAULT_TARGET_VERSION=\"$(version)\" \
   -DDEFAULT_TARGET_MACHINE=\"$(target_alias)\" \
-  -DTOOLDIR_BASE_PREFIX=\"$(exec_prefix)/\"
+  -DSTANDARD_BINDIR_PREFIX=\"$(bindir)/\" \
+  -DTOOLDIR_BASE_PREFIX=\"$(unlibsubdir)/../\"
 gcc.o: gcc.c $(CONFIG_H) system.h intl.h multilib.h \
     Makefile $(lang_specs_files) prefix.h
 	$(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
@@ -1971,7 +1972,7 @@ cccp.o: cccp.c $(CONFIG_H) intl.h pcp.h 
 	$(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
 	  -DGCC_INCLUDE_DIR=\"$(libsubdir)/include\" \
 	  -DGPLUSPLUS_INCLUDE_DIR=\"$(gcc_gxx_include_dir)\" \
-	  -DLOCAL_INCLUDE_DIR=\"$(includedir)\" \
+ 	  -DLOCAL_INCLUDE_DIR=\"$(libsubdir)/$(unlibsubdir)/..`echo $(exec_prefix) | sed -e 's|^$(prefix)||' -e 's|/[^/]*|/..|g'`/include\" \
 	  -DCROSS_INCLUDE_DIR=\"$(gcc_tooldir)/sys-include\" \
 	  -DTOOL_INCLUDE_DIR=\"$(gcc_tooldir)/include\" \
 	  -c `echo $(srcdir)/cccp.c | sed 's,^\./,,'`
@@ -2005,7 +2006,7 @@ cppinit.o:  cppinit.c $(CONFIG_H) cpplib
 	$(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
 	  -DGCC_INCLUDE_DIR=\"$(libsubdir)/include\" \
 	  -DGPLUSPLUS_INCLUDE_DIR=\"$(gcc_gxx_include_dir)\" \
-	  -DLOCAL_INCLUDE_DIR=\"$(includedir)\" \
+ 	  -DLOCAL_INCLUDE_DIR=\"$(libsubdir)/$(unlibsubdir)/..`echo $(exec_prefix) | sed -e 's|^$(prefix)||' -e 's|/[^/]*|/..|g'`/include\" \
 	  -DCROSS_INCLUDE_DIR=\"$(gcc_tooldir)/sys-include\" \
 	  -DTOOL_INCLUDE_DIR=\"$(gcc_tooldir)/include\" \
 	  -c `echo $(srcdir)/cppinit.c | sed 's,^\./,,'`
@@ -2030,7 +2031,7 @@ protoize.o: protoize.c $(srcdir)/../incl
 	  -DGPLUSPLUS_INCLUDE_DIR=\"$(gcc_gxx_include_dir)\" \
 	  -DCROSS_INCLUDE_DIR=\"$(gcc_tooldir)/sys-include\" \
 	  -DTOOL_INCLUDE_DIR=\"$(gcc_tooldir)/include\" \
-	  -DLOCAL_INCLUDE_DIR=\"$(includedir)\" \
+ 	  -DLOCAL_INCLUDE_DIR=\"$(libsubdir)/$(unlibsubdir)/..`echo $(exec_prefix) | sed -e 's|^$(prefix)||' -e 's|/[^/]*|/..|g'`/include\" \
 	  -DSTD_PROTO_DIR=\"$(libsubdir)\" \
 	  $(srcdir)/protoize.c
 
@@ -2041,7 +2042,7 @@ unprotoize.o: unprotoize.c protoize.c $(
 	  -DGPLUSPLUS_INCLUDE_DIR=\"$(gcc_gxx_include_dir)\" \
 	  -DCROSS_INCLUDE_DIR=\"$(gcc_tooldir)/sys-include\" \
 	  -DTOOL_INCLUDE_DIR=\"$(gcc_tooldir)/include\" \
-	  -DLOCAL_INCLUDE_DIR=\"$(includedir)\" \
+ 	  -DLOCAL_INCLUDE_DIR=\"$(libsubdir)/$(unlibsubdir)/..`echo $(exec_prefix) | sed -e 's|^$(prefix)||' -e 's|/[^/]*|/..|g'`/include\" \
 	  -DSTD_PROTO_DIR=\"$(libsubdir)\" \
 	  $(srcdir)/unprotoize.c
 
Index: gcc-2.95.2/gcc/gcc.c
===================================================================
RCS file: /homes/khan/src/CVSROOT/gcc-2.95.2/gcc/gcc.c,v
retrieving revision 1.1.1.1
diff -u -3 -p -r1.1.1.1 gcc.c
--- gcc-2.95.2/gcc/gcc.c	1999/11/05 01:09:43	1.1.1.1
+++ gcc-2.95.2/gcc/gcc.c	1999/11/05 05:34:35
@@ -76,6 +76,12 @@ compilation is specified by a string cal
 
 static char dir_separator_str[] = {DIR_SEPARATOR, 0};
 
+/* CYGNUS LOCAL -- meissner/relative pathnames */
+#ifndef DIR_UP
+#define DIR_UP ".."
+#endif
+/* END CYGNUS LOCAL -- meissner/relative pathnames */
+
 #define obstack_chunk_alloc xmalloc
 #define obstack_chunk_free free
 
@@ -177,6 +183,11 @@ static void set_spec		PROTO((const char 
 static struct compiler *lookup_compiler PROTO((const char *, size_t, const char *));
 static char *build_search_list	PROTO((struct path_prefix *, const char *, int));
 static void putenv_from_prefixes PROTO((struct path_prefix *, const char *));
+/* CYGNUS LOCAL -- meissner/relative pathnames */
+static char **split_directories PROTO((char *, int *));
+static void free_split_directories PROTO((char **));
+static char *make_relative_prefix PROTO((char *, char *, char *));
+/* END CYGNUS LOCAL -- meissner/relative pathnames */
 static char *find_a_file	PROTO((struct path_prefix *, const char *, int));
 static void add_prefix		PROTO((struct path_prefix *, const char *,
 				       const char *, int, int, int *));
@@ -1398,6 +1409,13 @@ static const char *standard_startfile_pr
 static const char *tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
 static const char *tooldir_prefix;
 
+/* CYGNUS LOCAL -- meissner/relative pathnames */
+#ifndef STANDARD_BINDIR_PREFIX
+#define STANDARD_BINDIR_PREFIX "/usr/local/bin"
+#endif /* !defined STANDARD_BINDIR_PREFIX */
+static char *standard_bindir_prefix = STANDARD_BINDIR_PREFIX;
+/* END CYGNUS LOCAL -- meissner/relative pathnames */
+
 /* Subdirectory to use for locating libraries.  Set by
    set_multilib_dir based on the compilation options.  */
 
@@ -1954,6 +1972,238 @@ putenv_from_prefixes (paths, env_var)
   putenv (build_search_list (paths, env_var, 1));
 }
 
+/* CYGNUS LOCAL -- meissner/relative pathnames */
+/* Split a filename into component directories.  */
+
+static char **
+split_directories (name, ptr_num_dirs)
+     char *name;
+     int *ptr_num_dirs;
+{
+  int num_dirs = 0;
+  char **dirs;
+  char *p, *q;
+  int ch;
+
+  /* Count the number of directories.  Special case MSDOS disk names as part
+     of the initial directory.  */
+  p = name;
+  if (DIR_SEPARATOR == '\\' && name[1] == ':'
+      && (name[2] == DIR_SEPARATOR || name[2] == '/'))
+    {
+      p += 3;
+      num_dirs++;
+    }
+
+  while ((ch = *p++) != '\0')
+    {
+      if (ch == '/' || ch == DIR_SEPARATOR)
+        {
+          num_dirs++;
+          while ((ch = *p) == '/' || ch == DIR_SEPARATOR)
+            p++;
+        }
+    }
+
+  dirs = (char **) xmalloc (sizeof (char *) * (num_dirs + 2));
+
+  /* Now copy the directory parts.  */
+  num_dirs = 0;
+  p = name;
+  if (DIR_SEPARATOR == '\\' && name[1] == ':'
+      && (name[2] == DIR_SEPARATOR || name[2] == '/'))
+    {
+      dirs[num_dirs++] = save_string (p, 3);
+      p += 3;
+    }
+
+  q = p;
+  while ((ch = *p++) != '\0')
+    {
+      if (ch == '/' || ch == DIR_SEPARATOR)
+        {
+          while ((ch = *p) == '/' || ch == DIR_SEPARATOR)
+            p++;
+
+          dirs[num_dirs++] = save_string (q, p - q);
+          q = p;
+        }
+    }
+
+  if (p - 1 - q > 0)
+    dirs[num_dirs++] = save_string (q, p - 1 - q);
+
+  dirs[num_dirs] = NULL_PTR;
+  if (ptr_num_dirs)
+    *ptr_num_dirs = num_dirs;
+
+  return dirs;
+}
+
+/* Release storage held by split directories.  */
+
+static void
+free_split_directories (dirs)
+     char **dirs;
+{
+  int i = 0;
+
+  while (dirs[i] != NULL_PTR)
+    free (dirs[i++]);
+
+  free ((char *)dirs);
+}
+
+/* Given three strings PROGNAME, BIN_PREFIX, PREFIX, return a string that gets
+   to PREFIX starting with the directory portion of PROGNAME and a relative
+   pathname of the difference between BIN_PREFIX and PREFIX.
+
+   For example, if BIN_PREFIX is /alpha/beta/gamma/gcc/delta, PREFIX is
+   /alpha/beta/gamma/omega/, and PROGNAME is /red/green/blue/gcc, then this
+   function will return /reg/green/blue/../omega.
+
+   If no relative prefix can be found, return NULL.  */
+
+static char *
+make_relative_prefix (progname, bin_prefix, prefix)
+     char *progname;
+     char *bin_prefix;
+     char *prefix;
+{
+  char **prog_dirs, **bin_dirs, **prefix_dirs;
+  int prog_num, bin_num, prefix_num, std_loc_p;
+  int i, n, common;
+
+  prog_dirs = split_directories (progname, &prog_num);
+  bin_dirs = split_directories (bin_prefix, &bin_num);
+
+  /* If there is no full pathname, try to find the program by checking in each
+     of the directories specified in the PATH environment variable.  */
+  if (prog_num == 1)
+    {
+      char *temp;
+
+      GET_ENV_PATH_LIST (temp, "PATH");
+      if (temp)
+        {
+          char *startp, *endp;
+          char *nstore = (char *) alloca (strlen (temp) + strlen (progname) 
+                                          + strlen (EXECUTABLE_SUFFIX) + 1);
+
+          startp = endp = temp;
+          while (1)
+            {
+              if (*endp == PATH_SEPARATOR || *endp == 0)
+                {
+                  if (endp == startp)
+                    {
+                      nstore[0] = '.';
+                      nstore[1] = DIR_SEPARATOR;
+                      nstore[2] = '\0';
+                    }
+                  else
+                    {
+                      strncpy (nstore, startp, endp-startp);
+                      if (endp[-1] != '/' && endp[-1] != DIR_SEPARATOR)
+                        {
+                          nstore[endp-startp] = DIR_SEPARATOR;
+                          nstore[endp-startp+1] = 0;
+                        }
+                      else
+                        nstore[endp-startp] = 0;
+                    }
+                  strcat (nstore, progname);
+                  if (! access (nstore, X_OK)
+#ifdef HAVE_EXECUTABLE_SUFFIX
+                      || ! access (strcat (nstore, EXECUTABLE_SUFFIX), X_OK)
+#endif
+                      )
+                    {
+                      free_split_directories (prog_dirs);
+                      progname = nstore;
+                      prog_dirs = split_directories (progname, &prog_num);
+                      break;
+                    }
+
+                  if (*endp == 0)
+                    break;
+                  endp = startp = endp + 1;
+                }
+              else
+                endp++;
+            }
+        }
+    }
+
+  /* Remove the program name from comparison of directory names.  */
+  prog_num--;
+
+  /* Determine if the compiler is installed in the standard location, and if
+     so, we don't need to specify relative directories.  Also, if argv[0]
+     doesn't contain any directory specifiers, there is not much we can do.  */
+  std_loc_p = 0;
+  if (prog_num == bin_num)
+    {
+      for (i = 0; i < bin_num; i++)
+        {
+          if (strcmp (prog_dirs[i], bin_dirs[i]) != 0)
+            break;
+        }
+
+      if (prog_num <= 0 || i == bin_num)
+        {
+          std_loc_p = 1;
+          free_split_directories (prog_dirs);
+          free_split_directories (bin_dirs);
+          prog_dirs = bin_dirs = (char **)0;
+          return NULL_PTR;
+        }
+    }
+
+  prefix_dirs = split_directories (prefix, &prefix_num);
+
+  /* Find how many directories are in common between bin_prefix & prefix */
+  n = (prefix_num < bin_num) ? prefix_num : bin_num;
+  for (common = 0; common < n; common++)
+    {
+      if (strcmp (bin_dirs[common], prefix_dirs[common]) != 0)
+        break;
+    }
+
+  /* If there are no common directories, there can be no relative prefix.  */
+  if (common == 0)
+    {
+      free_split_directories (prog_dirs);
+      free_split_directories (bin_dirs);
+      free_split_directories (prefix_dirs);
+      return NULL_PTR;
+    }
+
+  /* Build up the pathnames in argv[0].  */
+  for (i = 0; i < prog_num; i++)
+    obstack_grow (&obstack, prog_dirs[i], strlen (prog_dirs[i]));
+
+  /* Now build up the ..'s.  */
+  for (i = common; i < n; i++)
+    {
+      obstack_grow (&obstack, DIR_UP, sizeof (DIR_UP)-1);
+      obstack_1grow (&obstack, DIR_SEPARATOR);
+    }
+
+  /* Put in directories to move over to prefix.  */
+  for (i = common; i < prefix_num; i++)
+    obstack_grow (&obstack, prefix_dirs[i], strlen (prefix_dirs[i]));
+
+  free_split_directories (prog_dirs);
+  free_split_directories (bin_dirs);
+  free_split_directories (prefix_dirs);
+
+  obstack_1grow (&obstack, '\0');
+  return obstack_finish (&obstack);
+}
+/* END CYGNUS LOCAL -- meissner/relative pathnames */
+
+
 /* Search for NAME using the prefix list PREFIXES.  MODE is passed to
    access to check permissions.
    Return 0 if not found, otherwise return its name, allocated with malloc.  */
@@ -2597,8 +2847,19 @@ process_command (argc, argv)
 	  break;
 	}
     }
+
+  /* CYGNUS LOCAL meissner/relative pathnames */
+  /* Set up the default search paths.  If there is no GCC_EXEC_PREFIX, see if we
+     can create it from the pathname specified in argv[0].  */
 
-  /* Set up the default search paths.  */
+  if (!gcc_exec_prefix)
+    {
+      gcc_exec_prefix = make_relative_prefix (argv[0], standard_bindir_prefix,
+                                              standard_exec_prefix);
+      if (gcc_exec_prefix)
+        putenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL_PTR));
+    }
+  /* END CYGNUS LOCAL -- meissner/relative pathnames */
 
   if (gcc_exec_prefix)
     {
