This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [RFC] Add system-gdbinit infrastructure


> 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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]