abinit/shared/common/configure.ac

661 lines
18 KiB
Plaintext

# -*- Autoconf -*-
#
# Copyright (C) 2019-2025 ABINIT Group (Yann Pouillon)
#
# This file is part of the ABINIT software package. For license information,
# please see the COPYING file in the top-level directory of the ABINIT source
# distribution.
#
# ---------------------------------------------------------------------------- #
#
# IMPORTANT NOTE
#
# Please DO NOT EDIT this file unless you REALLY know what you are doing.
# Everything is important, in particular the order of the various commands
# executed here. YOU HAVE BEEN WARNED !
#
# ---------------------------------------------------------------------------- #
#
# Autoconf & Automake startup
#
# Initialize Autoconf
AC_PREREQ(2.59)
AC_INIT([ABINIT Common],[8.11.11],
[https://bugs.launchpad.net/abinit/],
[abinit-common])
AC_REVISION([Autotools support for ABINIT Common])
AC_CONFIG_AUX_DIR([config/gnu])
AC_CONFIG_MACRO_DIR([config/m4])
AC_CONFIG_SRCDIR([src/10_defs/defs_basis.F90])
AC_CONFIG_HEADERS([config.h])
# Initial setup
AC_CANONICAL_TARGET
# Disable pax to initialize Automake because it causes 'make dist' to fail
alias pax='/bin/false'
AM_INIT_AUTOMAKE([1.10 tar-ustar])
unalias pax
# Early ABINIT Common setup - the order is important!
ABI_INIT_DIRS
ABI_INIT_VERSION
ABI_INIT_CPU_INFO
ABI_INIT_OS_INFO
ABI_INIT_HEADER
ABI_INIT_ARCH
# Check for common programs
AC_PROG_MAKE_SET
AC_PROG_INSTALL
AC_PROG_LN_S
AC_PROG_SED
AC_PROG_AWK
AC_PROG_GREP
AC_PATH_PROG(BOURNE_SHELL, sh, /bin/sh)
AC_PATH_PROG(MV, mv, /bin/false)
AC_PATH_PROG(PERL, perl, /bin/false)
AC_PATH_PROG(RM, rm, /bin/false)
AC_CHECK_PROGS(TAR, [tar gtar star])
# Workaround for the wrong path to install-sh on Mac systems
ABI_PROG_MKDIR_P
# Look for a command that provide absolute paths
AC_CHECK_PROGS(REALPATH, [realpath readlink], [/bin/true])
test "${REALPATH}" = "readlink" && REALPATH="${REALPATH} -f"
# We might need a Python interpreter early on
ABI_PROG_PYTHON
# Define command-line arguments
ABI_OPTIONS_DEFINE
# Read config file and ensure that priorities are respected
ABI_ENV_BACKUP
ABI_OPTIONS_BACKUP
ABI_LOAD_OPTIONS
ABI_OPTIONS_CFG_TRANSFER
ABI_OPTIONS_RECALL
ABI_ENV_RECALL
# Set still undefined options
ABI_OPTIONS_SETUP
# Initialize environment, taking options into account
ABI_ENV_INIT
AC_SUBST(CC_LDFLAGS)
AC_SUBST(CC_LIBS)
AC_SUBST(CXX_LDFLAGS)
AC_SUBST(CXX_LIBS)
AC_SUBST(FC_LDFLAGS)
AC_SUBST(FC_LIBS)
# Initialize install dirs (requires version and config options to be set)
ABI_INIT_INSTALL_DIRS
# Disable wrapping of Fortran compiler by default
abi_fc_wrap="no"
# Save user-defined CPP
abi_cpp_user="${CPP}"
# Set-up required information for core libraries
ABI_CORELIBS_INIT
# Init Steredeg core features
SD_CORE_INIT
# Prepare MPI support
ABI_MPI_INIT
# GPU support requires MPI
if test "${abi_gpu_enable}" = "yes" -a "${abi_mpi_enable}" != "yes"; then
AC_MSG_ERROR([GPU support requires MPI])
fi
# Prepare GPU support
# Note: must be done after MPI
ABI_GPU_INIT
# Set basic ABINIT Common C parameters
# Note: advanced fetaures are set later on
ABI_PROG_CC
# Set basic ABINIT Common C++ parameters
# Note: advanced fetaures are set later on
ABI_PROG_CXX
# Set basic ABINIT Common Fortran parameters
# Note: advanced fetaures are set later on
ABI_PROG_FC
# Set default file extensions
ABI_FC_EXTENSIONS
# Get module file case
ABI_FC_MOD_CASE
# Determine Fortran-C name mangling scheme
AC_FC_WRAPPERS
# The IBM Fortran compiler crashes if the mpi module is included
# more than once
if test "${abi_fc_vendor}" = "ibm" -a "${abi_mpi_enable}" = "yes"; then
AC_MSG_NOTICE([activating MPI workaround for the IBM Fortran compiler])
AC_DEFINE([HAVE_MPI_INCLUDED_ONCE], 1,
[Define to 1 if you are using XLF.])
fi
# Wrap Fortran compiler calls if needed or requested
# Note: must be the last step of basic Fortran configuration
if test "${abi_fc_wrapper_enable}" = "yes"; then
abi_fc_wrap="yes"
fi
# FIXME: obsolete mechanism
AC_SUBST(fc_mod_fcflags)
# Look for a true C preprocessor
if test "${TRUE_CPP}" = ""; then
AC_CHECK_PROGS([TRUE_CPP],[cpp])
fi
if test "${TRUE_CPP}" = ""; then
AC_PATH_PROG([TRUE_CPP],[cpp])
fi
if test "${TRUE_CPP}" = ""; then
if test -x "/lib/cpp"; then
TRUE_CPP="/lib/cpp"
fi
fi
AC_MSG_CHECKING([for a true C preprocessor])
if test "${TRUE_CPP}" = ""; then
AC_MSG_RESULT([none])
else
AC_MSG_RESULT([${TRUE_CPP}])
fi
# Set Fortran preprocessor when needed
if test "${abi_fc_wrap}" = "yes"; then
AC_MSG_CHECKING([for a Fortran-compatible C preprocessor])
if test "${FPP}" = ""; then
if test "${abi_cpp_user}" != ""; then
FPP="${abi_cpp_user}"
else
if test "${TRUE_CPP}" != ""; then
FPP="${TRUE_CPP}"
else
FPP="${CPP}"
fi
fi
fi
AC_MSG_RESULT([${FPP}])
fi
# FIXME: set CPP vendor
case "${target_os}" in
aix*)
abi_cpp_vendor="ibm"
abi_xpp_vendor="ibm"
abi_fpp_vendor="ibm"
;;
*)
abi_cpp_vendor="default"
abi_xpp_vendor="default"
abi_fpp_vendor="default"
;;
esac
case "${abi_fc_vendor}" in
ibm)
abi_fpp_vendor="ibm"
;;
esac
AC_MSG_NOTICE([setting C preprocessor vendor to '${abi_cpp_vendor}'])
AC_MSG_NOTICE([setting C++ preprocessor vendor to '${abi_xpp_vendor}'])
AC_MSG_NOTICE([setting Fortran preprocessor vendor to '${abi_fpp_vendor}'])
# Preset flags to have the source building properly
if test "${abi_hints_enable}" = "yes"; then
# C support
ABI_CPP_HINTS
ABI_CC_HINTS
# C++ support
ABI_XPP_HINTS
ABI_CXX_HINTS
# Fortran support
ABI_FPP_HINTS
ABI_FC_HINTS
# Library archiver support
#ABI_AR_HINTS
fi
# Adjust OpenMP flags if not used
if test "${abi_openmp_enable}" != "yes"; then
FCFLAGS_OPENMP=""
fi
# Set Fortran preprocessing flags
if test "${abi_fc_wrap}" = "yes"; then
test "${FPPFLAGS}" = "" && FPPFLAGS="${FPPFLAGS_HINTS_EXT}"
fi
# Display Fortran preprocessing parameters
AC_MSG_CHECKING([which Fortran preprocessor to use])
if test "${FPP}" = ""; then
AC_MSG_RESULT([none])
else
AC_MSG_RESULT([${FPP}])
fi
AC_MSG_CHECKING([which Fortran preprocessor flags to apply])
if test "${FPPFLAGS}" = ""; then
AC_MSG_RESULT([none])
else
AC_MSG_RESULT([${FPPFLAGS}])
fi
# Display Fortran compiler wrapper status
AC_MSG_CHECKING([whether to wrap Fortran compiler calls])
AC_MSG_RESULT([${abi_fc_wrap}])
# Export true CPPFLAGS (required by LibXC)
AC_SUBST(CPPFLAGS_HINTS_EXT)
# Init debug flags
ABI_DEBUG_INIT([${abi_debug_flavor}])
# Activate "design-by-contract" debugging tests when paranoid
AC_MSG_CHECKING([whether to activate design-by-contract debugging])
if test "${abi_debug_flavor}" = "paranoid"; then
AC_DEFINE([DEBUG_CONTRACT], 1,
[Define to 1 if you want to activate design-by-contract debugging tests.])
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no])
fi
AM_CONDITIONAL(DO_BUILD_32_CONTRACT,
[test "${abi_debug_flavor}" = "paranoid"])
# Disable optimizations if debug mode is activated in source files
if test "${abi_debug_source}" = "yes"; then
if test "${abi_optim_flavor}" != "none"; then
AC_MSG_WARN([disabling optimizations])
fi
abi_optim_flavor="none"
fi
# Init optimization flags
# Note: must be done only once debugging is configured
ABI_OPTIM_INIT([${abi_optim_flavor}])
# FIXME: 20_datashare does not support optimizations
if test "${abi_optim_flavor}" != "none"; then
AC_MSG_NOTICE([disabling optimizations for src/20_datashare/])
fcflags_opt_20_datashare="-O0"
AC_MSG_NOTICE([disabling optimizations for src/43_ptgroups/])
fcflags_opt_43_ptgroups="-O0"
fi
# Set per-directory Fortran optimizations
# Note: must be done only once FCFLAGS_OPTIM is set
ABI_OPTFLAGS_DIRS([${FCFLAGS_OPTIM}])
# ---------------------------------------------------------------------------- #
# Set-up target and binary package names
# Note: requires knowledge of Fortran compiler
ABI_INIT_TARGET
ABINIT_BINARY_PACKAGE="${PACKAGE}-${VERSION}_${ABINIT_TARGET}"
AC_SUBST(ABINIT_BINARY_PACKAGE)
# Preserve environment
ABI_ENV_BACKUP
# Look for archiver
if test "${AR}" = ""; then
AC_CHECK_PROGS(AR,[ar xiar])
fi
# Set archiver command flag
test "${ARFLAGS_CMD}" = "" && ARFLAGS_CMD="rc"
AC_SUBST(ARFLAGS_CMD)
# Look for ranlib
AC_PROG_RANLIB
# Restore back compile flags
CFLAGS="${abi_env_CFLAGS}"
CXXFLAGS="${abi_env_CXXFLAGS}"
FCFLAGS="${abi_env_FCFLAGS}"
# We want to be able access the archiver from anywhere
AC_SUBST(AR)
AC_SUBST(ARFLAGS)
# Report the use of libtool-related options
AC_SUBST(enable_shared)
AC_SUBST(enable_static)
AC_SUBST(with_gnu_ld)
# Final adjustments for library archiver
test "${ARFLAGS}" = "" && \
ARFLAGS="${ARFLAGS_DEBUG} ${ARFLAGS_OPTIM} ${ARFLAGS_HINTS} ${ARFLAGS_EXTRA} ${ARFLAGS_CMD}"
# Final adjustments for C
test "${CFLAGS}" = "" && \
CFLAGS="${CFLAGS_DEBUG} ${CFLAGS_OPTIM} ${CFLAGS_HINTS} ${CFLAGS_EXTRA}"
test "${CC_LDFLAGS}" = "" && \
CC_LDFLAGS="${CC_LDFLAGS_DEBUG} ${CC_LDFLAGS_OPTIM} ${CC_LDFLAGS_HINTS} ${CC_LDFLAGS_EXTRA}"
test "${CC_LIBS}" = "" && \
CC_LIBS="${CC_LIBS_DEBUG} ${CC_LIBS_OPTIM} ${CC_LIBS_HINTS} ${CC_LIBS_EXTRA}"
# Final adjustments for C++
test "${CXXFLAGS}" = "" && \
CXXFLAGS="${CXXFLAGS_DEBUG} ${CXXFLAGS_OPTIM} ${CXXFLAGS_HINTS} ${CXXFLAGS_EXTRA}"
test "${CXX_LDFLAGS}" = "" && \
CXX_LDFLAGS="${CXX_LDFLAGS_DEBUG} ${CXX_LDFLAGS_OPTIM} ${CXX_LDFLAGS_HINTS} ${CXX_LDFLAGS_EXTRA}"
test "${CXX_LIBS}" = "" && \
CXX_LIBS="${CXX_LIBS_DEBUG} ${CXX_LIBS_OPTIM} ${CXX_LIBS_HINTS} ${CXX_LIBS_EXTRA}"
# Final adjustments for Fortran
# Note: FCFLAGS_OPTIM must not be included (per-directory optimizations)
test "${FCFLAGS}" = "" && \
FCFLAGS="${FCFLAGS_DEBUG} ${FCFLAGS_HINTS} ${FCFLAGS_EXTRA} ${FCFLAGS_OPENMP}"
test "${FC_LDFLAGS}" = "" && \
FC_LDFLAGS="${FC_LDFLAGS_DEBUG} ${FC_LDFLAGS_OPTIM} ${FC_LDFLAGS_HINTS} ${FC_LDFLAGS_EXTRA}"
test "${FC_LIBS}" = "" && \
FC_LIBS="${FC_LIBS_DEBUG} ${FC_LIBS_OPTIM} ${FC_LIBS_HINTS} ${FC_LIBS_EXTRA}"
# Final adjustments for preprocessors
test "${CPPFLAGS}" = "" && \
CPPFLAGS="${CPPFLAGS_DEBUG} ${CPPFLAGS_OPTIM} ${CPPFLAGS_HINTS} ${CPPFLAGS_EXTRA}"
test "${XPPFLAGS}" = "" && \
XPPFLAGS="${XPPFLAGS_DEBUG} ${XPPFLAGS_OPTIM} ${XPPFLAGS_HINTS} ${XPPFLAGS_EXTRA}"
test "${FPPFLAGS}" = "" -a "${abi_fc_wrap}" = "no" && \
FPPFLAGS="${FPPFLAGS_DEBUG} ${FPPFLAGS_OPTIM} ${FPPFLAGS_HINTS} ${FPPFLAGS_EXTRA}"
# FIXME: temporary workaround for Macs
if test "${abi_cpu_platform}" = "apple"; then
AC_MSG_WARN([${abi_cpu_platform} is not able to handle full link information])
AC_MSG_WARN([static builds will fail])
else
AC_MSG_NOTICE([static builds may be performed])
FC_LIBS="${FC_LIBS} ${FCLIBS}"
fi
# ---------------------------------------------------------------------------- #
# Look for desired C features
ABI_CC_FEATURES
# Look for desired Fortran features
ABI_FC_FEATURES
# Look for desired Python features
ABI_PY_FEATURES
# Platform-specific libraries
AC_MSG_CHECKING([which operating system we have])
AC_MSG_RESULT([${target_os}])
# Basic mathematical functions
AC_LANG_PUSH([C])
AC_SEARCH_LIBS([expl], [m ml],
[abi_math_expl_ok="yes"], [abi_math_expl_ok="no"])
AC_SEARCH_LIBS([logl], [m ml],
[abi_math_logl_ok="yes"], [abi_math_logl_ok="no"])
AC_LANG_POP([C])
# OpenMP support
AC_MSG_CHECKING([whether to enable OpenMP support])
AC_MSG_RESULT([${abi_openmp_enable}])
if test "${abi_openmp_enable}" = "yes"; then
AC_MSG_CHECKING([Fortran flags for OpenMP])
AC_MSG_RESULT([${FCFLAGS_OPENMP}])
ABI_OMP_CHECK_COLLAPSE
AC_MSG_NOTICE([OpenMP support is enabled in Fortran source code only])
fi
# MPI support
ABI_MPI_DETECT
if test "${abi_mpi_enable}" = "yes"; then
ABI_MPI_DUMP
fi
# GPU support
ABI_GPU_DETECT
# Init FFTW3
SD_FFTW3_INIT([optional skip])
# Init Levmar
SD_LEVMAR_INIT([optional fail])
# Init LibPSML
SD_LIBPSML_INIT([optional fail])
# Init LibXC
SD_LIBXC_INIT([no-fortran optional fail])
# Init PAPI
SD_NETCDF_INIT([no-cxx optional fail])
# Init PAPI
SD_PAPI_INIT([optional fail])
# Init PFFT
SD_PFFT_INIT([optional skip])
# Init TRIQS
SD_TRIQS_INIT([optional fail])
# Init Wannier90
SD_WANNIER90_INIT([optional fail], [-lwannier90])
# Init XMLF90
SD_XMLF90_INIT([optional fail])
# Linear algebra support
SD_LINALG_INIT([required fail])
SD_LINALG_INIT_FLAVOR
SD_LINALG_DETECT
# Optimized FFT support (must be done after linear algebra is fully configured)
SD_FFT_INIT
SD_FFT_DETECT
# ------------------------------ #
# PAPI library support
SD_PAPI_DETECT
AC_MSG_CHECKING([whether to enable the internal ABINIT Common timer])
AC_MSG_RESULT([${abi_timer_enable}])
if test "${sd_papi_ok}" != "yes"; then
if test "${abi_timer_enable}" = "yes"; then
AC_DEFINE([HAVE_TIMER_ABINIT], 1,
[Define to 1 if you want to use the ABINIT Common timer.])
fi
fi
# ------------------------------ #
# NetCDF library support
SD_NETCDF_DETECT
# FIXME: quick workaround
if test "${sd_netcdf_ok}" = "yes"; then
sd_netcdf_fcflags="${sd_netcdf_fcflags} ${sd_netcdf_cppflags}"
fi
# XMLF90 library support
SD_XMLF90_DETECT
# LibPSML library support
if test "${sd_xmlf90_ok}" = "yes"; then
SD_LIBPSML_DETECT
else
if test "${sd_libpsml_enable}" = "auto"; then
sd_libpsml_enable="no"
else
if test "${sd_libpsml_enable}" != "no"; then
AC_MSG_ERROR([LibPSML support has been requested but XMLF90 does not work
Please point the configuration to a working XMLF90
installation or disable LibPSML support])
fi
fi
fi
AM_CONDITIONAL([DO_BUILD_PSML],
[test "${sd_libpsml_enable}" = "yes " -a "${sd_libpsml_ok}" = "yes"])
# ------------------------------ #
# Levmar library support
SD_LEVMAR_DETECT
# ------------------------------ #
# LibXC library support
#ABI_LIBXC_DETECT(2, 2)
SD_LIBXC_DETECT
AM_CONDITIONAL([DO_BUILD_01_LIBXC_EXT],
[test "${sd_libxc_ok}" = "yes"])
# TRIQS support
SD_TRIQS_DETECT
AM_CONDITIONAL([DO_BUILD_67_TRIQS_EXT],
[test "${sd_triqs_enable}" = "yes" -a "${sd_triqs_ok}" = "yes"])
# Wannier90 library support
SD_WANNIER90_DETECT
# Display summary table
ABI_TRIGGERS_SUMMARY
# Always generate a build script for required fallbacks
AC_OUTPUT([transient/build-abinit-fallbacks.sh])
# Check that we have all required fallbacks
ABI_FALLBACKS_VALIDATE([${abi_fbk_required}])
# Report situation
if test "${abi_fbk_required}" = ""; then
AC_MSG_NOTICE([no fallback required - you may run production calculations])
else
AC_MSG_NOTICE([fallbacks required - you should not run production calculations])
fi
# FIXME: copying linear algebra tarball for now,
# ensuring ~/.abinit/tarballs/ exists
if test "${abi_fbk_linalg}" = "yes"; then
tmp_abinit_tardir="${HOME}/.abinit/tarballs"
tmp_linalg_tarball="lapack-abinit_6.10.tar.gz"
if test ! -s "${tmp_abinit_tardir}/${tmp_linalg_tarball}"; then
AC_MSG_NOTICE([using tarball repository ${tmp_abinit_tardir}])
if test ! -e "${tmp_abinit_tardir}"; then
AC_MSG_NOTICE([creating '${tmp_abinit_tardir}'])
${INSTALL} -d -m 755 "${tmp_abinit_tardir}"
elif test ! -d "${tmp_abinit_tardir}"; then
AC_MSG_ERROR(['${tmp_abinit_tardir}' is not a directory
please move away the current file and reconfigure ABINIT Common])
fi
AC_MSG_NOTICE([installing linear algebra fallback tarball to '${tmp_abinit_tardir}'])
${INSTALL} -m 644 "${abinit_srcdir}/transient/${tmp_linalg_tarball}" \
"${tmp_abinit_tardir}"
fi
fi
# Check that all triggers or their fallbacks are working
# FIXME: triggers must not fall back if with_* options are provided
for pkg in ${abi_trig_packages}; do
tmp_trig_errors=""
eval tmp_pkg_ok=\"\$\{abi_${pkg}_ok\}\"
eval tmp_fbk_ok=\"\$\{abi_fbk_${pkg}_ok\}\"
if test "${tmp_pkg_ok}" = "no" -a "${tmp_fbk_ok}" != "yes"; then
tmp_trig_errors="${tmp_trig_errors} ${pkg}"
fi
done
if test "${tmp_trig_errors}" != ""; then
for pkg in ${tmp_trig_errors}; do
tmp_fbk_error=`echo "${abi_fbk_packages}" | grep "${pkg}"`
AC_MSG_WARN([${pkg} support is unavailable or broken])
if test "${tmp_fbk_error}" != ""; then
AC_MSG_WARN([${pkg} fallback is unavailable])
fi
done
AC_MSG_ERROR([some optional features were not found on this system
(see messages above)
Please correct the options of configure to match your
actual situation])
fi
# Defines and conditionals for CPP options
# (see config/specs/options.conf for details)
ABI_OPTIONS_CPP_DEFINES
# Wrap buggy Fortran compilers
FC_NOWRAP="${FC}"
if test "${abi_fc_wrap}" = "yes"; then
FC="${abinit_builddir}/config/wrappers/wrap-fc"
fi
AC_SUBST(FC_NOWRAP)
# Force F77 and F90 environment variables (keep always last)
F77="${FC}"
FFLAGS="${FCFLAGS}"
F90="${FC}"
F90FLAGS="${FCFLAGS}"
# The following is required for oldish fixed-form Fortran libraries
AC_SUBST(F77)
AC_SUBST(FFLAGS)
# Void CPPFLAGS to allow for C/Fortran mixing
ABI_CPPFLAGS="${CPPFLAGS}"
CPPFLAGS=""
# FIXME: Temporary options to remove
case "${ABINIT_LEGACY_OPTION}" in
mpi1)
AC_DEFINE([HAVE_MPI1], 1,
[Define to 1 if you have a MPI-1 implementation (obsolete, broken).])
;;
wannier90_v1)
AC_DEFINE([HAVE_WANNIER90_V1], 1,
[Define to 1 if you want to use Wanner90 1.x (awfully obsolete).])
;;
esac
# FIXME: temporary translation of XML status
if test "${abi_libxml2_enable}" = "yes"; then
AC_DEFINE([HAVE_XML], 1,
[Define to 1 if you want to use LibXML2-based XML I/O.])
fi
# Output files
# Note: later, add tests/atconfig and tests/atlocal for test suite
ABI_OUTPUT
# The end
if test "${sd_linalg_flavor}" = "netlib-fallback"; then
ABI_MSG_NOTICE([linalg-abinit],
[Suboptimal linear algebra configuration])
fi
if test "${abi_gpu_enable}" = "yes" -a "${sd_linalg_chk_gpu}" != "magma"; then
ABI_MSG_NOTICE([gpu-without-magma],
[Suboptimal GPU configuration])
fi
ABI_MSG_FC_BUGGY(${abi_fc_vendor})
ABI_MSG_END