* dwarf2read.c (follow_die_ref): Add comment.
[deliverable/binutils-gdb.git] / gdb / main.c
index 5d4640b37f25500552666132e0a4f1b7f3cd5602..8b66f78665579181f8bc6760b02d5b5fc9cfe5f3 100644 (file)
@@ -40,6 +40,8 @@
 #include "interps.h"
 #include "main.h"
 
+#include "source.h"
+
 /* If nonzero, display time usage both at startup and for each command.  */
 
 int display_time;
@@ -62,6 +64,9 @@ int dbx_commands = 0;
 /* System root path, used to find libraries etc.  */
 char *gdb_sysroot = 0;
 
+/* GDB datadir, used to store data files.  */
+char *gdb_datadir = 0;
+
 struct ui_file *gdb_stdout;
 struct ui_file *gdb_stderr;
 struct ui_file *gdb_stdlog;
@@ -93,6 +98,57 @@ static void print_gdb_help (struct ui_file *);
 
 extern char *external_editor_command;
 
+/* Relocate a file or directory.  PROGNAME is the name by which gdb
+   was invoked (i.e., argv[0]).  INITIAL is the default value for the
+   file or directory.  FLAG is true if the value is relocatable, false
+   otherwise.  Returns a newly allocated string; this may return NULL
+   under the same conditions as make_relative_prefix.  */
+static char *
+relocate_path (const char *progname, const char *initial, int flag)
+{
+  if (flag)
+    return make_relative_prefix (progname, BINDIR, initial);
+  return xstrdup (initial);
+}
+
+/* Like relocate_path, but specifically checks for a directory.
+   INITIAL is relocated according to the rules of relocate_path.  If
+   the result is a directory, it is used; otherwise, INITIAL is used.
+   The chosen directory is then canonicalized using lrealpath.  This
+   function always returns a newly-allocated string.  */
+static char *
+relocate_directory (const char *progname, const char *initial, int flag)
+{
+  char *dir;
+
+  dir = relocate_path (progname, initial, flag);
+  if (dir)
+    {
+      struct stat s;
+
+      if (stat (dir, &s) != 0 || !S_ISDIR (s.st_mode))
+       {
+         xfree (dir);
+         dir = NULL;
+       }
+    }
+  if (!dir)
+    dir = xstrdup (initial);
+
+  /* Canonicalize the directory.  */
+  if (*dir)
+    {
+      char *canon_sysroot = lrealpath (dir);
+      if (canon_sysroot)
+       {
+         xfree (dir);
+         dir = canon_sysroot;
+       }
+    }
+
+  return dir;
+}
+
 /* Compute the locations of init files that GDB should source and return
    them in SYSTEM_GDBINIT, HOME_GDBINIT, LOCAL_GDBINIT.  If there is 
    no system gdbinit (resp. home gdbinit and local gdbinit) to be loaded,
@@ -113,24 +169,16 @@ get_init_files (char **system_gdbinit,
       struct stat homebuf, cwdbuf, s;
       char *homedir, *relocated_sysgdbinit;
 
-      sysgdbinit = SYSTEM_GDBINIT;
-      if (!sysgdbinit [0] || stat (sysgdbinit, &s) != 0)
-       sysgdbinit = NULL;
-
-#ifdef SYSTEM_GDBINIT_RELOCATABLE
-      relocated_sysgdbinit = make_relative_prefix (gdb_program_name, BINDIR,
-                                                  SYSTEM_GDBINIT);
-      if (relocated_sysgdbinit)
+      if (SYSTEM_GDBINIT[0])
        {
-         struct stat s;
-         int res = 0;
-
-         if (stat (relocated_sysgdbinit, &s) == 0)
+         relocated_sysgdbinit = relocate_path (gdb_program_name,
+                                               SYSTEM_GDBINIT,
+                                               SYSTEM_GDBINIT_RELOCATABLE);
+         if (relocated_sysgdbinit && stat (relocated_sysgdbinit, &s) == 0)
            sysgdbinit = relocated_sysgdbinit;
          else
            xfree (relocated_sysgdbinit);
        }
-#endif
 
       homedir = getenv ("HOME");
 
@@ -289,76 +337,21 @@ captured_main (void *data)
   current_directory = gdb_dirbuf;
 
   /* Set the sysroot path.  */
