[RFC] Add system-gdbinit infrastructure

Joel Brobecker brobecker@adacore.com
Tue Dec 18 15:54:00 GMT 2012


Hello,

We've had this feature in AdaCore's GDB for a while, and thought
it might be useful to others.  This is mostly for cross debuggers
that would typically require the user to first set various paths
such as the "sysroot" prior to really starting their debugging
session.

It extends the concept of system-gdbinit file, where GDB can be
configured to try to load a system gdbinit file at startup.
What this patch does is essentially provide a set of such
system-gdbinit files for platform where a generic one should
always work. Providing those with GDB would allow everyone
to use them, rather than having each one of us create our own.

For instance, on ElinOS, the environment is expected to provide
a number of environment variables, and we can use those to
setup GDB automatically.

One thing worth mentioning is that this patch essentially
just provides the various system-gdbinit, but does not
enable them by default. To enable them, GDB needs to be
configured with --with-system-gdbinit.

This patch is currently submitted as an RFC and as an example
of what we currently have at AdaCore. I'm sure there will be
comments, and probably documentation, NEWS, etc. I'd just like
to get a feel of whether people would find this useful for
the FSF tree.

gdb/ChangeLog:

        * data-directory/Makefile.in (SYSTEM_GDBINIT_SRCDIR): New
        variable.
        (VPATH): Add SYSTEM_GDBINIT_SRCDIR.
        (SYSTEM_GDBINIT_DIR, SYSTEM_GDBINIT_INSTALL_DIR)
        (SYSTEM_GDBINIT_FILES): New variables.
        (all): Add stamp-system-gdbinit.
        (stamp-system-gdbinit): New rule.
        (clean-system-gdbinit, install-system-gdbinit)
        (uninstall-system-gdbinit): New rules.  Make them .PHONY.
        (install-only): Add dependency on install-system-gdbinit.
        (uninstall): Add dependency on uninstall-system-gdbinit.
        (clean): Add dependency on clean-system-gdbinit.
        * system-gdbinit/elinos.py: New file.
        * system-gdbinit/wrs-linux.py: New file.

Thoughts?

Thanks,
-- 
Joel

---
 gdb/data-directory/Makefile.in  |   58 +++++++++++++++++++++++++++---
 gdb/system-gdbinit/elinos.py    |   75 +++++++++++++++++++++++++++++++++++++++
 gdb/system-gdbinit/wrs-linux.py |   25 +++++++++++++
 3 files changed, 153 insertions(+), 5 deletions(-)
 create mode 100644 gdb/system-gdbinit/elinos.py
 create mode 100644 gdb/system-gdbinit/wrs-linux.py

diff --git a/gdb/data-directory/Makefile.in b/gdb/data-directory/Makefile.in
index 2e2fbf9..f869fc2 100644
--- a/gdb/data-directory/Makefile.in
+++ b/gdb/data-directory/Makefile.in
@@ -19,7 +19,8 @@
 srcdir = @srcdir@
 SYSCALLS_SRCDIR = $(srcdir)/../syscalls
 PYTHON_SRCDIR = $(srcdir)/../python/lib
-VPATH = $(srcdir):$(SYSCALLS_SRCDIR):$(PYTHON_SRCDIR)
+SYSTEM_GDBINIT_SRCDIR = $(srcdir)/../system-gdbinit
+VPATH = $(srcdir):$(SYSCALLS_SRCDIR):$(PYTHON_SRCDIR):$(SYSTEM_GDBINIT_SRCDIR)
 
 top_srcdir = @top_srcdir@
 top_builddir = @top_builddir@
@@ -64,6 +65,12 @@ PYTHON_FILES = \
 	gdb/function/__init__.py \
 	gdb/function/strfns.py
 
+SYSTEM_GDBINIT_DIR = system-gdbinit
+SYSTEM_GDBINIT_INSTALL_DIR = $(DESTDIR)$(GDB_DATADIR)/$(SYSTEM_GDBINIT_DIR)
+SYSTEM_GDBINIT_FILES = \
+	elinos.py \
+	wrs-linux.py
+
 FLAGS_TO_PASS = \
 	"prefix=$(prefix)" \
 	"exec_prefix=$(exec_prefix)" \
@@ -97,7 +104,7 @@ FLAGS_TO_PASS = \
 	"RUNTESTFLAGS=$(RUNTESTFLAGS)"
 
 .PHONY: all
-all: stamp-syscalls stamp-python
+all: stamp-syscalls stamp-python stamp-system-gdbinit
 
 # For portability's sake, we need to handle systems that don't have
 # symbolic links.
@@ -181,6 +188,47 @@ uninstall-python:
 	  done \
 	done
 
