		     README for GDB release

This is GDB, the GNU source-level debugger.

A summary of new features is in the file `gdb/NEWS'.

Check the GDB home page at http://www.gnu.org/software/gdb/ for up to
date release information, mailing list links and archives, etc.

GDB's bug tracking data base can be found at
http://www.gnu.org/software/gdb/bugs/

Unpacking and Installation -- quick overview
==========================

   The release is provided as a gzipped tar file called
'gdb-VERSION.tar.gz', where VERSION is the version of GDB.

   The GDB debugger sources, the generic GNU include
files, the BFD ("Binary File Descriptor") library, the readline
library, and other libraries all have directories of their own
underneath the gdb-VERSION directory.  The idea is that a variety of GNU
tools can share a common copy of these things.  Be aware of variation
over time--for example don't try to build GDB with a copy of bfd from
a release other than the GDB release (such as a binutils release),
especially if the releases are more than a few weeks apart.
Configuration scripts and makefiles exist to cruise up and down this
directory tree and automatically build all the pieces in the right
order.

   When you unpack the gdb-VERSION.tar.gz file, it will create a
source directory called `gdb-VERSION'.

You can build GDB right in the source directory:

      cd gdb-VERSION
      ./configure --prefix=/usr/local   (or wherever you want)
      make all install

However, we recommend that an empty directory be used instead.
This way you do not clutter your source tree with binary files
and will be able to create different builds with different
configuration options.

You can build GDB in any empty build directory:

      mkdir build
      cd build
      <full path to your sources>/gdb-VERSION/configure [etc...]
      make all install

(Building GDB with DJGPP tools for MS-DOS/MS-Windows is slightly
different; see the file gdb-VERSION/gdb/config/djgpp/README for details.)

   This will configure and build all the libraries as well as GDB.  If
`configure' can't determine your system type, specify one as its
argument, e.g., `./configure sun4' or `./configure decstation'.

   Make sure that your 'configure' line ends in 'gdb-VERSION/configure':

      /berman/migchain/source/gdb-VERSION/configure      # RIGHT
      /berman/migchain/source/gdb-VERSION/gdb/configure  # WRONG

   The GDB package contains several subdirectories, such as 'gdb',
'bfd', and 'readline'.  If your 'configure' line ends in
'gdb-VERSION/gdb/configure', then you are configuring only the gdb
subdirectory, not the whole GDB package.  This leads to build errors
such as:

      make: *** No rule to make target `../bfd/bfd.h', needed by `gdb.o'.  Stop.

   If you get other compiler errors during this stage, see the `Reporting
Bugs' section below; there are a few known problems.

   GDB's `configure' script has many options to enable or disable
different features or dependencies.  These options are not generally
known to the top-level `configure', so if you want to see a complete
list of options, invoke the subdirectory `configure', like:

      /berman/migchain/source/gdb-VERSION/gdb/configure --help

   (Take note of how this differs from the invocation used to actually
configure the build tree.)

   GDB requires a C++17 compiler.  If you do not have a
C++17 compiler for your system, you may be able to download and install
the GNU CC compiler.  It is available via anonymous FTP from the
directory `ftp://ftp.gnu.org/pub/gnu/gcc'.  GDB also requires an ISO
C standard library.  The GDB remote server, GDBserver, builds with some
non-ISO standard libraries - e.g. for Windows CE.

   GDB can optionally be built against various external libraries.
These dependencies are described below in the "`configure options"
section of this README.

   GDB can be used as a cross-debugger, running on a machine of one
type while debugging a program running on a machine of another type.
See below.


More Documentation
******************

   All the documentation for GDB comes as part of the machine-readable
