Skip to content
Snippets Groups Projects
configure.ac 19.9 KiB
Newer Older
  • Learn to ignore specific revisions
  • # CAPABILITY TESTING MACROS
    
    m4_define(
      [M4_DETECT_HDF5],
      [
        if test "x${HDF5_INCLUDE}${HDF5_LIB}" = "x"; then
          pkg-config --version > /dev/null
          use_pkg_config=$?
          if test "x$use_pkg_config" = "x0"; then
            declare -a pkg_array=$(pkg-config --list-all | grep hdf5-serial)
            for i in "${pkg_array[[@]]}"; do echo "$i" | cut --delimiter=" " -f1; done | grep hdf5-serial > /dev/null
            result=$?
            if test "x$result" = "x0"; then
              cflags=$(pkg-config --cflags-only-I hdf5-serial)
              export HDF5_INCLUDE=$(echo "${cflags:2}")
              ldflags=$(pkg-config --libs-only-L hdf5-serial)
              export HDF5_LIB=$(echo "${ldflags:2}")
            else
              declare -a pkg_array=$(pkg-config --list-all | grep hdf5)
              for i in "${pkg_array[[@]]}"; do echo "$i" | cut --delimiter=" " -f1; done | grep hdf5 > /dev/null
              result=$?
              if test "x$result" = "x0"; then
                cflags=$(pkg-config --cflags-only-I hdf5)
                export HDF5_INCLUDE=$(echo "${cflags:2}")
                ldflags=$(pkg-config --libs-only-L hdf5)
                export HDF5_LIB=$(echo "${ldflags:2}")
              fi
            fi
          else
            export -p | grep HDF5_ROOT > /dev/null
            result=$?
            if test "x$result" = "x0"; then
              if test "x$HDF5_INCLUDE" = "x"; then
                export HDF5_INCLUDE=${HDF5_ROOT}/include
              fi
              if test "x$HDF5_LIB" = "x"; then
                export HDF5_LIB=${HDF5_ROOT}/lib
              fi
            fi
            export -p | grep HDF5_DIR > /dev/null
            result=$?
            if test "x$result" = "x0"; then
              if test "x$HDF5_INCLUDE" = "x"; then
                export HDF5_INCLUDE=${HDF5_DIR}/include
              fi
              if test "x$HDF5_LIB" = "x"; then
                export HDF5_LIB=${HDF5_DIR}/lib
              fi
            fi
            if test "x$HDF5_INCLUDE" = "x"; then
              export HDF5_INCLUDE="/usr/include/hdf5/serial"
            fi
            if test "x$HDF5_LIB" = "x"; then
              export HDF5_LIB="/usr/lib/x86_64-linux-gnu/hdf5/serial"
            fi
          fi
        fi
      ]
    )
    
    
      [M4_HDF5_LIB],
      [
        cat > nptm_test_hdf5.cpp <<EOF
    
    #include <hdf5.h>
    int main(int argc, char **argv) {
      hid_t file_id = 0;
      herr_t status = H5Iis_valid(file_id);
      return (int)status;
    }
    EOF
    
        $CXX -o nptm_test_hdf5 nptm_test_hdf5.cpp -I$HDF5_INCLUDE -L$HDF5_LIB -lhdf5 > /dev/null 2>>error.log
        export TEST_HDF5_LIB=$?
        rm nptm_test_hdf5.cpp
        if test "x$TEST_HDF5_LIB" = "x0"; then
          rm nptm_test_hdf5
        fi
      ]
    )
    
    m4_define(
      [M4_DETECT_LAPACK],
      [
    
        if test "x$ENABLE_ILP64" = "xyes"; then
          # 64-bit indices are enabled
          LAPACK_ILP64_FLAG="-DLAPACK_ILP64 -DUSE_ILP64"
          LAPACK_ILP64_LDSPEC="_ilp64"
          LAPACK_LDSPEC="64"
          MKL_BUILD="mkl-dynamic-ilp64-gomp"
        else
          # 64-bit indices are disabled
          LAPACK_ILP64_FLAG=""
          LAPACK_ILP64_LDSPEC="_lp64"
          LAPACK_LDSPEC=""
          MKL_BUILD="mkl-dynamic-lp64-gomp"
        fi # end of 64-bit decision tree
        pkg-config --version > /dev/null
        use_pkg_config=$?
        if test "x$use_pkg_config" = "x0"; then
          # pkg-config is available
          declare -a pkg_array=$(pkg-config --list-all | grep ${MKL_BUILD})
          for i in "${pkg_array[[@]]}"; do echo "$i" | cut --delimiter=" " -f1; done | grep ${MKL_BUILD} > /dev/null
          result=$?
          if test "x$result" = "x0"; then
            # MKL was found
            MKL_INCLUDE=$(pkg-config --cflags-only-I ${MKL_BUILD})
            export LAPACKFLAGS="-DUSE_LAPACK -DUSE_MKL ${LAPACK_ILP64_FLAG} ${MKL_INCLUDE}"
            export LAPACKLDFLAGS=$(pkg-config --libs ${MKL_BUILD})
          else
            # MKL was not found, so configuration searches for LAPACKe
            declare -a pkg_array=$(pkg-config --list-all | grep lapacke${LAPACK_LDSPEC})
            for i in "${pkg_array[[@]]}"; do echo "$i" | cut --delimiter=" " -f1; done | grep lapacke${LAPACK_LDSPEC} > /dev/null
            result=$?
            if test "x$result" = "x0"; then
              # LAPACKe was found
              LAPACK_INCLUDE=$(pkg-config --cflags-only-I lapacke${LAPACK_LDSPEC})
              export LAPACKFLAGS="-DUSE_LAPACK ${LAPACK_ILP64_FLAG} ${LAPACK_INCLUDE}"
              export LAPACKLDFLAGS=$(pkg-config --libs lapacke${LAPACK_LDSPEC})
            fi # end of LAPACKe decision tree
            if test "x${LAPACKFLAGS}${LAPACKLDFLAGS}" = "x"; then
              # LAPACKe was not found, so configuration searches for LAPACK
              declare -a pkg_array=$(pkg-config --list-all | grep lapack${LAPACK_LDSPEC})
              for i in "${pkg_array[[@]]}"; do echo "$i" | cut --delimiter=" " -f1; done | grep lapack${LAPACK_LDSPEC} > /dev/null
              result=$?
              if test "x$result" = "x0"; then
                # LAPACK was found
                LAPACK_INCLUDE=$(pkg-config --cflags-only-I lapack${LAPACK_LDSPEC})
                export LAPACKFLAGS="-DUSE_LAPACK ${LAPACK_ILP64_FLAG} ${LAPACK_INCLUDE}"
                export LAPACKLDFLAGS=$(pkg-config --libs lapack${LAPACK_LDSPEC})
              fi # end of LAPACK decision tree
            fi # end of LAPACKe decision tree
          fi # end of MKL decision tree
    
          # pkg-config is not available
          export -p | grep MKL > /dev/null
          MKL_DEF=$?
          if test "x$MKL_DEF" = "x0"; then
            export LAPACKFLAGS="-DUSE_LAPACK -DUSE_MKL ${LAPACK_ILP64_FLAG} -I{MKLROOT}/include"
            export LAPACKLDFLAGS="-L${MKLROOT}/lib -Wl,--no-as-needed -lmkl_intel${LAPACK_ILP64_LDSPEC} -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm -ldl"
          else
            if test -f /usr/include/lapacke.h; then
              export LAPACKFLAGS="-DUSE_LAPACK ${LAPACK_ILP64_FLAG}"
              export LAPACKLDFLAGS="-llapacke${LAPACK_LDSPEC}"
            fi
    
        if test "x$ENABLE_ILP64" = "xyes"; then
          # 64-bit indices are enabled
          MAGMA_ILP64_FLAG="-DMAGMA_ILP64"
          MAGMA_LD_SPEC="64"
        else
          # 64-bit indices are disabled
          MAGMA_ILP64_FLAG=""
          MAGMA_LD_SPEC=""
        fi # end of 64-bit decision tree
        pkg-config --version > /dev/null
        use_pkg_config=$?
    
        if test "x${CUDAFLAGS}${CUDALDFLAGS}" = "x"; then
          if test "x$use_pkg_config" = "x0"; then
            # pkg-config is available
            declare -a pkg_array=$(pkg-config --list-all | grep cudart)
            for i in "${pkg_array[[@]]}"; do echo "$i" | cut --delimiter=" " -f1; done | grep cudart > /dev/null
            result=$?
            if test "x$result" = "x0"; then
              # CUDA runtime detected
              cuda_pkg=$(for i in "${pkg_array[[@]]}"; do echo "$i" | cut --delimiter=" " -f1; done | grep cudart)
        	CUDAFLAGS=$(pkg-config --cflags ${cuda_pkg})
        	CUDALDFLAGS=$(pkg-config --libs ${cuda_pkg})
            fi # end of CUDA runtime decision tree
            echo $CUDALDFLAGS | grep cudart > /dev/null
            cudart_check=$?
            if test "x${cudart_check}" != "x0"; then
              CUDALDFLAGS="$CUDALDFLAGS -lcudart"
            fi
          else
            # pkg-config is not available
            if test -f /usr/local/cuda/include/cuda.h; then
              CUDAFLAGS="-I/usr/local/cuda/include"
              CUDALDFLAGS="-L/usr/local/cuda/lib64 -lcudart"
            elif test -f /usr/include/cuda.h; then
              CUDAFLAGS="-I/usr/include"
              CUDALDFLAGS="-lcudart"
            elif test "x$CUDA_HOME" != "x"; then
              CUDAFLAGS="-I${CUDA_HOME}/include"
              CUDALDFLAGS="-L${CUDA_HOME}/lib64 -lcudart"
            fi
          fi # end of pkg-config decision tree
        fi # end of CUDAFLAGS user override protection
    
        if test "x${MAGMA_ROOT}${MAGMA_HOME}${MAGMA_DIR}" = "x"; then
          # MAGMA environment is not defined
    
          if test "x$use_pkg_config" = "x0"; then
    
            # use pkg-config to search for MAGMA
            declare -a pkg_array=$(pkg-config --list-all | grep magma)
            for i in "${pkg_array[[@]]}"; do echo "$i" | cut --delimiter=" " -f1; done | grep magma > /dev/null
            result=$?
    	if test "x$result" = "x0"; then
    	  # MAGMA was found
    	  magma_pkg=$(for i in "${pkg_array[[@]]}"; do echo "$i" | cut --delimiter=" " -f1; done | grep magma)
    	  MAGMA_INCLUDE=$(pkg-config --cflags-only-I ${magma_pkg})
    
    	  MAGMA_LIBS_DIR=$(pkg-config --libs-only-L ${magma_pkg})
    
              export MAGMAFLAGS="-DUSE_MAGMA ${MAGMA_ILP64_FLAG} $CUDAFLAGS ${MAGMA_INCLUDE}"
              export MAGMALDFLAGS="$CUDALDFLAGS ${MAGMA_LIBS_DIR} -lmagma"
    	fi # end of MAGMA decision tree
          else
            # search for MAGMA in some standard folders
            if test "x$CUDAFLAGS" != "x"; then
              if test -f /usr/include/magma_v2.h; then
                export MAGMAFLAGS="-DUSE_MAGMA ${MAGMA_ILP64_FLAG} $CUDAFLAGS -I/usr/include"
                export MAGMALDFLAGS="$CUDALDFLAGS -lmagma"
              elif test -f /usr/local/include/magma_v2.h; then
                export MAGMAFLAGS="-DUSE_MAGMA ${MAGMA_ILP64_FLAG} $CUDAFLAGS -I/usr/local/include"
                export MAGMALDFLAGS="$CUDALDFLAGS -lmagma"
              fi
            fi
          fi # end of pkg-config decision tree
        else
          # MAGMA environment is defined, so configuration makes sure that MAGMA_ROOT is defined too
          if test "x${MAGMA_HOME}" != "x"; then
            MAGMA_ROOT="${MAGMA_HOME}"
          elif test "x${MAGMA_DIR}" != "x"; then
            MAGMA_ROOT="${MAGMA_DIR}"
          fi
          export MAGMAFLAGS="-DUSE_MAGMA -DMAGMA_ILP64 $CUDAFLAGS -I${MAGMA_ROOT}/include"
          export MAGMALDFLAGS="$CUDALDFLAGS -L${MAGMA_ROOT}/lib -lmagma"
    
    
    m4_define(
      [M4_TEST_MPI],
      [
        cat > np_test_mpi.cpp <<EOF
    #ifndef MPI_VERSION
    #include <mpi.h>
    #endif
    int main(int argc, char** argv) {
      int ierr = MPI_Init(&argc, &argv);
      MPI_Finalize();
      return ierr;
    }
    EOF
        $CXX -c np_test_mpi.cpp > /dev/null 2>&1
        export CXX_IS_MPI=$?
        rm np_test_mpi.cpp
        if test "x$CXX_IS_MPI" = "x0"; then
          rm np_test_mpi.o
        fi
      ]
    )
    
    
    m4_define(
      [M4_TEST_OFFLOAD],
      [
        cat > np_test_offload.cpp <<EOF
    #include <omp.h>
    #pragma omp requires unified_shared_memory
    
    #pragma omp begin declare target device_type(any)
    void fill_with_ones(int *array) {
    #pragma omp target teams distribute parallel for
      for (int i = 0; i < 1000; i++) {
        for (int j = 0; j < 1000; j++) {
          array[[(1000 * i) + j]] = 1;
        }
      }
    }
    #pragma omp end declare target
    int main(int argc, char** argv) {
      int *numbers = new int[[1000000]]();
      fill_with_ones(numbers);
      delete[[]] numbers;
      return 0;
    }
    EOF
    
        $CXX -fcf-protection=check -foffload=default -foffload=nvptx-none="-O3 -ggdb -fopt-info -lm -latomic -mgomp" -fopenmp -c np_test_offload.cpp > /dev/null 2>&1
    
        export CXX_SUPPORTS_OFFLOAD=$?
        rm np_test_offload.cpp
        if test "x$CXX_SUPPORTS_OFFLOAD" = "x0"; then
          rm np_test_offload.o
        fi
      ]
    )
    
    # END CAPABILITY TESTING MACROS
    
    # autoconf setup initialization
    
    AC_INIT([np_tmcode],[8.04],[giovanni.lamura@inaf.it])
    
    
    # Folder structure safety check
    
    AC_CONFIG_SRCDIR([../src/libnptm/TransitionMatrix.cpp])
    
    
    # Auxiliary build folder
    
    AC_CONFIG_AUX_DIR([build_aux])
    
    
    # automake initialization
    
    AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
    
    # Set the default library policy
    AC_DISABLE_SHARED
    AC_DISABLE_SHARED([])
    AC_ENABLE_STATIC
    AC_ENABLE_STATIC([])
    
    
    # Compiler detection
    AM_PROG_AR
    
    AC_ARG_ENABLE(
    
      [AS_HELP_STRING([--enable-mpi], [enable MPI compilation [default=auto]])],
    
        if test "x$enableval" = "xno"; then
    
          if test "x$CXX" = "x"; then
            AC_PROG_CXX([g++ clang++])
          else
            AC_PROG_CXX([$CXX])
          fi
    
          AC_MSG_NOTICE([Using $CXX])
          AC_SUBST([MPIFLAGS], [""])
        elif test "x$enableval" = "xauto"; then
    
          if test "x$CXX" = "x"; then
            AC_PROG_CXX([mpicxx.openmpi mpicxx.mpich mpic++.openmpi mpiCC.openmpi])
            if test "x$CXX" != "x"; then
              AC_SUBST([MPIFLAGS], [-DUSE_MPI])
            else
              AC_PROG_CXX([g++ clang++])
              AC_SUBST([MPIFLAGS], [""])
            fi
    
            M4_TEST_MPI
    
          fi
        elif test "x$enableval" = "xyes"; then
    
          if test "x$CXX" = "x"; then
            AC_PROG_CXX([mpicxx.openmpi mpicxx.mpich mpic++.openmpi mpiCC.openmpi])
            if test "x$CXX" != "x"; then
              AC_SUBST([MPIFLAGS], [-DUSE_MPI])
            else
              AC_MSG_ERROR([MPI was requested, but no MPI compiler detected!])
            fi
    
            M4_TEST_MPI
            if test "x$CXX_IS_MPI" != "x0"; then
    
              AC_MSG_ERROR([MPI was requested, but $CXX is not a MPI compiler!])
    
          AC_PROG_CXX([mpicxx.openmpi mpicxx.mpich mpic++.openmpi mpiCC.openmpi])
    
          if test "x$CXX" != "x"; then
            AC_SUBST([MPIFLAGS], [-DUSE_MPI])
          else
            AC_PROG_CXX([g++ clang++])
            AC_SUBST([MPIFLAGS], [""])
            AC_MSG_NOTICE([Using $CXX])
          fi
    
          M4_TEST_MPI
          if test "x$CXX_IS_MPI" = "x0"; then
            AC_SUBST([MPIFLAGS], [-DUSE_MPI])
          fi
    
    AC_PROG_F77([$F77 gfortran f77])
    
    # Check whether the compiler is clang++ (needs additional flags)
    CXX_IS_CLANG=$($CXX --version | grep clang)
    AS_IF(
      [test "x$CXX_IS_CLANG" = "x0"],
      [AC_SUBST([CLANGFLAGS], [-stdlib=libstdc++])],
      [AC_SUBST([CLANGFLAGS], [""])]
    )
    
    
    # Libtool initialization
    LT_INIT
    
    # Environment setup
    
      [test "x${HDF5_INCLUDE}" != "x"],
    
      [AC_MSG_NOTICE([HDF5 headers found in ${HDF5_INCLUDE}])],
      [AC_MSG_ERROR([HDF5 headers not found!])]
    
    AS_IF(
      [test "x${HDF5_LIB}" != "x"],
      [AC_MSG_NOTICE([HDF5 libraries found in ${HDF5_LIB}])],
      [AC_MSG_ERROR([HDF5 libraries not found!])]
    )
    
    # Check for required libraries
    M4_HDF5_LIB
    AS_IF(
    
      [test "x$TEST_HDF5_LIB" = "x0"],
      [AC_SUBST([HDF5_LDFLAGS], ["-L${HDF5_LIB} -lhdf5"])],
    
      [AC_MSG_ERROR(["HDF5 library not working!"])]
    
    # Configure the optional features
    
    AC_ARG_ENABLE(
      [ilp64],
      [AS_HELP_STRING([--enable-ilp64], [enable 64-bit indexing [default=yes]])],
      [
        if test "x$enableval" = "xno"; then
          AC_SUBST([ENABLE_ILP64], [""])
        else
          AC_SUBST([ENABLE_ILP64], ["yes"])
        fi
      ],
      [
        AC_SUBST([ENABLE_ILP64], ["yes"])
      ]
    )
    
    
    AC_ARG_ENABLE(
      [fortran],
      [AS_HELP_STRING([--enable-fortran], [enable legacy FORTRAN compilation [default=auto]])],
      [
        if test "x$enableval" = "xno"; then
          export BUILDF="false"
          AC_MSG_NOTICE([Disabling FORTRAN compilation])
        elif test "x$enableval" = "xyes"; then
          if test "x$F77" != "x"; then
            export BUILDF="true"
            AC_MSG_NOTICE([Enabling FORTRAN compilation])
          else
            AC_MSG_ERROR([FORTRAN was requested, but no FORTRAN compiler was found!])
          fi
        elif test "x$enableval" = "xauto"; then
          if test "x$F77" != "x"; then
            export BUILDF="true"
            AC_MSG_NOTICE([Enabling FORTRAN compilation])
          else
            export BUILDF="false"
            AC_MSG_NOTICE([Disabling FORTRAN compilation])
          fi
        fi
      ],
      [
        if test "x$F77" != "x"; then
          export BUILDF="true"
          AC_MSG_NOTICE([Enabling FORTRAN compilation])
        else
          export BUILDF="false"
          AC_MSG_NOTICE([Disabling FORTRAN compilation])
        fi
      ]
    )
    AM_CONDITIONAL([BUILDFORTRAN], [test "x$BUILDF" = "xtrue"])
    
    
    AC_ARG_ENABLE(
      [offload],
      [AS_HELP_STRING([--enable-offload], [enable target offloading (requires g++ version >= 13) [default=auto]])],
      [
        if test "x$enableval" != "xno"; then
          M4_TEST_OFFLOAD
          if test "x$CXX_SUPPORTS_OFFLOAD" = "x0"; then
            AC_MSG_NOTICE([Enabling offload.])
    
            AC_SUBST([OFFLOADFLAGS], ["-fcf-protection=check -foffload=default -foffload=nvptx-none=\"-O3 -ggdb -fopt-info -lm -latomic -mgomp\" -fopenmp -DUSE_TARGET_OFFLOAD "])
    
          else
            AC_MSG_ERROR([Target offload was requested, but it is not supported!])
          fi
        else
          AC_MSG_NOTICE([Disabling offload.])
          AC_SUBST([OFFLOADFLAGS], [""])
        fi
      ],
      [
        M4_TEST_OFFLOAD
        if test "x$CXX_SUPPORTS_OFFLOAD" = "x0"; then
          AC_MSG_NOTICE([Enabling offload.])
    
          AC_SUBST([OFFLOADFLAGS], ["-fcf-protection=check -foffload=default -foffload=nvptx-none=\"-O3 -ggdb -fopt-info -lm -latomic -mgomp\" -fopenmp -DUSE_TARGET_OFFLOAD "])
    
        else
          AC_MSG_NOTICE([Disabling offload.])
          AC_SUBST([OFFLOADFLAGS], [""])
        fi
      ]
    )
    
    
    AC_ARG_ENABLE(
      [openmp],
      [AS_HELP_STRING([--enable-openmp], [enable OpneMP multi-threading [default=yes]])],
      [
        if test "x$enableval" != "xno"; then
    
          AC_SUBST([OMPFLAGS], ["-fopenmp"])
    
        AC_SUBST([OMPFLAGS], ["-fopenmp"])
    
    AC_ARG_ENABLE(
      [optimize],
      [AS_HELP_STRING([--enable-optimize=LEVEL], [use optimization level LEVEL [default=3]])],
      [
        if test "x$enableval" = "x0"; then
          AC_SUBST([OPTFLAGS], ["-O0"])
        elif test "x$enableval" = "x1"; then
          AC_SUBST([OPTFLAGS], ["-O1"])
        elif test "x$enableval" = "x2"; then
          AC_SUBST([OPTFLAGS], ["-O2"])
        elif test "x$enableval" = "x3"; then
          AC_SUBST([OPTFLAGS], ["-O3"])
        else
          AC_MSG_ERROR([Invalid optimization flag!])
        fi
      ],
      [AC_SUBST([OPTFLAGS], ["-O3"])]
    )
    
    
    AC_ARG_WITH(
      [lapack],
    
      [AS_HELP_STRING([--with-lapack], [use LAPACK @<:@default=auto@:>@])],
    
      [
        if test "x$withval" = "xno"; then
    
          AC_SUBST([LAPACKFLAGS], [""])
          AC_SUBST([LAPACKLDFLAGS], [""])
        else
    
          M4_DETECT_LAPACK
          AS_IF(
            [test "x$LAPACKLDFLAGS" != "x"],
            [AC_MSG_NOTICE([LAPACK detected.])],
            [AC_MSG_NOTICE([No LAPACK found.])]
          )
    
          AC_SUBST([LAPACKFLAGS], [${LAPACKFLAGS}])
          AC_SUBST([LAPACKLDFLAGS], [${LAPACKLDFLAGS}])
    
        M4_DETECT_LAPACK
        AS_IF(
          [test "x$LAPACKLDFLAGS" != "x"],
          [AC_MSG_NOTICE([LAPACK detected. Activating by default (use --without-lapack to disble).])],
          [AC_MSG_NOTICE([No LAPACK found.])]
        )
    
        AC_SUBST([LAPACKFLAGS], [${LAPACKFLAGS}])
        AC_SUBST([LAPACKLDFLAGS], [${LAPACKLDFLAGS}])
    
      [AS_HELP_STRING([--with-magma[[=MAGMA_DIR]]], [use MAGMA @<:@default=auto@:>@])],
    
      [
        if test "x$withval" = "xno"; then
          AC_SUBST([MAGMAFLAGS], [""])
          AC_SUBST([MAGMALDFLAGS], [""])
        else
    
          if test "x$withval" != "xyes"; then
            if test "x$withval" != "xauto"; then
              export MAGMA_HOME=$withval
    	fi
    
          M4_DETECT_MAGMA
          AS_IF(
            [test "x$MAGMALDFLAGS" != "x"],
            [AC_MSG_NOTICE([MAGMA detected.])],
            [AC_MSG_NOTICE([MAGMA not found.])]
          )
    
          AC_SUBST([MAGMAFLAGS], [${MAGMAFLAGS}])
          AC_SUBST([MAGMALDFLAGS], [${MAGMALDFLAGS}])
        fi
      ],
      [
    
        M4_DETECT_MAGMA
        AS_IF(
          [test "x$MAGMALDFLAGS" != "x"],
          [AC_MSG_NOTICE([MAGMA detected. Activating by default (use --without-magma to disable).])],
          [AC_MSG_NOTICE([MAGMA not found.])]
        )
    
        AC_SUBST([MAGMAFLAGS], [${MAGMAFLAGS}])
        AC_SUBST([MAGMALDFLAGS], [${MAGMALDFLAGS}])
      ]
    
    AC_ARG_ENABLE(
      [nvtx],
      [AS_HELP_STRING([--enable-nvtx], [use NVTX profiling @<:@default=no@:>@])],
      [
        if test "x$enableval" = "xyes"; then
          AC_SUBST([NVTXFLAGS], ["-DUSE_NVTX"])
        fi
      ],
      [
        AC_SUBST([NVTXFLAGS], [""])
      ]
    )
    
    
    # Test for additional user configurations
    # Test for specific include folders
    AC_ARG_WITH(
      [include],
      [AS_HELP_STRING([--with-include], [additional include folders @<:@default=none@:>@])],
      [
        if test "x$with_val" != "x"; then
          AC_SUBST([USER_INCLUDE], [$with_val])
        fi
      ],
      [AC_SUBST([USER_INCLUDE], [""])]
    )
    
    # Test for special FORTRAN compiler flags
    AC_ARG_WITH(
      [fflags],
      [AS_HELP_STRING([--with-fflags=flags], [FORTRAN compiler flags @<:@default="-std=legacy -O3"@:>@])],
      [
        if test "x$with_val" != "x"; then
          AC_SUBST([FFLAGS], [$with_val])
        fi
      ],
      [
        AC_SUBST([FFLAGS], ["-std=legacy -O3"])
      ]
    )
    
    # Test for special linker flags
    AC_ARG_WITH(
      [ldflags],
      [AS_HELP_STRING([--with-ldflags=flags], [custom linker flags @<:@default=none@:>@])],
      [
        if test "x$with_val" != "x"; then
          AC_SUBST([USER_LDFLAGS], [$with_val])
        fi
      ],
      [
        AC_SUBST([USER_LDFLAGS], [""])
      ]
    )
    
    
    AS_IF(
      [test "x$OFFLOADFLAGS" != "x"],
      [AC_SUBST([OMPFLAGS], [""])],
      [AC_SUBST([OMPFLAGS], [$OMPFLAGS])]
    )
    
    CXXFLAGS="$CLANGFLAGS $OPTFLAGS -ggdb $OFFLOADFLAGS $USER_INCLUDE -I$HDF5_INCLUDE $OMPFLAGS $MPIFLAGS $LAPACKFLAGS $MAGMAFLAGS $NVTXFLAGS"
    
    SUBDIRS="cluster libnptm sphere testing trapping"
    
    # Generate the output
    AC_OUTPUT