+stamp-system-gdbinit: Makefile $(SYSTEM_GDBINIT_FILES)
+	rm -rf ./$(SYSTEM_GDBINIT_DIR)
+	mkdir ./$(SYSTEM_GDBINIT_DIR)
+	files='$(SYSTEM_GDBINIT_FILES)' ; \
+	for file in $$files ; do \
+	  f=$(SYSTEM_GDBINIT_SRCDIR)/$$file ; \
+	  if test -f $$f ; then \
+	    $(INSTALL_DATA) $$f ./$(SYSTEM_GDBINIT_DIR) ; \
+	  fi ; \
+	done
+	touch $@
+
+.PHONY: clean-system-gdbinit
+clean-system-gdbinit:
+	rm -rf $(SYSTEM_GDBINIT_DIR)
+	rm -f stamp-system-gdbinit
+
+.PHONY: install-system-gdbinit
+install-system-gdbinit:
+	$(INSTALL_DIR) $(SYSTEM_GDBINIT_INSTALL_DIR)
+	files='$(SYSTEM_GDBINIT_FILES)' ; \
+	for file in $$files; do \
+	  f=$(SYSTEM_GDBINIT_SRCDIR)/$$file ; \
+	  if test -f $$f ; then \
+	    $(INSTALL_DATA) $$f $(SYSTEM_GDBINIT_INSTALL_DIR) ; \
+	  fi ; \
+	done
+
+.PHONY: uninstall-system-gdbinit
+uninstall-system-gdbinit:
+	files='$(SYSTEM_GDBINIT_FILES)' ; \
+	for file in $$files ; do \
+	  slashdir=`echo "/$$file" | sed 's,/[^/]*$$,,'` ; \
+	  rm -f $(SYSTEM_GDBINIT_INSTALL_DIR)/$$file ; \
+	  while test "x$$file" != "x$$slashdir" ; do \
+	    rmdir 2>/dev/null "$(SYSTEM_GDBINIT_INSTALL_DIR)$$slashdir" ; \
+	    file="$$slashdir" ; \
+	    slashdir=`echo "$$file" | sed 's,/[^/]*$$,,'` ; \
+	  done \
+	done
+
 # Traditionally "install" depends on "all".  But it may be useful
 # not to; for example, if the user has made some trivial change to a
 # source file and doesn't care about rebuilding or just wants to save the
@@ -191,13 +239,13 @@ install: all
 	@$(MAKE) $(FLAGS_TO_PASS) install-only
 
 .PHONY: install-only
-install-only: install-syscalls install-python
+install-only: install-syscalls install-python install-system-gdbinit
 
 .PHONY: uninstall
-uninstall: uninstall-syscalls uninstall-python
+uninstall: uninstall-syscalls uninstall-python uninstall-system-gdbinit
 
 .PHONY: clean
-clean: clean-syscalls clean-python
+clean: clean-syscalls clean-python clean-system-gdbinit
 
 .PHONY: maintainer-clean realclean distclean
 maintainer-clean realclean distclean: clean
diff --git a/gdb/system-gdbinit/elinos.py b/gdb/system-gdbinit/elinos.py
new file mode 100644
index 0000000..2a6b090
--- /dev/null
+++ b/gdb/system-gdbinit/elinos.py
@@ -0,0 +1,75 @@
+# Copyright (C) 2011-2012 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+"""Configure GDB using the ELinOS environment."""
+
+import os
+import glob
+import gdb
+
+def warn(msg):
+    print "warning: %s" % msg
+
+def get_elinos_environment():
+    """Return the ELinOS environment.
+
+    If the ELinOS environment is properly set up, return a dictionary
+    which contains:
+      * The path to the ELinOS project at key 'project';
+      * The path to the ELinOS CDK at key 'cdk';
+      * The ELinOS target name at key 'target' (Eg. 'i486-linux');
+      * A list of Xenomai install prefixes (which could be empty, if
+        the ELinOS project does not include Xenomai) at key 'xenomai'.
+
+    If one of these cannot be found, it is then assumed that the ELinOS
+    environment is not properly set up. Return None in such a case,
+    and print a warning.
+    """
+    result = {}
+    for key in ("project", "cdk", "target"):
+        var = "ELINOS_" + key.upper()
+        if var in os.environ:
+            result[key] = os.environ[var]
+        else:
+            warn("%s not set" % var)
+            return None
+
+    result["xenomai"] = glob.glob(result["project"] + "/xenomai-[0-9.]*")
+    return result
+
+def elinos_init():
+    """Initialize debugger environment for ELinOS.
+
+    Let the debugger know where to find the ELinOS libraries on host. This
+    assumes that an ELinOS environment is properly set up. If not, abort
+    with a warning.
+    """
+    elinos_env = get_elinos_environment()
+
+    if elinos_env is None:
+        warn("ELinOS system libraries will not be loaded")
+    else:
+        solib_prefix = "%s/%s" % (elinos_env["cdk"], elinos_env["target"])
+
+        solib_dirs = []
+        for dir in elinos_env['xenomai']:
+            solib_dirs += ["%s/%s" % (dir, "xenomai-build/usr/realtime/lib")]
+        solib_dirs += ["%s/%s" % (solib_prefix, "lib")]
+
+        gdb.execute("set solib-absolute-prefix %s" % solib_prefix)
+        gdb.execute("set solib-search-path %s" % ":".join(solib_dirs))
+
+if __name__ == "__main__":
+    elinos_init()
diff --git a/gdb/system-gdbinit/wrs-linux.py b/gdb/system-gdbinit/wrs-linux.py
new file mode 100644
index 0000000..37ffa4c
--- /dev/null
+++ b/gdb/system-gdbinit/wrs-linux.py
@@ -0,0 +1,25 @@
+# Copyright (C) 2011-2012 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+"""Configure GDB using the WRS/Linux environment."""
+
+import os
+
+if 'ENV_PREFIX' in os.environ:
+    gdb.execute('set sysroot %s' % os.environ['ENV_PREFIX'])
+
+else:
+    print "warning: ENV_PREFIX environment variable missing."
+    print "The debugger will probably be unable to find the correct system libraries"
-- 
1.7.10.4



More information about the Gdb-patches mailing list