distribution.  The documentation is written in Texinfo format, which
is a documentation system that uses a single source file to produce
both on-line information and a printed manual.  You can use one of the
Info formatting commands to create the on-line version of the
documentation and TeX (or `texi2roff') to typeset the printed version.

   GDB includes an already formatted copy of the on-line Info version
of this manual in the `gdb/doc' subdirectory.  The main Info file is
`gdb-VERSION/gdb/doc/gdb.info', and it refers to subordinate files
matching `gdb.info*' in the same directory.  If necessary, you can
print out these files, or read them with any editor; but they are
easier to read using the `info' subsystem in GNU Emacs or the
standalone `info' program, available as part of the GNU Texinfo
distribution.

   If you want to format these Info files yourself, you need one of the
Info formatting programs, such as `texinfo-format-buffer' or
`makeinfo'.

   If you have `makeinfo' installed, and are in the top level GDB
source directory (`gdb-VERSION'), you can make the Info file by
typing:

      cd gdb/doc
      make info

   If you want to typeset and print copies of this manual, you need
TeX, a program to print its DVI output files, and `texinfo.tex', the
Texinfo definitions file.  This file is included in the GDB
distribution, in the directory `gdb-VERSION/texinfo'.

   TeX is a typesetting program; it does not print files directly, but
produces output files called DVI files.  To print a typeset document,
you need a program to print DVI files.  If your system has TeX
installed, chances are it has such a program.  The precise command to
use depends on your system; `lpr -d' is common; another (for PostScript
devices) is `dvips'.  The DVI print command may require a file name
without any extension or a `.dvi' extension.

   TeX also requires a macro definitions file called `texinfo.tex'.
This file tells TeX how to typeset a document written in Texinfo
format.  On its own, TeX cannot read, much less typeset a Texinfo file.
 `texinfo.tex' is distributed with GDB and is located in the
`gdb-VERSION/texinfo' directory.

   If you have TeX and a DVI printer program installed, you can typeset
and print this manual.  First switch to the `gdb' subdirectory of
the main source directory (for example, to `gdb-VERSION/gdb') and then type:

      make doc/gdb.dvi

   If you prefer to have the manual in PDF format, type this from the
`gdb/doc' subdirectory of the main source directory:

      make gdb.pdf

For this to work, you will need the PDFTeX package to be installed.


Installing GDB
**************

   GDB comes with a `configure' script that automates the process of
preparing GDB for installation; you can then use `make' to build the
`gdb' program.

   The GDB distribution includes all the source code you need for GDB in
a single directory.  That directory contains:

`gdb-VERSION/{COPYING,COPYING.LIB}'
     Standard GNU license files.  Please read them.

`gdb-VERSION/bfd'
     source for the Binary File Descriptor library

`gdb-VERSION/config*'
     script for configuring GDB, along with other support files

`gdb-VERSION/gdb'
     the source specific to GDB itself

`gdb-VERSION/include'
     GNU include files

`gdb-VERSION/libiberty'
     source for the `-liberty' free software library

`gdb-VERSION/opcodes'
     source for the library of opcode tables and disassemblers

`gdb-VERSION/readline'
     source for the GNU command-line interface
     NOTE:  The readline library is compiled for use by GDB, but will
     not be installed on your system when "make install" is issued.

`gdb-VERSION/sim'
     source for some simulators (ARM, D10V, SPARC, M32R, MIPS, PPC, V850, etc)

`gdb-VERSION/texinfo'
     The `texinfo.tex' file, which you need in order to make a printed
     manual using TeX.

`gdb-VERSION/etc'
     Coding standards, useful files for editing GDB, and other
     miscellanea.

   Note: the following instructions are for building GDB on Unix or
Unix-like systems.  Instructions for building with DJGPP for
MS-DOS/MS-Windows are in the file gdb/config/djgpp/README.

   The simplest way to configure and build GDB is to run `configure'
from the `gdb-VERSION' directory.

   First switch to the `gdb-VERSION' source directory if you are
not already in it; then run `configure'.

   For example:

      cd gdb-VERSION
      ./configure
      make

   Running `configure' followed by `make' builds the `bfd',
`readline', `mmalloc', and `libiberty' libraries, then `gdb' itself.
The configured source files, and the binaries, are left in the
corresponding source directories.

   `configure' is a Bourne-shell (`/bin/sh') script; if your system
does not recognize this automatically when you run a different shell,
you may need to run `sh' on it explicitly:

      sh configure

   If you run `configure' from a directory that contains source
directories for multiple libraries or programs, `configure' creates
configuration files for every directory level underneath (unless
you tell it not to, with the `--norecursion' option).

   You can install `gdb' anywhere; it has no hardwired paths. However,
you should make sure that the shell on your path (named by the `SHELL'
environment variable) is publicly readable.  Remember that GDB uses the
shell to start your program--some systems refuse to let GDB debug child
processes whose programs are not readable.


