Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [RFC] Add system-gdbinit infrastructure
@ 2012-12-18 15:54 Joel Brobecker
  2012-12-18 16:48 ` Jan Kratochvil
  2013-05-10 12:35 ` Joel Brobecker
  0 siblings, 2 replies; 8+ messages in thread
From: Joel Brobecker @ 2012-12-18 15:54 UTC (permalink / raw)
  To: gdb-patches; +Cc: Joel Brobecker

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


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC] Add system-gdbinit infrastructure
  2012-12-18 15:54 [RFC] Add system-gdbinit infrastructure Joel Brobecker
@ 2012-12-18 16:48 ` Jan Kratochvil
  2012-12-18 16:57   ` Joel Brobecker
  2013-05-10 12:35 ` Joel Brobecker
  1 sibling, 1 reply; 8+ messages in thread
From: Jan Kratochvil @ 2012-12-18 16:48 UTC (permalink / raw)
  To: Joel Brobecker; +Cc: gdb-patches

Hi Joel,

--with-system-gdbinit is used to enable something like for example Fedora uses
/etc/gdbinit.  But this provides only a single init file which is a problem
for various optionally installed packages each needing to install its own
system-wide gdb init file (such as older versions of the gdb-heap package).

Unfortunately GDB does not support wildcards for the "source" command for:
/etc/gdbinit:
	source /etc/gdbinit.d/*
which is why only a single file is possible that way.

But I do not see this problem solved in your patch, how do you execute those
files?

Besides that I find such files more as configuration files where read-only
$(GDB_DATADIR) is not a suitable location.

But maybe we both talk about two unrelated features.


Regards,
Jan


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC] Add system-gdbinit infrastructure
  2012-12-18 16:48 ` Jan Kratochvil
@ 2012-12-18 16:57   ` Joel Brobecker
  2012-12-18 17:39     ` Jan Kratochvil
  0 siblings, 1 reply; 8+ messages in thread
From: Joel Brobecker @ 2012-12-18 16:57 UTC (permalink / raw)
  To: Jan Kratochvil; +Cc: gdb-patches

> But I do not see this problem solved in your patch, how do you execute
> those files?

My patch does not address the problem you point out. This is an
orthogonal issue, IMO.

> Besides that I find such files more as configuration files where read-only
> $(GDB_DATADIR) is not a suitable location.

Can you explain why not? As I said, for some systems, it works
universally, so sharing them across users in the read-only GDB_DATADIR
seems fine to me.

-- 
Joel


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC] Add system-gdbinit infrastructure
  2012-12-18 16:57   ` Joel Brobecker
@ 2012-12-18 17:39     ` Jan Kratochvil
  2012-12-18 18:06       ` Joel Brobecker
  0 siblings, 1 reply; 8+ messages in thread
From: Jan Kratochvil @ 2012-12-18 17:39 UTC (permalink / raw)
  To: Joel Brobecker; +Cc: gdb-patches

On Tue, 18 Dec 2012 17:57:06 +0100, Joel Brobecker wrote:
> > Besides that I find such files more as configuration files where read-only
> > $(GDB_DATADIR) is not a suitable location.
> 
> Can you explain why not? As I said, for some systems, it works
> universally, so sharing them across users in the read-only GDB_DATADIR
> seems fine to me.

You two files you put there are more GDB scripts, not configuration files.
So it is probably OK for them but I just would not call this feature
system-gdbinit, I find it more contrib-scripts.

system-gdbinit is /etc/gdbinit (Debian has some similar file there) which
seems unrelated to this mail thread feature to me.


Regards,
Jan


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC] Add system-gdbinit infrastructure
  2012-12-18 17:39     ` Jan Kratochvil
@ 2012-12-18 18:06       ` Joel Brobecker
  2012-12-18 18:17         ` Jan Kratochvil
  0 siblings, 1 reply; 8+ messages in thread
From: Joel Brobecker @ 2012-12-18 18:06 UTC (permalink / raw)
  To: Jan Kratochvil; +Cc: gdb-patches

> You two files you put there are more GDB scripts, not configuration files.
> So it is probably OK for them but I just would not call this feature
> system-gdbinit, I find it more contrib-scripts.
> 
> system-gdbinit is /etc/gdbinit (Debian has some similar file there)
> which seems unrelated to this mail thread feature to me.

We added the --with-system-gdbinit configure option in order to
allow someone to build a GDB that would use another file as
the system-wide gdbinit. The distinction you are trying to
establish between what constitutes or not a system-wide gdbinit
seems artificial and unnecessary.

Anyone is free to configure its GDB in the way they want, and
in particular, to use the --with-system-gdbinit option to provide
a script (yes, a script) that would automatically setup their
GDB in a way that's actually useful to them. Many times, I am
sure, they will setup their own script based on their own setup.
But for the platforms this patch mentions, the scripts I provide
would work out of the box, and thus would be a suitable system-
wide init file.

And again, there is no harm possible, since the decision to
use them is voluntary, as GDB needs to be configured with
the appropriate --with-system-gdbinit switch in order to
enable the script of their choice.

