dnl Process this file with autoconf to produce a configure script. AC_PREREQ([2.70]) dnl Get version number from git m4_define([git_revision], m4_esyscmd_s([./autover.sh])) AC_INIT([SnapRAID CLI],[git_revision],[],[snapraid],[https://www.snapraid.it]) AC_CANONICAL_HOST AC_CANONICAL_BUILD AC_CANONICAL_TARGET AM_INIT_AUTOMAKE([foreign no-dependencies subdir-objects]) AC_CONFIG_SRCDIR([os/os.h]) AC_CONFIG_HEADERS([config.h]) dnl Enables as many system-specific extensions as reasonably possible AC_USE_SYSTEM_EXTENSIONS dnl Macro directory AC_CONFIG_MACRO_DIRS([m4]) dnl Checks for programs. AC_PROG_CC AC_CHECK_PROG([VALGRIND],[valgrind],[valgrind],[]) AC_CHECK_PROG([WINE],[wine64],[wine64],[]) AC_CHECK_PROG([SDE],[sde64],[sde64],[]) AC_CHECK_PROG([ADVD2],[advd2],[advd2],[]) AM_CONDITIONAL(HAVE_ADVD2, [test x"$ADVD2" != x]) # Compile a quick test program using a syntax unique to C99 and newer AC_MSG_CHECKING([if compiler supports C99 or newer features]) AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([[]], [[ int x = 0; x++; int y = x; int array[y]; ]]) ], [ AC_MSG_RESULT([yes]) ], [ AC_MSG_RESULT([no]) AC_MSG_ERROR([A C99-compliant compiler or newer is required to build this package.]) ]) # Check if we are targeting Windows is_windows=no AS_CASE([$host_os], [mingw*|msys*|cygwin*], [is_windows=yes]) AM_CONDITIONAL([HOST_WINDOWS], [test "x$is_windows" = "xyes"]) # Check for Windows-specific tools only if on Windows if test "x$is_windows" = "xyes"; then AC_CHECK_TOOL([WINDMC], [windmc]) AC_CHECK_TOOL([WINDRES], [windres]) fi dnl Options to improve stacktrace (some disabled as no crash reported by years) AX_CHECK_COMPILE_FLAG([-fno-omit-frame-pointer], CFLAGS="$CFLAGS -fno-omit-frame-pointer", []) # AX_CHECK_COMPILE_FLAG([-fno-inline-functions-called-once], CFLAGS="$CFLAGS -fno-inline-functions-called-once", []) # AX_CHECK_COMPILE_FLAG([-fno-inline-small-functions], CFLAGS="$CFLAGS -fno-inline-small-functions", []) # AX_CHECK_COMPILE_FLAG([-fno-optimize-sibling-calls], CFLAGS="$CFLAGS -fno-optimize-sibling-calls", []) AX_CHECK_COMPILE_FLAG([-rdynamic], CFLAGS="$CFLAGS -rdynamic", []) # This is the new default for gcc 10 AX_CHECK_COMPILE_FLAG([-fno-common], CFLAGS="$CFLAGS -fno-common", []) dnl Checks for system. AC_SYS_LARGEFILE dnl Checks for architecture AC_C_BIGENDIAN dnl Checks for header files. AC_HEADER_ASSERT AC_HEADER_SYS_WAIT AC_CHECK_HEADERS([dirent.h stdint.h inttypes.h unistd.h math.h execinfo.h strings.h getopt.h syslog.h grp.h pwd.h io.h alloca.h]) AC_CHECK_HEADERS([sys/file.h sys/sysctl.h sys/ioctl.h sys/time.h sys/types.h sys/mkdev.h sys/sysmacros.h sys/stat.h sys/prctl.h sys/sysinfo.h sys/utsname.h]) AC_CHECK_HEADERS([linux/fs.h linux/btrfs.h linux/fiemap.h mach/mach_time.h]) # Check for the close_range(...,CLOSE_RANGE_CLOEXEC) AC_CHECK_HEADERS([linux/close_range.h]) AC_CHECK_FUNCS([close_range]) AC_MSG_CHECKING([for CLOSE_RANGE_CLOEXEC]) AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([[ #ifdef HAVE_LINUX_CLOSE_RANGE_H #include #endif #include ]], [[ unsigned int flags = CLOSE_RANGE_CLOEXEC; ]]) ], [ AC_MSG_RESULT([yes]) AC_DEFINE([HAVE_CLOSE_RANGE_CLOEXEC], [1], [Define if CLOSE_RANGE_CLOEXEC is available]) ], [ AC_MSG_RESULT([no]) ]) dnl Checks for typedefs, structures, and compiler characteristics. AC_C_INLINE AC_C_RESTRICT AC_C_VOLATILE AC_TYPE_SIZE_T AC_TYPE_OFF_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 syncfs]) AC_CHECK_FUNCS([getc_unlocked ferror_unlocked]) AC_CHECK_FUNCS([futimes futimens futimesat localtime_r lutimes utimensat]) AC_CHECK_FUNCS([fstatat flock renameat]) 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_FUNCS([fexecve pipe2]) AC_SEARCH_LIBS([exp], [m]) AC_CHECK_FUNCS([eaccess faccessat]) 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 libraries AS_IF([test "x$is_windows" = "xyes"], [ AC_MSG_NOTICE([Windows native threads support enabled]) ], [ AC_CHECK_HEADERS([pthread.h]) AX_PTHREAD([ thread_model="pthreads" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" AC_DEFINE([HAVE_PTHREAD], [1], [Define to 1 if POSIX threads are available]) AC_MSG_NOTICE([POSIX threads support enabled]) ], [ AC_MSG_WARN([Single-threaded version]) ]) ]) dnl Checks for compiler AX_CHECK_COMPILE_FLAG([-Wall], CFLAGS="$CFLAGS -Wall", []) AX_CHECK_COMPILE_FLAG([-Wextra], CFLAGS="$CFLAGS -Wextra", []) AX_CHECK_COMPILE_FLAG([-Wuninitialized], CFLAGS="$CFLAGS -Wuninitialized", []) AX_CHECK_COMPILE_FLAG([-Wshadow], CFLAGS="$CFLAGS -Wshadow", []) AX_CHECK_COMPILE_FLAG([-Wshorten-64-to-32], CFLAGS="$CFLAGS -Wshorten-64-to-32", []) dnl Disable warning about zero-length-bounds raised by gcc 10 on linux kernel header on the fm_extents field AX_CHECK_COMPILE_FLAG([-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 Optional command prefix used to execute cross-compiled target binaries. dnl For example: dnl TARGET_RUNNER="qemu-arm -cpu cortex-a15 -L /usr/arm-linux-gnueabihf" AC_ARG_VAR([TARGET_RUNNER], [Command prefix used to execute cross-compiled target binaries]) dnl Checks for test environment AS_CASE([$host], [*-*-mingw*], [ TESTENV="$WINE" FAILENV="$TESTENV" ], [ POSIX=1 AS_IF([test "x$cross_compiling" = "xyes" && test -n "$TARGET_RUNNER"], [ TESTENV="$TARGET_RUNNER" FAILENV="$TESTENV" AC_MSG_NOTICE([Cross-compiled target runner: $TARGET_RUNNER]) ]) ] ) AM_CONDITIONAL(HAVE_POSIX, [test x"$POSIX" != x]) AM_CONDITIONAL(CROSS_COMPILING, [test "x$cross_compiling" = "xyes"]) AM_CONDITIONAL(HAVE_DISK_ARBITRATION, [test "$(uname)" = Darwin]) 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 --suppressions=valgrind.supp --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 --suppressions=valgrind.supp --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 --suppressions=valgrind.supp --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 -fno-sanitize=function" 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 AVX512F dnl skx -> Skylake Xeon with AVX512BW [ TESTENV_SSE2="$SDE -chip-check-exe-only -p4p --" TESTENV_SSSE3="$SDE -chip-check-exe-only -mrm --" TESTENV_SSE42="$SDE -nhm --" TESTENV_AVX2="$SDE -hsw --" TESTENV_AVX512="$SDE -skx --" 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" AX_CHECK_COMPILE_FLAG([-rdynamic], CFLAGS="$CFLAGS -rdynamic", []) ], []) AC_ARG_ENABLE([warning-as-error], [AS_HELP_STRING([--enable-warning-as-error],[stop build on warnings])], [ AX_CHECK_COMPILE_FLAG([-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 AX_CHECK_COMPILE_FLAG([-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])], [ AX_CHECK_COMPILE_FLAG([-Wpointer-arith], CFLAGS="$CFLAGS -Wpointer-arith", []) AX_CHECK_COMPILE_FLAG([-Wcast-qual], CFLAGS="$CFLAGS -Wcast-qual", []) AX_CHECK_COMPILE_FLAG([-Wunused], CFLAGS="$CFLAGS -Wunused", []) AX_CHECK_COMPILE_FLAG([-Wunreachable-code], CFLAGS="$CFLAGS -Wunreachable-code", []) AX_CHECK_COMPILE_FLAG([-Wpadded], CFLAGS="$CFLAGS -Wpadded", []) AX_CHECK_COMPILE_FLAG([-Weverything], CFLAGS="$CFLAGS -Weverything", []) ], []) # WITH_TOOL(NAME, BINARY, DESCRIPTION) # Adds --with-NAME=PATH option. Defines NAME_PATH if given. AC_DEFUN([WITH_TOOL], [ AC_ARG_WITH([$1], [AS_HELP_STRING([--with-$1=PATH], [absolute path to the $2 executable ($3)])], [ AS_CASE([$withval], [/*], [], [AC_MSG_ERROR([--with-$1 requires an absolute path (got '$withval')])]) AS_IF([test ! -x "$withval"], [AC_MSG_WARN([$2 not found or not executable at '$withval'])]) AC_DEFINE_UNQUOTED(m4_toupper([$1_PATH]), ["$withval"], [Absolute path to $2, set at configure time.]) AC_MSG_NOTICE([$2: $withval]) ], [ AC_MSG_NOTICE([$2: use runtime discovery]) ]) ]) WITH_TOOL([smartctl], [smartctl], [S.M.A.R.T. monitoring]) WITH_TOOL([zfs], [zfs], [ZFS pool management]) WITH_TOOL([zpool], [zpool], [ZFS pool status]) WITH_TOOL([bcachefs], [bcachefs], [Bcachefs management]) 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_ARG_VAR([TESTENV_AVX512], [Test environment for AVX512]) AC_CONFIG_FILES([Makefile]) AC_CONFIG_FILES([pkg/snapraid.info pkg/control pkg/snapraid.spec pkg/.PKGINFO pkg/PKGBUILD pkg/.SRCINFO]) AC_CONFIG_FILES([makeslackware.sh], [chmod a+x makeslackware.sh]) AC_CONFIG_FILES([makeslackdist.sh], [chmod a+x makeslackdist.sh]) AC_CONFIG_FILES([pkg/snapraid.SlackBuild], [chmod a+x pkg/snapraid.SlackBuild]) AC_CONFIG_FILES([makedeb.sh], [chmod a+x makedeb.sh]) AC_CONFIG_FILES([makerpm.sh], [chmod a+x makerpm.sh]) AC_CONFIG_FILES([makearch.sh], [chmod a+x makearch.sh]) AC_CONFIG_FILES([makearchdist.sh], [chmod a+x makearchdist.sh]) AC_OUTPUT