Compiling GDB in another directory
==================================

   If you want to run GDB versions for several host or target machines,
you need a different `gdb' compiled for each combination of host and
target.  `configure' is designed to make this easy by allowing you to
generate each configuration in a separate subdirectory, rather than in
the source directory.  If your `make' program handles the `VPATH'
feature correctly (GNU `make' and SunOS 'make' are two that should),
running `make' in each of these directories builds the `gdb' program
specified there.

   To build `gdb' in a separate directory, run `configure' with the
`--srcdir' option to specify where to find the source. (You also need
to specify a path to find `configure' itself from your working
directory.  If the path to `configure' would be the same as the
argument to `--srcdir', you can leave out the `--srcdir' option; it
will be assumed.)

   For example, you can build GDB in a separate
directory for a Sun 4 like this:

     cd gdb-VERSION
     mkdir ../gdb-sun4
     cd ../gdb-sun4
     ../gdb-VERSION/configure
     make

   When `configure' builds a configuration using a remote source
directory, it creates a tree for the binaries with the same structure
(and using the same names) as the tree under the source directory.  In
the example, you'd find the Sun 4 library `libiberty.a' in the
directory `gdb-sun4/libiberty', and GDB itself in `gdb-sun4/gdb'.

   One popular reason to build several GDB configurations in separate
directories is to configure GDB for cross-compiling (where GDB runs on
one machine--the host--while debugging programs that run on another
machine--the target).  You specify a cross-debugging target by giving
the `--target=TARGET' option to `configure'.

   When you run `make' to build a program or library, you must run it
in a configured directory--whatever directory you were in when you
called `configure' (or one of its subdirectories).

   The `Makefile' that `configure' generates in each source directory
also runs recursively.  If you type `make' in a source directory such
as `gdb-VERSION' (or in a separate configured directory configured with
`--srcdir=PATH/gdb-VERSION'), you will build all the required libraries,
and then build GDB.

   When you have multiple hosts or targets configured in separate
directories, you can run `make' on them in parallel (for example, if
they are NFS-mounted on each of the hosts); they will not interfere
with each other.


Specifying names for hosts and targets
======================================

   The specifications used for hosts and targets in the `configure'
script are based on a three-part naming scheme, but some short
predefined aliases are also supported.  The full naming scheme encodes
three pieces of information in the following pattern:

     ARCHITECTURE-VENDOR-OS

   For example, you can use the alias `sun4' as a HOST argument or in a
`--target=TARGET' option.  The equivalent full name is
`sparc-sun-sunos4'.

   The `configure' script accompanying GDB does not provide any query
facility to list all supported host and target names or aliases.
`configure' calls the Bourne shell script `config.sub' to map
abbreviations to full names; you can read the script, if you wish, or
you can use it to test your guesses on abbreviations--for example:

     % sh config.sub sun4
     sparc-sun-sunos4.1.1
     % sh config.sub sun3
     m68k-sun-sunos4.1.1
     % sh config.sub decstation
     mips-dec-ultrix4.2
     % sh config.sub hp300bsd
     m68k-hp-bsd
     % sh config.sub i386v
     i386-pc-sysv
     % sh config.sub i786v
     Invalid configuration `i786v': machine `i786v' not recognized