-- 
Joel


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC] Add system-gdbinit infrastructure
  2012-12-18 18:06       ` Joel Brobecker
@ 2012-12-18 18:17         ` Jan Kratochvil
  0 siblings, 0 replies; 8+ messages in thread
From: Jan Kratochvil @ 2012-12-18 18:17 UTC (permalink / raw)
  To: Joel Brobecker; +Cc: gdb-patches

On Tue, 18 Dec 2012 19:05:55 +0100, Joel Brobecker wrote:
> We added the --with-system-gdbinit configure option in order to
> allow someone to build a GDB that would use another file as
> the system-wide gdbinit.

I have only now found out how you intend to use the scripts, for example by:
	./configure --with-system-gdbinit=/usr/share/gdb/system-gdbinit/elinos.py
or
	./configure --with-system-gdbinit=/usr/share/gdb/system-gdbinit/wrs-linux.py

It makes sense to me now.

Or one could also do:
	./configure --with-system-gdbinit=/etc/gdbinit
/etc/gdbinit:
	source /usr/share/gdb/system-gdbinit/elinos.py

OK, I see this is really orthogonal to the "source" command wildcard feature.


Regards,
Jan


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC] Add system-gdbinit infrastructure
  2012-12-18 15:54 [RFC] Add system-gdbinit infrastructure Joel Brobecker
  2012-12-18 16:48 ` Jan Kratochvil
@ 2013-05-10 12:35 ` Joel Brobecker
  2013-05-21  6:55   ` Checked in: " Joel Brobecker
  1 sibling, 1 reply; 8+ messages in thread
From: Joel Brobecker @ 2013-05-10 12:35 UTC (permalink / raw)
  To: gdb-patches

> 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?

FYI:

I asked about this quite a while ago, and there were some questions,
but no objections. I am planning on letting this sit a few more
day, and then rebase, cleanup if necessary, and commit.

> ---
>  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

-- 
Joel


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Checked in: [RFC] Add system-gdbinit infrastructure
  2013-05-10 12:35 ` Joel Brobecker
@ 2013-05-21  6:55   ` Joel Brobecker
  0 siblings, 0 replies; 8+ messages in thread
From: Joel Brobecker @ 2013-05-21  6:55 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 1112 bytes --]

> > 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.
[...]
> I asked about this quite a while ago, and there were some questions,
> but no objections. I am planning on letting this sit a few more
> day, and then rebase, cleanup if necessary, and commit.

FYI, attached is the patch I just checked in. I am working on documention
as I write this...

Thanks,
-- 
Joel

[-- Attachment #2: 0001-Add-new-system-gdbinit-infrastructure.patch --]
[-- Type: text/x-diff, Size: 9719 bytes --]

From 3b4bbdd06eb1dd35bedfd4db1f31810b58d7f2de Mon Sep 17 00:00:00 2001
From: Joel Brobecker <brobecker@adacore.com>
Date: Thu, 8 Dec 2011 10:44:10 -0500
Subject: [PATCH] Add new system-gdbinit infrastructure

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.
---
 gdb/ChangeLog                   |   17 +++++++++
 gdb/data-directory/Makefile.in  |   58 +++++++++++++++++++++++++---
 gdb/system-gdbinit/elinos.py    |   79 +++++++++++++++++++++++++++++++++++++++
 gdb/system-gdbinit/wrs-linux.py |   25 +++++++++++++
 4 files changed, 174 insertions(+), 5 deletions(-)
 create mode 100644 gdb/system-gdbinit/elinos.py
 create mode 100644 gdb/system-gdbinit/wrs-linux.py

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index c48f7e7..ece0942 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,22 @@
 2013-05-21  Joel Brobecker  <brobecker@adacore.com>
 
+	* 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.
+
+2013-05-21  Joel Brobecker  <brobecker@adacore.com>
+
 	* ada-lang.c (old_renaming_is_invisible): Fix cleanup leak.
 
 2013-05-21  Hui Zhu  <hui@codesourcery.com>
diff --git a/gdb/data-directory/Makefile.in b/gdb/data-directory/Makefile.in
index 13433ed..dec6207 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@
@@ -68,6 +69,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)" \
@@ -101,7 +108,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.
@@ -185,6 +192,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
@@ -195,13 +243,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..08c5b0f
--- /dev/null
+++ b/gdb/system-gdbinit/elinos.py
@@ -0,0 +1,79 @@
+# Copyright (C) 2011-2013 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..5571e66
--- /dev/null
+++ b/gdb/system-gdbinit/wrs-linux.py
@@ -0,0 +1,25 @@
+# Copyright (C) 2011-2013 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


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2013-05-21  6:55 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-12-18 15:54 [RFC] Add system-gdbinit infrastructure Joel Brobecker
2012-12-18 16:48 ` Jan Kratochvil
2012-12-18 16:57   ` Joel Brobecker
2012-12-18 17:39     ` Jan Kratochvil
2012-12-18 18:06       ` Joel Brobecker
2012-12-18 18:17         ` Jan Kratochvil
2013-05-10 12:35 ` Joel Brobecker
2013-05-21  6:55   ` Checked in: " Joel Brobecker

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox