From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28690 invoked by alias); 10 May 2013 12:35:53 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 28677 invoked by uid 89); 10 May 2013 12:35:53 -0000 X-Spam-SWARE-Status: No, score=-2.0 required=5.0 tests=AWL,BAYES_00,RCVD_IN_HOSTKARMA_NO autolearn=ham version=3.3.1 Received: from rock.gnat.com (HELO rock.gnat.com) (205.232.38.15) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Fri, 10 May 2013 12:35:51 +0000 Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id D83982EA22 for ; Fri, 10 May 2013 08:35:49 -0400 (EDT) Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id A3J3Af+Ouav3 for ; Fri, 10 May 2013 08:35:49 -0400 (EDT) Received: from joel.gnat.com (localhost.localdomain [127.0.0.1]) by rock.gnat.com (Postfix) with ESMTP id 3EE702EA1F for ; Fri, 10 May 2013 08:35:49 -0400 (EDT) Received: by joel.gnat.com (Postfix, from userid 1000) id 38A8DC1BD5; Fri, 10 May 2013 16:35:42 +0400 (RET) Date: Fri, 10 May 2013 12:35:00 -0000 From: Joel Brobecker To: gdb-patches@sourceware.org Subject: Re: [RFC] Add system-gdbinit infrastructure Message-ID: <20130510123542.GJ9160@adacore.com> References: <1355846036-7645-1-git-send-email-brobecker@adacore.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1355846036-7645-1-git-send-email-brobecker@adacore.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SW-Source: 2013-05/txt/msg00382.txt.bz2 > 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 . > + > +"""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 . > + > +"""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