1 # Copyright (C) 2024 Mikulas Patocka
3 # This file is part of Ajla.
5 # Ajla is free software: you can redistribute it and/or modify it under the
6 # terms of the GNU General Public License as published by the Free Software
7 # Foundation, either version 3 of the License, or (at your option) any later
10 # Ajla is distributed in the hope that it will be useful, but WITHOUT ANY
11 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12 # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
14 # You should have received a copy of the GNU General Public License along with
15 # Ajla. If not, see <https://www.gnu.org/licenses/>.
18 # Process this file with autoconf to produce a configure script.
22 AC_CONFIG_SRCDIR(ajla.c)
23 AC_CONFIG_HEADERS(config.h)
24 AM_INIT_AUTOMAKE(-Wall -Werror)
26 if uname 2>/dev/null | grep -i OS/2 >/dev/null || uname 2>/dev/null | grep -i Dos >/dev/null; then
30 ACLOCAL="touch aclocal.m4; echo >/dev/null"
31 AUTOCONF="touch configure; echo >/dev/null"
32 AUTOMAKE="touch Makefile.in; echo >/dev/null"
33 AUTOHEADER="touch config.h.in; echo >/dev/null"
37 # Checks for programs.
40 CPPFLAGS="-D_GNU_SOURCE -D_ALL_SOURCE $CPPFLAGS"
44 CPPFLAGS="$CPPFLAGS -I/usr/local/include"
45 LDFLAGS="$LDFLAGS -L/usr/local/lib"
49 AC_CACHE_CHECK([for EMX], ac_cv_have_emx,
50 AC_TRY_COMPILE(, [#ifndef __EMX__
52 #endif ], ac_cv_have_emx=yes, ac_cv_have_emx=no)
54 AC_CACHE_CHECK([for WIN32], ac_cv_have_win32,
55 AC_TRY_COMPILE(, [#ifndef _WIN32
57 #endif ], ac_cv_have_win32=yes, ac_cv_have_win32=no)
59 AC_CACHE_CHECK([for Minix 3], ac_cv_have_minix3,
60 AC_TRY_COMPILE(, [#ifndef __minix__
62 #endif ], ac_cv_have_minix3=yes, ac_cv_have_minix3=no)
65 AC_ARG_ENABLE(threads, [ --disable-threads disable threads], enable_threads="$enableval", enable_threads=yes)
67 if test "$enable_threads" != no && test "$ac_cv_have_minix3" = no; then
68 if test "$enable_threads" = pthread || test "$ac_cv_have_emx" != yes -a "$ac_cv_have_win32" != yes; then
70 LIBS="$PTHREAD_LIBS $LIBS"
71 CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
74 if test "$ax_pthread_ok" != yes -a "$ac_cv_have_emx" = yes; then
77 if test "$ax_pthread_ok" = yes -a "$enable_threads" = pthread; then
78 AC_DEFINE([HAVE_PTHREAD_PREFER], 1, [Prefer pthreads])
82 AC_ARG_ENABLE(computed-goto, [ --disable-computed-goto disable computed goto], enable_computed_goto="$enableval", enable_computed_goto=yes)
84 AC_ARG_ENABLE(bitwise-frame, [ --enable-bitwise-frame use bitwise tags on the frame], enable_bitwise_frame="$enableval", enable_bitwise_frame=no)
85 test "$enable_bitwise_frame" = yes && AC_DEFINE(HAVE_BITWISE_FRAME, 1, Use bitwise frame)
87 AC_ARG_ENABLE(debuglevel, [ --enable-debuglevel set internal checking level
89 1 - checks that don't degrade performane (default)
90 2 - checks that degrade performance
91 3 - checks that degrade performance seriously], enable_debuglevel="$enableval", enable_debuglevel=1)
92 if test "$enable_debuglevel" = no; then enable_debuglevel=0; fi
93 if test "$enable_debuglevel" = yes; then enable_debuglevel=2; fi
94 AC_DEFINE_UNQUOTED(HAVE_DEBUGLEVEL, $enable_debuglevel, Debugging level)
96 # Checks for typedefs, structures, and compiler characteristics.
102 AC_CACHE_CHECK(for __float128, ac_cv_have___float128,
104 volatile __float128 a = 0.1;
105 volatile __float128 b = 0.2;
106 volatile __float128 c, d, e, f;
107 volatile int g, h, i, j;
117 ], ac_cv_have___float128=yes, ac_cv_have___float128=no))
118 test "$ac_cv_have___float128" = yes && AC_DEFINE(HAVE___FLOAT128, 1, Have __float128)
120 AC_CACHE_CHECK(for signbit(__float128), ac_cv_have_signbit__float128,
123 volatile __float128 a = 0.1;
128 ], ac_cv_have_signbit__float128=yes, ac_cv_have_signbit__float128=no, ac_cv_have_signbit__float128=no))
129 test "$ac_cv_have_signbit__float128" = yes && AC_DEFINE(HAVE_SIGNBIT___FLOAT128, 1, Have signbit(__float128))
131 AC_CHECK_TYPES([max_align_t], [], [], [[#include <stddef.h>]])
132 AC_CHECK_TYPES([sig_atomic_t], [], [], [[#include <signal.h>]])
133 AC_CHECK_TYPES([sigset_t], [], [], [[#include <signal.h>]])
134 AC_CHECK_TYPES([socklen_t], [], [], [[
135 #include <sys/types.h>
136 #include <sys/socket.h>]])
137 AC_CHECK_TYPES([_Float16], [], [], [])
143 default_unsigned__int128=0
146 default_long_double=0
148 AC_CHECK_SIZEOF(unsigned short,"$default_short")
149 AC_CHECK_SIZEOF(unsigned, "$default_int")
150 AC_CHECK_SIZEOF(unsigned long, "$default_long")
151 AC_CHECK_SIZEOF(unsigned long long, "$default_long_long")
152 AC_CHECK_SIZEOF(unsigned __int128, "$default_unsigned__int128")
153 AC_CHECK_SIZEOF(void *, "$default_void")
154 AC_CHECK_SIZEOF(size_t, "$default_size_t")
155 AC_CHECK_SIZEOF(long double, "$default_long_double")
157 if test "$ax_pthread_ok" = yes; then
158 AC_CACHE_CHECK([for PTHREAD_MUTEX_ERRORCHECK],
159 ax_cv_PTHREAD_MUTEX_ERRORCHECK, [
161 AC_LANG_PROGRAM([[#include <pthread.h>]], [[int i = PTHREAD_MUTEX_ERRORCHECK;]])],
162 [ax_cv_PTHREAD_MUTEX_ERRORCHECK=yes],
163 [ax_cv_PTHREAD_MUTEX_ERRORCHECK=no])
165 AS_IF([test "x$ax_cv_PTHREAD_MUTEX_ERRORCHECK" = "xyes"],
166 AC_DEFINE([HAVE_PTHREAD_MUTEX_ERRORCHECK], 1, [Have PTHREAD_MUTEX_ERRORCHECK]))
169 AC_CACHE_CHECK([for PTHREAD_MUTEX_ERRORCHECK_NP],
170 ax_cv_PTHREAD_MUTEX_ERRORCHECK_NP, [
172 AC_LANG_PROGRAM([[#include <pthread.h>]], [[int i = PTHREAD_MUTEX_ERRORCHECK_NP;]])],
173 [ax_cv_PTHREAD_MUTEX_ERRORCHECK_NP=yes],
174 [ax_cv_PTHREAD_MUTEX_ERRORCHECK_NP=no])
176 AS_IF([test "x$ax_cv_PTHREAD_MUTEX_ERRORCHECK_NP" = "xyes"],
177 AC_DEFINE([HAVE_PTHREAD_MUTEX_ERRORCHECK_NP], 1, [Have PTHREAD_MUTEX_ERRORCHECK_NP]))
179 AC_CACHE_CHECK([if we can assign to pthread_key_t],
180 ax_cv_pthread_key_t_assign, [
182 AC_LANG_PROGRAM([[#include <pthread.h>]], [[pthread_key_t key = (pthread_key_t)-1;]])],
183 [ax_cv_pthread_key_t_assign=yes],
184 [ax_cv_pthread_key_t_assign=no])
186 AS_IF([test "x$ax_cv_pthread_key_t_assign" = "xyes"],
187 AC_DEFINE([HAVE_PTHREAD_KEY_T_ASSIGN], 1, [Can assign to pthread_key_t]))
191 AC_CACHE_CHECK(for __thread, ac_cv_have___thread,
194 static __thread int j = 0;
197 ], ac_cv_have___thread=yes, ac_cv_have___thread=no))
198 test "$ac_cv_have___thread" = yes && AC_DEFINE(HAVE___THREAD, __thread, Have thread local storage)
200 AC_CACHE_CHECK(for computed goto, ac_cv_have_computed_goto,
203 static const void *dispatch[[4096]] = {
206 goto *(void *)dispatch[[10]];
209 #if defined(__GNUC__) && __GNUC__ <= 2
212 ], ac_cv_have_computed_goto=yes, ac_cv_have_computed_goto=no))
213 test "$ac_cv_have_computed_goto" = yes && test "$enable_computed_goto" != no && AC_DEFINE(HAVE_COMPUTED_GOTO, 1, Have computed goto)
215 if echo "$CC" | grep clang >/dev/null; then
216 AC_CACHE_CHECK(for -no-integrated-as, ac_cv_have_no_integrated_as,
217 save_CFLAGS="$CFLAGS"
218 CFLAGS="-no-integrated-as $CFLAGS"
219 AC_TRY_LINK([ ], [ ], ac_cv_have_no_integrated_as=yes, ac_cv_have_no_integrated_as=no)
220 CFLAGS="$save_CFLAGS"
222 test "$ac_cv_have_no_integrated_as" = yes && CFLAGS="-no-integrated-as $CFLAGS"
225 AC_CACHE_CHECK(for gcc assembler, ac_cv_have_gcc_assembler,
230 __asm__ (""::"i"(63355));
231 __asm__ volatile ("":::"memory");
232 __asm__ (".if 0 \n .endif" : "=r"(dest) : "0"(src));
237 ], ac_cv_have_gcc_assembler=yes, ac_cv_have_gcc_assembler=no))
238 test "$ac_cv_have_gcc_assembler" = yes && AC_DEFINE(HAVE_GCC_ASSEMBLER, 1, Have gcc assembler)
240 if test "$ac_cv_have_gcc_assembler" = yes; then
241 AC_CACHE_CHECK(for asm goto, ac_cv_have_asm_goto,
244 __asm__ goto("" : : : : label);
247 ], ac_cv_have_asm_goto=yes, ac_cv_have_asm_goto=no))
248 test "$ac_cv_have_asm_goto" = yes && AC_DEFINE(HAVE_ASM_GOTO, 1, Have asm goto)
250 if test "$ac_cv_sizeof_unsigned___int128" != 0; then
251 AC_CACHE_CHECK(for assembler __int128, ac_cv_have_assembler___int128,
254 volatile __int128 a, b;
256 #if defined(__aarch64__)
257 __asm__ ("mov %H0, %H1; mov %x0, %x1" : "=&r"(b) : "r"(a));
258 #elif defined(__x86_64__)
259 __asm__ ("" : "=A"(b) : "A"(a));
261 __asm__ ("" : "=r"(b) : "0"(a));
264 ], ac_cv_have_assembler___int128=yes, ac_cv_have_assembler___int128=no))
265 test "$ac_cv_have_assembler___int128" = yes && AC_DEFINE(HAVE_ASSEMBLER___INT128, 1, Have assembler __int128)
268 AC_CACHE_CHECK(for X86 assembler popcnt, ac_cv_have_x86_assembler_popcnt,
271 __asm__ volatile ("popcntw %%ax, %%bx \n popcntl %%eax, %%ebx":::"eax", "ebx", "cc");
272 ], ac_cv_have_x86_assembler_popcnt=yes, ac_cv_have_x86_assembler_popcnt=no))
273 test "$ac_cv_have_x86_assembler_popcnt" = yes && AC_DEFINE(HAVE_X86_ASSEMBLER_POPCNT, 1, Have X86 popcnt)
275 AC_CACHE_CHECK(for X86 assembler lzcnt, ac_cv_have_x86_assembler_lzcnt,
278 __asm__ volatile ("lzcntw %%ax, %%bx \n lzcntl %%eax, %%ebx":::"eax", "ebx", "cc");
279 ], ac_cv_have_x86_assembler_lzcnt=yes, ac_cv_have_x86_assembler_lzcnt=no))
280 test "$ac_cv_have_x86_assembler_lzcnt" = yes && AC_DEFINE(HAVE_X86_ASSEMBLER_LZCNT, 1, Have X86 lzcnt)
282 AC_CACHE_CHECK(for X86 assembler sse, ac_cv_have_x86_assembler_sse,
287 __asm__ volatile ("cvtss2si (%1), %0":"=r"(i):"r"(&a));
288 ], ac_cv_have_x86_assembler_sse=yes, ac_cv_have_x86_assembler_sse=no))
289 test "$ac_cv_have_x86_assembler_sse" = yes && AC_DEFINE(HAVE_X86_ASSEMBLER_SSE, 1, Have X86 sse)
291 AC_CACHE_CHECK(for X86 assembler sse2, ac_cv_have_x86_assembler_sse2,
296 __asm__ volatile ("cvtsd2si (%1), %0":"=r"(i):"r"(&a));
297 ], ac_cv_have_x86_assembler_sse2=yes, ac_cv_have_x86_assembler_sse2=no))
298 test "$ac_cv_have_x86_assembler_sse2" = yes && AC_DEFINE(HAVE_X86_ASSEMBLER_SSE2, 1, Have X86 sse2)
300 AC_CACHE_CHECK(for X86 assembler avx, ac_cv_have_x86_assembler_avx,
305 __asm__ volatile ("vcvtss2si (%1), %0":"=r"(i):"r"(&a));
306 ], ac_cv_have_x86_assembler_avx=yes, ac_cv_have_x86_assembler_avx=no))
307 test "$ac_cv_have_x86_assembler_avx" = yes && AC_DEFINE(HAVE_X86_ASSEMBLER_AVX, 1, Have X86 avx)
309 AC_CACHE_CHECK(for X86 assembler f16c, ac_cv_have_x86_assembler_f16c,
312 __asm__ volatile ("vcvtps2ph \$0, %%xmm0, %%xmm0":::"memory");
313 ], ac_cv_have_x86_assembler_f16c=yes, ac_cv_have_x86_assembler_f16c=no))
314 test "$ac_cv_have_x86_assembler_f16c" = yes && AC_DEFINE(HAVE_X86_ASSEMBLER_F16C, 1, Have X86 f16c)
316 AC_CACHE_CHECK(for X86 assembler fp16, ac_cv_have_x86_assembler_fp16,
319 __asm__ volatile ("vmovsh (%%rax), %%xmm0":::"memory");
320 ], ac_cv_have_x86_assembler_fp16=yes, ac_cv_have_x86_assembler_fp16=no))
321 test "$ac_cv_have_x86_assembler_fp16" = yes && AC_DEFINE(HAVE_X86_ASSEMBLER_FP16, 1, Have X86 fp16)
323 AC_CACHE_CHECK(for ARM assembler, ac_cv_have_arm_assembler,
326 __asm__ volatile (".cpu cortex-a15 \n .fpu neon-vfpv4 \n mov r1, r2":::"r1", "r2");
327 ], ac_cv_have_arm_assembler=yes, ac_cv_have_arm_assembler=no))
328 test "$ac_cv_have_arm_assembler" = yes && AC_DEFINE(HAVE_ARM_ASSEMBLER, 1, Have ARM assembler)
330 if test "$ac_cv_have_arm_assembler" = yes; then
331 AC_CACHE_CHECK(for ARM assembler clz, ac_cv_have_arm_assembler_clz,
334 __asm__ volatile (".cpu cortex-a15 \n .fpu neon-vfpv4 \n clz r1, r2":::"r1", "r2");
335 ], ac_cv_have_arm_assembler_clz=yes, ac_cv_have_arm_assembler_clz=no))
336 test "$ac_cv_have_arm_assembler_clz" = yes && AC_DEFINE(HAVE_ARM_ASSEMBLER_CLZ, 1, Have ARM clz)
338 AC_CACHE_CHECK(for ARM assembler rbit, ac_cv_have_arm_assembler_rbit,
341 __asm__ volatile (".cpu cortex-a15 \n .fpu neon-vfpv4 \n rbit r1, r2":::"r1", "r2");
342 ], ac_cv_have_arm_assembler_rbit=yes, ac_cv_have_arm_assembler_rbit=no))
343 test "$ac_cv_have_arm_assembler_rbit" = yes && AC_DEFINE(HAVE_ARM_ASSEMBLER_RBIT, 1, Have ARM rbit)
345 AC_CACHE_CHECK(for ARM assembler sdiv udiv, ac_cv_have_arm_assembler_sdiv_udiv,
348 __asm__ volatile (".cpu cortex-a15 \n .fpu neon-vfpv4 \n sdiv r1, r2, r3 \n udiv r1, r2, r3":::"r1", "r2", "r3");
349 ], ac_cv_have_arm_assembler_sdiv_udiv=yes, ac_cv_have_arm_assembler_sdiv_udiv=no))
350 test "$ac_cv_have_arm_assembler_sdiv_udiv" = yes && AC_DEFINE(HAVE_ARM_ASSEMBLER_SDIV_UDIV, 1, Have ARM sdiv udiv)
352 AC_CACHE_CHECK(for ARM assembler half-precision, ac_cv_have_arm_assembler_half_precision,
355 __asm__ volatile (".cpu cortex-a15 \n .fpu neon-vfpv4 \n vcvtb.f16.f32 s0, s0 \n vcvtb.f32.f16 s0, s0":::"s0");
356 ], ac_cv_have_arm_assembler_half_precision=yes, ac_cv_have_arm_assembler_half_precision=no))
357 test "$ac_cv_have_arm_assembler_half_precision" = yes && AC_DEFINE(HAVE_ARM_ASSEMBLER_HALF_PRECISION, 1, Have ARM half precision)
359 AC_CACHE_CHECK(for ARM assembler vfp, ac_cv_have_arm_assembler_vfp,
362 __asm__ volatile (".cpu cortex-a15 \n .fpu neon-vfpv4 \n vld1.8 d0[[0]], [[r1]] \n vcnt.8 d0, d0 \n vpaddl.u8 d0, d0 \n vst1.8 d0[[0]], [[r1]]":::"r1", "d0");
363 ], ac_cv_have_arm_assembler_vfp=yes, ac_cv_have_arm_assembler_vfp=no))
364 test "$ac_cv_have_arm_assembler_vfp" = yes && AC_DEFINE(HAVE_ARM_ASSEMBLER_VFP, 1, Have ARM VFP)
368 # Checks for header files.
369 AC_CHECK_HEADERS(asm/prctl.h ffi.h gmp.h gmp/gmp.h linux/falloc.h linux/fs.h malloc.h netdb.h netinet/in.h os2thunk.h quadmath.h signal.h stdalign.h stdatomic.h stdnoreturn.h sys/auxv.h sys/builtin.h sys/epoll.h sys/event.h sys/fmutex.h sys/inotify.h sys/mman.h sys/mount.h sys/netinet.in sys/param.h sys/pstat.h sys/select.h sys/socket.h sys/statvfs.h sys/syscall.h sys/sysctl.h sys/sysmacros.h sys/time.h sys/ucred.h sys/utsname.h sys/vfs.h ucontext.h x86/sysarch.h)
371 # Checks for libraries.
372 AC_CHECK_LIB(m, frexp)
373 if test "$ac_cv_have___float128" = yes && test "$ac_cv_header_quadmath_h" = yes; then
374 AC_CHECK_LIB(quadmath, frexpq)
376 AC_ARG_WITH(gmp, [ --without-gmp use built-in gmp])
377 if test "$with_gmp" != "no"; then
378 if test "$ac_cv_header_gmp_h" = yes || test "$ac_cv_header_gmp_gmp_h" = yes; then
379 AC_CHECK_LIB(gmp, __gmpz_init2)
382 if test "$ac_cv_header_ffi_h" = yes; then
383 AC_CHECK_LIB(ffi, ffi_prep_cif)
384 AC_CHECK_FUNCS(ffi_prep_cif_var)
385 if test "$ac_cv_have_emx" = no -a "$ac_cv_have_win32" = no; then
386 AC_CHECK_FUNCS(dlopen)
387 if test "$ac_cv_have_dlopen" != yes; then
388 AC_CHECK_LIB(dl, dlopen)
395 AC_CHECK_LIB(xnet, getpeername)
397 # Checks for library functions.
398 AC_CHECK_FUNCS(accept4 aligned_alloc amd64_set_gsbase cfmakeraw chown clock_gettime epoll_create fallocate fchdir fchmodat fchownat fdatasync ffs ffsl ffsll fls flsl flsll fstat64 fstatat fstatfs fstatvfs fstatvfs64 ftruncate64 getauxval getenv getfsstat gethostname getpagesize getpeername getvfsstat gmtime_r inotify_init isatty kqueue lchown link linkat localtime_r lseek64 lstat lstat64 madvise memalign mempcpy mkdirat mknod mknodat mkostemp mmap mmap64 mprotect mremap open64 openat pipe2 posix_memalign pread pread64 pstat_getdynamic pthread_condattr_setclock pthread_sigmask pthread_spin_init pwrite pwrite64 raise readlink readlinkat renameat setitimer setvbuf sigaction sigblock sigfillset sigprocmask sigsetmask socket stat64 statfs statvfs statvfs64 strerror strerror_r strnlen strverscmp symlink symlinkat syncfs sysarch syscall sysconf sysctl timegm timer_create truncate64 uname unlinkat utime utimensat utimes vsnprintf _beginthreadex _fmutex_create _threadstore)
402 nextafter nextafterf nextafterl \
404 finite finitef finitel finiteq \
405 isnan isnanf isnanl isnanq \
421 asinh asinhf asinhl \
422 acosh acoshf acoshl \
423 atanh atanhf atanhl \
425 exp2 exp2f exp2l exp2q \
427 exp10 exp10f exp10l exp10q \
435 trunc truncf truncl \
437 frexpf frexpl frexpq \
441 ldexpf ldexpl ldexpq \
446 if test "$ac_cv_func_socket" != yes; then
447 AC_CHECK_LIB(socket, socket)
448 if test "$ac_cv_lib_socket_socket" != yes; then
449 AC_CHECK_LIB(watt, socket)
450 if test "$ac_cv_lib_watt_socket" != yes; then
451 AC_CHECK_LIB(wsock32, socket)
452 if test "$ac_cv_lib_wsock32_socket" != yes; then
453 if echo "$CC" | grep -i mingw >/dev/null; then
454 LIBS="-lwsock32 $LIBS"
462 AC_CHECK_FUNCS(gethostbyname)
463 if test "$ac_cv_func_gethostbyname" != yes; then
464 AC_CHECK_LIB(socket, gethostbyname)
465 if test "$ac_cv_lib_socket_gethostbyname" != yes; then
466 AC_CHECK_LIB(nsl, gethostbyname)
467 if test "$ac_cv_lib_nsl_gethostbyname" != yes; then
472 if test "$cf_have_socket" = yes && test "$ac_cv_header_sys_socket_h" = yes && test "$ac_cv_header_netinet_in_h" = yes && test "$ac_cv_header_netdb_h" = yes; then
473 AC_DEFINE(HAVE_NETWORK, 1, Have networking)
475 AC_CHECK_FUNCS(gethostbyaddr getaddrinfo getnameinfo hstrerror h_errno)
477 AC_CACHE_CHECK(for struct timespec, ac_cv_have_struct_timespec,
486 ], ac_cv_have_struct_timespec=yes, ac_cv_have_struct_timespec=no))
487 test "$ac_cv_have_struct_timespec" = yes && AC_DEFINE(HAVE_STRUCT_TIMESPEC, 1, Have struct timespec)
489 AC_CACHE_CHECK(if struct stat has st_atim, ac_cv_have_struct_stat_st_atim,
491 #include <sys/stat.h>
493 volatile struct stat st;
494 volatile struct timespec a = st.st_atim;
496 ], ac_cv_have_struct_stat_st_atim=yes, ac_cv_have_struct_stat_st_atim=no))
497 test "$ac_cv_have_struct_stat_st_atim" = yes && AC_DEFINE(HAVE_STRUCT_STAT_ST_ATIM, 1, Struct stat has st_atim)
499 AC_CACHE_CHECK(if struct stat has st_atimespec, ac_cv_have_struct_stat_st_atimespec,
501 #include <sys/stat.h>
503 volatile struct stat st;
504 volatile struct timespec a = st.st_atimespec;
506 ], ac_cv_have_struct_stat_st_atimespec=yes, ac_cv_have_struct_stat_st_atimespec=no))
507 test "$ac_cv_have_struct_stat_st_atimespec" = yes && AC_DEFINE(HAVE_STRUCT_STAT_ST_ATIMESPEC, 1, Struct stat has st_atimespec)
510 if test "$ac_cv_func_clock_gettime" = no -a "$ax_pthread_ok" = yes -a "$ac_cv_func_pthread_condattr_setclock" = yes; then
511 AC_CHECK_LIB(rt, clock_gettime)
512 if test "$ac_cv_lib_rt_clock_gettime" = yes; then
513 AC_DEFINE(HAVE_CLOCK_GETTIME)
517 AC_CACHE_CHECK(for struct sigevent, ac_cv_have_struct_sigevent,
524 timer_create(CLOCK_MONOTONIC, &sev, &timer_id);
526 ], ac_cv_have_struct_sigevent=yes, ac_cv_have_struct_sigevent=no))
527 test "$ac_cv_have_struct_sigevent" = yes && AC_DEFINE(HAVE_STRUCT_SIGEVENT, 1, Have struct sigevent)
529 if test "$ac_cv_have_struct_sigevent" = yes -a "$ac_cv_func_timer_create" = no; then
530 AC_CHECK_LIB(rt, timer_create)
531 if test "$ac_cv_lib_rt_timer_create" = yes; then
532 AC_DEFINE(HAVE_TIMER_CREATE)
537 AC_CACHE_CHECK(for CLOCK_MONOTONIC, ac_cv_have_clock_monotonic,
541 clockid_t id = CLOCK_MONOTONIC;
543 ], ac_cv_have_clock_monotonic=yes, ac_cv_have_clock_monotonic=no))
544 test "$ac_cv_have_clock_monotonic" = yes && AC_DEFINE(HAVE_CLOCK_MONOTONIC, 1, Have CLOCK_MONOTONIC)
546 AC_CACHE_CHECK(for CLOCK_MONOTONIC_RAW, ac_cv_have_clock_monotonic_raw,
550 clockid_t id = CLOCK_MONOTONIC_RAW;
552 ], ac_cv_have_clock_monotonic_raw=yes, ac_cv_have_clock_monotonic_raw=no))
553 test "$ac_cv_have_clock_monotonic_raw" = yes && AC_DEFINE(HAVE_CLOCK_MONOTONIC_RAW, 1, Have CLOCK_MONOTONIC_RAW)
556 AC_CACHE_CHECK(for intX_t and u_intX_t, ac_cv_have_intx_t_u_intx_t,
558 #include <sys/types.h>
566 return (int)(a + b + c + d + e + f);
567 ], ac_cv_have_intx_t_u_intx_t=yes, ac_cv_have_intx_t_u_intx_t=no))
568 test "$ac_cv_have_intx_t_u_intx_t" = yes && AC_DEFINE(HAVE_INT_T_U_INT_T, 1, Have intX_t and u_intX_t)
570 AC_CACHE_CHECK(for int64_t and u_int64_t, ac_cv_have_int64_t_u_int64_t,
572 #include <sys/types.h>
574 int64_t a = 0x12345678;
575 u_int64_t b = 0x9abcdef0;
577 ], ac_cv_have_int64_t_u_int64_t=yes, ac_cv_have_int64_t_u_int64_t=no))
578 test "$ac_cv_have_int64_t_u_int64_t" = yes && AC_DEFINE(HAVE_INT64_T_U_INT64_T, 1, Have int64_t and u_int64_t)
580 AC_CACHE_CHECK(for int64_t and uint64_t, ac_cv_have_int64_t_uint64_t,
584 int64_t a = 0x12345678;
585 uint64_t b = 0x9abcdef0;
587 ], ac_cv_have_int64_t_uint64_t=yes, ac_cv_have_int64_t_uint64_t=no))
588 test "$ac_cv_have_int64_t_uint64_t" = yes && AC_DEFINE(HAVE_INT64_T_UINT64_T, 1, Have int64_t and uint64_t)
590 AC_CACHE_CHECK([for big endian], ac_cv_big_endian,
593 char *c = (char *)&l;
597 return !(c[[sizeof(long) - 1]] == 0x78 && c[[sizeof(long) - 2]] == 0x56 && c[[sizeof(long) - 3]] == 0x34 && c[[sizeof(long) - 4]] == 0x12);
599 ], ac_cv_big_endian=yes, ac_cv_big_endian=no, ac_cv_big_endian=unknown)
601 AC_CACHE_CHECK([for little endian], ac_cv_little_endian,
604 char *c = (char *)&l;
608 return !(c[[0]] == 0x78 && c[[1]] == 0x56 && c[[2]] == 0x34 && c[[3]] == 0x12);
610 ], ac_cv_little_endian=yes, ac_cv_little_endian=no, ac_cv_little_endian=unknown)
613 if test "$ac_cv_big_endian" = yes -a "$ac_cv_little_endian" = yes; then
614 AC_ERROR([The endianity test is broken])
615 elif test "$ac_cv_big_endian" = yes; then
616 AC_DEFINE(CONFIG_BIG_ENDIAN, 1, Define if the system is big endian)
617 elif test "$ac_cv_little_endian" = yes; then
618 AC_DEFINE(CONFIG_LITTLE_ENDIAN, 1, Define if the system is little endian)
621 AC_CACHE_CHECK([if rwx mappings work], ac_cv_rwx_mmap,
624 #include <sys/mman.h>
627 return mmap(NULL, getpagesize(), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) == MAP_FAILED;
629 ], ac_cv_rwx_mmap=yes, ac_cv_rwx_mmap=no, ac_cv_rwx_mmap=no))
630 test "$ac_cv_func_mmap" = yes && test "$ac_cv_rwx_mmap" = no && AC_DEFINE(DISABLE_RWX_MAPPINGS, 1, Disable rwx mappings)
632 AC_CACHE_CHECK([for pointer tags], ac_cv_pointer_tags,
636 volatile unsigned val = 0x12345678U;
637 volatile unsigned * volatile ptr, * volatile tagged_ptr;
638 unsigned long want_tag = 0;
639 #if defined(__aarch64__) && !defined(__ILP32__)
640 want_tag = 0xFF00000000000000UL;
642 #if defined(__s390__) && !defined(__LP64__)
643 want_tag = 0x80000000UL;
648 if ((unsigned long)ptr & want_tag)
650 tagged_ptr = (unsigned *)((unsigned long)ptr | want_tag);
651 return *tagged_ptr == 0x12345678U ? 0 : 1;
653 ], ac_cv_pointer_tags=yes, ac_cv_pointer_tags=no, ac_cv_pointer_tags=unknown)
655 test "$ac_cv_pointer_tags" = yes && AC_DEFINE(HAVE_POINTER_TAGS, 1, Have pointer tags)
657 AC_CACHE_CHECK(for __sync_add_and_fetch __sync_sub_and_fetch __sync_bool_compare_and_swap __sync_synchronize, ac_cv_have_sync_and_fetch,
659 unsigned long val = 0;
660 __sync_synchronize();
661 __sync_add_and_fetch(&val, 1);
662 __sync_bool_compare_and_swap(&val, 1, 2);
663 return __sync_sub_and_fetch(&val, 1);
664 ], ac_cv_have_sync_and_fetch=yes, ac_cv_have_sync_and_fetch=no))
665 test "$ac_cv_have_sync_and_fetch" = yes && AC_DEFINE(HAVE_SYNC_AND_FETCH, 1, Have __sync_add_and_fetch __sync_sub_and_fetch)
667 if test "$ac_cv_header_stdatomic_h" = yes; then
668 AC_CACHE_CHECK(for C11 atomics, ac_cv_have_c11_atomics,
671 #include <stdatomic.h>
672 atomic_uintptr_t val;
673 _Atomic uintptr_t val2;
675 uintptr_t ld = atomic_load_explicit(&val, memory_order_relaxed);
676 uintptr_t fld = atomic_fetch_add_explicit(&val, 4, memory_order_acq_rel);
677 uintptr_t fld2 = atomic_fetch_sub_explicit(&val2, 8, memory_order_release);
678 uintptr_t xch = atomic_exchange_explicit(&val2, 12, memory_order_acquire);
679 atomic_thread_fence(memory_order_seq_cst);
680 return (int)(ld + fld + fld2 + xch);
681 ], ac_cv_have_c11_atomics=yes, ac_cv_have_c11_atomics=no))
682 if test "$ac_cv_have_c11_atomics" = yes; then
683 AC_DEFINE(HAVE_C11_ATOMICS, 1, Have C11 atomics)
686 LIBS="-latomic $LIBS"
687 AC_CACHE_CHECK(for C11 atomics with -latomic, ac_cv_have_c11_atomics_latomic,
690 #include <stdatomic.h>
691 atomic_uintptr_t val;
693 uintptr_t ld = atomic_load_explicit(&val, memory_order_relaxed);
694 uintptr_t fld = atomic_fetch_add_explicit(&val, 4, memory_order_acq_rel);
695 uintptr_t fld2 = atomic_fetch_sub_explicit(&val, 8, memory_order_release);
696 uintptr_t xch = atomic_exchange_explicit(&val, 12, memory_order_acquire);
697 atomic_thread_fence(memory_order_seq_cst);
698 return (int)(ld + fld + fld2 + xch);
699 ], ac_cv_have_c11_atomics_latomic=yes, ac_cv_have_c11_atomics_latomic=no))
700 if test "$ac_cv_have_c11_atomics_latomic" = yes; then
701 AC_DEFINE(HAVE_C11_ATOMICS, 1, Have C11 atomics)
708 AX_GCC_BUILTIN(__builtin_unreachable)
709 AX_GCC_BUILTIN(__builtin_bswap32)
710 AX_GCC_BUILTIN(__builtin_bswap64)
711 AX_GCC_BUILTIN(__builtin_assume_aligned)
712 AX_GCC_BUILTIN(__builtin___clear_cache)
714 AC_CACHE_CHECK(for __builtin_clz __builtin_clzl __builtin_clzll, ac_cv_have_builtin_clz,
716 volatile unsigned a = 0x12345678;
717 volatile unsigned long b = 0x567890ab;
718 volatile unsigned long long c = 0x9abcdef0;
720 return __builtin_clz(a) + __builtin_clzl(b) + __builtin_clzll(c);
721 ], ac_cv_have_builtin_clz=yes, ac_cv_have_builtin_clz=no))
722 test "$ac_cv_have_builtin_clz" = yes && AC_DEFINE(HAVE_BUILTIN_CLZ, 1, Have __builtin_clz __builtin_clzl __builtin_clzll)
724 AC_CACHE_CHECK(for __builtin_ctz __builtin_ctzl __builtin_ctzll, ac_cv_have_builtin_ctz,
726 volatile unsigned a = 0x12345678;
727 volatile unsigned long b = 0x567890ab;
728 volatile unsigned long long c = 0x9abcdef0;
730 return __builtin_ctz(a) + __builtin_ctzl(b) + __builtin_ctzll(c);
731 ], ac_cv_have_builtin_ctz=yes, ac_cv_have_builtin_ctz=no))
732 test "$ac_cv_have_builtin_ctz" = yes && AC_DEFINE(HAVE_BUILTIN_CTZ, 1, Have __builtin_ctz __builtin_ctzl __builtin_ctzll)
734 AC_CACHE_CHECK(for __builtin_popcount __builtin_popcountll, ac_cv_have_builtin_popcount,
736 volatile unsigned a = 0x12345678;
737 volatile unsigned long long b = 0x9abcdef0;
739 return __builtin_popcount(a) + __builtin_popcountll(b);
740 ], ac_cv_have_builtin_popcount=yes, ac_cv_have_builtin_popcount=no))
741 test "$ac_cv_have_builtin_popcount" = yes && AC_DEFINE(HAVE_BUILTIN_POPCOUNT, 1, Have __builtin_popcount __builtin_popcountll)
744 if test "$ac_cv_sizeof_unsigned___int128" != 0; then
746 elif test "$ac_cv_c_long_long" = yes; then
752 AC_CACHE_CHECK(for __builtin_mul_overflow, ac_cv_have_builtin_mul_overflow,
754 volatile $max_type a = 0x12345678;
755 volatile $max_type b = 0x9abcdef;
756 volatile $max_type c;
758 int o1 = __builtin_mul_overflow(a, b, &c);
760 ], ac_cv_have_builtin_mul_overflow=yes, ac_cv_have_builtin_mul_overflow=no))
762 if test "$ac_cv_have_builtin_mul_overflow" = yes; then
763 AC_DEFINE(HAVE_BUILTIN_MUL_OVERFLOW, 1, Have __builtin_mul_overflow)
765 AC_CACHE_CHECK(for __builtin_mul_overflow with -rtlib=compiler-rt, ac_cv_have_builtin_mul_overflow_rtlib_compiler_rt,
766 save_LDFLAGS="$LDFLAGS"
767 LDFLAGS="-rtlib=compiler-rt $LDFLAGS"
769 volatile $max_type a = 0x12345678;
770 volatile $max_type b = 0x9abcdef;
771 volatile $max_type c;
773 int o1 = __builtin_mul_overflow(a, b, &c);
775 ], ac_cv_have_builtin_mul_overflow_rtlib_compiler_rt=yes, ac_cv_have_builtin_mul_overflow_rtlib_compiler_rt=no)
776 LDFLAGS="$save_LDFLAGS"
779 if test "$ac_cv_have_builtin_mul_overflow_rtlib_compiler_rt" = yes; then
781 if test "$ac_cv_have___float128" = yes; then
782 AC_CHECK_LIB(gcc, __addtf3)
783 if test "$ac_cv_lib_gcc___addtf3" != yes; then
784 use_compiler_rt=false
787 if $use_compiler_rt; then
788 LDFLAGS="-rtlib=compiler-rt $LDFLAGS"
789 AC_DEFINE(HAVE_BUILTIN_MUL_OVERFLOW, 1, Have __builtin_mul_overflow)
794 AC_CACHE_CHECK(for __builtin_add_overflow __builtin_sub_overflow, ac_cv_have_builtin_add_sub_overflow,
796 volatile $max_type a = 0x12345678;
797 volatile $max_type b = 0x9abcdef;
798 volatile $max_type c;
800 int o1 = __builtin_add_overflow(a, b, &c);
801 int o2 = __builtin_sub_overflow(a, b, &c);
803 ], ac_cv_have_builtin_add_sub_overflow=yes, ac_cv_have_builtin_add_sub_overflow=no))
804 test "$ac_cv_have_builtin_add_sub_overflow" = yes && AC_DEFINE(HAVE_BUILTIN_ADD_SUB_OVERFLOW, 1, Have __builtin_add_overflow __builtin_sub_overflow)
808 AC_CACHE_CHECK(for -mieee, ac_cv_have_mieee,
809 save_CFLAGS="$CFLAGS"
810 CFLAGS="-mieee $CFLAGS"
811 AC_TRY_LINK([ ], [ ], ac_cv_have_mieee=yes, ac_cv_have_mieee=no)
812 CFLAGS="$save_CFLAGS"
814 test "$ac_cv_have_mieee" = yes && CFLAGS="-mieee $CFLAGS"
818 AC_CACHE_CHECK(if we can use union of float and uint32_t, ac_cv_union_float_uint32_t,
830 return !(u.i == 0xBE280000UL);
832 ], ac_cv_union_float_uint32_t=yes, ac_cv_union_float_uint32_t=no, ac_cv_union_float_uint32_t=unknown))
833 test "$ac_cv_union_float_uint32_t" = yes && AC_DEFINE(HAVE_UNION_FLOAT_UINT32_T, 1, Can use union of float and uint32_t)
835 dnl gcc-4.* on ARM has buggy infinity float to __fp16 conversion (it incorrectly returns NaN)
836 dnl clang-6 on ARM64 generates invalid instruction when storing fp16 zero
837 AC_CACHE_CHECK(for __fp16, ac_cv_have___fp16,
841 volatile float a = HUGE_VAL;
844 static __fp16 store0(__fp16 *fp, __fp16 arg)
850 __fp16 (*volatile ptr_store0)(__fp16 *, __fp16) = store0;
857 return !(f == 0 && b == HUGE_VAL);
859 ], ac_cv_have___fp16=yes, ac_cv_have___fp16=no, ac_cv_have___fp16=unknown))
860 cf_have_fp16="$ac_cv_have___fp16"
862 if test "$ac_cv_have___fp16" = no; then
863 save_CFLAGS="$CFLAGS"
864 CFLAGS="-mfp16-format=ieee $CFLAGS"
865 AC_CACHE_CHECK(for __fp16 with -mfp16-format=ieee, ac_cv_have___fp16_2,
869 volatile float a = HUGE_VAL;
872 static __fp16 store0(__fp16 *fp, __fp16 arg)
878 __fp16 (*volatile ptr_store0)(__fp16 *, __fp16) = store0;
885 return !(f == 0 && b == HUGE_VAL);
887 ], ac_cv_have___fp16_2=yes, ac_cv_have___fp16_2=no, ac_cv_have___fp16_2=unknown))
888 if test "$ac_cv_have___fp16_2" = yes; then
891 CFLAGS="$save_CFLAGS"
895 if test "$cf_have_fp16" = yes; then
896 dnl libgcc-6 on ARM64 lacks the functions __extendhftf2 and __trunctfhf2
897 dnl clang-6 on X86 lacks the function __truncxfhf2
898 AC_CACHE_CHECK(if conversion between __fp16 and long double works, ac_cv_conversion___fp16_long_double,
900 volatile __fp16 a = 1.2;
901 volatile long double b;
907 ], ac_cv_conversion___fp16_long_double=yes, ac_cv_conversion___fp16_long_double=no))
908 test "$ac_cv_conversion___fp16_long_double" = no && cf_have_fp16=no
910 dnl libgcc-6 on ARM64 lacks the function __floatundihf
911 AC_CACHE_CHECK(if conversion from unsigned long to __fp16 works, ac_cv_conversion_unsigned_long___fp16,
913 volatile unsigned long a = 10;
914 volatile __fp16 b = 1.2;
918 ], ac_cv_conversion_unsigned_long___fp16=yes, ac_cv_conversion_unsigned_long___fp16=no))
919 test "$ac_cv_conversion_unsigned_long___fp16" = no && cf_have_fp16=no
921 if test "$ac_cv_sizeof_unsigned___int128" != 0; then
922 dnl libgcc-6 on ARM64 lacks the functions __fixhfti and __fixunshfti
923 AC_CACHE_CHECK(if conversion from __fp16 to __int128 works, ac_cv_conversion___fp16___int128,
925 volatile __fp16 a = 1.2;
927 volatile unsigned __int128 c;
930 c = (unsigned __int128)a;
932 ], ac_cv_conversion___fp16___int128=yes, ac_cv_conversion___fp16___int128=no))
933 test "$ac_cv_conversion___fp16___int128" = no && cf_have_fp16=no
935 dnl libgcc-6 on ARM64 lacks the functions __floattihf and __floattihf
936 AC_CACHE_CHECK(if conversion from __int128 to __fp16 works, ac_cv_conversion___int128___fp16,
938 volatile __int128 a = 12;
939 volatile unsigned __int128 b = 34;
945 ], ac_cv_conversion___int128___fp16=yes, ac_cv_conversion___int128___fp16=no))
946 test "$ac_cv_conversion___int128___fp16" = no && cf_have_fp16=no
949 test "$cf_have_fp16" = yes && AC_DEFINE(HAVE___FP16, 1, Have __fp16)
951 AC_CACHE_CHECK(if sqrt sets errno, ac_cv_have_sqrt_errno,
956 volatile double a = -1;
964 ], ac_cv_have_sqrt_errno=yes, ac_cv_have_sqrt_errno=no, ac_cv_have_sqrt_errno=unknown))
966 if test "$ac_cv_have_sqrt_errno" = yes; then
967 save_CFLAGS="$CFLAGS"
968 CFLAGS="-fno-math-errno $CFLAGS"
969 AC_CACHE_CHECK(for -fno-math-errno, ac_cv_have__fno_math_errno,
974 volatile double a = -1;
982 ], ac_cv_have__fno_math_errno=yes, ac_cv_have__fno_math_errno=no, ac_cv_have__fno_math_errno=unknown))
983 if test "$ac_cv_have__fno_math_errno" != yes; then
984 CFLAGS="$save_CFLAGS"
988 AC_CACHE_CHECK(if fmod is buggy, ac_cv_have_buggy_fmod,
991 volatile double a = 0.;
992 volatile double b = 0.;
995 return fmod(a, b) == 0;
997 ], ac_cv_have_buggy_fmod=no, ac_cv_have_buggy_fmod=yes, ac_cv_have_buggy_fmod=unknown))
998 test "$ac_cv_have_buggy_fmod" = yes && AC_DEFINE(HAVE_BUGGY_FMOD, 1, Have buggy fmod)
1000 AC_CACHE_CHECK(if modf is buggy, ac_cv_have_buggy_modf,
1003 volatile double a = 1.;
1004 volatile double b = 0.;
1008 return !(modf(a / b, &d) == 0);
1010 ], ac_cv_have_buggy_modf=no, ac_cv_have_buggy_modf=yes, ac_cv_have_buggy_modf=unknown))
1011 test "$ac_cv_have_buggy_modf" = yes && AC_DEFINE(HAVE_BUGGY_MODF, 1, Have buggy modf)
1013 AC_CACHE_CHECK(if ldexp is buggy, ac_cv_have_buggy_ldexp,
1018 volatile double s = 1;
1019 volatile double lx = ldexp(s, 1024);
1020 volatile double ly = ldexp(lx, -1024);
1023 ], ac_cv_have_buggy_ldexp=no, ac_cv_have_buggy_ldexp=yes, ac_cv_have_buggy_ldexp=unknown))
1024 test "$ac_cv_have_buggy_ldexp" = yes && AC_DEFINE(HAVE_BUGGY_LDEXP, 1, Have buggy ldexp)
1027 AC_CONFIG_FILES(Makefile)
1030 if test "$ac_cv_lib_ffi_ffi_prep_cif" != yes; then
1031 AC_MSG_WARN([libffi is not present, ffi functionality will be disabled])
1033 if test "$ac_cv_lib_gmp___gmpz_init2" != yes; then
1034 AC_MSG_WARN([libgmp is not present, slow built-in emulation will be used])