|
version 1.1.1.1, 2012/02/21 22:57:49
|
version 1.1.1.3, 2021/03/17 13:38:46
|
|
Line 1
|
Line 1
|
| # strerror.m4 serial 9 | # strerror.m4 serial 20 |
| dnl Copyright (C) 2002, 2007-2008 Free Software Foundation, Inc. | dnl Copyright (C) 2002, 2007-2019 Free Software Foundation, Inc. |
| dnl This file is free software; the Free Software Foundation |
dnl This file is free software; the Free Software Foundation |
| dnl gives unlimited permission to copy and/or distribute it, |
dnl gives unlimited permission to copy and/or distribute it, |
| dnl with or without modifications, as long as this notice is preserved. |
dnl with or without modifications, as long as this notice is preserved. |
| |
|
| AC_DEFUN([gl_FUNC_STRERROR], |
AC_DEFUN([gl_FUNC_STRERROR], |
| [ |
[ |
| AC_REQUIRE([gl_FUNC_STRERROR_SEPARATE]) |
|
| if test $REPLACE_STRERROR = 1; then |
|
| AC_LIBOBJ([strerror]) |
|
| AC_DEFINE_UNQUOTED([REPLACE_STRERROR], [$REPLACE_STRERROR], |
|
| [Define this to 1 if strerror is broken.]) |
|
| fi |
|
| ]) |
|
| |
|
| # Like gl_FUNC_STRERROR, except prepare for separate compilation (no AC_LIBOBJ). |
|
| AC_DEFUN([gl_FUNC_STRERROR_SEPARATE], |
|
| [ |
|
| AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) |
AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) |
| AC_REQUIRE([gl_HEADER_ERRNO_H]) |
AC_REQUIRE([gl_HEADER_ERRNO_H]) |
| if test -z "$ERRNO_H"; then | AC_REQUIRE([gl_FUNC_STRERROR_0]) |
| | AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles |
| | m4_ifdef([gl_FUNC_STRERROR_R_WORKS], [ |
| | AC_REQUIRE([gl_FUNC_STRERROR_R_WORKS]) |
| | ]) |
| | if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then |
| AC_CACHE_CHECK([for working strerror function], |
AC_CACHE_CHECK([for working strerror function], |
| [gl_cv_func_working_strerror], |
[gl_cv_func_working_strerror], |
| [AC_RUN_IFELSE( |
[AC_RUN_IFELSE( |
| [AC_LANG_PROGRAM( |
[AC_LANG_PROGRAM( |
| [[#include <string.h> |
[[#include <string.h> |
| ]], |
]], |
| [[return !*strerror (-2);]])], | [[if (!*strerror (-2)) return 1;]])], |
| [gl_cv_func_working_strerror=yes], |
[gl_cv_func_working_strerror=yes], |
| [gl_cv_func_working_strerror=no], |
[gl_cv_func_working_strerror=no], |
| [dnl Assume crossbuild works if it compiles. | [case "$host_os" in |
| AC_COMPILE_IFELSE( | # Guess yes on glibc systems. |
| [AC_LANG_PROGRAM( | *-gnu* | gnu*) gl_cv_func_working_strerror="guessing yes" ;; |
| [[#include <string.h> | # Guess yes on musl systems. |
| ]], | *-musl*) gl_cv_func_working_strerror="guessing yes" ;; |
| [[return !*strerror (-2);]])], | # If we don't know, assume the worst. |
| [gl_cv_func_working_strerror=yes], | *) gl_cv_func_working_strerror="guessing no" ;; |
| [gl_cv_func_working_strerror=no]) | esac |
| ]) | ]) |
| ]) |
]) |
| if test $gl_cv_func_working_strerror = no; then | case "$gl_cv_func_working_strerror" in |
| dnl The system's strerror() fails to return a string for out-of-range | *yes) ;; |
| dnl integers. Replace it. | *) |
| REPLACE_STRERROR=1 | dnl The system's strerror() fails to return a string for out-of-range |
| fi | dnl integers. Replace it. |
| | REPLACE_STRERROR=1 |
| | ;; |
| | esac |
| | m4_ifdef([gl_FUNC_STRERROR_R_WORKS], [ |
| | dnl If the system's strerror_r or __xpg_strerror_r clobbers strerror's |
| | dnl buffer, we must replace strerror. |
| | case "$gl_cv_func_strerror_r_works" in |
| | *no) REPLACE_STRERROR=1 ;; |
| | esac |
| | ]) |
| else |
else |
| dnl The system's strerror() cannot know about the new errno values we add |
dnl The system's strerror() cannot know about the new errno values we add |
| dnl to <errno.h>. Replace it. | dnl to <errno.h>, or any fix for strerror(0). Replace it. |
| REPLACE_STRERROR=1 |
REPLACE_STRERROR=1 |
| fi |
fi |
| if test $REPLACE_STRERROR = 1; then |
|
| gl_PREREQ_STRERROR |
|
| fi |
|
| ]) |
]) |
| |
|
| # Prerequisites of lib/strerror.c. | dnl Detect if strerror(0) passes (that is, does not set errno, and does not |
| AC_DEFUN([gl_PREREQ_STRERROR], [ | dnl return a string that matches strerror(-1)). |
| AC_CHECK_DECLS([strerror]) | AC_DEFUN([gl_FUNC_STRERROR_0], |
| AC_CHECK_HEADERS_ONCE([sys/socket.h]) | [ |
| if test $ac_cv_header_sys_socket_h != yes; then | AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles |
| dnl We cannot use AC_CHECK_HEADERS_ONCE here, because that would make | REPLACE_STRERROR_0=0 |
| dnl the check for those headers unconditional; yet cygwin reports | AC_CACHE_CHECK([whether strerror(0) succeeds], |
| dnl that the headers are present but cannot be compiled (since on | [gl_cv_func_strerror_0_works], |
| dnl cygwin, all socket information should come from sys/socket.h). | [AC_RUN_IFELSE( |
| AC_CHECK_HEADERS([winsock2.h]) | [AC_LANG_PROGRAM( |
| fi | [[#include <string.h> |
| | #include <errno.h> |
| | ]], |
| | [[int result = 0; |
| | char *str; |
| | errno = 0; |
| | str = strerror (0); |
| | if (!*str) result |= 1; |
| | if (errno) result |= 2; |
| | if (strstr (str, "nknown") || strstr (str, "ndefined")) |
| | result |= 4; |
| | return result;]])], |
| | [gl_cv_func_strerror_0_works=yes], |
| | [gl_cv_func_strerror_0_works=no], |
| | [case "$host_os" in |
| | # Guess yes on glibc systems. |
| | *-gnu* | gnu*) gl_cv_func_strerror_0_works="guessing yes" ;; |
| | # Guess yes on musl systems. |
| | *-musl*) gl_cv_func_strerror_0_works="guessing yes" ;; |
| | # Guess yes on native Windows. |
| | mingw*) gl_cv_func_strerror_0_works="guessing yes" ;; |
| | # If we don't know, assume the worst. |
| | *) gl_cv_func_strerror_0_works="guessing no" ;; |
| | esac |
| | ]) |
| | ]) |
| | case "$gl_cv_func_strerror_0_works" in |
| | *yes) ;; |
| | *) |
| | REPLACE_STRERROR_0=1 |
| | AC_DEFINE([REPLACE_STRERROR_0], [1], [Define to 1 if strerror(0) |
| | does not return a message implying success.]) |
| | ;; |
| | esac |
| ]) |
]) |