`config.sub' is also distributed in the GDB source directory.


`configure' options
===================

   Here is a summary of the `configure' options and arguments that are
most often useful for building GDB.  `configure' also has several other
options not listed here.  There are many options to gdb's `configure'
script, some of which are only useful in special situation.
*note : (autoconf.info)Running configure scripts, for a full
explanation of `configure'.

     configure [--help]
               [--prefix=DIR]
               [--srcdir=PATH]
               [--target=TARGET]
	       [--host=HOST]

You may introduce options with a single `-' rather than `--' if you
prefer; but you may abbreviate option names if you use `--'.  Some
more obscure GDB `configure' options are not listed here.

`--help'
     Display a quick summary of how to invoke `configure'.

`-prefix=DIR'
     Configure the source to install programs and files under directory
     `DIR'.

`--srcdir=PATH'
     *Warning: using this option requires GNU `make', or another `make'
     that compatibly implements the `VPATH' feature.*
     Use this option to make configurations in directories separate
     from the GDB source directories.  Among other things, you can use
     this to build (or maintain) several configurations simultaneously,
     in separate directories.  `configure' writes configuration
     specific files in the current directory, but arranges for them to
     use the source in the directory PATH.  `configure' will create
     directories under the working directory in parallel to the source
     directories below PATH.

`--host=HOST'
     Configure GDB to run on the specified HOST.  If you omit this,
     GDB will guess; it's quite accurate.

     The guess is done by running the `config.guess' script, which can
     be found in the root of the binutils-gdb source tree.

     There is no convenient way to generate a list of all available
     hosts.

`--target=TARGET'
     Configure GDB for cross-debugging programs running on the
     specified TARGET.  One way in which GDB supports cross-debugging
     is through the 'target remote' and 'target extended-remote'
     commands for remote debugging.  See the 'Remote debugging'
     section below.

     If this option is not specified, the default is the value of
     HOST, see `--host' above.

     When TARGET matches HOST, GDB will be configured with support for
     native debugging of programs running on the same machine as GDB.

     When TARGET and HOST are different, GDB will only include support
     for cross-debugging programs running on TARGET.

     There is no convenient way to generate a list of all available
     targets.

`--enable-targets=TARGET,TARGET,...'
`--enable-targets=all`
     Configure GDB for cross-debugging programs running on the
     specified list of targets in addition to the target specified
     with `--target' (see above).  The special value `all' configures
     GDB for debugging programs running on any target it supports.

     There is no convenient way to generate a list of all available
     targets.

`--with-gdb-datadir=PATH'
     Set the GDB-specific data directory.  GDB will look here for
     certain supporting files or scripts.  This defaults to the `gdb'
     subdirectory of `datadir' (which can be set using `--datadir').

`--with-relocated-sources=DIR'
     Sets up the default source path substitution rule so that
     directory names recorded in debug information will be
     automatically adjusted for any directory under DIR.  DIR should
     be a subdirectory of GDB's configured prefix, the one mentioned
     in the `--prefix' or `--exec-prefix' options to configure.  This
     option is useful if GDB is supposed to be moved to a different
     place after it is built.

`--enable-64-bit-bfd'
     Enable 64-bit support in BFD on 32-bit hosts.

`--disable-gdbmi'
     Build GDB without the GDB/MI machine interface.

`--enable-tui'
     Build GDB with the text-mode full-screen user interface (TUI).
     Requires a curses library (ncurses and cursesX are also
     supported).

`--disable-gdb-compile'
    Build GDB without support for the 'compile' command.

`--with-curses'
     Use the curses library instead of the termcap library, for
     text-mode terminal operations.

`--with-debuginfod'
     Build GDB with libdebuginfod, the debuginfod client library.  Used
     to automatically fetch source files and separate debug files from
     debuginfod servers using the associated executable's build ID.
     Enabled by default if libdebuginfod is installed and found at
     configure time.  debuginfod is packaged with elfutils, starting
     with version 0.178.  You can get the latest version from
     'https://sourceware.org/elfutils/'.

