From 8ecfd7bd4acd69213c06fac6de9af38299123547 Mon Sep 17 00:00:00 2001 From: Sergio Durigan Junior Date: Mon, 17 Sep 2018 15:58:55 -0400 Subject: [PATCH] Add parameter to allow enabling/disabling selftests via configure This is a follow-up of: https://sourceware.org/ml/gdb-patches/2018-08/msg00347.html Instead of going throttle and always enabling our selftests (even in non-development builds), this patch is a bit more conservative and introduces a configure option ("--enable-unit-tests") that allows the user to choose whether she wants unit tests in the build or not. Note that the current behaviour is retained: if no option is provided, GDB will have selftests included in a development build, and will *not* have selftests included in a non-development build. The rationale for having this option is still the same: due to the many racy testcases and random failures we see when running the GDB testsuite, it is unfortunately not possible to perform a full test when one is building a downstream package. As the Fedora GDB maintainer and one of the Debian GDB uploaders, I feel like this situation could be improved by, at least, executing our selftests after the package has been built. This patch introduces no regressions to our build. OK? gdb/ChangeLog: 2018-10-10 Sergio Durigan Junior Simon Marchi * README (`configure' options): Add documentation for new "--enable-unit-tests" option. * acinclude.m4: Include "selftest.m4". * configure: Regenerate. * configure.ac: Use "GDB_AC_SELFTEST". * maint.c (maintenance_selftest): Update message informing that selftests have been disabled. (maintenance_info_selftests): Likewise. * selftest.m4: New file. gdb/gdbserver/ChangeLog: 2018-10-10 Sergio Durigan Junior Simon Marchi * acinclude.m4: Include "../selftest.m4". * configure: Regenerate. * configure.ac: Use "GDB_AC_SELFTEST". * configure.srv: Use "$enable_unittests" instead of "$development" when checking whether unit tests have been enabled. * server.c (captured_main): Update message informing that selftests have been disabled. gdb/testsuite/ChangeLog: 2018-10-10 Sergio Durigan Junior * gdb.gdb/unittest.exp: Update expected message informing that selftests have been disabled. * gdb.server/unittest.exp: Likewise. squash! Add parameter to allow enabling/disabling selftests via configure --- gdb/ChangeLog | 13 ++++++++ gdb/README | 6 ++++ gdb/acinclude.m4 | 3 ++ gdb/configure | 27 +++++++++++++++- gdb/configure.ac | 6 ++-- gdb/gdbserver/ChangeLog | 12 +++++++ gdb/gdbserver/acinclude.m4 | 3 ++ gdb/gdbserver/configure | 29 +++++++++++++++-- gdb/gdbserver/configure.ac | 6 ++-- gdb/gdbserver/configure.srv | 2 +- gdb/gdbserver/server.c | 2 +- gdb/maint.c | 4 +-- gdb/selftest.m4 | 45 +++++++++++++++++++++++++++ gdb/testsuite/ChangeLog | 6 ++++ gdb/testsuite/gdb.gdb/unittest.exp | 2 +- gdb/testsuite/gdb.server/unittest.exp | 2 +- 16 files changed, 151 insertions(+), 17 deletions(-) create mode 100644 gdb/selftest.m4 diff --git a/gdb/ChangeLog b/gdb/ChangeLog index aac5b7a09a..e28b464f20 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,16 @@ +2018-10-10 Sergio Durigan Junior + Simon Marchi + + * README (`configure' options): Add documentation for new + "--enable-unit-tests" option. + * acinclude.m4: Include "selftest.m4". + * configure: Regenerate. + * configure.ac: Use "GDB_AC_SELFTEST". + * maint.c (maintenance_selftest): Update message informing + that selftests have been disabled. + (maintenance_info_selftests): Likewise. + * selftest.m4: New file. + 2018-10-10 Gary Benson * remote.c (remote_target::remote_send_printf): Add diff --git a/gdb/README b/gdb/README index 69ba0eb8df..8a91aab2a4 100644 --- a/gdb/README +++ b/gdb/README @@ -545,6 +545,12 @@ more obscure GDB `configure' options are not listed here. 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. diff --git a/gdb/acinclude.m4 b/gdb/acinclude.m4 index 52ba3f9ed6..d21dd76fab 100644 --- a/gdb/acinclude.m4 +++ b/gdb/acinclude.m4 @@ -18,6 +18,9 @@ sinclude(warning.m4) # AM_GDB_UBSAN sinclude(sanitize.m4) +# This gets GDB_AC_SELFTEST. +sinclude(selftest.m4) + dnl gdb/configure.in uses BFD_NEED_DECLARATION, so get its definition. sinclude(../bfd/bfd.m4) diff --git a/gdb/configure b/gdb/configure index adb26e5d4d..3652455322 100755 --- a/gdb/configure +++ b/gdb/configure @@ -896,6 +896,7 @@ enable_sim enable_gdbserver with_babeltrace with_libbabeltrace_prefix +enable_unit_tests ' ac_precious_vars='build_alias host_alias @@ -1561,6 +1562,8 @@ Optional Features: --enable-sim link gdb with simulator --enable-gdbserver automatically build gdbserver (yes/no/auto, default is auto) + --enable-unit-tests Enable the inclusion of unit tests when compiling + GDB Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] @@ -17838,15 +17841,37 @@ ac_config_links="$ac_config_links $ac_config_links_1" $as_echo "#define GDB_DEFAULT_HOST_CHARSET \"UTF-8\"" >>confdefs.h -if $development; then + +# Check whether we will enable the inclusion of unit tests when +# compiling GDB. +# +# The default value of this option changes depending whether we're on +# development mode (in which case it's "true") or not (in which case +# it's "false"). +# Check whether --enable-unit-tests was given. +if test "${enable_unit_tests+set}" = set; then : + enableval=$enable_unit_tests; case "${enableval}" in + yes) enable_unittests=true ;; + no) enable_unittests=false ;; + *) as_fn_error $? "bad value ${enableval} for --{enable,disable}-unit-tests option" "$LINENO" 5 ;; +esac +else + enable_unittests=$development +fi + + +if $enable_unittests; then $as_echo "#define GDB_SELF_TEST 1" >>confdefs.h + CONFIG_OBS="$CONFIG_OBS \$(SUBDIR_UNITTESTS_OBS) common/selftest.o selftest-arch.o" CONFIG_SRCS="$CONFIG_SRCS \$(SUBDIR_UNITTESTS_SRCS) common/selftest.c selftest-arch.c" + fi + gdb_ac_transform=`echo "$program_transform_name" | sed -e 's/\\$\\$/\\$/g'` GDB_TRANSFORM_NAME=`echo gdb | sed -e "$gdb_ac_transform"` if test "x$GDB_TRANSFORM_NAME" = x; then diff --git a/gdb/configure.ac b/gdb/configure.ac index dfb7c87171..b2343a90e5 100644 --- a/gdb/configure.ac +++ b/gdb/configure.ac @@ -2247,12 +2247,10 @@ dnl At the moment, we just assume it's UTF-8. AC_DEFINE(GDB_DEFAULT_HOST_CHARSET, "UTF-8", [Define to be a string naming the default host character set.]) -if $development; then - AC_DEFINE(GDB_SELF_TEST, 1, - [Define if self-testing features should be enabled]) +GDB_AC_SELFTEST([ CONFIG_OBS="$CONFIG_OBS \$(SUBDIR_UNITTESTS_OBS) common/selftest.o selftest-arch.o" CONFIG_SRCS="$CONFIG_SRCS \$(SUBDIR_UNITTESTS_SRCS) common/selftest.c selftest-arch.c" -fi +]) GDB_AC_TRANSFORM([gdb], [GDB_TRANSFORM_NAME]) GDB_AC_TRANSFORM([gcore], [GCORE_TRANSFORM_NAME]) diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index da4c24f225..27f7ab55db 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,15 @@ +2018-10-10 Sergio Durigan Junior + Simon Marchi + + * acinclude.m4: Include "../selftest.m4". + * configure: Regenerate. + * configure.ac: Use "GDB_AC_SELFTEST". + * configure.srv: Use "$enable_unittests" instead of + "$development" when checking whether unit tests have been + enabled. + * server.c (captured_main): Update message informing that + selftests have been disabled. + 2018-10-04 Tom Tromey * configure: Rebuild. diff --git a/gdb/gdbserver/acinclude.m4 b/gdb/gdbserver/acinclude.m4 index c75d783f57..fc3e344a61 100644 --- a/gdb/gdbserver/acinclude.m4 +++ b/gdb/gdbserver/acinclude.m4 @@ -31,6 +31,9 @@ m4_include(../ptrace.m4) m4_include(../ax_cxx_compile_stdcxx.m4) +dnl For GDB_AC_SELFTEST. +m4_include(../selftest.m4) + dnl Check for existence of a type $1 in libthread_db.h dnl Based on BFD_HAVE_SYS_PROCFS_TYPE in bfd/bfd.m4. diff --git a/gdb/gdbserver/configure b/gdb/gdbserver/configure index a46b865f61..1ddbd6b27e 100755 --- a/gdb/gdbserver/configure +++ b/gdb/gdbserver/configure @@ -722,6 +722,7 @@ enable_option_checking enable_maintainer_mode enable_largefile enable_libmcheck +enable_unit_tests with_ust with_ust_include with_ust_lib @@ -1367,6 +1368,8 @@ Optional Features: sometimes confusing) to the casual installer --disable-largefile omit support for large files --enable-libmcheck Try linking with -lmcheck if available + --enable-unit-tests Enable the inclusion of unit tests when compiling + GDB --enable-werror treat compile warnings as errors --enable-build-warnings enable build-time compiler warnings if gcc is used --enable-gdb-build-warnings @@ -5889,13 +5892,35 @@ fi fi -if $development; then - srv_selftest_objs="common/selftest.o" + +# Check whether we will enable the inclusion of unit tests when +# compiling GDB. +# +# The default value of this option changes depending whether we're on +# development mode (in which case it's "true") or not (in which case +# it's "false"). +# Check whether --enable-unit-tests was given. +if test "${enable_unit_tests+set}" = set; then : + enableval=$enable_unit_tests; case "${enableval}" in + yes) enable_unittests=true ;; + no) enable_unittests=false ;; + *) as_fn_error $? "bad value ${enableval} for --{enable,disable}-unit-tests option" "$LINENO" 5 ;; +esac +else + enable_unittests=$development +fi + + +if $enable_unittests; then $as_echo "#define GDB_SELF_TEST 1" >>confdefs.h + + srv_selftest_objs="common/selftest.o" + fi + case ${build_alias} in "") build_noncanonical=${build} ;; *) build_noncanonical=${build_alias} ;; diff --git a/gdb/gdbserver/configure.ac b/gdb/gdbserver/configure.ac index fa3ca53efd..f1dfa4546c 100644 --- a/gdb/gdbserver/configure.ac +++ b/gdb/gdbserver/configure.ac @@ -54,11 +54,9 @@ else fi GDB_AC_LIBMCHECK(${libmcheck_default}) -if $development; then +GDB_AC_SELFTEST([ srv_selftest_objs="common/selftest.o" - AC_DEFINE(GDB_SELF_TEST, 1, - [Define if self-testing features should be enabled]) -fi +]) ACX_NONCANONICAL_TARGET ACX_NONCANONICAL_HOST diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv index 72e6a0d87f..636d830f1a 100644 --- a/gdb/gdbserver/configure.srv +++ b/gdb/gdbserver/configure.srv @@ -24,7 +24,7 @@ # Default hostio_last_error implementation srv_hostio_err_objs="hostio-errno.o" -if $development; then +if $enable_unittests; then srv_i386_linux_regobj="i386-linux.o i386-avx-linux.o i386-avx-avx512-linux.o i386-avx-mpx-avx512-pku-linux.o i386-mpx-linux.o i386-avx-mpx-linux.o i386-mmx-linux.o linux-x86-tdesc-selftest.o" srv_amd64_linux_regobj="amd64-linux.o amd64-avx-linux.o amd64-avx-avx512-linux.o amd64-avx-mpx-avx512-pku-linux.o amd64-mpx-linux.o amd64-avx-mpx-linux.o x32-linux.o x32-avx-linux.o x32-avx-avx512-linux.o" else diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index d711c53e5f..4ec3548d64 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -3790,7 +3790,7 @@ captured_main (int argc, char *argv[]) #if GDB_SELF_TEST selftests::run_tests (selftest_filter); #else - printf (_("Selftests are not available in a non-development build.\n")); + printf (_("Selftests have been disabled for this build.\n")); #endif throw_quit ("Quit"); } diff --git a/gdb/maint.c b/gdb/maint.c index 19db8a850b..01a80f5d73 100644 --- a/gdb/maint.c +++ b/gdb/maint.c @@ -943,7 +943,7 @@ maintenance_selftest (const char *args, int from_tty) selftests::run_tests (args); #else printf_filtered (_("\ -Selftests are not available in a non-development build.\n")); +Selftests have been disabled for this build.\n")); #endif } @@ -957,7 +957,7 @@ maintenance_info_selftests (const char *arg, int from_tty) }); #else printf_filtered (_("\ -Selftests are not available in a non-development build.\n")); +Selftests have been disabled for this build.\n")); #endif } diff --git a/gdb/selftest.m4 b/gdb/selftest.m4 new file mode 100644 index 0000000000..acf4050bde --- /dev/null +++ b/gdb/selftest.m4 @@ -0,0 +1,45 @@ +dnl Copyright (C) 2018 Free Software Foundation, Inc. +dnl +dnl This file is part of GDB. +dnl +dnl This program is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 3 of the License, or +dnl (at your option) any later version. +dnl +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +dnl GNU General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with this program. If not, see . + +dnl GDB_AC_SELFTEST(ACTION-IF-ENABLED) +dnl +dnl Enable the unit/self tests if needed. If they are enabled, AC_DEFINE +dnl the GDB_SELF_TEST macro, and execute ACTION-IF-ENABLED. + +AC_DEFUN([GDB_AC_SELFTEST],[ +# Check whether we will enable the inclusion of unit tests when +# compiling GDB. +# +# The default value of this option changes depending whether we're on +# development mode (in which case it's "true") or not (in which case +# it's "false"). +AC_ARG_ENABLE(unit-tests, +AS_HELP_STRING([--enable-unit-tests], +[Enable the inclusion of unit tests when compiling GDB]), +[case "${enableval}" in + yes) enable_unittests=true ;; + no) enable_unittests=false ;; + *) AC_MSG_ERROR( +[bad value ${enableval} for --{enable,disable}-unit-tests option]) ;; +esac], [enable_unittests=$development]) + +if $enable_unittests; then + AC_DEFINE(GDB_SELF_TEST, 1, + [Define if self-testing features should be enabled]) + $1 +fi +]) diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index c627578714..f907323f96 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-10-10 Sergio Durigan Junior + + * gdb.gdb/unittest.exp: Update expected message informing that + selftests have been disabled. + * gdb.server/unittest.exp: Likewise. + 2018-10-09 Tom de Vries * lib/gdb.exp (target_supports_scheduler_locking): Replace gdb_start_cmd diff --git a/gdb/testsuite/gdb.gdb/unittest.exp b/gdb/testsuite/gdb.gdb/unittest.exp index 1c835850b8..8e3e9a1761 100644 --- a/gdb/testsuite/gdb.gdb/unittest.exp +++ b/gdb/testsuite/gdb.gdb/unittest.exp @@ -24,7 +24,7 @@ gdb_test_multiple $test $test { gdb_assert "$num_ran > 0" $test } - -re "Selftests are not available in a non-development build.\r\n$gdb_prompt $" { + -re "Selftests have been disabled for this build.\r\n$gdb_prompt $" { unsupported $test } } diff --git a/gdb/testsuite/gdb.server/unittest.exp b/gdb/testsuite/gdb.server/unittest.exp index e947ff2c30..b0a7c6ae56 100644 --- a/gdb/testsuite/gdb.server/unittest.exp +++ b/gdb/testsuite/gdb.server/unittest.exp @@ -38,7 +38,7 @@ gdb_expect { gdb_assert "$num_ran > 0" $test } - -re "Selftests are not available in a non-development build.\r\n$" { + -re "Selftests have been disabled for this build.\r\n$" { unsupported $test } -- 2.34.1