diff options
author | Tom Tromey <tromey@redhat.com> | 2009-04-23 21:28:20 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2009-04-23 21:28:20 +0000 |
commit | b14b1491f237a685a00ba669fb8410ae9ee7f648 (patch) | |
tree | 0d95cea6581f1777f0f83662fa7ae9840cdfd805 /gdb/main.c | |
parent | 5e7b5f74c234fb11db064df93e309463a9058740 (diff) | |
download | binutils-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.c | 143 |
1 files changed, 65 insertions, 78 deletions
@@ -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); |