`--with-libunwind-ia64'
     Use the libunwind library for unwinding function call stack on ia64
     target platforms.
     See http://www.nongnu.org/libunwind/index.html for details.

`--with-system-readline'
     Use the readline library installed on the host, rather than the
     library supplied as part of GDB.  Readline 7 or newer is required;
     this is enforced by the build system.

`--with-system-zlib'
     Use the zlib library installed on the host, rather than the
     library supplied as part of GDB.

`--with-expat'
     Build GDB with Expat, a library for XML parsing.  (Done by
     default if libexpat is installed and found at configure time.)
     This library is used to read XML files supplied with GDB.  If it
     is unavailable, some features, such as remote protocol memory
     maps, target descriptions, and shared library lists, that are
     based on XML files, will not be available in GDB.  If your host
     does not have libexpat installed, you can get the latest version
     from `http://expat.sourceforge.net'.

`--with-libiconv-prefix[=DIR]'
     Build GDB with GNU libiconv, a character set encoding conversion
     library.  This is not done by default, as on GNU systems the
     `iconv' that is built in to the C library is sufficient.  If your
     host does not have a working `iconv', you can get the latest
     version of GNU iconv from `https://www.gnu.org/software/libiconv/'.

     GDB's build system also supports building GNU libiconv as part of
     the overall build.  See the GDB manual instructions on how to do
     this.

`--with-lzma'
     Build GDB with LZMA, a compression library.  (Done by default if
     liblzma is installed and found at configure time.)  LZMA is used
     by GDB's "mini debuginfo" feature, which is only useful on
     platforms using the ELF object file format.  If your host does
     not have liblzma installed, you can get the latest version from
     `https://tukaani.org/xz/'.

`--with-gmp=DIR'
`--with-gmp-lib=LIBDIR'
`--with-gmp-include=INCDIR'
     Build GDB using the GMP library installed at the directory DIR.
     If your host does not have GMP installed, you can get the latest
     version at `https://gmplib.org/'.
     The `--with-gmp=gmpinstalldir` option is shorthand for
     `--with-gmp-lib=gmpinstalldir/lib` and
     `--with-gmp-include=gmpinstalldir/include`.

`--with-mpfr=DIR'
`--with-mpfr-lib=LIBDIR'
`--with-mpfr-include=INCDIR'
     Build GDB using GNU MPFR installed at the directory DIR,
     a library for multiple-precision floating-point computation
     with correct rounding.
     This library is used to emulate target floating-point arithmetic
     during expression evaluation when the target uses different
     floating-point formats than the host.
     If your host does not have GNU MPFR installed, you
     can get the latest version from `https://www.mpfr.org/'.

     The `--with-mpfr=mpfrinstalldir` option is shorthand for
     `--with-mpfr-lib=mpfrinstalldir/lib` and
     `--with-mpfr-include=mpfrinstalldir/include`.

`--with-python[=PYTHON]'
     Build GDB with Python scripting support.  (Done by default if
     libpython is present and found at configure time.)  Python makes
     GDB scripting much more powerful than the restricted CLI
     scripting language.  If your host does not have Python installed,
     you can find it on `http://www.python.org/download/'.  The oldest
     version of Python supported by GDB is 3.2.  The optional argument
     PYTHON is used to find the Python headers and libraries.  It can
     be either the name of a Python executable, or the name of the
     directory in which Python is installed.

`--with-guile[=GUILE]'
     Build GDB with GNU Guile scripting support.  (Done by default if
     libguile is present and found at configure time.)  If your host
     does not have Guile installed, you can find it at
     `https://www.gnu.org/software/guile/'.  The optional argument
     GUILE can be a version number, which will cause `configure' to
     try to use that version of Guile; or the file name of a
     `pkg-config' executable, which will be queried to find the
     information needed to compile and link against Guile.

`--enable-source-highlight'
     When printing source code, use source highlighting.  This requires
     libsource-highlight to be installed and is enabled by default
     if the library is found.

