Re: Python pretty-printing [1/6]

Tom Tromey
2009-04-03T23:58:42Z

Here is the revised version of patch #1.

I believe I have addressed all the comments. (As I mentioned before,
I plan to document "set data-directory" in a later patch -- unless,
Eli, there is an existing node where you want this to appear.)

While testing this I discovered that the relocatable directory code in
configure does not appear to actually work. This patch fixes this
problem.

Tom

2009-01-25 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/ChangeLog | 16 ++++++
gdb/README | 5 ++
gdb/acinclude.m4 | 35 ++++++++++++
gdb/config.in | 16 ++++--
gdb/configure | 154 ++++++++++++++++++++++++++++++++++++++----------------
gdb/configure.ac | 70 ++++++-------------------
gdb/defs.h | 3 +
gdb/main.c | 143 +++++++++++++++++++++++---------------------------
gdb/top.c | 9 +++
9 files changed, 269 insertions(+), 182 deletions(-)

diff --git a/gdb/README b/gdb/README
index cc16ecd..868cbb5 100644
--- a/gdb/README
+++ b/gdb/README
@@ -436,6 +436,11 @@ prefer; but you may abbreviate option names if you use `--'.
Same as `--host=HOST'. If you omit this, GDB will guess; it's
quite accurate.

+`--with-gdb-datadir=PATH'
+ Set the GDB-specific data directory. GDB will look here for
+ certain supporting files or scripts. This defaults to the `gdb'
+ subdirectory of `datadir' (which can be set using `--datadir').
+
`configure' accepts other options, for compatibility with configuring
other GNU tools recursively; but these are the only options that affect
GDB or its supporting libraries.
diff --git a/gdb/acinclude.m4 b/gdb/acinclude.m4
index 5e77230..cdf8015 100644
--- a/gdb/acinclude.m4
+++ b/gdb/acinclude.m4
@@ -387,3 +387,38 @@ AC_DEFUN([CY_AC_TK_PRIVATE_HEADERS], [
AC_MSG_RESULT(${private_dir})
fi
])
+
+dnl GDB_AC_WITH_DIR([VARIABLE], [ARG-NAME], [HELP], [DEFAULT])
+dnl Add a new --with option that defines a directory.
+dnl The result is stored in VARIABLE. AC_DEFINE_DIR is called
+dnl on this variable, as is AC_SUBST.
+dnl ARG-NAME is the base name of the argument (without "--with").
+dnl HELP is the help text to use.
+dnl If the user's choice is relative to the prefix, then the
+dnl result is relocatable, then this will define the C macro
+dnl VARIABLE_RELOCATABLE to 1; otherwise it is defined as 0.
+dnl DEFAULT is the default value, which is used if the user
+dnl does not specify the argument.
+AC_DEFUN([GDB_AC_WITH_DIR], [
+ AC_ARG_WITH([$2], AS_HELP_STRING([--with-][$2][=PATH], [$3]), [
+ [$1]=$withval], [[$1]=[$4]])
+ AC_DEFINE_DIR([$1], [$1], [$3])
+ AC_SUBST([$1])
+ if test "x$exec_prefix" = xNONE || test "x$exec_prefix" = 'x${prefix}'; then
+ if test "x$prefix" = xNONE; then
+ test_prefix=/usr/local
+ else
+ test_prefix=$prefix
+ fi
+ else
+ test_prefix=$exec_prefix
+ fi
+ value=0
+ case ${ac_define_dir} in
+ "${test_prefix}"|"${test_prefix}/"*|\
+ '${exec_prefix}'|'${exec_prefix}/'*)
+ value=1
+ ;;
+ esac
+ AC_DEFINE_UNQUOTED([$1]_RELOCATABLE, $value, [Define if the $2 directory should be relocated when GDB is moved.])
+ ])
diff --git a/gdb/configure.ac b/gdb/configure.ac
index 821dffe..05dcd9b 100644
--- a/gdb/configure.ac
+++ b/gdb/configure.ac
@@ -92,31 +92,16 @@ AC_SUBST(PACKAGE)
# generate its Makefile.in.
AM_INIT_AUTOMAKE(gdb, UNUSED-VERSION, [no-define])

-debugdir=${libdir}/debug
-
-AC_ARG_WITH(separate-debug-dir,
-[ --with-separate-debug-dir=path Look for global separate debug info in this path [LIBDIR/debug]],
-[debugdir="${withval}"])
-
-AC_DEFINE_DIR(DEBUGDIR, debugdir,
- [Global directory for separate debug files. ])
-#AC_DEFINE_UNQUOTED(DEBUGDIR, "$debugdir"),
-
-if test "x$exec_prefix" = xNONE || test "x$exec_prefix" = 'x${prefix}'; then
- if test "x$prefix" = xNONE; then
- test_prefix=/usr/local
- else
- test_prefix=$prefix
- fi
-else
- test_prefix=$exec_prefix
-fi
-case ${debugdir} in
-"${test_prefix}"|"${test_prefix}/"*|\
-'${exec_prefix}'|'${exec_prefix}/'*)
- AC_DEFINE(DEBUGDIR_RELOCATABLE, 1, [Define if the debug directory should be relocated when GDB is moved.])
- ;;
-esac
+GDB_AC_WITH_DIR(DEBUGDIR, separate-debug-dir,
+ [Look for global separate debug info in this path [LIBDIR/debug]],
+ [${libdir}/debug])
+
+# GDB's datadir relocation
+
+GDB_AC_WITH_DIR(GDB_DATADIR, gdb-datadir,
+ [look for global separate data files in this path [DATADIR/gdb]],
+ [${datadir}/gdb])
+

AC_CONFIG_SUBDIRS(doc testsuite)

@@ -1474,6 +1459,7 @@ fi

dnl Handle optional features that can be enabled.

+target_sysroot_reloc=0
AC_ARG_WITH(sysroot,
[ --with-sysroot[=DIR] Search for usr/lib et al within DIR.],
[
@@ -1499,44 +1485,20 @@ AC_ARG_WITH(sysroot,
"${test_exec_prefix}"|"${test_exec_prefix}/"*|\
'${prefix}'|'${prefix}/'*|\
'${exec_prefix}'|'${exec_prefix}/'*)
- t="$TARGET_SYSTEM_ROOT_DEFINE -DTARGET_SYSTEM_ROOT_RELOCATABLE"
- TARGET_SYSTEM_ROOT_DEFINE="$t"
+ target_sysroot_reloc=1
;;
esac
], [
TARGET_SYSTEM_ROOT=
TARGET_SYSTEM_ROOT_DEFINE='-DTARGET_SYSTEM_ROOT=\"\"'
])
+TARGET_SYSTEM_ROOT_DEFINE="$TARGET_SYSTEM_ROOT_DEFINE -DTARGET_SYSTEM_ROOT_RELOCATABLE=$target_sysroot_reloc"
AC_SUBST(TARGET_SYSTEM_ROOT)
AC_SUBST(TARGET_SYSTEM_ROOT_DEFINE)

-system_gdbinit=
-AC_ARG_WITH(system-gdbinit,
-[ --with-system-gdbinit=file Automatically load a system-wide gdbinit file],
-[system_gdbinit=${withval}])
-
-AC_DEFINE_DIR(SYSTEM_GDBINIT, system_gdbinit,
- [System-wide gdbinit file.])
-
-if test "x$prefix" = xNONE; then
- test_prefix=$ac_default_prefix
-else
- test_prefix=$prefix
-fi
-if test "x$exec_prefix" = xNONE || test "x$exec_prefix" = 'x${prefix}'; then
- test_exec_prefix=$test_prefix
-else
- test_exec_prefix=$exec_prefix
-fi
-case ${system_gdbinit} in
- "${test_prefix}"|"${test_prefix}/"*|\
- "${test_exec_prefix}"|"${test_exec_prefix}/"*|\
- '${prefix}'|'${prefix}/'*|\
- '${exec_prefix}'|'${exec_prefix}/'*)
- AC_DEFINE(SYSTEM_GDBINIT_RELOCATABLE, 1,
- [Define if the system-wide gdbinit file should be relocated when GDB is moved.])
- ;;
-esac
+GDB_AC_WITH_DIR(SYSTEM_GDBINIT, system-gdbinit,
+ [Automatically load a system-wide gdbinit file],
+ [])

AC_ARG_ENABLE(werror,
[ --enable-werror treat compile warnings as errors],
diff --git a/gdb/defs.h b/gdb/defs.h
index 882a844..ee80659 100644
--- a/gdb/defs.h
+++ b/gdb/defs.h
@@ -153,6 +153,9 @@ extern int dbx_commands;
/* System root path, used to find libraries etc. */
extern char *gdb_sysroot;

+/* GDB datadir, used to store data files. */
+extern char *gdb_datadir;
+
/* Search path for separate debug files. */
extern char *debug_file_directory;

diff --git a/gdb/main.c b/gdb/main.c
index 5d4640b..edfea30 100644
--- a/gdb/main.c
+++ b/gdb/main.c
@@ -62,6 +62,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 +96,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 +167,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,73 +335,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);

diff --git a/gdb/top.c b/gdb/top.c
index 3aff25f..5654535 100644
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -1619,6 +1619,15 @@ Use \"on\" to enable the notification, and \"off\" to disable it."),
NULL,
show_exec_done_display_p,
&setlist, &showlist);
+
+ add_setshow_filename_cmd ("data-directory", class_maintenance,
+ &gdb_datadir, _("Set GDB's data directory."),
+ _("Show GDB's data directory."),
+ _("\
+When set, GDB uses the specified path to search for data files."),
+ NULL, NULL,
+ &setlist,
+ &showlist);
}

void
--
1.6.0.6