[RFA] Look for system.gdbinit in specified --data-directory

Doug Evans dje@google.com
Thu Nov 15 19:41:00 GMT 2012


On Thu, Nov 15, 2012 at 10:03 AM, Eli Zaretskii <eliz@gnu.org> wrote:
>> Date: Thu, 15 Nov 2012 06:29:07 -0800
>> From: Doug Evans <dje@google.com>
>> Cc: palves@redhat.com, gdb-patches@sourceware.org
>>
>> When I wrote:
>>
>> >> Remember, this only happens *if* system.gdbinit lives somewhere
>> >> underneath data-directory.
>>
>> pretend I said:
>>
>> Remember, this only happens *if* the configured location of
>> system.gdbinit (the value of --with-system-gdbinit) is in the
>> configured location of data-directory (the value of
>> --with-gdb-datadir).
>
> Ah, okay, sorry for my misunderstanding.
>
> But why "pretend"?  Why not say this explicitly?

That "pretend" comment was referring to text in the prose of an email
message, not anything intended to appear in a patch.
Yikes.

> Like this, for
> example:
>
>   If the configured location of system.gdbinit file (as given by the
>   --with-system-gdbinit option at configure time) is in the
>   data-directory (as specified by --with-gdb-datadir at configure
>   time) or in one of its subdirectories, then GDB will look for the
>   system-wide init file in the directory specified by the
>   --data-directory command-line option.

Ok to check in?

2012-11-15  Doug Evans  <dje@google.com>

        * main.c (gdb_datadir_provided): New static global.
        (get_init_files): If --data-directory is provided,
        and SYSTEM_GDBINIT lives in data-directory, look for it there.
        * NEWS: Mention it.

        doc/
        * gdb.texinfo (System-wide configuration): If the system-wide init
        file lives in the data-directory, and --data-directory is provided,
        look for it there.
-------------- next part --------------
2012-11-15  Doug Evans  <dje@google.com>

	* main.c (gdb_datadir_provided): New static global.
	(get_init_files): If --data-directory is provided,
	and SYSTEM_GDBINIT lives in data-directory, look for it there.
	* NEWS: Mention it.

	doc/
	* gdb.texinfo (System-wide configuration): If the system-wide init
	file lives in the data-directory, and --data-directory is provided,
	look for it there.

Index: NEWS
===================================================================
RCS file: /cvs/src/src/gdb/NEWS,v
retrieving revision 1.548
diff -u -p -r1.548 NEWS
--- NEWS	17 Oct 2012 00:53:21 -0000	1.548
+++ NEWS	15 Nov 2012 19:37:24 -0000
@@ -3,6 +3,13 @@
 
 *** Changes since GDB 7.5
 
+* If the configured location of system.gdbinit file (as given by the
+  --with-system-gdbinit option at configure time) is in the
+  data-directory (as specified by --with-gdb-datadir at configure
+  time) or in one of its subdirectories, then GDB will look for the
+  system-wide init file in the directory specified by the
+  --data-directory command-line option.
+
 * New command line options:
 
 -nh   Disables auto-loading of ~/.gdbinit, but still executes all the
Index: main.c
===================================================================
RCS file: /cvs/src/src/gdb/main.c,v
retrieving revision 1.114
diff -u -p -r1.114 main.c
--- main.c	15 Oct 2012 21:45:04 -0000	1.114
+++ main.c	15 Nov 2012 19:37:24 -0000
@@ -60,6 +60,11 @@ char *gdb_sysroot = 0;
 /* GDB datadir, used to store data files.  */
 char *gdb_datadir = 0;
 
+/* Non-zero if GDB_DATADIR was provided on the command line.
+   This doesn't track whether data-directory is set later from the
+   command line, but we don't reread system.gdbinit when that happens.  */
+static int gdb_datadir_provided = 0;
+
 /* If gdb was configured with --with-python=/path,
    the possibly relocated path to python's lib directory.  */
 char *python_libdir = 0;
@@ -163,13 +168,38 @@ get_init_files (char **system_gdbinit,
   if (!initialized)
     {
       struct stat homebuf, cwdbuf, s;
-      char *homedir, *relocated_sysgdbinit;
+      char *homedir;
 
       if (SYSTEM_GDBINIT[0])
 	{
-	  relocated_sysgdbinit = relocate_path (gdb_program_name,
-						SYSTEM_GDBINIT,
-						SYSTEM_GDBINIT_RELOCATABLE);
+	  int datadir_len = strlen (GDB_DATADIR);
+	  int sys_gdbinit_len = strlen (SYSTEM_GDBINIT);
+	  char *relocated_sysgdbinit;
+
+	  /* If SYSTEM_GDBINIT lives in data-directory, and data-directory
+	     has been provided, search for SYSTEM_GDBINIT there.  */
+	  if (gdb_datadir_provided
+	      && datadir_len < sys_gdbinit_len
+	      && strncmp (SYSTEM_GDBINIT, GDB_DATADIR, datadir_len) == 0
+	      && strchr (SLASH_STRING, SYSTEM_GDBINIT[datadir_len]) != NULL)
+	    {
+	      /* Append the part of SYSTEM_GDBINIT that follows GDB_DATADIR
+		 to gdb_datadir.  */
+	      char *tmp_sys_gdbinit = xstrdup (SYSTEM_GDBINIT + datadir_len);
+	      char *p;
+
+	      for (p = tmp_sys_gdbinit; strchr (SLASH_STRING, *p); ++p)
+		continue;
+	      relocated_sysgdbinit = concat (gdb_datadir, SLASH_STRING, p,
+					     NULL);
+	      xfree (tmp_sys_gdbinit);
+	    }
+	  else
+	    {
+	      relocated_sysgdbinit = relocate_path (gdb_program_name,
+						    SYSTEM_GDBINIT,
+						    SYSTEM_GDBINIT_RELOCATABLE);
+	    }
 	  if (relocated_sysgdbinit && stat (relocated_sysgdbinit, &s) == 0)
 	    sysgdbinit = relocated_sysgdbinit;
 	  else
@@ -591,6 +621,7 @@ captured_main (void *data)
 	  case 'D':
 	    xfree (gdb_datadir);
 	    gdb_datadir = xstrdup (optarg);
+	    gdb_datadir_provided = 1;
 	    break;
 #ifdef GDBTK
 	  case 'z':
Index: doc/gdb.texinfo
===================================================================
RCS file: /cvs/src/src/gdb/doc/gdb.texinfo,v
retrieving revision 1.1017
diff -u -p -r1.1017 gdb.texinfo
--- doc/gdb.texinfo	5 Nov 2012 19:36:38 -0000	1.1017
+++ doc/gdb.texinfo	15 Nov 2012 19:37:24 -0000
@@ -34544,6 +34544,17 @@ then @value{GDBN} will always look for @
 wherever @value{GDBN} is installed.
 @end itemize
 
+If the configured location of the system-wide init file (as given by the
+@option{--with-system-gdbinit} option at configure time) is in the
+data-directory (as specified by @option{--with-gdb-datadir} at configure
+time) or in one of its subdirectories, then @value{GDBN} will look for the
+system-wide init file in the directory specified by the
+@option{--data-directory} command-line option.
+Note that the system-wide init file is only read once, during @value{GDBN}
+initialization.  If the data-directory is changed after @value{GDBN} has
+started with the @code{set data-directory} command, the file will not be
+reread.
+
 @node Maintenance Commands
 @appendix Maintenance Commands
 @cindex maintenance commands


More information about the Gdb-patches mailing list