-#ifdef TARGET_SYSTEM_ROOT_RELOCATABLE
-  gdb_sysroot = make_relative_prefix (argv[0], BINDIR, TARGET_SYSTEM_ROOT);
-  if (gdb_sysroot)
-    {
-      struct stat s;
-      int res = 0;
+  gdb_sysroot = relocate_directory (argv[0], TARGET_SYSTEM_ROOT,
+                                   TARGET_SYSTEM_ROOT_RELOCATABLE);
 
-      if (stat (gdb_sysroot, &s) == 0)
-       if (S_ISDIR (s.st_mode))
-         res = 1;
+  debug_file_directory = relocate_directory (argv[0], DEBUGDIR,
+                                            DEBUGDIR_RELOCATABLE);
 
-      if (res == 0)
-       {
-         xfree (gdb_sysroot);
-         gdb_sysroot = xstrdup (TARGET_SYSTEM_ROOT);
-       }
-    }
-  else
-    gdb_sysroot = xstrdup (TARGET_SYSTEM_ROOT);
-#else
-  gdb_sysroot = xstrdup (TARGET_SYSTEM_ROOT);
-#endif
-
-  /* Canonicalize the sysroot path.  */
-  if (*gdb_sysroot)
-    {
-      char *canon_sysroot = lrealpath (gdb_sysroot);
-      if (canon_sysroot)
-       {
-         xfree (gdb_sysroot);
-         gdb_sysroot = canon_sysroot;
-       }
-    }
-
-#ifdef DEBUGDIR_RELOCATABLE
-  debug_file_directory = make_relative_prefix (argv[0], BINDIR, DEBUGDIR);
-  if (debug_file_directory)
-    {
-      struct stat s;
-      int res = 0;
-
-      if (stat (debug_file_directory, &s) == 0)
-       if (S_ISDIR (s.st_mode))
-         res = 1;
+  gdb_datadir = relocate_directory (argv[0], GDB_DATADIR,
+                                   GDB_DATADIR_RELOCATABLE);
 
-      if (res == 0)
-       {
-         xfree (debug_file_directory);
-         debug_file_directory = xstrdup (DEBUGDIR);
-       }
-    }
-  else
-    debug_file_directory = xstrdup (DEBUGDIR);
-#else
-  debug_file_directory = xstrdup (DEBUGDIR);
+#ifdef RELOC_SRCDIR
+  add_substitute_path_rule (RELOC_SRCDIR,
+                           make_relative_prefix (argv[0], BINDIR,
+                                                 RELOC_SRCDIR));
 #endif
 
-  /* Canonicalize the debugfile path.  */
-  if (*debug_file_directory)
-    {
-      char *canon_debug = lrealpath (debug_file_directory);
-      if (canon_debug)
-       {
-         xfree (debug_file_directory);
-         debug_file_directory = canon_debug;
-       }
-    }
-
-  get_init_files (&system_gdbinit, &home_gdbinit, &local_gdbinit);
-
   /* There will always be an interpreter.  Either the one passed into
      this captured main, or one specified by the user at start up, or
      the console.  Initialize the interpreter to the one requested by 
@@ -694,6 +687,11 @@ Excess command line arguments ignored. (%s%s)\n"),
      control of the console via the deprecated_init_ui_hook ().  */
   gdb_init (argv[0]);
 
+  /* Lookup gdbinit files. Note that the gdbinit file name may be overriden
+     during file initialization, so get_init_files should be called after
+     gdb_init.  */
+  get_init_files (&system_gdbinit, &home_gdbinit, &local_gdbinit);
+
   /* Do these (and anything which might call wrap_here or *_filtered)
      after initialize_all_files() but before the interpreter has been
      installed.  Otherwize the help/version messages will be eaten by
This page took 0.026503 seconds and 4 git commands to generate.