Append a DIR_SEPARATOR to a path specified by the -B switch, if doing so would
authorNick Clifton <nickc@cambridge.redhat.com>
Sat, 30 Jun 2001 08:46:31 +0000 (08:46 +0000)
committerNick Clifton <nickc@gcc.gnu.org>
Sat, 30 Jun 2001 08:46:31 +0000 (08:46 +0000)
create a valid directory name.

From-SVN: r43664

gcc/ChangeLog
gcc/doc/invoke.texi
gcc/gcc.c

index aaa636eb5df7691b79adf539a23ae077ab186876..f4fbe8aac78283a61fb46ab3f3199b4adb19cd1b 100644 (file)
@@ -1,3 +1,10 @@
+2001-06-29  Nick Clifton  <nickc@cambridge.redhat.com>
+
+       * gcc.c (process_command): Append a DIR_SEPARATOR to a path
+       specified by the -B switch, if doing so would create a valid
+       directory name.
+       * doc/invoke.texi: Document changed behaviour of -B.
+
 2001-06-29  DJ Delorie  <dj@redhat.com>
 
        * simplify-rtx.c (simplify_subreg): When simplifying a CONCAT, at
index 6b2413394df68f6729567ce68c175f72ab71826f..37645ebc7abba9fd130b7ed183de2aa30b1fe1f3 100644 (file)
@@ -4398,6 +4398,10 @@ those results in a file name that is found, the unmodified program
 name is searched for using the directories specified in your
 @env{PATH} environment variable.
 
+The compiler will check to see if the path provided by the @option{-B}
+refers to a directory, and if necessary it will add a directory
+separator character at the end of the path.
+
 @option{-B} prefixes that effectively specify directory names also apply
 to libraries in the linker, because the compiler translates these
 options into @option{-L} options for the linker.  They also apply to
@@ -4414,6 +4418,10 @@ Another way to specify a prefix much like the @option{-B} prefix is to use
 the environment variable @env{GCC_EXEC_PREFIX}.  @xref{Environment
 Variables}.
 
+As a special kludge, if the path provided by @option{-B} is
+@samp{[foo/]stage<N>/} then it will be replaced by
+@samp{[foo/]include}.  This is to help with boot-strapping the compiler.
+
 @item -specs=@var{file}
 @opindex specs
 Process @var{file} after the compiler reads in the standard @file{specs}
index 5f851e208638d8caa47b80ae9a390ab9a092dd1e..50be2f8e6140c35f488a901d8b976b4a17570db2 100644 (file)
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -3366,36 +3366,55 @@ process_command (argc, argv)
            case 'B':
              {
                const char *value;
+               int len;
+
                if (p[1] == 0 && i + 1 == argc)
                  fatal ("argument to `-B' is missing");
                if (p[1] == 0)
                  value = argv[++i];
                else
                  value = p + 1;
-               {
-                 /* As a kludge, if the arg is "[foo/]stageN/", just
-                    add "[foo/]include" to the include prefix.  */
-                 int len = strlen (value);
-                 if ((len == 7
-                      || (len > 7
-                          && (IS_DIR_SEPARATOR (value[len - 8]))))
-                     && strncmp (value + len - 7, "stage", 5) == 0
-                     && ISDIGIT (value[len - 2])
-                     && (IS_DIR_SEPARATOR (value[len - 1])))
-                   {
-                     if (len == 7)
-                       add_prefix (&include_prefixes, "include", NULL,
+
+               len = strlen (value);
+
+               /* Catch the case where the user has forgotten to append a
+                  directory seperator to the path.  Note, they may be using
+                  -B to add an executable name prefix, eg "i386-elf-", in
+                  order to distinguish between multiple installations of
+                  GCC in the same directory.  Hence we must check to see
+                  if appending a directory separator actually makes a
+                  valid directory name.  */
+               if (! IS_DIR_SEPARATOR (value [len - 1])
+                   && is_directory (value, "", 0))
+                 {
+                   value = strcpy (xmalloc (len + 2), value);
+                   value[len] = DIR_SEPARATOR;
+                   value[++ len] = 0;
+                 }
+               
+               /* As a kludge, if the arg is "[foo/]stageN/", just
+                  add "[foo/]include" to the include prefix.  */
+               if ((len == 7
+                    || (len > 7
+                        && (IS_DIR_SEPARATOR (value[len - 8]))))
+                   && strncmp (value + len - 7, "stage", 5) == 0
+                   && ISDIGIT (value[len - 2])
+                   && (IS_DIR_SEPARATOR (value[len - 1])))
+                 {
+                   if (len == 7)
+                     add_prefix (&include_prefixes, "include", NULL,
+                                 PREFIX_PRIORITY_B_OPT, 0, NULL);
+                   else
+                     {
+                       char * string = xmalloc (len + 1);
+
+                       strncpy (string, value, len - 7);
+                       strcpy (string + len - 7, "include");
+                       add_prefix (&include_prefixes, string, NULL,
                                    PREFIX_PRIORITY_B_OPT, 0, NULL);
-                     else
-                       {
-                         char *string = xmalloc (len + 1);
-                         strncpy (string, value, len-7);
-                         strcpy (string+len-7, "include");
-                         add_prefix (&include_prefixes, string, NULL,
-                                     PREFIX_PRIORITY_B_OPT, 0, NULL);
-                       }
-                   }
-               }
+                     }
+                 }
+
                add_prefix (&exec_prefixes, value, NULL,
                            PREFIX_PRIORITY_B_OPT, 0, &warn_B);
                add_prefix (&startfile_prefixes, value, NULL,