From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1726) id E264A3858C2D; Tue, 11 Oct 2022 14:19:31 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org E264A3858C2D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1665497971; bh=2a8uYHgBwpV1bdD8yC737Zg4y6OFDOgUBZr1EYWhKQo=; h=From:To:Subject:Date:From; b=EnP+qKli/Umjk0kZF3chvWlkpp6UH1aF4+QaH3no3BqDwpNRaB0Wg3qScMYqkoO+u NvDoz+kUUmUn+dnkh6HjBdI8YtypoKgGmvJSWriTEXaXFtOMivgsbMfFelKU/PJPMw Wei+FcTk5EZvb3ck9DmN8prnH1UitZu6X6ZZdHG0= Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Andrew Burgess To: gdb-cvs@sourceware.org Subject: [binutils-gdb] sim: Check known getopt definition existence X-Act-Checkin: binutils-gdb X-Git-Author: Tsukasa OI X-Git-Refname: refs/heads/master X-Git-Oldrev: 96894c19ad2b91db76b9b606d48c56ad354b4801 X-Git-Newrev: 340aa4f6872ca3c4f7fc4a79671537064d0ca91f Message-Id: <20221011141931.E264A3858C2D@sourceware.org> Date: Tue, 11 Oct 2022 14:19:31 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;h=3D340aa4f6872c= a3c4f7fc4a79671537064d0ca91f commit 340aa4f6872ca3c4f7fc4a79671537064d0ca91f Author: Tsukasa OI Date: Thu Oct 6 06:43:52 2022 +0000 sim: Check known getopt definition existence =20 Clang generates a warning if there is a function declaration/definition with zero arguments. Such declarations/definitions without a prototype= (an argument list) are deprecated forms of indefinite arguments ("-Wdeprecated-non-prototype"). On the default configuration, it cause= s a build failure (unless "--disable-werror" is specified). =20 include/getopt.h defines some getopt function definitions but one of th= em has a form "extern int getopt ();". If this form is selected in include/getopt.h, Clang generates a warning and the build fails by defa= ult. =20 In really old environments, this getopt definition with no arguments is necessary (because the definition may change between environments). However, this definition is now a cause of problems on modern environme= nts. =20 A good news is, this definition is not always selected (e.g. if used by binutils/*.c). This is because configuration scripts of binutils, gas, gprof and ld tries to find known definition of getopt function is used = and defines HAVE_DECL_GETOPT macro. If this macro is defined when getopt.h= is included, a good form of getopt is used and Clang won't generate warnin= gs. =20 This commit adds a modified portion of ld/configure.ac to find the known getopt definition. If we could find one (and we *will* in most modern environments), we don't need to rely on the deprecated definition. Diff: --- sim/config.h.in | 3 +++ sim/configure | 32 ++++++++++++++++++++++++++++++++ sim/configure.ac | 10 ++++++++++ 3 files changed, 45 insertions(+) diff --git a/sim/config.h.in b/sim/config.h.in index 84c363c0aec..9a94b289e46 100644 --- a/sim/config.h.in +++ b/sim/config.h.in @@ -41,6 +41,9 @@ /* Define to 1 if you have the `chmod' function. */ #undef HAVE_CHMOD =20 +/* Is the prototype for getopt in in the expected format? */ +#undef HAVE_DECL_GETOPT + /* Define to 1 if you have the declaration of `tzname', and to 0 if you do= n't. */ #undef HAVE_DECL_TZNAME diff --git a/sim/configure b/sim/configure index 75d1935df38..dac7f085be1 100755 --- a/sim/configure +++ b/sim/configure @@ -16428,6 +16428,38 @@ $as_echo "${WARN_CFLAGS} ${WERROR_CFLAGS}" >&6; } fi =20 =20 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a known getopt proto= type in unistd.h" >&5 +$as_echo_n "checking for a known getopt prototype in unistd.h... " >&6; } +if ${sim_cv_decl_getopt_unistd_h+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +extern int getopt (int, char *const*, const char *); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + sim_cv_decl_getopt_unistd_h=3Dyes +else + sim_cv_decl_getopt_unistd_h=3Dno +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $sim_cv_decl_getopt_unist= d_h" >&5 +$as_echo "$sim_cv_decl_getopt_unistd_h" >&6; } +if test $sim_cv_decl_getopt_unistd_h =3D yes; then + +$as_echo "#define HAVE_DECL_GETOPT 1" >>confdefs.h + +fi + =20 =20 =20 diff --git a/sim/configure.ac b/sim/configure.ac index 66a1020efe0..be0cfdbea32 100644 --- a/sim/configure.ac +++ b/sim/configure.ac @@ -177,6 +177,16 @@ SIM_AC_OPTION_STDIO SIM_AC_OPTION_TRACE SIM_AC_OPTION_WARNINGS =20 +AC_MSG_CHECKING(for a known getopt prototype in unistd.h) +AC_CACHE_VAL(sim_cv_decl_getopt_unistd_h, +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include ], [extern int get= opt (int, char *const*, const char *);])], +sim_cv_decl_getopt_unistd_h=3Dyes, sim_cv_decl_getopt_unistd_h=3Dno)]) +AC_MSG_RESULT($sim_cv_decl_getopt_unistd_h) +if test $sim_cv_decl_getopt_unistd_h =3D yes; then + AC_DEFINE([HAVE_DECL_GETOPT], 1, + [Is the prototype for getopt in in the expected format?]) +fi + dnl These are unfortunate. They are conditionally called by other sim mac= ros dnl but always used by common/Make-common.in. So we have to subst here ev= en dnl when the rest of the code is in the respective macros. Once we merge = the