`--with-xxhash'
     Use libxxhash for hashing.  This has no user-visible effect but
     speeds up various GDB operations such as symbol loading.  Enabled
     by default if libxxhash is found.

`--with-amd-dbgapi=[auto,yes,no]'
     Whether to use the amd-dbgapi library to support local debugging of
     AMD GCN architecture GPUs.

     When explicitly requesting support for an AMD GCN architecture through
     `--enable-targets' or `--target', there is no need to use
     `--with-amd-dbgapi': `configure' will automatically look for the
     amd-dbgapi library and fail if not found.

     When using --enable-targets=all, support for the AMD GCN architecture will
     only be included if the amd-dbgapi is found.  `--with-amd-dbgapi=yes' can
     be used to make it a failure if the amd-dbgapi library is not found.
     `--with-amd-dbgapi=no' can be used to prevent looking for the amd-dbgapi
     library altogether.

`--without-included-regex'
     Don't use the regex library included with GDB (as part of the
     libiberty library).  This is the default on hosts with version 2
     of the GNU C library.

`--with-sysroot=DIR'
     Use DIR as the default system root directory for libraries whose
     file names begin with `/lib' or `/usr/lib'.  (The value of DIR
     can be modified at run time by using the "set sysroot" command.)
     If DIR is under the GDB configured prefix (set with `--prefix' or
     `--exec-prefix' options), the default system root will be
     automatically adjusted if and when GDB is moved to a different
     location.

`--with-system-gdbinit=FILE'
     Configure GDB to automatically load a system-wide init file.
     FILE should be an absolute file name.  If FILE is in a directory
     under the configured prefix, and GDB is moved to another location
     after being built, the location of the system-wide init file will
     be adjusted accordingly.

`--with-system-gdbinit-dir=DIR'
     Configure GDB to automatically load system-wide init files from
     a directory. Files with extensions `.gdb', `.py' (if Python
     support is enabled) and `.scm' (if Guile support is enabled) are
     supported.  DIR should be an absolute directory name.  If DIR is
     in a directory under the configured prefix, and GDB is moved to
     another location after being built, the location of the system-
     wide init directory will be adjusted accordingly.

`--enable-build-warnings'
     When building the GDB sources, ask the compiler to warn about any
     code which looks even vaguely suspicious.  It passes many
     different warning flags, depending on the exact version of the
     compiler you are using.

`--enable-werror'
     Treat compiler warnings as werrors.  It adds the -Werror flag to
     the compiler, which will fail the compilation if the compiler
     outputs any warning messages.

`--enable-ubsan'
     Enable the GCC undefined behavior sanitizer.  By default this is
     disabled in GDB releases, but enabled when building from git.
     The undefined behavior sanitizer checks for C++ undefined
     behavior.  It has a performance cost, so if you are looking at
     GDB's performance, you should disable it.

`--enable-unit-tests[=yes|no]'
     Enable (i.e., include) support for unit tests when compiling GDB
     and GDBServer.  Note that if this option is not passed, GDB will
     have selftests if it is a development build, and will *not* have
     selftests if it is a non-development build.

`configure' accepts other options, for compatibility with configuring
other GNU tools recursively.


