gcc/libgfortran/configure.ac
Jakub Jelinek 133d0d422e fortran, libgfortran: Avoid using libquadmath for glibc 2.26+
As mentioned by Joseph in PR105101, glibc 2.26 or later has on x86
(both -m32/-m64), powerpc64le, ia64 and mips support for
*f128 math/complex APIs plus strtof128 and strfromf128, and these APIs allow
us to avoid libquadmath for Fortran purposes on these architectures,
replace *q math/complex APIs, strtof128 instead of strtoflt128 and,
while strfromf128 unfortunately isn't a perfect replacement to
quadmath_snprintf, it can be made to work.

The advantage of this is that when configured against such glibcs
(2.26 is now almost 5 years old), we can avoid linking against an extra shared
library and the math support in glibc is maintained better than libquadmath.

We need both a compiler change (so that for glibc 2.26+ it uses *f128 APIs
instead of *q) and library change.

The above mentioned problem with strfromf128 is that the strfrom* functions
are severely restricted versions of snprintf.  In libgfortran, we handle
!isfinite differently and just use snprintf/quadmath_snprintf for
%+-#.*{L,Q}{f,e} printing.
strfrom* doesn't allow +, -, # modifiers and it only supports .34 or
similar precision, not .* .  The L/Q etc. letters are omitted.
The + is there to force + sign at the start if it is positive.
Workaround in the patch is to add the + at the start manually for
!signbit (val).
The - (left alignment instead of right) I don't understand why we need it,
when minimum field width isn't specified (for strfrom* can't be specified),
no padding is ever added anywhere I believe.
The # is to force adding . - workaround is to search for first . or e or '\0'
character, if it is '\0', just append ., if it is e, insert . before e and
memmove the rest (which is just a few bytes, e, +/- and at most a few digits)
one byte later.
The .* case is handled by creating the format string for strfrom* by
snprintf into a temporary buffer.

As requested, this patch also switches from using __float128 type in
libgfortran to _Float128 which is equivalent on all arches that support
__float128.

The change is done in a backwards compatible change, when GCC is configured
against glibc 2.26 or newer, libgfortran.so.5 itself doesn't link against
-lquadmath nor uses any libquadmath APIs, libgfortran.a doesn't use any
libquadmath APIs either.  User programs and libraries when being linked
by gfortran driver are linked against -lgfortran and -lquadmath, but
the latter only in the --as-needed linker mode, which means it needs
to be around during linking and will be linked in if there are any
calls to math/complex functions with real(kind=16) or complex(kind=16)
in compilation units compiled by older versions of gcc, but if either
user code doesn't call those math/complex functions for the largest
supported kind, or the code is recompiled by gcc with this change in,
libquadmath won't be linked in.

2022-06-28  Jakub Jelinek  <jakub@redhat.com>

gcc/fortran/
	* gfortran.h (gfc_real_info): Add use_iec_60559 bitfield.
	* trans-types.h (gfc_real16_use_iec_60559): Declare.
	* trans-types.cc (gfc_real16_use_iec_60559): Define.
	(gfc_init_kinds): When building powerpc64le-linux libgfortran
	on glibc 2.26 to 2.31, set gfc_real16_use_iec_60559 and
	use_iec_60559.
	(gfc_build_real_type): Set gfc_real16_use_iec_60559 and use_iec_60559
	on glibc 2.26 or later.
	* trans-intrinsic.cc (gfc_build_intrinsic_lib_fndecls): Adjust
	comment.  Handle gfc_real16_use_iec_60559.
	(gfc_get_intrinsic_lib_fndecl): Handle use_iec_60559.
libgfortran/
	* configure.ac: Check for strtof128 and strfromf128.
	Check for math and complex *f128 functions.  Set
	have_iec_60559_libc_support to yes if *f128 support is around, for
	--enable-libquadmath-support default to "default" rather than yes if
	have_iec_60559_libc_support is yes.
	* acinclude.m4 (LIBGFOR_CHECK_FLOAT128): Test
	_Float128/_Complex _Float128 rather than __float128 and
	_Complex float __attribute__((mode(TC))).  If libquadmath support
	is defaulted and have_iec_60559_libc_support is yes, define and subst
	USE_IEC_60559.  Remove unused LIBGFOR_BUILD_QUAD conditional.
	* Makefile.am (kinds.h): Pass @USE_IEC_60559@ as an extra
	mk-kinds-h.sh argument.
	* mk-kinds-h.sh: Accept 4th use_iec_60559 argument.  Use
	_Float128/_Complex _Float128 types instead of __float128 and
	_Complex float __attribute__((mode(TC))), and if use_iec_60559 is yes,
	use f128 suffix instead of q and define GFC_REAL_16_USE_IEC_60559.
	* kinds-override.h: Use _Float128/_Complex _Float128 types instead of
	__float128 and _Complex float __attribute__((mode(TC))), if
	USE_IEC_60559 is defined, use f128 suffixes instead of q and
	define GFC_REAL_17_USE_IEC_60559.
	* libgfortran.h: Don't include quadmath_weak.h if USE_IEC_60559 is
	defined.
	(GFC_REAL_16_INFINITY, GFC_REAL_16_QUIET_NAN): Define
	for GFC_REAL_16_USE_IEC_60559 differently.
	* caf/single.c (convert_type): Use _Float128/_Complex _Float128
	instead of __float128 and _Complex float __attribute__((mode(TC))).
	For HAVE_GFC_REAL_10 when HAVE_GFC_REAL_16 isn't defined use
	_Complex long double instead of long double.
	* ieee/issignaling_fallback.h (ieee854_float128_shape_type): Use
	_Float128 instead of __float128.
	(__issignalingf128): Change argument type to _Float128.
	(issignaling): Use _Float128 instead of __float128 in _Generic.
	* intrinsics/cshift0.c (cshift0): Use _Float128 instead of __float128
	in a comment.  Fix a comment typo, logn double -> long double.
	* intrinsics/erfc_scaled.c (_THRESH, _M_2_SQRTPI, _INF, _ERFC, _EXP):
	Use different definitions if GFC_REAL_16_USE_IEC_60559.
	(_THRESH, _M_2_SQRTPI): Use GFC_REAL_17_LITERAL macro.
	(_ERFC, _EXP): Use different definitions if GFC_REAL_17_USE_IEC_60559.
	* intrinsics/spread_generic.c (spread, spread_scalar): Use _Float128
	instead of __float128 in a comment.  Fix a comment typo,
	logn double -> long double.
	* intrinsics/trigd.c (ENABLE_SIND, ENABLE_COSD, ENABLE_TAND): Handle
	GFC_REAL_16_USE_IEC_60559.
	* intrinsics/pack_generic.c (pack): Use _Float128 instead of
	__float128 in a comment.  Fix a comment typo, logn double ->
	long double.
	* intrinsics/unpack_generic.c (unpack1, unpack0): Likewise.
	* runtime/in_pack_generic.c (internal_pack): Likewise.
	* runtime/in_unpack_generic.c (internal_unpack): Likewise.
	* io/read.c (convert_real, convert_infnan): Handle
	GFC_REAL_16_USE_IEC_60559 and GFC_REAL_17_USE_IEC_60559.
	* io/transfer128.c (tmp1, tmp2): Don't define if libquadmath
	isn't needed.
	* io/write_float.def (gfor_strfromf128): New function.
	(DTOA2Q, FDTOA2Q): Define differently if
	GFC_REAL_16_USE_IEC_60559 or GFC_REAL_17_USE_IEC_60559.
	* m4/mtype.m4: Use different suffix if GFC_REAL_16_USE_IEC_60559
	or GFC_REAL_17_USE_IEC_60559.
	* config.h.in: Regenerated.
	* configure: Regenerated.
	* Makefile.in: Regenerated.
	* generated/bessel_r16.c: Regenerated.
	* generated/bessel_r17.c: Regenerated.
	* generated/norm2_r16.c: Regenerated.
	* generated/norm2_r17.c: Regenerated.
