aboutsummaryrefslogtreecommitdiff
path: root/gdb/main.c
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2009-04-23 21:28:20 +0000
committerTom Tromey <tromey@redhat.com>2009-04-23 21:28:20 +0000
commitb14b1491f237a685a00ba669fb8410ae9ee7f648 (patch)
tree0d95cea6581f1777f0f83662fa7ae9840cdfd805 /gdb/main.c
parent5e7b5f74c234fb11db064df93e309463a9058740 (diff)
downloadbinutils-b14b1491f237a685a00ba669fb8410ae9ee7f648.zip
binutils-b14b1491f237a685a00ba669fb8410ae9ee7f648.tar.gz
binutils-b14b1491f237a685a00ba669fb8410ae9ee7f648.tar.bz2
gdb
2009-04-23 Sergio Durigan Junior <sergiodj@linux.vnet.ibm.com> Tom Tromey <tromey@redhat.com> * configure, config.in: Regenerate. * configure.ac: Support for relocatable GDB datadir. Use GDB_AC_WITH_DIR. Always define TARGET_SYSTEM_ROOT_RELOCATABLE. * acinclude.m4 (GDB_AC_WITH_DIR): New defun. * top.c (init_main): Add "set data-directory". * defs.h (gdb_datadir): Declare. * main.c (gdb_datadir): New global. (captured_main): Initialize gdb_datadir. Use relocate_directory. (relocate_path): New function. (relocate_directory): Likewise. (get_init_files): Use relocate_path. (README): Mention --with-gdb-datadir. gdb/doc 2009-04-23 Tom Tromey <tromey@redhat.com> * gdb.texinfo (Data Files): New node. (GDB Files): Update menu.
Diffstat (limited to 'gdb/main.c')
-rw-r--r--gdb/main.c143
1 files changed, 65 insertions, 78 deletions
diff --git a/gdb/main.c b/gdb/main.c
index 86607d3..27870c7 100644
--- a/gdb/main.c
+++ b/gdb/main.c
@@ -64,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;
@@ -95,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,
@@ -115,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");
@@ -291,73 +337,14 @@ 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;
-
- if (stat (gdb_sysroot, &s) == 0)
- if (S_ISDIR (s.st_mode))
- res = 1;
+ gdb_sysroot = relocate_directory (argv[0], TARGET_SYSTEM_ROOT,
+ TARGET_SYSTEM_ROOT_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;
- }
- }
+ debug_file_directory = relocate_directory (argv[0], DEBUGDIR,
+ DEBUGDIR_RELOCATABLE);
-#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;
-
- if (res == 0)
- {
- xfree (debug_file_directory);
- debug_file_directory = xstrdup (DEBUGDIR);
- }
- }
- else
- debug_file_directory = xstrdup (DEBUGDIR);
-#else
- debug_file_directory = xstrdup (DEBUGDIR);
-#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;
- }
- }
+ gdb_datadir = relocate_directory (argv[0], GDB_DATADIR,
+ GDB_DATADIR_RELOCATABLE);
get_init_files (&system_gdbinit, &home_gdbinit, &local_gdbinit);