2016-01-07 19:06:04 +08:00
|
|
|
dnl Autoconf configure script for GDB, the GNU debugger.
|
2024-01-12 23:30:44 +08:00
|
|
|
dnl Copyright (C) 1995-2024 Free Software Foundation, Inc.
|
2016-01-07 19:06:04 +08:00
|
|
|
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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
AC_DEFUN([AM_GDB_WARNINGS],[
|
|
|
|
AC_ARG_ENABLE(werror,
|
|
|
|
AS_HELP_STRING([--enable-werror], [treat compile warnings as errors]),
|
|
|
|
[case "${enableval}" in
|
|
|
|
yes | y) ERROR_ON_WARNING="yes" ;;
|
|
|
|
no | n) ERROR_ON_WARNING="no" ;;
|
|
|
|
*) AC_MSG_ERROR(bad value ${enableval} for --enable-werror) ;;
|
|
|
|
esac])
|
|
|
|
|
|
|
|
# Enable -Werror by default when using gcc. Turn it off for releases.
|
|
|
|
if test "${GCC}" = yes -a -z "${ERROR_ON_WARNING}" && $development; then
|
|
|
|
ERROR_ON_WARNING=yes
|
|
|
|
fi
|
|
|
|
|
|
|
|
WERROR_CFLAGS=""
|
|
|
|
if test "${ERROR_ON_WARNING}" = yes ; then
|
|
|
|
WERROR_CFLAGS="-Werror"
|
|
|
|
fi
|
|
|
|
|
2016-09-06 02:10:44 +08:00
|
|
|
# The options we'll try to enable.
|
2016-01-07 19:06:04 +08:00
|
|
|
build_warnings="-Wall -Wpointer-arith \
|
2018-07-09 11:05:41 +08:00
|
|
|
-Wno-unused -Wunused-value -Wunused-variable -Wunused-function \
|
2016-01-07 19:06:04 +08:00
|
|
|
-Wno-switch -Wno-char-subscripts \
|
2016-09-06 02:10:44 +08:00
|
|
|
-Wempty-body -Wunused-but-set-parameter -Wunused-but-set-variable \
|
2018-08-08 03:14:09 +08:00
|
|
|
-Wno-sign-compare -Wno-error=maybe-uninitialized \
|
2018-04-07 04:11:51 +08:00
|
|
|
-Wno-mismatched-tags \
|
2018-04-27 12:46:54 +08:00
|
|
|
-Wno-error=deprecated-register \
|
2016-08-19 00:56:11 +08:00
|
|
|
-Wsuggest-override \
|
2023-10-17 03:36:03 +08:00
|
|
|
-Wimplicit-fallthrough=5 \
|
2018-04-22 06:09:10 +08:00
|
|
|
-Wduplicated-cond \
|
2019-05-10 23:25:19 +08:00
|
|
|
-Wshadow=local \
|
|
|
|
-Wdeprecated-copy \
|
|
|
|
-Wdeprecated-copy-dtor \
|
2020-01-14 03:05:44 +08:00
|
|
|
-Wredundant-move \
|
2020-02-11 23:51:49 +08:00
|
|
|
-Wmissing-declarations \
|
|
|
|
-Wstrict-null-sentinel \
|
2024-04-13 01:51:54 +08:00
|
|
|
-Wno-vla-cxx-extension \
|
2020-02-11 23:51:49 +08:00
|
|
|
"
|
2016-01-07 19:06:04 +08:00
|
|
|
|
gdb: don't use -Wmissing-prototypes with g++
This commit aims to not make use of -Wmissing-prototypes when
compiling with g++.
Use of -Wmissing-prototypes was added with this commit:
commit a0761e34f054767de6d6389929d27e9015fb299b
Date: Wed Mar 11 15:15:12 2020 -0400
gdb: enable -Wmissing-prototypes warning
Because clang can provide helpful warnings with this flag.
Unfortunately, g++ doesn't accept this flag, and will give this
warning:
cc1plus: warning: command line option ‘-Wmissing-prototypes’ is valid for C/ObjC but not for C++
In theory the fact that this flag is not supported should be detected
by the configure check in gdbsupport/warning.m4, but for users of
ccache, this check doesn't work due to a long standing ccache issue:
https://github.com/ccache/ccache/issues/738
The ccache problem is that -W... options are reordered on the command
line, and so -Wmissing-prototypes is seen before -Werror. Usually
this doesn't matter, but the above warning (about the flag not being
valid) is issued before the -Werror flag is processed, and so is not
fatal.
There have been two previous attempts to fix this that I'm aware of.
The first is:
https://sourceware.org/pipermail/gdb-patches/2021-September/182148.html
In this attempt, instead of just relying on a compile to check if a
flag is valid, the proposal was to both compile and link. As linking
doesn't go through ccache, we don't suffer from the argument
reordering problem, and the link phase will correctly fail when using
-Wmissing-prototypes with g++. The configure script will then disable
the use of this flag.
This approach was rejected, and the suggestion was to only add the
-Wmissing-prototypes flag if we are compiling with gcc.
The second attempt, attempts this approach, and can be found here:
https://sourceware.org/pipermail/gdb-patches/2021-November/183076.html
This attempt only adds the -Wmissing-prototypes flag is the value of
GCC is not 'yes'. This feels like it is doing the right thing,
unfortunately, the GCC flag is really a 'is gcc like' flag, not a
strict, is gcc check. As such, GCC is set to 'yes' for clang, which
would mean the flag was not included for clang or gcc. The entire
point of the original commit was to add this flag for clang, so
clearly the second attempt is not sufficient either.
In this new attempt I have added gdbsupport/compiler-type.m4, this
file defines AM_GDB_COMPILER_TYPE. This macro sets the variable
GDB_COMPILER_TYPE to either 'gcc', 'clang', or 'unknown'. In future
the list of values might be extended to cover other compilers, if this
is ever useful.
I've then modified gdbsupport/warning.m4 to only add the problematic
-Wmissing-prototypes flag if GDB_COMPILER_TYPE is not 'gcc'.
I've tested this with both gcc and clang and see the expected results,
gcc no longer attempts to use the -Wmissing-prototypes flag, while
clang continues to use it.
When compiling using ccache, I am no longer seeing the warning.
2022-01-11 01:17:23 +08:00
|
|
|
# The -Wmissing-prototypes flag will be accepted by GCC, but results
|
|
|
|
# in a warning being printed about the flag not being valid for C++,
|
|
|
|
# this is something to do with using ccache, and argument ordering.
|
|
|
|
if test "$GDB_COMPILER_TYPE" != gcc; then
|
|
|
|
build_warnings="$build_warnings -Wmissing-prototypes"
|
|
|
|
fi
|
|
|
|
|
2016-01-07 19:06:04 +08:00
|
|
|
case "${host}" in
|
Fix gdb 8.1 Solaris compilation
I just tried to compile gdb trunk on Solaris 11.4 (formerly 12), and
failed for a couple of reasons:
*
In file included from /usr/include/python2.7/Python.h:128:0,
from /vol/src/gnu/gdb/gdb/dist/gdb/python/python-internal.h:94,
from /vol/src/gnu/gdb/gdb/dist/gdb/python/py-instruction.h:23,
from /vol/src/gnu/gdb/gdb/dist/gdb/python/py-instruction.c:21:
/usr/include/python2.7/ceval.h:67:0: error: ignoring #pragma no_inline [-Werror=unknown-pragmas]
#pragma no_inline(PyEval_EvalFrameEx)
^
New in Solaris 11.4: <python2.7/ceval.h> uses a Studio-only #pragma.
I've disabled the warning in warnings.m4.
*
/vol/src/gnu/gdb/gdb/dist/gdb/ser-pipe.c: In function ‘int pipe_open(serial*, const char*)’:
/vol/src/gnu/gdb/gdb/dist/gdb/ser-pipe.c:77:9: error: ‘pid_t vfork()’ is deprecated (declared at /usr/include/unistd.h:659) [-Werror=deprecated-declarations]
pid = vfork ();
^
/vol/src/gnu/gdb/gdb/dist/gdb/ser-pipe.c:77:16: error: ‘pid_t vfork()’ is deprecated (declared at /usr/include/unistd.h:659) [-Werror=deprecated-declarations]
pid = vfork ();
^
Since Solaris 11, vfork () is marked deprecated in <unistd.h>.
cf. vfork(2):
The vfork() and vforkx() functions are deprecated. Their sole legiti-
mate use as a prelude to an immediate call to a function from the exec
family can be achieved safely by posix_spawn(3C) or posix_spawnp(3C).
Again, I've disabled the warning.
*
/vol/src/gnu/gdb/gdb/dist/gdb/cli/cli-cmds.c: In function ‘void shell_escape(const char*, int)’:
/vol/src/gnu/gdb/gdb/dist/gdb/cli/cli-cmds.c:750:14: error: ‘pid_t vfork()’ is deprecated (declared at /usr/include/unistd.h:659) [-Werror=deprecated-declarations]
if ((pid = vfork ()) == 0)
^
/vol/src/gnu/gdb/gdb/dist/gdb/cli/cli-cmds.c:750:21: error: ‘pid_t vfork()’ is deprecated (declared at /usr/include/unistd.h:659) [-Werror=deprecated-declarations]
if ((pid = vfork ()) == 0)
^
Same problem.
*
/vol/src/gnu/gdb/gdb/dist/gdb/procfs.c: In function ‘void procfs_init_inferior(target_ops*, int)’:
/vol/src/gnu/gdb/gdb/dist/gdb/procfs.c:4380:30: error: ‘START_INFERIOR_TRAPS_EXPECTED’ was not declared in this scope
gdb_startup_inferior (pid, START_INFERIOR_TRAPS_EXPECTED);
^
defined in nat/fork-inferior.h, need to include that header
/vol/src/gnu/gdb/gdb/dist/gdb/procfs.c: In function ‘void procfs_create_inferior(target_ops*, const char*, const string&, char**, int)’:
/vol/src/gnu/gdb/gdb/dist/gdb/procfs.c:4605:38: error: ‘fork_inferior’ was not declared in this scope
NULL, NULL, shell_file, NULL);
^
likewise
/vol/src/gnu/gdb/gdb/dist/gdb/procfs.c: In function ‘void procfs_info_proc(target_ops*, const char*, info_proc_what)’:
/vol/src/gnu/gdb/gdb/dist/gdb/procfs.c:5124:20: error: ‘argv’ was not declared in this scope
for (char *arg : argv)
^
Typo, should be built_argv instead!
*
Undefined first referenced
symbol in file
fork_inferior(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char**, void (*)(), void (*)(int), void (*)(), char const*, void (*)(char const*, char* const*, char* const*)) procfs.o
startup_inferior(int, int, target_waitstatus*, ptid_t*) fork-child.o
ld: fatal: symbol referencing errors
collect2: error: ld returned 1 exit status
make[2]: *** [Makefile:2249: gdb] Error 1
Need to add fork-inferior.o to NATDEPFILES.
With the changes below, I can build gdb on sparcv9-sun-solaris2.11 and
amd64-pc-solaris2.11 and a simple smoke test (gdb/gdb gdb/gdb) works.
2017-09-22 16:42:45 +08:00
|
|
|
*-*-mingw32*)
|
|
|
|
# Enable -Wno-format by default when using gcc on mingw since many
|
|
|
|
# GCC versions complain about %I64.
|
|
|
|
build_warnings="$build_warnings -Wno-format" ;;
|
|
|
|
*-*-solaris*)
|
|
|
|
# Solaris 11.4 <python2.7/ceval.h> uses #pragma no_inline that GCC
|
|
|
|
# doesn't understand.
|
|
|
|
build_warnings="$build_warnings -Wno-unknown-pragmas"
|
|
|
|
# Solaris 11 <unistd.h> marks vfork deprecated.
|
|
|
|
build_warnings="$build_warnings -Wno-deprecated-declarations" ;;
|
2018-09-06 03:46:47 +08:00
|
|
|
*)
|
|
|
|
# Note that gcc requires -Wformat for -Wformat-nonliteral to work,
|
|
|
|
# but there's a special case for this below.
|
|
|
|
build_warnings="$build_warnings -Wformat-nonliteral" ;;
|
2016-01-07 19:06:04 +08:00
|
|
|
esac
|
|
|
|
|
|
|
|
AC_ARG_ENABLE(build-warnings,
|
|
|
|
AS_HELP_STRING([--enable-build-warnings], [enable build-time compiler warnings if gcc is used]),
|
|
|
|
[case "${enableval}" in
|
|
|
|
yes) ;;
|
|
|
|
no) build_warnings="-w";;
|
|
|
|
,*) t=`echo "${enableval}" | sed -e "s/,/ /g"`
|
|
|
|
build_warnings="${build_warnings} ${t}";;
|
|
|
|
*,) t=`echo "${enableval}" | sed -e "s/,/ /g"`
|
|
|
|
build_warnings="${t} ${build_warnings}";;
|
|
|
|
*) build_warnings=`echo "${enableval}" | sed -e "s/,/ /g"`;;
|
|
|
|
esac
|
|
|
|
if test x"$silent" != x"yes" && test x"$build_warnings" != x""; then
|
|
|
|
echo "Setting compiler warning flags = $build_warnings" 6>&1
|
|
|
|
fi])dnl
|
|
|
|
AC_ARG_ENABLE(gdb-build-warnings,
|
|
|
|
AS_HELP_STRING([--enable-gdb-build-warnings], [enable GDB specific build-time compiler warnings if gcc is used]),
|
|
|
|
[case "${enableval}" in
|
|
|
|
yes) ;;
|
|
|
|
no) build_warnings="-w";;
|
|
|
|
,*) t=`echo "${enableval}" | sed -e "s/,/ /g"`
|
|
|
|
build_warnings="${build_warnings} ${t}";;
|
|
|
|
*,) t=`echo "${enableval}" | sed -e "s/,/ /g"`
|
|
|
|
build_warnings="${t} ${build_warnings}";;
|
|
|
|
*) build_warnings=`echo "${enableval}" | sed -e "s/,/ /g"`;;
|
|
|
|
esac
|
|
|
|
if test x"$silent" != x"yes" && test x"$build_warnings" != x""; then
|
|
|
|
echo "Setting GDB specific compiler warning flags = $build_warnings" 6>&1
|
|
|
|
fi])dnl
|
|
|
|
|
|
|
|
# The set of warnings supported by a C++ compiler is not the same as
|
|
|
|
# of the C compiler.
|
2016-09-06 02:10:44 +08:00
|
|
|
AC_LANG_PUSH([C++])
|
2016-01-07 19:06:04 +08:00
|
|
|
|
|
|
|
WARN_CFLAGS=""
|
|
|
|
if test "x${build_warnings}" != x -a "x$GCC" = xyes
|
|
|
|
then
|
|
|
|
AC_MSG_CHECKING(compiler warning flags)
|
|
|
|
# Separate out the -Werror flag as some files just cannot be
|
|
|
|
# compiled with it enabled.
|
|
|
|
for w in ${build_warnings}; do
|
|
|
|
# GCC does not complain about -Wno-unknown-warning. Invert
|
|
|
|
# and test -Wunknown-warning instead.
|
|
|
|
case $w in
|
|
|
|
-Wno-*)
|
|
|
|
wtest=`echo $w | sed 's/-Wno-/-W/g'` ;;
|
2018-09-06 03:46:47 +08:00
|
|
|
-Wformat-nonliteral)
|
|
|
|
# gcc requires -Wformat before -Wformat-nonliteral
|
|
|
|
# will work, so stick them together.
|
|
|
|
w="-Wformat $w"
|
|
|
|
wtest="$w"
|
|
|
|
;;
|
2016-01-07 19:06:04 +08:00
|
|
|
*)
|
|
|
|
wtest=$w ;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
case $w in
|
|
|
|
-Werr*) WERROR_CFLAGS=-Werror ;;
|
|
|
|
*)
|
|
|
|
# Check whether GCC accepts it.
|
|
|
|
saved_CFLAGS="$CFLAGS"
|
gdb: Use -Werror when checking for (un)supported warning flags
In warning.m4, we pass all the warning flags one by one to the compiler
to test if they are supported by this particular compiler. If the
compiler exits with an error, we conclude that this warning flag is not
supported and exclude it. This allows us to use warning flags without
having to worry about which versions of which compilers support each
flag.
clang, by default, only emits a warning if an unknown flag is passed:
warning: unknown warning option '-Wfoo' [-Wunknown-warning-option]
The result is that we think that all the warning flags we use are
supported by clang (they are not), and the compilation fails later when
building with -Werror, since the aforementioned warning becomes an
error. The fix is to also pass -Werror when probing for supported
flags, then we'll correctly get an error when using an unknown warning,
and we'll exclude it:
error: unknown warning option '-Wfoo' [-Werror,-Wunknown-warning-option]
I am not sure why there is a change in a random comment in
gdbserver/configure, but I suppose it's a leftfover from a previous
patch, so I included it.
gdb/ChangeLog:
* configure: Re-generate.
* warning.m4: Pass -Werror to compiler when checking for
supported warning flags.
gdb/gdbserver/ChangeLog:
* configure: Re-generate.
2017-06-18 05:18:20 +08:00
|
|
|
CFLAGS="$CFLAGS -Werror $wtest"
|
2016-01-07 19:06:04 +08:00
|
|
|
saved_CXXFLAGS="$CXXFLAGS"
|
gdb: Use -Werror when checking for (un)supported warning flags
In warning.m4, we pass all the warning flags one by one to the compiler
to test if they are supported by this particular compiler. If the
compiler exits with an error, we conclude that this warning flag is not
supported and exclude it. This allows us to use warning flags without
having to worry about which versions of which compilers support each
flag.
clang, by default, only emits a warning if an unknown flag is passed:
warning: unknown warning option '-Wfoo' [-Wunknown-warning-option]
The result is that we think that all the warning flags we use are
supported by clang (they are not), and the compilation fails later when
building with -Werror, since the aforementioned warning becomes an
error. The fix is to also pass -Werror when probing for supported
flags, then we'll correctly get an error when using an unknown warning,
and we'll exclude it:
error: unknown warning option '-Wfoo' [-Werror,-Wunknown-warning-option]
I am not sure why there is a change in a random comment in
gdbserver/configure, but I suppose it's a leftfover from a previous
patch, so I included it.
gdb/ChangeLog:
* configure: Re-generate.
* warning.m4: Pass -Werror to compiler when checking for
supported warning flags.
gdb/gdbserver/ChangeLog:
* configure: Re-generate.
2017-06-18 05:18:20 +08:00
|
|
|
CXXFLAGS="$CXXFLAGS -Werror $wtest"
|
2018-07-09 11:05:41 +08:00
|
|
|
if test "x$w" = "x-Wunused-variable"; then
|
|
|
|
# Check for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=38958,
|
|
|
|
# fixed in GCC 4.9. This test is derived from the gdb
|
|
|
|
# source code that triggered this bug in GCC.
|
2020-10-31 20:30:59 +08:00
|
|
|
AC_COMPILE_IFELSE(
|
|
|
|
[AC_LANG_PROGRAM(
|
|
|
|
[struct scoped_restore_base {};
|
|
|
|
struct scoped_restore_tmpl : public scoped_restore_base {
|
|
|
|
~scoped_restore_tmpl() {}
|
|
|
|
};],
|
|
|
|
[const scoped_restore_base &b = scoped_restore_tmpl();]
|
|
|
|
)],
|
|
|
|
[WARN_CFLAGS="${WARN_CFLAGS} $w"],
|
|
|
|
[]
|
|
|
|
)
|
2018-07-09 11:05:41 +08:00
|
|
|
else
|
2020-10-31 20:30:59 +08:00
|
|
|
AC_COMPILE_IFELSE(
|
|
|
|
[AC_LANG_PROGRAM([], [])],
|
|
|
|
[WARN_CFLAGS="${WARN_CFLAGS} $w"],
|
|
|
|
[]
|
|
|
|
)
|
2018-07-09 11:05:41 +08:00
|
|
|
fi
|
2016-01-07 19:06:04 +08:00
|
|
|
CFLAGS="$saved_CFLAGS"
|
|
|
|
CXXFLAGS="$saved_CXXFLAGS"
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
AC_MSG_RESULT(${WARN_CFLAGS} ${WERROR_CFLAGS})
|
|
|
|
fi
|
|
|
|
AC_SUBST(WARN_CFLAGS)
|
|
|
|
AC_SUBST(WERROR_CFLAGS)
|
|
|
|
|
2016-09-06 02:10:44 +08:00
|
|
|
AC_LANG_POP([C++])
|
2016-01-07 19:06:04 +08:00
|
|
|
])
|