2022-06-28 13:14:45 +02:00

825 lines
26 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Process this file with autoconf to produce a configure script, like so:
# aclocal && autoconf && autoheader && automake
AC_INIT([GNU Fortran Runtime Library], 0.3,,[libgfortran])
AC_CONFIG_HEADER(config.h)
GCC_TOPLEV_SUBDIRS
# -------
# Options
# -------
AC_MSG_CHECKING([for --enable-version-specific-runtime-libs])
AC_ARG_ENABLE(version-specific-runtime-libs,
AS_HELP_STRING([--enable-version-specific-runtime-libs],
[specify that runtime libraries should be installed in a compiler-specific directory]),
[case "$enableval" in
yes) version_specific_libs=yes ;;
no) version_specific_libs=no ;;
*) AC_MSG_ERROR([Unknown argument to enable/disable version-specific libs]);;
esac],
[version_specific_libs=no])
AC_MSG_RESULT($version_specific_libs)
# Build with intermodule optimisations
AC_MSG_CHECKING([for --enable-intermodule])
AC_ARG_ENABLE(intermodule,
AS_HELP_STRING([--enable-intermodule],[build the library in one step]),
[case "$enable_intermodule" in
yes) onestep="-onestep";;
*) onestep="";;
esac],
[onestep=""])
AC_MSG_RESULT($enable_intermodule)
AM_CONDITIONAL(onestep,[test x$onestep = x-onestep])
AC_SUBST(onestep)
# Gets build, host, target, *_vendor, *_cpu, *_os, etc.
#
# You will slowly go insane if you do not grok the following fact: when
# building this library, the top-level /target/ becomes the library's /host/.
#
# configure then causes --target to default to --host, exactly like any
# other package using autoconf. Therefore, 'target' and 'host' will
# always be the same. This makes sense both for native and cross compilers
# just think about it for a little while. :-)
#
# Also, if this library is being configured as part of a cross compiler, the
# top-level configure script will pass the "real" host as $with_cross_host.
#
# Do not delete or change the following two lines. For why, see
# http://gcc.gnu.org/ml/libstdc++/2003-07/msg00451.html
AC_CANONICAL_SYSTEM
ACX_NONCANONICAL_TARGET
target_alias=${target_alias-$host_alias}
AC_SUBST(target_alias)
# Sets up automake. Must come after AC_CANONICAL_SYSTEM. Each of the
# following is magically included in AUTOMAKE_OPTIONS in each Makefile.am.
# 1.9.6: minimum required version
# no-define: PACKAGE and VERSION will not be #define'd in config.h (a bunch
# of other PACKAGE_* variables will, however, and there's nothing
# we can do about that; they come from AC_INIT).
# foreign: we don't follow the normal rules for GNU packages (no COPYING
# file in the top srcdir, etc, etc), so stop complaining.
# no-dist: we don't want 'dist' and related rules.
# -Wall: turns on all automake warnings...
# -Wno-portability: ...except this one, since GNU make is required.
AM_INIT_AUTOMAKE([1.9.6 no-define foreign no-dist -Wall -Wno-portability])
AM_MAINTAINER_MODE
AM_ENABLE_MULTILIB(, ..)
# Handy for debugging:
#AC_MSG_NOTICE($build / $host / $target / $host_alias / $target_alias); sleep 5
# Are we being configured with some form of cross compiler?
# NB: We don't actually need to know this just now, but when, say, a test
# suite is included, we'll have to know.
if test "$build" != "$host"; then
LIBGFOR_IS_NATIVE=false
GCC_NO_EXECUTABLES
else
LIBGFOR_IS_NATIVE=true
fi
AC_USE_SYSTEM_EXTENSIONS
GCC_WITH_TOOLEXECLIBDIR
# Calculate toolexeclibdir
# Also toolexecdir, though it's only used in toolexeclibdir
case ${version_specific_libs} in
yes)
# Need the gcc compiler version to know where to install libraries
# and header files if --enable-version-specific-runtime-libs option
# is selected.
toolexecdir='$(libdir)/gcc/$(target_alias)'
toolexeclibdir='$(toolexecdir)/$(gcc_version)$(MULTISUBDIR)'
;;
no)
if test -n "$with_cross_host" &&
test x"$with_cross_host" != x"no"; then
# Install a library built with a cross compiler in tooldir, not libdir.
toolexecdir='$(exec_prefix)/$(target_alias)'
case ${with_toolexeclibdir} in
no)
toolexeclibdir='$(toolexecdir)/lib'
;;
*)
toolexeclibdir=${with_toolexeclibdir}
;;
esac
else
toolexecdir='$(libdir)/gcc-lib/$(target_alias)'
toolexeclibdir='$(libdir)'
fi
multi_os_directory=`$CC -print-multi-os-directory`
case $multi_os_directory in
.) ;; # Avoid trailing /.
*) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;;
esac
;;
esac
AC_SUBST(toolexecdir)
AC_SUBST(toolexeclibdir)
# Create a spec file, so that compile/link tests don't fail
test -f libgfortran.spec || touch libgfortran.spec
AC_LANG_C
# Check the compiler.
# The same as in boehm-gc and libstdc++. Have to borrow it from there.
# We must force CC to /not/ be precious variables; otherwise
# the wrong, non-multilib-adjusted value will be used in multilibs.
# As a side effect, we have to subst CFLAGS ourselves.
m4_rename([_AC_ARG_VAR_PRECIOUS],[real_PRECIOUS])
m4_define([_AC_ARG_VAR_PRECIOUS],[])
AC_PROG_CC
m4_rename_force([real_PRECIOUS],[_AC_ARG_VAR_PRECIOUS])
AC_SUBST(CFLAGS)
AM_PROG_CC_C_O
# Add -Wall -fno-repack-arrays -fno-underscoring if we are using GCC.
have_real_17=no
if test "x$GCC" = "xyes"; then
AM_FCFLAGS="-I . -Wall -Werror -fimplicit-none -fno-repack-arrays -fno-underscoring"
## We like to use C11 and C99 routines when available. This makes
## sure that
## __STDC_VERSION__ is set such that libc includes make them available.
AM_CFLAGS="-std=gnu11 -Wall -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition -Wextra -Wwrite-strings -Werror=implicit-function-declaration -Werror=vla"
## Compile the following tests with the same system header contents
## that we'll encounter when compiling our own source files.
CFLAGS="-std=gnu11 $CFLAGS"
case x$target in
xpowerpc64le*-linux*)
AC_PREPROC_IFELSE(
[AC_LANG_PROGRAM([[#if __SIZEOF_LONG_DOUBLE__ != 16
#error long double is double
#endif]],
[[(void) 0;]])],
[AM_FCFLAGS="$AM_FCFLAGS -mabi=ibmlongdouble -mno-gnu-attribute";
AM_CFLAGS="$AM_CFLAGS -mabi=ibmlongdouble -mno-gnu-attribute";
CFLAGS="$CFLAGS -mabi=ibmlongdouble -mno-gnu-attribute";
have_real_17=yes])
;;
*)
;;
esac
fi
AM_CONDITIONAL([HAVE_REAL_17], [test "x$have_real_17" != xno])
# Add CET specific flags if CET is enabled
GCC_CET_FLAGS(CET_FLAGS)
AM_FCFLAGS="$AM_FCFLAGS $CET_FLAGS"
AM_CFLAGS="$AM_CFLAGS $CET_FLAGS"
CFLAGS="$CFLAGS $CET_FLAGS"
AC_SUBST(AM_FCFLAGS)
AC_SUBST(AM_CFLAGS)
AC_SUBST(CFLAGS)
# Check for symbol versioning (copied from libssp).
AC_MSG_CHECKING([whether symbol versioning is supported])
AC_ARG_ENABLE(symvers,
AS_HELP_STRING([--disable-symvers],
[disable symbol versioning for libgfortran]),
gfortran_use_symver=$enableval,
gfortran_use_symver=yes)
if test "x$gfortran_use_symver" != xno; then
save_LDFLAGS="$LDFLAGS"
LDFLAGS="$LDFLAGS -fPIC -shared -Wl,--version-script,./conftest.map"
cat > conftest.map <<EOF
FOO_1.0 {
global: *foo*; bar; local: *;
};
EOF
AC_LINK_IFELSE([AC_LANG_PROGRAM([[int foo;]],[[]])],[gfortran_use_symver=gnu],[gfortran_use_symver=no])
if test x$gfortran_use_symver = xno; then
case "$target_os" in
solaris2*)
LDFLAGS="$save_LDFLAGS"
LDFLAGS="$LDFLAGS -fPIC -shared -Wl,-M,./conftest.map"
# Sun ld cannot handle wildcards and treats all entries as undefined.
cat > conftest.map <<EOF
FOO_1.0 {
global: foo; local: *;
};
EOF
AC_LINK_IFELSE([AC_LANG_PROGRAM([[int foo;]],[[]])],[gfortran_use_symver=sun],[gfortran_use_symver=no])
;;
esac
fi
LDFLAGS="$save_LDFLAGS"
fi
AC_MSG_RESULT($gfortran_use_symver)
AM_CONDITIONAL(LIBGFOR_USE_SYMVER, [test "x$gfortran_use_symver" != xno])
AM_CONDITIONAL(LIBGFOR_USE_SYMVER_GNU, [test "x$gfortran_use_symver" = xgnu])
AM_CONDITIONAL(LIBGFOR_USE_SYMVER_SUN, [test "x$gfortran_use_symver" = xsun])
# For GPU offloading, not everything in libfortran can be supported.
# Currently, the only target that has this problem is nvptx. The
# following is a (partial) list of features that are unsupportable on
# this particular target:
# * Constructors
# * alloca
# * C library support for I/O, with printf as the one notable exception
# * C library support for other features such as signal, environment
# variables, time functions
AM_CONDITIONAL(LIBGFOR_MINIMAL, [test "x${target_cpu}" = xnvptx])
# Some compiler target support may have limited support for integer
# or floating point numbers or may want to reduce the libgfortran size
# although they do have the support.
LIBGOMP_CHECKED_INT_KINDS="1 2 4 8 16"
LIBGOMP_CHECKED_REAL_KINDS="4 8 10 16"
AC_SUBST(LIBGOMP_CHECKED_INT_KINDS)
AC_SUBST(LIBGOMP_CHECKED_REAL_KINDS)
# Figure out whether the compiler supports "-ffunction-sections -fdata-sections",
# similarly to how libstdc++ does it
ac_test_CFLAGS="${CFLAGS+set}"
ac_save_CFLAGS="$CFLAGS"
# Check for -ffunction-sections -fdata-sections
AC_MSG_CHECKING([for gcc that supports -ffunction-sections -fdata-sections])
CFLAGS='-Werror -ffunction-sections -fdata-sections'
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[int foo;]])], [ac_fdsections=yes], [ac_fdsections=no])
if test "$ac_test_CFLAGS" = set; then
CFLAGS="$ac_save_CFLAGS"
else
# this is the suspicious part
CFLAGS=""
fi
if test x"$ac_fdsections" = x"yes"; then
SECTION_FLAGS='-ffunction-sections -fdata-sections'
fi
AC_MSG_RESULT($ac_fdsections)
AC_SUBST(SECTION_FLAGS)
# Check linker hardware capability support.
GCC_CHECK_LINKER_HWCAP
# Find other programs we need.
AC_CHECK_TOOL(AS, as)
AC_CHECK_TOOL(AR, ar)
AC_CHECK_TOOL(RANLIB, ranlib, ranlib-not-found-in-path-error)
AC_PROG_MAKE_SET
AC_PROG_INSTALL
# Configure libtool
#AC_MSG_NOTICE([====== Starting libtool configuration])
AC_LIBTOOL_DLOPEN
AM_PROG_LIBTOOL
LT_LIB_M
ACX_LT_HOST_FLAGS
AC_SUBST(enable_shared)
AC_SUBST(enable_static)
#AC_MSG_NOTICE([====== Finished libtool configuration]) ; sleep 10
# We need gfortran to compile parts of the library
#AC_PROG_FC(gfortran)
FC="$GFORTRAN"
AC_PROG_FC(gfortran)
# extra LD Flags which are required for targets
case "${host}" in
*-darwin*)
# Darwin needs -single_module when linking libgfortran
extra_ldflags_libgfortran=-Wl,-single_module
;;
esac
AC_SUBST(extra_ldflags_libgfortran)
# We need a working compiler at that point, otherwise give a clear
# error message and bail out.
LIBGFOR_WORKING_GFORTRAN
AC_SYS_LARGEFILE
# Types
AC_TYPE_OFF_T
AC_TYPE_INTPTR_T
AC_TYPE_UINTPTR_T
AC_CHECK_TYPES([ptrdiff_t])
# check header files (we assume C89 is available, so don't check for that)
AC_CHECK_HEADERS_ONCE(unistd.h sys/random.h sys/time.h sys/times.h \
sys/resource.h sys/types.h sys/stat.h sys/uio.h sys/wait.h \
floatingpoint.h ieeefp.h fenv.h fptrap.h \
fpxcp.h pwd.h complex.h xlocale.h)
GCC_HEADER_STDINT(gstdint.h)
AC_CHECK_MEMBERS([struct stat.st_blksize, struct stat.st_blocks, struct stat.st_rdev])
case "${host}--x${with_newlib}" in
mips*--xyes)
hardwire_newlib=1;;
nvptx*--xyes)
hardwire_newlib=1;;
esac
# Check for library functions.
if test "${hardwire_newlib:-0}" -eq 1; then
# We are being configured with a cross compiler. AC_REPLACE_FUNCS
# may not work correctly, because the compiler may not be able to
# link executables.
AC_DEFINE(HAVE_MKSTEMP, 1, [Define if you have mkstemp.])
AC_DEFINE(HAVE_STRTOF, 1, [Define if you have strtof.])
AC_DEFINE(HAVE_SNPRINTF, 1, [Define if you have snprintf.])
AC_DEFINE(HAVE_VSNPRINTF, 1, [Define if you have vsnprintf.])
AC_DEFINE(HAVE_LOCALTIME_R, 1, [Define if you have localtime_r.])
AC_DEFINE(HAVE_GMTIME_R, 1, [Define if you have gmtime_r.])
AC_DEFINE(HAVE_STRNLEN, 1, [Define if you have strnlen.])
AC_DEFINE(HAVE_STRNDUP, 1, [Define if you have strndup.])
# At some point, we should differentiate between architectures
# like x86, which have long double versions, and alpha/powerpc/etc.,
# which don't. For the time being, punt.
if test x"long_double_math_on_this_cpu" = x"yes"; then
AC_DEFINE(HAVE_STRTOLD, 1, [Define if you have strtold.])
fi
else
AC_CHECK_FUNCS_ONCE(getrusage times mkstemp strtof strtold snprintf \
ftruncate chsize chdir getentropy getlogin gethostname kill link symlink \
sleep ttyname sigaction waitpid \
alarm access fork posix_spawn setmode fcntl writev \
gettimeofday stat fstat lstat getpwuid vsnprintf dup \
getcwd localtime_r gmtime_r getpwuid_r ttyname_r clock_gettime \
getgid getpid getuid geteuid umask getegid \
secure_getenv __secure_getenv mkostemp strnlen strndup newlocale \
freelocale uselocale strerror_l strtof128 strfromf128)
fi
# Check strerror_r, cannot be above as versions with two and three arguments exist
LIBGFOR_CHECK_STRERROR_R
# Check for C99 (and other IEEE) math functions
GCC_CHECK_MATH_FUNC([acosf])
GCC_CHECK_MATH_FUNC([acos])
GCC_CHECK_MATH_FUNC([acosl])
GCC_CHECK_MATH_FUNC([acoshf])
GCC_CHECK_MATH_FUNC([acosh])
GCC_CHECK_MATH_FUNC([acoshl])
GCC_CHECK_MATH_FUNC([asinf])
GCC_CHECK_MATH_FUNC([asin])
GCC_CHECK_MATH_FUNC([asinl])
GCC_CHECK_MATH_FUNC([asinhf])
GCC_CHECK_MATH_FUNC([asinh])
GCC_CHECK_MATH_FUNC([asinhl])
GCC_CHECK_MATH_FUNC([atan2f])
GCC_CHECK_MATH_FUNC([atan2])
GCC_CHECK_MATH_FUNC([atan2l])
GCC_CHECK_MATH_FUNC([atanf])
GCC_CHECK_MATH_FUNC([atan])
GCC_CHECK_MATH_FUNC([atanl])
GCC_CHECK_MATH_FUNC([atanhf])
GCC_CHECK_MATH_FUNC([atanh])
GCC_CHECK_MATH_FUNC([atanhl])
GCC_CHECK_MATH_FUNC([cargf])
GCC_CHECK_MATH_FUNC([carg])
GCC_CHECK_MATH_FUNC([cargl])
GCC_CHECK_MATH_FUNC([ceilf])
GCC_CHECK_MATH_FUNC([ceil])
GCC_CHECK_MATH_FUNC([ceill])
GCC_CHECK_MATH_FUNC([copysignf])
GCC_CHECK_MATH_FUNC([copysign])
GCC_CHECK_MATH_FUNC([copysignl])
GCC_CHECK_MATH_FUNC([cosf])
GCC_CHECK_MATH_FUNC([cos])
GCC_CHECK_MATH_FUNC([cosl])
GCC_CHECK_MATH_FUNC([ccosf])
GCC_CHECK_MATH_FUNC([ccos])
GCC_CHECK_MATH_FUNC([ccosl])
GCC_CHECK_MATH_FUNC([coshf])
GCC_CHECK_MATH_FUNC([cosh])
GCC_CHECK_MATH_FUNC([coshl])
GCC_CHECK_MATH_FUNC([ccoshf])
GCC_CHECK_MATH_FUNC([ccosh])
GCC_CHECK_MATH_FUNC([ccoshl])
GCC_CHECK_MATH_FUNC([expf])
GCC_CHECK_MATH_FUNC([exp])
GCC_CHECK_MATH_FUNC([expl])
GCC_CHECK_MATH_FUNC([cexpf])
GCC_CHECK_MATH_FUNC([cexp])
GCC_CHECK_MATH_FUNC([cexpl])
GCC_CHECK_MATH_FUNC([fabsf])
GCC_CHECK_MATH_FUNC([fabs])
GCC_CHECK_MATH_FUNC([fabsl])
GCC_CHECK_MATH_FUNC([cabsf])
GCC_CHECK_MATH_FUNC([cabs])
GCC_CHECK_MATH_FUNC([cabsl])
GCC_CHECK_MATH_FUNC([floorf])
GCC_CHECK_MATH_FUNC([floor])
GCC_CHECK_MATH_FUNC([floorl])
GCC_CHECK_MATH_FUNC([fmaf])
GCC_CHECK_MATH_FUNC([fma])
GCC_CHECK_MATH_FUNC([fmal])
GCC_CHECK_MATH_FUNC([fmodf])
GCC_CHECK_MATH_FUNC([fmod])
GCC_CHECK_MATH_FUNC([fmodl])
GCC_CHECK_MATH_FUNC([frexpf])
GCC_CHECK_MATH_FUNC([frexp])
GCC_CHECK_MATH_FUNC([frexpl])
GCC_CHECK_MATH_FUNC([hypotf])
GCC_CHECK_MATH_FUNC([hypot])
GCC_CHECK_MATH_FUNC([hypotl])
GCC_CHECK_MATH_FUNC([ldexpf])
GCC_CHECK_MATH_FUNC([ldexp])
GCC_CHECK_MATH_FUNC([ldexpl])
GCC_CHECK_MATH_FUNC([logf])
GCC_CHECK_MATH_FUNC([log])
GCC_CHECK_MATH_FUNC([logl])
GCC_CHECK_MATH_FUNC([clogf])
GCC_CHECK_MATH_FUNC([clog])
GCC_CHECK_MATH_FUNC([clogl])
GCC_CHECK_MATH_FUNC([log10f])
GCC_CHECK_MATH_FUNC([log10])
GCC_CHECK_MATH_FUNC([log10l])
GCC_CHECK_MATH_FUNC([clog10f])
GCC_CHECK_MATH_FUNC([clog10])
GCC_CHECK_MATH_FUNC([clog10l])
GCC_CHECK_MATH_FUNC([nextafterf])
GCC_CHECK_MATH_FUNC([nextafter])
GCC_CHECK_MATH_FUNC([nextafterl])
GCC_CHECK_MATH_FUNC([powf])
GCC_CHECK_MATH_FUNC([pow])
GCC_CHECK_MATH_FUNC([cpowf])
GCC_CHECK_MATH_FUNC([cpow])
GCC_CHECK_MATH_FUNC([cpowl])
GCC_CHECK_MATH_FUNC([roundf])
GCC_CHECK_MATH_FUNC([round])
GCC_CHECK_MATH_FUNC([roundl])
GCC_CHECK_MATH_FUNC([lroundf])
GCC_CHECK_MATH_FUNC([lround])
GCC_CHECK_MATH_FUNC([lroundl])
GCC_CHECK_MATH_FUNC([llroundf])
GCC_CHECK_MATH_FUNC([llround])
GCC_CHECK_MATH_FUNC([llroundl])
GCC_CHECK_MATH_FUNC([scalbnf])
GCC_CHECK_MATH_FUNC([scalbn])
GCC_CHECK_MATH_FUNC([scalbnl])
GCC_CHECK_MATH_FUNC([sinf])
GCC_CHECK_MATH_FUNC([sin])
GCC_CHECK_MATH_FUNC([sinl])
GCC_CHECK_MATH_FUNC([csinf])
GCC_CHECK_MATH_FUNC([csin])
GCC_CHECK_MATH_FUNC([csinl])
GCC_CHECK_MATH_FUNC([sinhf])
GCC_CHECK_MATH_FUNC([sinh])
GCC_CHECK_MATH_FUNC([sinhl])
GCC_CHECK_MATH_FUNC([csinhf])
GCC_CHECK_MATH_FUNC([csinh])
GCC_CHECK_MATH_FUNC([csinhl])
GCC_CHECK_MATH_FUNC([sqrtf])
GCC_CHECK_MATH_FUNC([sqrt])
GCC_CHECK_MATH_FUNC([sqrtl])
GCC_CHECK_MATH_FUNC([csqrtf])
GCC_CHECK_MATH_FUNC([csqrt])
GCC_CHECK_MATH_FUNC([csqrtl])
GCC_CHECK_MATH_FUNC([tanf])
GCC_CHECK_MATH_FUNC([tan])
GCC_CHECK_MATH_FUNC([tanl])
GCC_CHECK_MATH_FUNC([ctanf])
GCC_CHECK_MATH_FUNC([ctan])
GCC_CHECK_MATH_FUNC([ctanl])
GCC_CHECK_MATH_FUNC([tanhf])
GCC_CHECK_MATH_FUNC([tanh])
GCC_CHECK_MATH_FUNC([tanhl])
GCC_CHECK_MATH_FUNC([ctanhf])
GCC_CHECK_MATH_FUNC([ctanh])
GCC_CHECK_MATH_FUNC([ctanhl])
GCC_CHECK_MATH_FUNC([truncf])
GCC_CHECK_MATH_FUNC([trunc])
GCC_CHECK_MATH_FUNC([truncl])
GCC_CHECK_MATH_FUNC([erff])
GCC_CHECK_MATH_FUNC([erf])
GCC_CHECK_MATH_FUNC([erfcf])
GCC_CHECK_MATH_FUNC([erfc])
GCC_CHECK_MATH_FUNC([erfcl])
GCC_CHECK_MATH_FUNC([j0f])
GCC_CHECK_MATH_FUNC([j0])
GCC_CHECK_MATH_FUNC([j1f])
GCC_CHECK_MATH_FUNC([j1])
GCC_CHECK_MATH_FUNC([jnf])
GCC_CHECK_MATH_FUNC([jn])
GCC_CHECK_MATH_FUNC([jnl])
GCC_CHECK_MATH_FUNC([y0f])
GCC_CHECK_MATH_FUNC([y0])
GCC_CHECK_MATH_FUNC([y1f])
GCC_CHECK_MATH_FUNC([y1])
GCC_CHECK_MATH_FUNC([ynf])
GCC_CHECK_MATH_FUNC([yn])
GCC_CHECK_MATH_FUNC([ynl])
GCC_CHECK_MATH_FUNC([tgamma])
GCC_CHECK_MATH_FUNC([tgammaf])
GCC_CHECK_MATH_FUNC([lgamma])
GCC_CHECK_MATH_FUNC([lgammaf])
# Check for GFORTRAN_C99_1.1 funcs
GCC_CHECK_MATH_FUNC([cacos])
GCC_CHECK_MATH_FUNC([cacosf])
GCC_CHECK_MATH_FUNC([cacosh])
GCC_CHECK_MATH_FUNC([cacoshf])
GCC_CHECK_MATH_FUNC([cacoshl])
GCC_CHECK_MATH_FUNC([cacosl])
GCC_CHECK_MATH_FUNC([casin])
GCC_CHECK_MATH_FUNC([casinf])
GCC_CHECK_MATH_FUNC([casinh])
GCC_CHECK_MATH_FUNC([casinhf])
GCC_CHECK_MATH_FUNC([casinhl])
GCC_CHECK_MATH_FUNC([casinl])
GCC_CHECK_MATH_FUNC([catan])
GCC_CHECK_MATH_FUNC([catanf])
GCC_CHECK_MATH_FUNC([catanh])
GCC_CHECK_MATH_FUNC([catanhf])
GCC_CHECK_MATH_FUNC([catanhl])
GCC_CHECK_MATH_FUNC([catanl])
# For POWER, check the ieee128 math functions
if test "x$have_real_17" = "xyes"; then
AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_REAL_17),[1],
[Define to 1 if you have REAL(KIND=17)])
LIBGFOR_CHECK_MATH_IEEE128([__acoshieee128])
LIBGFOR_CHECK_MATH_IEEE128([__acosieee128])
LIBGFOR_CHECK_MATH_IEEE128([__asinhieee128])
LIBGFOR_CHECK_MATH_IEEE128([__asinieee128])
LIBGFOR_CHECK_MATH_IEEE128([__atan2ieee128])
LIBGFOR_CHECK_MATH_IEEE128([__atanhieee128])
LIBGFOR_CHECK_MATH_IEEE128([__atanieee128])
LIBGFOR_CHECK_MATH_IEEE128([__coshieee128])
LIBGFOR_CHECK_MATH_IEEE128([__cosieee128])
LIBGFOR_CHECK_MATH_IEEE128([__erfieee128])
LIBGFOR_CHECK_MATH_IEEE128([__expieee128])
LIBGFOR_CHECK_MATH_IEEE128([__fabsieee128])
LIBGFOR_CHECK_MATH_IEEE128([__jnieee128])
LIBGFOR_CHECK_MATH_IEEE128([__log10ieee128])
LIBGFOR_CHECK_MATH_IEEE128([__logieee128])
LIBGFOR_CHECK_MATH_IEEE128([__powieee128])
LIBGFOR_CHECK_MATH_IEEE128([__sinhieee128])
LIBGFOR_CHECK_MATH_IEEE128([__sinieee128])
LIBGFOR_CHECK_MATH_IEEE128([__sqrtieee128])
LIBGFOR_CHECK_MATH_IEEE128([__tanhieee128])
LIBGFOR_CHECK_MATH_IEEE128([__tanieee128])
LIBGFOR_CHECK_MATH_IEEE128([__ynieee128])
fi
# On AIX, clog is present in libm as __clog
AC_CHECK_LIB([m],[__clog],[AC_DEFINE([HAVE_CLOG],[1],[libm includes clog])])
GCC_CHECK_MATH_INLINE_BUILTIN_FALLBACK2([copysign], [double])
GCC_CHECK_MATH_INLINE_BUILTIN_FALLBACK2([copysignl], [long double])
GCC_CHECK_MATH_INLINE_BUILTIN_FALLBACK1([fabs], [double])
GCC_CHECK_MATH_INLINE_BUILTIN_FALLBACK1([fabsl], [long double])
GCC_CHECK_MATH_FUNC([acosf128])
GCC_CHECK_MATH_FUNC([acoshf128])
GCC_CHECK_MATH_FUNC([asinf128])
GCC_CHECK_MATH_FUNC([asinhf128])
GCC_CHECK_MATH_FUNC([atan2f128])
GCC_CHECK_MATH_FUNC([atanf128])
GCC_CHECK_MATH_FUNC([atanhf128])
GCC_CHECK_MATH_FUNC([cargf128])
GCC_CHECK_MATH_FUNC([ceilf128])
GCC_CHECK_MATH_FUNC([copysignf128])
GCC_CHECK_MATH_FUNC([cosf128])
GCC_CHECK_MATH_FUNC([ccosf128])
GCC_CHECK_MATH_FUNC([coshf128])
GCC_CHECK_MATH_FUNC([ccoshf128])
GCC_CHECK_MATH_FUNC([expf128])
GCC_CHECK_MATH_FUNC([cexpf128])
GCC_CHECK_MATH_FUNC([fabsf128])
GCC_CHECK_MATH_FUNC([cabsf128])
GCC_CHECK_MATH_FUNC([floorf128])
GCC_CHECK_MATH_FUNC([fmaf128])
GCC_CHECK_MATH_FUNC([fmodf128])
GCC_CHECK_MATH_FUNC([frexpf128])
GCC_CHECK_MATH_FUNC([hypotf128])
GCC_CHECK_MATH_FUNC([ldexpf128])
GCC_CHECK_MATH_FUNC([logf128])
GCC_CHECK_MATH_FUNC([clogf128])
GCC_CHECK_MATH_FUNC([log10f128])
GCC_CHECK_MATH_FUNC([clog10f128])
GCC_CHECK_MATH_FUNC([nextafterf128])
GCC_CHECK_MATH_FUNC([powf128])
GCC_CHECK_MATH_FUNC([cpowf128])
GCC_CHECK_MATH_FUNC([roundf128])
GCC_CHECK_MATH_FUNC([lroundf128])
GCC_CHECK_MATH_FUNC([llroundf128])
GCC_CHECK_MATH_FUNC([scalbnf128])
GCC_CHECK_MATH_FUNC([sinf128])
GCC_CHECK_MATH_FUNC([csinf128])
GCC_CHECK_MATH_FUNC([sinhf128])
GCC_CHECK_MATH_FUNC([csinhf128])
GCC_CHECK_MATH_FUNC([sqrtf128])
GCC_CHECK_MATH_FUNC([csqrtf128])
GCC_CHECK_MATH_FUNC([tanf128])
GCC_CHECK_MATH_FUNC([ctanf128])
GCC_CHECK_MATH_FUNC([tanhf128])
GCC_CHECK_MATH_FUNC([ctanhf128])
GCC_CHECK_MATH_FUNC([truncf128])
GCC_CHECK_MATH_FUNC([erff128])
GCC_CHECK_MATH_FUNC([erfcf128])
GCC_CHECK_MATH_FUNC([j0f128])
GCC_CHECK_MATH_FUNC([j1f128])
GCC_CHECK_MATH_FUNC([jnf128])
GCC_CHECK_MATH_FUNC([y0f128])
GCC_CHECK_MATH_FUNC([y1f128])
GCC_CHECK_MATH_FUNC([ynf128])
GCC_CHECK_MATH_FUNC([tgammaf128])
GCC_CHECK_MATH_FUNC([lgammaf128])
GCC_CHECK_MATH_FUNC([cacosf128])
GCC_CHECK_MATH_FUNC([cacoshf128])
GCC_CHECK_MATH_FUNC([casinf128])
GCC_CHECK_MATH_FUNC([casinhf128])
GCC_CHECK_MATH_FUNC([catanf128])
GCC_CHECK_MATH_FUNC([catanhf128])
# Check whether the system has a working stat()
LIBGFOR_CHECK_WORKING_STAT
# Check whether __mingw_snprintf() is present
LIBGFOR_CHECK_MINGW_SNPRINTF
have_iec_60559_libc_support=no
if test "x$ac_cv_func_strtof128$ac_cv_func_strfromf128" = xyesyes \
&& test "x$gcc_cv_math_func_sinf128$gcc_cv_math_func_cacosf128" = xyesyes; then
have_iec_60559_libc_support=yes
fi
# Check whether libquadmath should be used
AC_ARG_ENABLE(libquadmath-support,
AS_HELP_STRING([--disable-libquadmath-support],
[disable libquadmath support for Fortran]),
ENABLE_LIBQUADMATH_SUPPORT=$enableval,
if test "x$have_iec_60559_libc_support" = xyes; then
ENABLE_LIBQUADMATH_SUPPORT=default
else
ENABLE_LIBQUADMATH_SUPPORT=yes
fi)
enable_libquadmath_support=
if test "${ENABLE_LIBQUADMATH_SUPPORT}" = "no" ; then
enable_libquadmath_support=no
elif test "${ENABLE_LIBQUADMATH_SUPPORT}" = "default" ; then
enable_libquadmath_support=default
fi
# Check whether we have a _Float128 type, depends on enable_libquadmath_support
# and have_iec_60559_libc_support.
LIBGFOR_CHECK_FLOAT128
# Check for GNU libc feenableexcept
AC_CHECK_LIB([m],[feenableexcept],[have_feenableexcept=yes AC_DEFINE([HAVE_FEENABLEEXCEPT],[1],[libm includes feenableexcept])])
# At least for glibc, clock_gettime is in librt. But don't
# pull that in if it still doesn't give us the function we want. This
# test is copied from libgomp, and modified to not link in -lrt as
# libgfortran calls clock_gettime via a weak reference if it's found
# in librt.
if test "$ac_cv_func_clock_gettime" = no; then
AC_CHECK_LIB(rt, clock_gettime,
[AC_DEFINE(HAVE_CLOCK_GETTIME_LIBRT, 1,
[Define to 1 if you have the `clock_gettime' function in librt.])])
fi
# Check for SysV fpsetmask
LIBGFOR_CHECK_FPSETMASK
AC_CHECK_TYPES([fp_except,fp_except_t], [], [], [[
#ifdef HAVE_IEEEFP_H
#include <ieeefp.h>
#endif
#include <math.h>
]])
AC_CHECK_TYPES([fp_rnd,fp_rnd_t], [], [], [[
#ifdef HAVE_IEEEFP_H
#include <ieeefp.h>
#endif
#include <math.h>
]])
# Check whether we have fpsetsticky or fpresetsticky
AC_CHECK_FUNC([fpsetsticky],[have_fpsetsticky=yes AC_DEFINE([HAVE_FPSETSTICKY],[1],[fpsetsticky is present])])
AC_CHECK_FUNC([fpresetsticky],[have_fpresetsticky=yes AC_DEFINE([HAVE_FPRESETSTICKY],[1],[fpresetsticky is present])])
# Check for AIX fp_trap and fp_enable
AC_CHECK_FUNC([fp_trap],[have_fp_trap=yes AC_DEFINE([HAVE_FP_TRAP],[1],[fp_trap is present])])
AC_CHECK_FUNC([fp_enable],[have_fp_enable=yes AC_DEFINE([HAVE_FP_ENABLE],[1],[fp_enable is present])])
# Check if _SOFT_FLOAT is defined
AC_CHECK_DEFINE([_SOFT_FLOAT],[have_soft_float=yes])
# Runs configure.host to set up necessary host-dependent shell variables.
# We then display a message about it, and propagate them through the
# build chain.
. ${srcdir}/configure.host
AC_MSG_NOTICE([FPU dependent file will be ${fpu_host}.h])
AC_MSG_NOTICE([Support for IEEE modules: ${ieee_support}])
FPU_HOST_HEADER=config/${fpu_host}.h
AC_SUBST(FPU_HOST_HEADER)
# Whether we will build the IEEE modules
AM_CONDITIONAL(IEEE_SUPPORT,[test x${ieee_support} = xyes])
AC_SUBST(IEEE_SUPPORT)
# Some targets require additional compiler options for IEEE compatibility.
IEEE_FLAGS="${ieee_flags}"
AC_SUBST(IEEE_FLAGS)
# Conditionalize the makefile for this target machine.
tmake_file_=
for f in ${tmake_file}
do
if test -f ${srcdir}/config/$f
then
tmake_file_="${tmake_file_} \$(srcdir)/config/$f"
fi
done
tmake_file="${tmake_file_}"
AC_SUBST(tmake_file)
# Check for POSIX getpwuid_r
#
# There are two versions of getpwuid_r, the POSIX one with 5
# arguments, and another one with 4 arguments used by at least HP-UX
# 10.2.
if test "$ac_cv_func_getpwuid_r" = "yes"; then
AC_CACHE_CHECK([POSIX version of getpwuid_r with 5 arguments], libgfor_cv_posix_getpwuid_r, [
AC_LINK_IFELSE([AC_LANG_PROGRAM([
#include <stdio.h>
#include <sys/types.h>
#include <pwd.h>], [
getpwuid_r(0, NULL, NULL, 0, NULL);
])], [libgfor_cv_posix_getpwuid_r="yes"], [libgfor_cv_posix_getpwuid_r="no"])])
fi
if test "$libgfor_cv_posix_getpwuid_r" = "yes"; then
AC_DEFINE([HAVE_POSIX_GETPWUID_R], [1], [Define to 1 if we have POSIX getpwuid_r which takes 5 arguments.])
fi
# Check out attribute support.
LIBGFOR_CHECK_ATTRIBUTE_VISIBILITY
LIBGFOR_CHECK_ATTRIBUTE_ALIAS
# Check out atomic builtins support.
LIBGFOR_CHECK_ATOMIC_FETCH_ADD
# Check out #pragma weak.
LIBGFOR_GTHREAD_WEAK
# Check out weakref support.
LIBGFOR_CHECK_WEAKREF
# Various other checks on target
LIBGFOR_CHECK_UNLINK_OPEN_FILE
# Check whether line terminator is LF or CRLF
LIBGFOR_CHECK_CRLF
# Check whether we support AVX extensions
LIBGFOR_CHECK_AVX
# Check whether we support AVX2 extensions
LIBGFOR_CHECK_AVX2
# Check whether we support AVX512f extensions
LIBGFOR_CHECK_AVX512F
# Check for FMA3 extensions
LIBGFOR_CHECK_FMA3
# Check for FMA4 extensions
LIBGFOR_CHECK_FMA4
# Check if AVX128 works
LIBGFOR_CHECK_AVX128
# Determine what GCC version number to use in filesystem paths.
GCC_BASE_VER
AC_CACHE_SAVE
if test ${multilib} = yes; then
multilib_arg="--enable-multilib"
else
multilib_arg=
fi
# Write our Makefile and spec file.
AC_CONFIG_FILES([
Makefile
libgfortran.spec
])
AC_OUTPUT