dnl Process this file with autoconf to produce a configure script. AC_PREREQ([2.65]) dnl Get version number from git m4_define([git_revision], m4_esyscmd_s([./autover.sh])) AC_INIT([snapraid], [git_revision], [], [], [http://www.snapraid.it]) AM_INIT_AUTOMAKE([foreign no-dependencies subdir-objects]) AC_CONFIG_SRCDIR([cmdline/snapraid.c]) AC_CONFIG_HEADERS([config.h]) AC_CANONICAL_HOST dnl Checks for programs. AC_PROG_CC AC_USE_SYSTEM_EXTENSIONS AC_CHECK_PROG([VALGRIND],[valgrind],[valgrind],[]) AC_CHECK_PROG([WINE],[wine],[wine],[]) AC_CHECK_PROG([SDE],[sde],[sde],[]) AC_CHECK_PROG([ADVD2],[advd2],[advd2],[]) AM_CONDITIONAL(HAVE_ADVD2, [test x"$ADVD2" != x]) dnl Options to improve stacktrace AC_CHECK_CC_OPT([-fno-omit-frame-pointer], CFLAGS="$CFLAGS -fno-omit-frame-pointer", []) AC_CHECK_CC_OPT([-fno-inline-functions-called-once], CFLAGS="$CFLAGS -fno-inline-functions-called-once", []) AC_CHECK_CC_OPT([-fno-inline-small-functions], CFLAGS="$CFLAGS -fno-inline-small-functions", []) AC_CHECK_CC_OPT([-rdynamic], CFLAGS="$CFLAGS -rdynamic", []) # This the new default for gcc 10 AC_CHECK_CC_OPT([-fno-common], CFLAGS="$CFLAGS -fno-common", []) dnl Checks for system. AC_SYS_LARGEFILE dnl Checks for header files. AC_HEADER_ASSERT AC_HEADER_DIRENT AC_HEADER_TIME AC_HEADER_SYS_WAIT AC_CHECK_HEADERS([fcntl.h stddef.h stdint.h stdlib.h string.h limits.h]) AC_CHECK_HEADERS([unistd.h getopt.h fnmatch.h io.h inttypes.h byteswap.h]) AC_CHECK_HEADERS([pthread.h math.h]) AC_CHECK_HEADERS([sys/file.h sys/ioctl.h sys/sysmacros.h sys/mkdev.h]) AC_CHECK_HEADERS([linux/fiemap.h linux/fs.h mach/mach_time.h execinfo.h]) dnl Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_C_INLINE AC_C_RESTRICT AC_C_VOLATILE AC_TYPE_SIZE_T AC_TYPE_OFF_T AC_TYPE_SIZE_T AC_TYPE_SSIZE_T AC_TYPE_UINT32_T AC_TYPE_UINT64_T AC_TYPE_UINT8_T AC_TYPE_INT8_T AC_STRUCT_DIRENT_D_INO AC_STRUCT_DIRENT_D_TYPE AC_CHECK_MEMBERS([struct stat.st_nlink, struct stat.st_mtim.tv_nsec, struct stat.st_mtimensec, struct stat.st_mtimespec.tv_nsec], [], [], [[ #if HAVE_SYS_TYPES_H #include #endif #if HAVE_SYS_STAT_H #include #endif #if HAVE_UNISTD_H #include #endif ]]) dnl Checks for library functions. AC_CHECK_FUNCS([memset strchr strerror strrchr mkdir gettimeofday strtoul]) AC_CHECK_FUNCS([getopt getopt_long snprintf vsnprintf sigaction]) AC_CHECK_FUNCS([ftruncate fallocate access]) AC_CHECK_FUNCS([fsync posix_fadvise sync_file_range]) AC_CHECK_FUNCS([getc_unlocked ferror_unlocked fnmatch]) AC_CHECK_FUNCS([futimes futimens futimesat localtime_r lutimes utimensat]) AC_CHECK_FUNCS([fstatat flock]) AC_CHECK_FUNCS([mach_absolute_time]) AC_CHECK_FUNCS([backtrace backtrace_symbols]) AC_SEARCH_LIBS([clock_gettime], [rt]) AC_CHECK_FUNCS([clock_gettime]) AC_CHECK_CC_OPT([-pthread], CFLAGS="$CFLAGS -pthread", CFLAGS="$CFLAGS -D_REENTRANT") AC_CHECK_FUNCS([pthread_create]) AC_SEARCH_LIBS([exp], [m]) dnl Checks for statfs for linux avoiding to include sys/mount.h that is required only in darwin dnl In glibc since 7eae6a91e9b1670330c9f15730082c91c0b1d570, milestone 2.36, sys/mount.h defines fsconfig_command which conflicts with linux/mount.h AC_CHECK_HEADERS([sys/vfs.h sys/statfs.h]) AC_CHECK_DECLS([statfs], [], [ AC_CHECK_HEADERS([sys/param.h sys/mount.h]) ], [[ #if HAVE_SYS_VFS_H #include #endif #if HAVE_SYS_STATFS_H #include #endif ]]) AC_CHECK_FUNCS([statfs]) AC_CHECK_MEMBERS([struct statfs.f_type], [], [], [[ #if HAVE_SYS_PARAM_H #include #endif #if HAVE_SYS_MOUNT_H #include #endif #if HAVE_SYS_VFS_H #include #endif #if HAVE_SYS_STATFS_H #include #endif ]]) AC_CHECK_MEMBERS([struct statfs.f_fstypename], [], [], [[ #if HAVE_SYS_PARAM_H #include #endif #if HAVE_SYS_MOUNT_H #include #endif #if HAVE_SYS_VFS_H #include #endif #if HAVE_SYS_STATFS_H #include #endif ]]) dnl Checks for libblkid AC_ARG_WITH([blkid], AS_HELP_STRING([--without-blkid], [Ignore presence of blkid and disable it])) AS_IF([test "x$with_blkid" != "xno"], [AC_SEARCH_LIBS([blkid_probe_all], [blkid], [have_blkid=yes], [have_blkid=no])], [have_blkid=no]) AS_IF([test "x$have_blkid" = "xyes"], [ AC_CHECK_HEADERS([blkid/blkid.h]) AC_CHECK_FUNCS([blkid_devno_to_devname blkid_get_tag_value]) ], [AS_IF([test "x$with_blkid" = "xyes"], [AC_MSG_ERROR([blkid requested but not found]) ]) ]) dnl Checks for architecture AC_C_BIGENDIAN dnl Checks for compiler AC_CHECK_CC_OPT([-Wall], CFLAGS="$CFLAGS -Wall", []) AC_CHECK_CC_OPT([-Wextra], CFLAGS="$CFLAGS -Wextra", []) AC_CHECK_CC_OPT([-Wuninitialized], CFLAGS="$CFLAGS -Wuninitialized", []) AC_CHECK_CC_OPT([-Wshadow], CFLAGS="$CFLAGS -Wshadow", []) dnl Disable warning about zero-length-bounds raised by gcc 10 on linux kernel header on the fm_extents field AC_CHECK_CC_OPT([-Wno-zero-length-bounds], CFLAGS="$CFLAGS -Wno-zero-length-bounds", []) dnl Checks for asm AC_ARG_ENABLE([asm], AS_HELP_STRING([--disable-asm], [Disable inline assembly])) AS_IF([test "x$enable_asm" != "xno"], [AC_DEFINE([HAVE_ASSEMBLY], [1], [Define to 1 if inline assembly should be used.])] dnl AS_IF(HAVE_ASSEMBLY) NOT closed here dnl Checks for AS supporting the SSE2 instructions. AC_MSG_CHECKING([for sse2]) asmsse2=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #if defined(__i386__) || defined(__x86_64__) void f(void) { asm volatile("pxor %xmm0,%xmm1"); } #else #error not x86 #endif ]])], [AC_DEFINE([HAVE_SSE2], [1], [Define to 1 if sse2 is supported by the assembler.]) asmsse2=yes]) AC_MSG_RESULT([$asmsse2]) dnl Checks for AS supporting the SSSE3 instructions. AC_MSG_CHECKING([for ssse3]) asmssse3=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #if defined(__i386__) || defined(__x86_64__) void f(void) { asm volatile("pshufb %xmm0,%xmm1"); } #else #error not x86 #endif ]])], [AC_DEFINE([HAVE_SSSE3], [1], [Define to 1 if ssse3 is supported by the assembler.]) asmssse3=yes]) AC_MSG_RESULT([$asmssse3]) dnl Checks for AS supporting the SSE4.2 instructions. AC_MSG_CHECKING([for sse42]) asmsse42=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #if defined(__i386__) || defined(__x86_64__) unsigned f(unsigned crc, unsigned char b) { asm volatile("crc32b %1, %0" : "+r" (crc) : "rm" (b)); return crc; } #else #error not x86 #endif ]])], [AC_DEFINE([HAVE_SSE42], [1], [Define to 1 if sse4.2 is supported by the assembler.]) asmsse42=yes]) AC_MSG_RESULT([$asmsse42]) dnl Checks for AS supporting the AVX2 instructions. AC_MSG_CHECKING([for avx2]) asmavx2=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #if defined(__i386__) || defined(__x86_64__) void f(void* ptr) { asm volatile("vbroadcasti128 %0, %%ymm0" : : "m" (ptr)); } #else #error not x86 #endif ]])], [AC_DEFINE([HAVE_AVX2], [1], [Define to 1 if avx2 is supported by the assembler.]) asmavx2=yes]) AC_MSG_RESULT([$asmavx2]) dnl AS_IF(HAVE_ASSEMBLY) closed here ) dnl Checks for test environment AS_CASE([$host], [*-*-mingw*], [ TESTENV="$WINE" FAILENV="$TESTENV" ], [POSIX=1] ) AM_CONDITIONAL(HAVE_POSIX, [test x"$POSIX" != x]) AC_ARG_ENABLE([profiler], [AS_HELP_STRING([--enable-profiler],[enable the use of gprof for code coverage])], [ CFLAGS="-O2 -pg -g -pthread" ], []) AC_ARG_ENABLE([coverage], [AS_HELP_STRING([--enable-coverage],[enable the use of gcov for code coverage])], [ CFLAGS="-O0 -g -fprofile-arcs -ftest-coverage -pthread" ], []) AC_ARG_ENABLE([valgrind], [AS_HELP_STRING([--enable-valgrind],[enable the use of valgrind in testing])], [ TESTENV="$VALGRIND --leak-check=full --error-exitcode=1" FAILENV="$VALGRIND --error-exitcode=1" CFLAGS="$CFLAGS -DCHECKER" MEMORY_CHECKER=1 ], []) AC_ARG_ENABLE([sgcheck], [AS_HELP_STRING([--enable-sgcheck],[enable the use of sgcheck in testing])], [ TESTENV="$VALGRIND --tool=exp-sgcheck --suppressions=valgrind.supp --error-exitcode=1" FAILENV="$TESTENV" CFLAGS="$CFLAGS -DCHECKER" MEMORY_CHECKER=1 ], []) AC_ARG_ENABLE([helgrind], [AS_HELP_STRING([--enable-helgrind],[enable the use of helgrind in testing])], [ TESTENV="$VALGRIND --tool=helgrind --fair-sched=try --error-exitcode=1" FAILENV="$TESTENV" CFLAGS="$CFLAGS -DCHECKER" THREAD_CHECKER=1 ], []) AC_ARG_ENABLE([drd], [AS_HELP_STRING([--enable-drd],[enable the use of drd in testing])], [ TESTENV="$VALGRIND --tool=drd --fair-sched=try --error-exitcode=1" FAILENV="$TESTENV" CFLAGS="$CFLAGS -DCHECKER" THREAD_CHECKER=1 ], []) AC_ARG_ENABLE([asan], [AS_HELP_STRING([--enable-asan],[enable the use of AddressSanitizer in testing])], [ CFLAGS="$CFLAGS -DCHECKER -fsanitize=address" MEMORY_CHECKER=1 ], []) AC_ARG_ENABLE([msan], [AS_HELP_STRING([--enable-msan],[enable the use of MemorySanitizer in testing])], [ CFLAGS="$CFLAGS -DCHECKER -fsanitize=memory" MEMORY_CHECKER=1 ], []) AC_ARG_ENABLE([ubsan], [AS_HELP_STRING([--enable-ubsan],[enable the use of UndefinedBehaviourSanitizer in testing])], [ CFLAGS="$CFLAGS -DCHECKER -fsanitize=undefined" MEMORY_CHECKER=1 ], []) AC_ARG_ENABLE([tsan], [AS_HELP_STRING([--enable-tsan],[enable the use of ThreadSanitizer in testing])], [ CFLAGS="$CFLAGS -DCHECKER -fsanitize=thread" dnl Use MEMORY_CHECKER instead of THREAD_CHECKER to run the full and long test MEMORY_CHECKER=1 ], []) AM_CONDITIONAL(HAVE_MEMORY_CHECKER, [test x"$MEMORY_CHECKER" != x]) AM_CONDITIONAL(HAVE_THREAD_CHECKER, [test x"$THREAD_CHECKER" != x]) AC_ARG_ENABLE([sde], [AS_HELP_STRING([--enable-sde],[enable the use of SDE emulator in testing])], dnl p4p -> Pentium4 Prescott with SSE2 dnl mrm -> Merom with SSSE3 dnl nhm -> Nehalem with SSE4.2 dnl hsw -> Haswell with AVX2 dnl knl -> Knights Landing with AVX512 [ TESTENV_SSE2="$SDE -p4p --" TESTENV_SSSE3="$SDE -mrm --" TESTENV_SSE42="$SDE -nhm --" TESTENV_AVX2="$SDE -hsw --" EMULATOR=1 # Target CPU compatible with P4 Prescott CFLAGS="$CFLAGS -march=athlon64" ], []) AM_CONDITIONAL(HAVE_EMULATOR, [test x"$EMULATOR" != x]) AC_ARG_ENABLE([debug], [AS_HELP_STRING([--enable-debug],[enable debugging])], [ CFLAGS="-Og -g -pthread -Wall -Wextra" AC_CHECK_CC_OPT([-rdynamic], CFLAGS="$CFLAGS -rdynamic", []) ], []) AC_ARG_ENABLE([warning-as-error], [AS_HELP_STRING([--enable-warning-as-error],[stop build on warnings])], [ AC_CHECK_CC_OPT([-Werror], CFLAGS="$CFLAGS -Werror", []) dnl This avoid the Darwin error: clang: error: argument unused during compilation: '-pthread' dnl See: https://llvm.org/bugs/show_bug.cgi?id=7798 AC_CHECK_CC_OPT([-Wno-error=unused-command-line-argument], CFLAGS="$CFLAGS -Wno-error=unused-command-line-argument", []) ], []) AC_ARG_ENABLE([warning], [AS_HELP_STRING([--enable-warning],[enable extra warning])], [ AC_CHECK_CC_OPT([-Wpointer-arith], CFLAGS="$CFLAGS -Wpointer-arith", []) AC_CHECK_CC_OPT([-Wcast-qual], CFLAGS="$CFLAGS -Wcast-qual", []) AC_CHECK_CC_OPT([-Wunused], CFLAGS="$CFLAGS -Wunused", []) AC_CHECK_CC_OPT([-Wunreachable-code], CFLAGS="$CFLAGS -Wunreachable-code", []) AC_CHECK_CC_OPT([-Wpadded], CFLAGS="$CFLAGS -Wpadded", []) AC_CHECK_CC_OPT([-Weverything], CFLAGS="$CFLAGS -Weverything", []) ], []) AC_ARG_VAR([TESTENV], [Test environment]) AC_ARG_VAR([FAILENV], [Test environment for failing tests]) AC_ARG_VAR([TESTENV_SSE2], [Test environment for SSE2]) AC_ARG_VAR([TESTENV_SSSE3], [Test environment for SSSE3]) AC_ARG_VAR([TESTENV_SSE42], [Test environment for SSE42]) AC_ARG_VAR([TESTENV_AVX2], [Test environment for AVX2]) AC_CONFIG_FILES([Makefile]) AC_OUTPUT