Hash :
86a9695e
Author :
Date :
2023-02-17T16:24:34
Improve cross-compilation from midipix. Reported by Ørjan Malde <red@foxi.me> at <https://lists.gnu.org/archive/html/bug-gnulib/2023-02/msg00131.html>. Since midipix consists of musl libc based on an emulation of Linux system calls, for pure libc functionality it can be treated like musl libc. * m4/calloc.m4 (_AC_FUNC_CALLOC_IF): Treat midipix like systems with musl libc. * m4/cbrtl.m4 (gl_FUNC_CBRTL): Likewise. * m4/ceil.m4 (gl_FUNC_CEIL): Likewise. * m4/ceilf.m4 (gl_FUNC_CEILF): Likewise. * m4/ceill.m4 (gl_FUNC_CEILL): Likewise. * m4/exp2l.m4 (gl_FUNC_EXP2L): Likewise. * m4/expl.m4 (gl_FUNC_EXPL): Likewise. * m4/expm1.m4 (gl_FUNC_EXPM1): Likewise. * m4/expm1f.m4 (gl_FUNC_EXPM1F): Likewise. * m4/expm1l.m4 (gl_FUNC_EXPM1L): Likewise. * m4/fclose.m4 (gl_FUNC_FCLOSE_STDIN): Likewise. * m4/fdopendir.m4 (gl_FUNC_FDOPENDIR): Likewise. * m4/ffsll.m4 (gl_FUNC_FFSLL): Likewise. * m4/floor.m4 (gl_FUNC_FLOOR): Likewise. * m4/floorf.m4 (gl_FUNC_FLOORF): Likewise. * m4/fmod.m4 (gl_FUNC_FMOD): Likewise. * m4/fmodf.m4 (gl_FUNC_FMODF): Likewise. * m4/fmodl.m4 (gl_FUNC_FMODL): Likewise. * m4/fnmatch.m4 (gl_FUNC_FNMATCH_POSIX): Likewise. * m4/fopen.m4 (gl_FUNC_FOPEN_GNU): Likewise. * m4/fpurge.m4 (gl_FUNC_FPURGE): Likewise. * m4/getdelim.m4 (gl_FUNC_GETDELIM): Likewise. * m4/getline.m4 (gl_FUNC_GETLINE): Likewise. * m4/hypot.m4 (gl_FUNC_HYPOT): Likewise. * m4/hypotf.m4 (gl_FUNC_HYPOTF): Likewise. * m4/hypotl.m4 (gl_FUNC_HYPOTL): Likewise. * m4/iconv_open-utf.m4 (gl_FUNC_ICONV_OPEN_UTF_SUPPORT): Likewise. * m4/log.m4 (gl_FUNC_LOG): Likewise. * m4/log10.m4 (gl_FUNC_LOG10): Likewise. * m4/log10f.m4 (gl_FUNC_LOG10F): Likewise. * m4/log10l.m4 (gl_FUNC_LOG10L_WORKS): Likewise. * m4/log1p.m4 (gl_FUNC_LOG1P): Likewise. * m4/log1pf.m4 (gl_FUNC_LOG1PF): Likewise. * m4/log1pl.m4 (gl_FUNC_LOG1PL, gl_FUNC_LOG1PL_WORKS): Likewise. * m4/log2.m4 (gl_FUNC_LOG2): Likewise. * m4/log2f.m4 (gl_FUNC_LOG2F): Likewise. * m4/log2l.m4 (gl_FUNC_LOG2L_WORKS): Likewise. * m4/logf.m4 (gl_FUNC_LOGF): Likewise. * m4/logl.m4 (gl_FUNC_LOGL_WORKS): Likewise. * m4/malloc.m4 (_AC_FUNC_MALLOC_IF): Likewise. * m4/mkstemp.m4 (gl_FUNC_MKSTEMP): Likewise. * m4/modf.m4 (gl_FUNC_MODF): Likewise. * m4/modff.m4 (gl_FUNC_MODFF): Likewise. * m4/modfl.m4 (gl_FUNC_MODFL): Likewise. * m4/musl.m4 (gl_MUSL_LIBC): Likewise. * m4/perror.m4 (gl_FUNC_PERROR): Likewise. * m4/posix_spawn.m4 (gl_POSIX_SPAWN_SECURE, gl_FUNC_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE, gl_FUNC_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2, gl_FUNC_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN): Likewise. * m4/printf.m4 (gl_PRINTF_SIZES_C99, gl_PRINTF_INFINITE, gl_PRINTF_INFINITE_LONG_DOUBLE, gl_PRINTF_DIRECTIVE_A, gl_PRINTF_DIRECTIVE_F, gl_PRINTF_FLAG_ZERO, gl_SNPRINTF_TRUNCATION_C99, gl_SNPRINTF_RETVAL_C99, gl_SNPRINTF_DIRECTIVE_N, gl_VSNPRINTF_ZEROSIZE_C99): Likewise. * m4/pthread_rwlock_rdlock.m4 (gl_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER): Likewise. * m4/putenv.m4 (gl_FUNC_PUTENV): Likewise. * m4/realloc.m4 (_AC_FUNC_REALLOC_IF): Likewise. * m4/remainder.m4 (gl_FUNC_REMAINDER): Likewise. * m4/remainderf.m4 (gl_FUNC_REMAINDERF): Likewise. * m4/remainderl.m4 (gl_FUNC_REMAINDERL, gl_FUNC_REMAINDERL_WORKS): Likewise. * m4/rintl.m4 (gl_FUNC_RINTL): Likewise. * m4/round.m4 (gl_FUNC_ROUND): Likewise. * m4/roundf.m4 (gl_FUNC_ROUNDF): Likewise. * m4/roundl.m4 (gl_FUNC_ROUNDL): Likewise. * m4/setenv.m4 (gl_FUNC_SETENV): Likewise. * m4/setlocale_null.m4 (gl_FUNC_SETLOCALE_NULL): Likewise. * m4/signbit.m4 (gl_SIGNBIT): Likewise. * m4/stpncpy.m4 (gl_FUNC_STPNCPY): Likewise. * m4/strerror.m4 (gl_FUNC_STRERROR, gl_FUNC_STRERROR_0): Likewise. * m4/strtod.m4 (gl_FUNC_STRTOD): Likewise. * m4/strtold.m4 (gl_FUNC_STRTOLD): Likewise. * m4/trunc.m4 (gl_FUNC_TRUNC): Likewise. * m4/truncf.m4 (gl_FUNC_TRUNCF): Likewise. * m4/truncl.m4 (gl_FUNC_TRUNCL): Likewise. * m4/ungetc.m4 (gl_FUNC_UNGETC_WORKS): Likewise. * m4/wcwidth.m4 (gl_FUNC_WCWIDTH): Likewise.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
# strtold.m4 serial 9
dnl Copyright (C) 2002-2003, 2006-2023 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.
AC_DEFUN([gl_FUNC_STRTOLD],
[
AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE])
AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
AC_CHECK_FUNCS_ONCE([strtold])
if test $ac_cv_func_strtold != yes; then
HAVE_STRTOLD=0
else
AC_CACHE_CHECK([whether strtold obeys POSIX], [gl_cv_func_strtold_works],
[AC_RUN_IFELSE([AC_LANG_PROGRAM([[
#include <stdlib.h>
#include <math.h>
#include <errno.h>
/* Compare two numbers with ==.
This is a separate function because IRIX 6.5 "cc -O" miscompiles an
'x == x' test. */
static int
numeric_equal (long double x, long double y)
{
return x == y;
}
]], [[
int result = 0;
{
/* Under Solaris 2.4, strtod returns the wrong value for the
terminating character under some conditions. */
const char *string = "NaN";
char *term;
strtold (string, &term);
if (term != string && *(term - 1) == 0)
result |= 1;
}
{
/* Older glibc and Cygwin mis-parse "-0x". */
const char *string = "-0x";
char *term;
long double value = strtold (string, &term);
long double zero = 0.0L;
if (1.0L / value != -1.0L / zero || term != (string + 2))
result |= 2;
}
{
/* IRIX 6.5, mingw do not parse hex floats. */
const char *string = "0XaP+1";
char *term;
long double value = strtold (string, &term);
if (value != 20.0L || term != (string + 6))
result |= 4;
}
{
/* IRIX 6.5 does not parse infinities. HP-UX 11.31/ia64 parses inf,
but mistakenly sets errno. */
const char *string = "inf";
char *term;
long double value;
errno = 0;
value = strtold (string, &term);
if (value != HUGE_VAL || term != (string + 3) || errno)
result |= 8;
}
{
/* glibc-2.3.2, IRIX 6.5, mingw, Haiku misparse "nan()". */
const char *string = "nan()";
char *term;
long double value = strtold (string, &term);
if (numeric_equal (value, value) || term != (string + 5))
result |= 16;
}
{
/* Mac OS X 10.5, IRIX 6.5 misparse "nan(". */
const char *string = "nan(";
char *term;
long double value = strtold (string, &term);
if (numeric_equal (value, value) || term != (string + 3))
result |= 32;
}
{
/* In Cygwin 2.9, strtold does not set errno upon underflow. */
const char *string = "1E-100000";
char *term;
long double value;
errno = 0;
value = strtold (string, &term);
if (term != (string + 9) || (value == 0.0L && errno != ERANGE))
result |= 64;
}
return result;
]])],
[gl_cv_func_strtold_works=yes],
[if expr $? '>=' 64 >/dev/null; then
gl_cv_func_strtold_works="no (underflow problem)"
else
gl_cv_func_strtold_works=no
fi
],
[dnl The last known bugs in glibc strtold(), as of this writing,
dnl were fixed in version 2.8
AC_EGREP_CPP([Lucky user],
[
#include <features.h>
#ifdef __GNU_LIBRARY__
#if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 8) || (__GLIBC__ > 2)) \
&& !defined __UCLIBC__
Lucky user
#endif
#endif
],
[gl_cv_func_strtold_works="guessing yes"],
[case "$host_os" in
# Guess yes on musl systems.
*-musl* | midipix*) gl_cv_func_strtold_works="guessing yes" ;;
# Guess 'no (underflow problem)' on Cygwin.
cygwin*) gl_cv_func_strtold_works="guessing no (underflow problem)" ;;
*) gl_cv_func_strtold_works="$gl_cross_guess_normal" ;;
esac
])
])
])
case "$gl_cv_func_strtold_works" in
*yes) ;;
*)
REPLACE_STRTOLD=1
case "$gl_cv_func_strtold_works" in
*"no (underflow problem)")
AC_DEFINE([STRTOLD_HAS_UNDERFLOW_BUG], [1],
[Define to 1 if strtold does not set errno upon underflow.])
;;
esac
;;
esac
fi
])
# Prerequisites of lib/strtold.c.
AC_DEFUN([gl_PREREQ_STRTOLD], [
AC_REQUIRE([gl_CHECK_LDEXPL_NO_LIBM])
if test $gl_cv_func_ldexpl_no_libm = yes; then
AC_DEFINE([HAVE_LDEXPL_IN_LIBC], [1],
[Define if the ldexpl function is available in libc.])
fi
gl_CHECK_FUNCS_ANDROID([nl_langinfo], [[#include <langinfo.h>]])
])