Remote debugging
=================

   Remote debugging is when GDB runs on one machine type (see `--host'
above), while debugging applications running on a possibly different
machine using the 'target remote' or 'target extended-remote'
commands.  The `--target' and `--enable-targets' configure options
control which targets GDB can debug.  Remote debugging is one way in
which GDB can support cross-debugging.  GDB runs on a machine of type
HOST (see `--host' configure option) but can remote debug a machine of
type TARGET (see `--target' and `--enable-targets' configure options).

   The files m68k-stub.c, i386-stub.c, and sparc-stub.c are examples
of remote stubs to be used with remote.c.  They are designed to run
standalone on an m68k, i386, or SPARC cpu and communicate properly
with the remote.c stub over a serial line.

   The directory gdbserver/ contains `gdbserver', a program that
allows remote debugging for Unix applications.  GDBserver is only
supported for some native configurations.

   The file gdbserver/README includes further notes on GDBserver; in
particular, it explains how to build GDBserver for cross-debugging
(where GDBserver runs on the target machine, which is of a different
architecture than the host machine running GDB).


Reporting Bugs in GDB
=====================

   There are several ways of reporting bugs in GDB.  The preferred
method is to use the World Wide Web:

      http://www.gnu.org/software/gdb/bugs/

As an alternative, the bug report can be submitted, via e-mail, to the
address "bug-gdb@gnu.org".

   When submitting a bug, please include the GDB version number, and
how you configured it (e.g., "sun4" or "mach386 host,
i586-intel-synopsys target").  Since GDB supports so many
different configurations, it is important that you be precise about
this.  The simplest way to do this is to include the output from these
commands:

      % gdb --version
      % gdb --config

   For more information on how/whether to report bugs, see the
Reporting Bugs chapter of the GDB manual (gdb/doc/gdb.texinfo).


Graphical interface to GDB -- X Windows, MS Windows
==========================

   Several graphical interfaces to GDB are available.  You should
check:

	https://sourceware.org/gdb/wiki/GDB%20Front%20Ends

for an up-to-date list.

   Emacs users will very likely enjoy the Grand Unified Debugger mode;
try typing `M-x gdb RET'.


Writing Code for GDB
=====================

   There is information about writing code for GDB in the file
`CONTRIBUTE' and at the website:

	http://www.gnu.org/software/gdb/

in particular in the wiki.

   If you are pondering writing anything but a short patch, especially
take note of the information about copyrights and copyright assignment.
It can take quite a while to get all the paperwork done, so
we encourage you to start that process as soon as you decide you are
planning to work on something, or at least well ahead of when you
think you will be ready to submit the patches.


GDB Testsuite
=============

   Included with the GDB distribution is a DejaGNU based testsuite
that can either be used to test your newly built GDB, or for
regression testing a GDB with local modifications.

   Running the testsuite requires the prior installation of DejaGNU,
which is generally available via ftp.  The directory
ftp://sources.redhat.com/pub/dejagnu/ will contain a recent snapshot.
Once DejaGNU is installed, you can run the tests in one of the
following ways:

  (1)	cd gdb-VERSION
	make check-gdb

or

  (2)	cd gdb-VERSION/gdb
	make check

or

  (3)	cd gdb-VERSION/gdb/testsuite
	make site.exp	(builds the site specific file)
	runtest -tool gdb GDB=../gdb    (or GDB=<somepath> as appropriate)

When using a `make'-based method, you can use the Makefile variable
`RUNTESTFLAGS' to pass flags to `runtest', e.g.:

	make RUNTESTFLAGS=--directory=gdb.cp check

If you use GNU make, you can use its `-j' option to run the testsuite
in parallel.  This can greatly reduce the amount of time it takes for
the testsuite to run.  In this case, if you set `RUNTESTFLAGS' then,
by default, the tests will be run serially even under `-j'.  You can
override this and force a parallel run by setting the `make' variable
`FORCE_PARALLEL' to any non-empty value.  Note that the parallel `make
check' assumes that you want to run the entire testsuite, so it is not
compatible with some dejagnu options, like `--directory'.

The last method gives you slightly more control in case of problems
with building one or more test executables or if you are using the
testsuite `standalone', without it being part of the GDB source tree.

See the DejaGNU documentation for further details.


Copyright and License Notices
=============================

Most files maintained by the GDB Project contain a copyright notice
as well as a license notice, usually at the start of the file.

To reduce the length of copyright notices, consecutive years in the
copyright notice can be combined into a single range.  For instance,
the following list of copyright years...

    1986, 1988, 1989, 1991-1993, 1999, 2000, 2007, 2008, 2009, 2010, 2011

... is abbreviated into:

    1986, 1988-1989, 1991-1993, 1999-2000, 2007-2011

Every year of each range, inclusive, is a copyrightable year that
could be listed individually.


(this is for editing this file with GNU emacs)
Local Variables:
mode: text
End:
