mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-09 04:21:49 +08:00
3e09762b7d
Currently, if you configure gdb with explicit --enable-threading, but then configure detects std::thread does not work, configure silently disables threading support and continues configuring. This patch makes that scenario cause a configuration error, like so: $ /home/pedro/gdb/src/configure --enable-threading && make ... configure: error: std::thread does not work; disable threading make[1]: *** [Makefile:11225: configure-gdbsupport] Error 1 make[1]: Leaving directory '/home/pedro/gdb/build-windows-threads' make: *** [Makefile:1041: all] Error 2 $ Additionally, if you don't explicitly pass --enable-threading, and std::thread does not work, we will now get a warning (and the build continues): $ /home/pedro/gdb/src/configure && make ... configure: WARNING: std::thread does not work; disabling threading ... This is similar to how we handle --enable-tui and missing curses. The code and error/warning messages were borrowed from there. Change-Id: I73a8b580d1e2a796b23136920c0e181408ae1b22 Approved-By: Tom Tromey <tom@tromey.com>
292 lines
8.9 KiB
Plaintext
292 lines
8.9 KiB
Plaintext
dnl Autoconf configure snippets for common.
|
|
dnl Copyright (C) 1995-2024 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 <http://www.gnu.org/licenses/>.
|
|
|
|
dnl Invoke configury needed by the files in 'common'.
|
|
AC_DEFUN([GDB_AC_COMMON], [
|
|
# Set the 'development' global.
|
|
. $srcdir/../bfd/development.sh
|
|
|
|
AC_HEADER_STDC
|
|
AC_FUNC_ALLOCA
|
|
|
|
WIN32APILIBS=
|
|
case ${host} in
|
|
*mingw32*)
|
|
AC_DEFINE(USE_WIN32API, 1,
|
|
[Define if we should use the Windows API, instead of the
|
|
POSIX API. On Windows, we use the Windows API when
|
|
building for MinGW, but the POSIX API when building
|
|
for Cygwin.])
|
|
WIN32APILIBS="-lws2_32"
|
|
;;
|
|
esac
|
|
|
|
dnl Note that this requires codeset.m4, which is included
|
|
dnl by the users of common.m4.
|
|
AM_LANGINFO_CODESET
|
|
|
|
AC_CHECK_HEADERS(linux/perf_event.h locale.h memory.h signal.h dnl
|
|
sys/resource.h sys/socket.h dnl
|
|
sys/un.h sys/wait.h dnl
|
|
thread_db.h wait.h dnl
|
|
termios.h dnl
|
|
dlfcn.h dnl
|
|
linux/elf.h proc_service.h dnl
|
|
poll.h sys/poll.h sys/select.h)
|
|
|
|
AC_FUNC_MMAP
|
|
AC_FUNC_FORK
|
|
# Some systems (e.g. Solaris) have `socketpair' in libsocket.
|
|
AC_SEARCH_LIBS(socketpair, socket)
|
|
AC_CHECK_FUNCS([fdwalk getrlimit pipe pipe2 poll socketpair sigaction \
|
|
ptrace64 sbrk setns sigaltstack sigprocmask \
|
|
setpgid setpgrp getrusage getauxval sigtimedwait])
|
|
|
|
# This is needed for RHEL 5 and uclibc-ng < 1.0.39.
|
|
# These did not define ADDR_NO_RANDOMIZE in sys/personality.h,
|
|
# only in linux/personality.h.
|
|
AC_CHECK_DECLS([ADDR_NO_RANDOMIZE],,, [#include <sys/personality.h>])
|
|
|
|
AC_CHECK_DECLS([strstr])
|
|
|
|
# ----------------------- #
|
|
# Checks for structures. #
|
|
# ----------------------- #
|
|
|
|
AC_CHECK_MEMBERS([struct stat.st_blocks, struct stat.st_blksize])
|
|
|
|
# On FreeBSD we need libutil for the kinfo_get* functions. On
|
|
# GNU/kFreeBSD systems, FreeBSD libutil is renamed to libutil-freebsd.
|
|
# Figure out which one to use.
|
|
AC_SEARCH_LIBS(kinfo_getfile, util util-freebsd)
|
|
|
|
# Define HAVE_KINFO_GETFILE if kinfo_getfile is available.
|
|
AC_CHECK_FUNCS(kinfo_getfile)
|
|
|
|
# ----------------------- #
|
|
# Check for threading. #
|
|
# ----------------------- #
|
|
|
|
AC_ARG_ENABLE(threading,
|
|
AS_HELP_STRING([--enable-threading], [include support for parallel processing of data (yes/no)]),
|
|
[case "$enableval" in
|
|
yes) want_threading=yes ;;
|
|
no) want_threading=no ;;
|
|
*) AC_MSG_ERROR([bad value $enableval for threading]) ;;
|
|
esac],
|
|
[want_threading=auto])
|
|
|
|
# Check for std::thread. This does not work on some platforms, like
|
|
# mingw using the win32 threads model with gcc older than 13, and
|
|
# DJGPP.
|
|
AC_LANG_PUSH([C++])
|
|
AX_PTHREAD([threads=yes], [threads=no])
|
|
save_LIBS="$LIBS"
|
|
LIBS="$PTHREAD_LIBS $LIBS"
|
|
save_CXXFLAGS="$CXXFLAGS"
|
|
CXXFLAGS="$PTHREAD_CFLAGS $save_CXXFLAGS"
|
|
AC_CACHE_CHECK([for std::thread],
|
|
gdb_cv_cxx_std_thread,
|
|
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
|
|
dnl NOTE: this must be kept in sync with common-defs.h.
|
|
[[#if defined (__MINGW32__) || defined (__CYGWIN__)
|
|
# ifdef _WIN32_WINNT
|
|
# if _WIN32_WINNT < 0x0501
|
|
# undef _WIN32_WINNT
|
|
# define _WIN32_WINNT 0x0501
|
|
# endif
|
|
# else
|
|
# define _WIN32_WINNT 0x0501
|
|
# endif
|
|
#endif /* __MINGW32__ || __CYGWIN__ */
|
|
#include <thread>
|
|
#include <mutex>
|
|
void callback() { }]],
|
|
[[std::thread t(callback);]])],
|
|
gdb_cv_cxx_std_thread=yes,
|
|
gdb_cv_cxx_std_thread=no)])
|
|
|
|
if test "$threads" = "yes"; then
|
|
# This check must be here, while LIBS includes any necessary
|
|
# threading library.
|
|
AC_CHECK_FUNCS([pthread_sigmask pthread_setname_np])
|
|
fi
|
|
LIBS="$save_LIBS"
|
|
CXXFLAGS="$save_CXXFLAGS"
|
|
|
|
if test "$want_threading" != "no"; then
|
|
if test "$gdb_cv_cxx_std_thread" = "yes"; then
|
|
AC_DEFINE(CXX_STD_THREAD, 1,
|
|
[Define to 1 if std::thread works.])
|
|
else
|
|
if test "$want_threading" = "yes"; then
|
|
AC_MSG_ERROR([std::thread does not work; disable threading])
|
|
else
|
|
AC_MSG_WARN([std::thread does not work; disabling threading])
|
|
fi
|
|
fi
|
|
fi
|
|
AC_LANG_POP
|
|
|
|
dnl Check if sigsetjmp is available. Using AC_CHECK_FUNCS won't
|
|
dnl do since sigsetjmp might only be defined as a macro.
|
|
AC_CACHE_CHECK(
|
|
[for sigsetjmp],
|
|
[gdb_cv_func_sigsetjmp],
|
|
[AC_COMPILE_IFELSE(
|
|
[AC_LANG_PROGRAM(
|
|
[#include <setjmp.h>],
|
|
[sigjmp_buf env;
|
|
while (! sigsetjmp (env, 1))
|
|
siglongjmp (env, 1);]
|
|
)],
|
|
[gdb_cv_func_sigsetjmp=yes],
|
|
[gdb_cv_func_sigsetjmp=no]
|
|
)]
|
|
)
|
|
if test "$gdb_cv_func_sigsetjmp" = "yes"; then
|
|
AC_DEFINE(HAVE_SIGSETJMP, 1, [Define if sigsetjmp is available. ])
|
|
fi
|
|
|
|
AC_ARG_WITH(intel_pt,
|
|
AS_HELP_STRING([--with-intel-pt], [include Intel Processor Trace support (auto/yes/no)]),
|
|
[], [with_intel_pt=auto])
|
|
AC_MSG_CHECKING([whether to use intel pt])
|
|
AC_MSG_RESULT([$with_intel_pt])
|
|
|
|
if test "${with_intel_pt}" = no; then
|
|
AC_MSG_WARN([Intel Processor Trace support disabled; some features may be unavailable.])
|
|
HAVE_LIBIPT=no
|
|
else
|
|
AC_PREPROC_IFELSE([AC_LANG_SOURCE([[
|
|
#include <linux/perf_event.h>
|
|
#ifndef PERF_ATTR_SIZE_VER5
|
|
# error
|
|
#endif
|
|
]])], [perf_event=yes], [perf_event=no])
|
|
if test "$perf_event" != yes; then
|
|
if test "$with_intel_pt" = yes; then
|
|
AC_MSG_ERROR([linux/perf_event.h missing or too old])
|
|
else
|
|
AC_MSG_WARN([linux/perf_event.h missing or too old; some features may be unavailable.])
|
|
fi
|
|
fi
|
|
|
|
AC_LIB_HAVE_LINKFLAGS([ipt], [], [#include "intel-pt.h"], [pt_insn_alloc_decoder (0);])
|
|
if test "$HAVE_LIBIPT" != yes; then
|
|
if test "$with_intel_pt" = yes; then
|
|
AC_MSG_ERROR([libipt is missing or unusable])
|
|
else
|
|
AC_MSG_WARN([libipt is missing or unusable; some features may be unavailable.])
|
|
fi
|
|
else
|
|
save_LIBS=$LIBS
|
|
LIBS="$LIBS $LIBIPT"
|
|
AC_CHECK_FUNCS(pt_insn_event)
|
|
AC_CHECK_MEMBERS([struct pt_insn.enabled, struct pt_insn.resynced], [], [],
|
|
[#include <intel-pt.h>])
|
|
LIBS=$save_LIBS
|
|
fi
|
|
fi
|
|
|
|
# Check if the compiler and runtime support printing long longs.
|
|
|
|
AC_CACHE_CHECK([for long long support in printf],
|
|
gdb_cv_printf_has_long_long,
|
|
[AC_RUN_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT],
|
|
[[char buf[32];
|
|
long long l = 0;
|
|
l = (l << 16) + 0x0123;
|
|
l = (l << 16) + 0x4567;
|
|
l = (l << 16) + 0x89ab;
|
|
l = (l << 16) + 0xcdef;
|
|
sprintf (buf, "0x%016llx", l);
|
|
return (strcmp ("0x0123456789abcdef", buf));]])],
|
|
gdb_cv_printf_has_long_long=yes,
|
|
gdb_cv_printf_has_long_long=no,
|
|
gdb_cv_printf_has_long_long=no)])
|
|
if test "$gdb_cv_printf_has_long_long" = yes; then
|
|
AC_DEFINE(PRINTF_HAS_LONG_LONG, 1,
|
|
[Define to 1 if the "%ll" format works to print long longs.])
|
|
fi
|
|
|
|
BFD_SYS_PROCFS_H
|
|
if test "$ac_cv_header_sys_procfs_h" = yes; then
|
|
BFD_HAVE_SYS_PROCFS_TYPE(gregset_t)
|
|
BFD_HAVE_SYS_PROCFS_TYPE(fpregset_t)
|
|
BFD_HAVE_SYS_PROCFS_TYPE(prgregset_t)
|
|
BFD_HAVE_SYS_PROCFS_TYPE(prfpregset_t)
|
|
BFD_HAVE_SYS_PROCFS_TYPE(prgregset32_t)
|
|
BFD_HAVE_SYS_PROCFS_TYPE(lwpid_t)
|
|
BFD_HAVE_SYS_PROCFS_TYPE(psaddr_t)
|
|
BFD_HAVE_SYS_PROCFS_TYPE(elf_fpregset_t)
|
|
fi
|
|
|
|
dnl xxhash support
|
|
# Check for xxhash
|
|
AC_ARG_WITH(xxhash,
|
|
AS_HELP_STRING([--with-xxhash], [use libxxhash for hashing (faster) (auto/yes/no)]),
|
|
[], [with_xxhash=auto])
|
|
|
|
if test "x$with_xxhash" != "xno"; then
|
|
AC_LIB_HAVE_LINKFLAGS([xxhash], [],
|
|
[#include <xxhash.h>],
|
|
[XXH32("foo", 3, 0);
|
|
])
|
|
if test "$HAVE_LIBXXHASH" != yes; then
|
|
if test "$with_xxhash" = yes; then
|
|
AC_MSG_ERROR([xxhash is missing or unusable])
|
|
fi
|
|
fi
|
|
if test "x$with_xxhash" = "xauto"; then
|
|
with_xxhash="$HAVE_LIBXXHASH"
|
|
fi
|
|
fi
|
|
|
|
AC_MSG_CHECKING([whether to use xxhash])
|
|
AC_MSG_RESULT([$with_xxhash])
|
|
])
|
|
|
|
dnl Check that the provided value ($1) is either "yes" or "no". If not,
|
|
dnl emit an error message mentionning the configure option $2, and abort
|
|
dnl the script.
|
|
AC_DEFUN([GDB_CHECK_YES_NO_VAL],
|
|
[
|
|
case $1 in
|
|
yes | no)
|
|
;;
|
|
*)
|
|
AC_MSG_ERROR([bad value $1 for $2])
|
|
;;
|
|
esac
|
|
])
|
|
|
|
dnl Check that the provided value ($1) is either "yes", "no" or "auto". If not,
|
|
dnl emit an error message mentionning the configure option $2, and abort
|
|
dnl the script.
|
|
AC_DEFUN([GDB_CHECK_YES_NO_AUTO_VAL],
|
|
[
|
|
case $1 in
|
|
yes | no | auto)
|
|
;;
|
|
*)
|
|
AC_MSG_ERROR([bad value $1 for $2])
|
|
;;
|
|
esac
|
|
])
|