version 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 |
]) |
]) |