gdb/testsuite: Installed-GDB testing & data-directory

In testsuite/README, we suggest that you can run the testsuite against
some other GDB binary by using:

    make check RUNTESTFLAGS=GDB=/usr/bin/gdb

However, that example isn't fully correct, because with that command
line, the testsuite will still pass

  -data-directory=[pwd]/../data-directory

to /usr/bin/gdb, like e.g.:

  ...
  builtin_spawn /usr/bin/gdb -nw -nx -data-directory /home/pedro/gdb/build/gdb/testsuite/../data-directory -iex set height 0 -iex set width 0
  ...

while if you're testing an installed GDB (the system GDB being the
most usual scenario), then you should normally let it use its own
configured directory, not the just-built GDB's data directory.

This commit improves the status quo with the following two changes:

 - if the user specifies GDB on the command line, then by default,
   don't start GDB with the -data-directory command line option.
   I.e., let the tested GDB use its own configured data directory.

 - let the user override the data directory, via a new
   GDB_DATA_DIRECTORY global.  This replaces the existing
   BUILD_DATA_DIRECTORY variable in testsuite/lib/gdb.exp, which
   wasn't overridable, and was a bit misnamed for the new purpose.

So after this, the following commands I believe behave intuitively:

 # Test the non-installed GDB in some build dir:

    make check \
      RUNTESTFLAGS="GDB=/path/to/other/build/gdb \
                    GDB_DATA_DIRECTORY=/path/to/other/build/gdb/data-directory"

 # Test the GDB installed in some prefix:

    make check \
      RUNTESTFLAGS="GDB=/opt/gdb/bin/gdb"

 # Test the built GDB with some alternative data directory, e.g., the
   system GDB's data directory:

    make check \
      RUNTESTFLAGS="GDB_DATA_DIRECTORY=/usr/share/gdb"

Change-Id: Icdc21c85219155d9564a9900961997e6624b78fb
This commit is contained in:
Pedro Alves
2022-03-18 12:39:55 +00:00
parent a58b0053f4
commit 9170b70c41
2 changed files with 51 additions and 6 deletions

View File

@ -164,6 +164,19 @@ instance
checks both the installed GDB and GDBserver.
GDB_DATA_DIRECTORY
If you set GDB, then by default the testsuite assumes you are
exercising an installed GDB, and thus the testsuite lets GDB use its
configured data directory. Otherwise, if you don't set GDB, then by
default the tested GDB uses the data directory found under the GDB
build directory. You can override this by setting GDB_DATA_DIRECTORY.
For instance:
make check \
RUNTESTFLAGS="GDB=/path/to/other/build/gdb \
GDB_DATA_DIRECTORY=/path/to/other/build/gdb/data-directory"
INTERNAL_GDBFLAGS
Command line options passed to all GDB invocations.

View File

@ -92,8 +92,13 @@ load_lib gdb-utils.exp
load_lib memory.exp
load_lib check-test-names.exp
# The path to the GDB binary to test.
global GDB
# The data directory to use for testing. If this is the empty string,
# then we let GDB use its own configured data directory.
global GDB_DATA_DIRECTORY
# The spawn ID used for I/O interaction with the inferior. For native
# targets, or remote targets that can do I/O through GDB
# (semi-hosting) this will be the same as the host/GDB's spawn ID.
@ -111,9 +116,24 @@ if ![info exists GDB] {
} else {
set GDB [transform gdb]
}
} else {
# If the user specifies GDB on the command line, and doesn't
# specify GDB_DATA_DIRECTORY, then assume we're testing an
# installed GDB, and let it use its own configured data directory.
if ![info exists GDB_DATA_DIRECTORY] {
set GDB_DATA_DIRECTORY ""
}
}
verbose "using GDB = $GDB" 2
# The data directory the testing GDB will use. By default, assume
# we're testing a non-installed GDB in the build directory. Users may
# also explictly override the -data-directory from the command line.
if ![info exists GDB_DATA_DIRECTORY] {
set GDB_DATA_DIRECTORY "[pwd]/../data-directory"
}
verbose "using GDB_DATA_DIRECTORY = $GDB_DATA_DIRECTORY" 2
# GDBFLAGS is available for the user to set on the command line.
# E.g. make check RUNTESTFLAGS=GDBFLAGS=mumble
# Testcases may use it to add additional flags, but they must:
@ -125,23 +145,35 @@ if ![info exists GDBFLAGS] {
}
verbose "using GDBFLAGS = $GDBFLAGS" 2
# Make the build data directory available to tests.
set BUILD_DATA_DIRECTORY "[pwd]/../data-directory"
# Append the -data-directory option to pass to GDB to CMDLINE and
# return the resulting string. If GDB_DATA_DIRECTORY is empty,
# nothing is appended.
proc append_gdb_data_directory_option {cmdline} {
global GDB_DATA_DIRECTORY
if { $GDB_DATA_DIRECTORY != "" } {
return "$cmdline -data-directory $GDB_DATA_DIRECTORY"
} else {
return $cmdline
}
}
# INTERNAL_GDBFLAGS contains flags that the testsuite requires.
# `-nw' disables any of the windowed interfaces.
# `-nx' disables ~/.gdbinit, so that it doesn't interfere with the tests.
# `-data-directory' points to the data directory in the build directory.
# `-iex "set {height,width} 0"' disables pagination.
# `-data-directory' points to the data directory, usually in the build
# directory.
global INTERNAL_GDBFLAGS
if ![info exists INTERNAL_GDBFLAGS] {
set INTERNAL_GDBFLAGS \
[join [list \
"-nw" \
"-nx" \
"-data-directory $BUILD_DATA_DIRECTORY" \
{-iex "set height 0"} \
{-iex "set width 0"}]]
set INTERNAL_GDBFLAGS [append_gdb_data_directory_option $INTERNAL_GDBFLAGS]
}
# The variable gdb_prompt is a regexp which matches the gdb prompt.
@ -8021,9 +8053,9 @@ proc verify_psymtab_expanded { filename readin } {
# string (the default) means .gdb_index; "-dwarf-5" means .debug_names.
proc add_gdb_index { program {style ""} } {
global srcdir GDB env BUILD_DATA_DIRECTORY
global srcdir GDB env
set contrib_dir "$srcdir/../contrib"
set env(GDB) "$GDB --data-directory=$BUILD_DATA_DIRECTORY"
set env(GDB) [append_gdb_data_directory_option $GDB]
set result [catch "exec $contrib_dir/gdb-add-index.sh $style $program" output]
if { $result != 0 } {
verbose -log "result is $result"