From 7dd41ecfc5c8cfca2d2e3ede06e671c753e38118 Mon Sep 17 00:00:00 2001 From: Giovanni La Mura <giovanni.lamura@inaf.it> Date: Wed, 10 Jul 2024 14:38:02 +0200 Subject: [PATCH] Define AX_PROG_CXX_MPI macro --- build/configure.ac | 285 ++++++++++++++++++++++++++++++--------------- 1 file changed, 190 insertions(+), 95 deletions(-) diff --git a/build/configure.ac b/build/configure.ac index 89f91def..2acdc471 100644 --- a/build/configure.ac +++ b/build/configure.ac @@ -1,3 +1,183 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_prog_cxx_mpi.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PROG_CXX_MPI([MPI-WANTED-TEST[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]]) +# +# DESCRIPTION +# +# This macro tries to find out how to compile C++ programs that use MPI +# (Message Passing Interface), a standard API for parallel process +# communication (see http://www-unix.mcs.anl.gov/mpi/). The macro has to +# be used instead of the standard macro AC_PROG_CXX and will replace the +# standard variable CXX with the found compiler. +# +# MPI-WANTED-TEST is used to test whether MPI is actually wanted by the +# user. If MPI-WANTED_TEST is omitted or if it succeeds, the macro will +# try to find out how to use MPI, if it fails, the macro will call +# AC_PROG_CC to find a standard C compiler instead. +# +# When MPI is found, ACTION-IF-FOUND will be executed, if MPI is not found +# (or MPI-WANTED-TEST fails) ACTION-IF-NOT-FOUND is executed. If +# ACTION-IF-FOUND is not set, the macro will define HAVE_MPI. +# +# The following example demonstrates usage of the macro: +# +# # If --with-mpi=auto is used, try to find MPI, but use standard C +# compiler if it is not found. +# # If --with-mpi=yes is used, try to find MPI and fail if it isn't found. +# # If --with-mpi=no is used, use a standard C compiler instead. +# AC_ARG_WITH(mpi, [AS_HELP_STRING([--with-mpi], +# [compile with MPI (parallelization) support. If none is found, +# MPI is not used. Default: auto]) +# ],,[with_mpi=auto]) +# +# AX_PROG_CXX_MPI([test x"$with_mpi" != xno],[use_mpi=yes],[ +# use_mpi=no +# if test x"$with_mpi" = xyes; then +# AC_MSG_FAILURE([MPI compiler requested, but couldn't use MPI.]) +# else +# AC_MSG_WARN([No MPI compiler found, won't use MPI.]) +# fi +# ]) +# +# LICENSE +# +# Copyright (c) 2010,2011 Olaf Lenz <olenz@icp.uni-stuttgart.de> +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see <https://www.gnu.org/licenses/>. +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 3 + +AC_DEFUN([AX_PROG_CXX_MPI], [ +AC_PREREQ(2.50) + +# Check for compiler +# Needs to be split off into an extra macro to ensure right expansion +# order. +AC_REQUIRE([_AX_PROG_CXX_MPI],[_AX_PROG_CXX_MPI([$1])]) + +AS_IF([test x"$_ax_prog_cxx_mpi_mpi_wanted" = xno], + [ _ax_prog_cxx_mpi_mpi_found=no ], + [ + AC_LANG_PUSH([C++]) + + # test whether MPI_Init() is available + # We do not use AC_SEARCH_LIBS here, as it caches its outcome and + # thus disallows corresponding calls in the other AX_PROG_*_MPI + # macros. + for lib in NONE mpi mpich; do + save_LIBS=$LIBS + if test x"$lib" = xNONE; then + AC_MSG_CHECKING([for function MPI_Init]) + else + AC_MSG_CHECKING([for function MPI_Init in -l$lib]) + LIBS="-l$lib $LIBS" + fi + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([ +extern "C" { void MPI_Init(); } +],[MPI_Init();])], + [ _ax_prog_cxx_mpi_mpi_found=yes ], + [ _ax_prog_cxx_mpi_mpi_found=no ]) + AC_MSG_RESULT($_ax_prog_cxx_mpi_mpi_found) + if test "x$_ax_prog_cxx_mpi_mpi_found" = "xyes"; then + break; + fi + LIBS=$save_LIBS + done + + # Check for header + AS_IF([test x"$_ax_prog_cxx_mpi_mpi_found" = xyes], [ + AC_MSG_CHECKING([for mpi.h]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <mpi.h>])], + [ AC_MSG_RESULT(yes)], + [ AC_MSG_RESULT(no) + _ax_prog_cxx_mpi_mpi_found=no + ]) + ]) + AC_LANG_POP([C++]) +]) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +AS_IF([test x"$_ax_prog_cxx_mpi_mpi_found" = xyes], [ + ifelse([$2],,[AC_DEFINE(HAVE_MPI,1,[Define if you have the MPI library.])],[$2]) + : +],[ + $3 + : +]) + +])dnl AX_PROG_CXX_MPI + +dnl _AX_PROG_CXX_MPI is an internal macro required by AX_PROG_CXX_MPI. +dnl To ensure the right expansion order, the main function AX_PROG_CXX_MPI +dnl has to be split into two parts. +dnl +dnl Known MPI C++ compilers: +dnl mpic++ +dnl mpicxx +dnl mpiCC +dnl sxmpic++ NEC SX +dnl hcp +dnl mpxlC_r +dnl mpxlC +dnl mpixlcxx_r +dnl mpixlcxx +dnl mpg++ +dnl mpc++ +dnl mpCC +dnl cmpic++ +dnl mpiFCC Fujitsu +dnl CC +dnl +AC_DEFUN([_AX_PROG_CXX_MPI], [ + AC_ARG_VAR(MPICXX,[MPI C++ compiler command]) + ifelse([$1],,[_ax_prog_cxx_mpi_mpi_wanted=yes],[ + AC_MSG_CHECKING([whether to compile using MPI]) + if $1; then + _ax_prog_cxx_mpi_mpi_wanted=yes + else + _ax_prog_cxx_mpi_mpi_wanted=no + fi + AC_MSG_RESULT($_ax_prog_cxx_mpi_mpi_wanted) + ]) + if test x"$_ax_prog_cxx_mpi_mpi_wanted" = xyes; then + if test -z "$CXX" && test -n "$MPICXX"; then + CXX="$MPICXX" + else + AC_CHECK_TOOLS([CXX], [mpic++ mpicxx mpiCC sxmpic++ hcp mpxlC_r mpxlC mpixlcxx_r mpixlcxx mpg++ mpc++ mpCC cmpic++ mpiFCC CCicpc pgCC pathCC sxc++ xlC_r xlC bgxlC_r bgxlC openCC sunCC crayCC g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC]) + fi + fi + AC_PROG_CXX +])dnl _AX_PROG_CXX_MPI + # CAPABILITY TESTING MACROS m4_define( [M4_HDF5_LIB], @@ -89,104 +269,19 @@ AM_INIT_AUTOMAKE([-Wall -Werror foreign]) AM_PROG_AR AC_ARG_ENABLE( [mpi], - [AS_HELP_STRING([--enable-mpi], [use MPI if available [default=yes]])], - [ - if test "x$enableval" = "xno"; then - if test "x$F77" = "xmpif90"; then - gfortran --version > /dev/null - if test "x$?" = "x0"; then - AC_SUBST([F77], [gfortran]) - fi - fi - if test "x$F77" = "xmpif90"; then - f77 --version > /dev/null - if test "x$?" = "x0"; then - #export F77=f77 - AC_SUBST([F77], [f77]) - fi - fi - if test "x$CXX" = "xmpicxx"; then - g++ --version > /dev/null - if test "x$?" = "x0"; then - #export CXX=g++ - AC_SUBST([CXX], [g++]) - fi - fi - if test "x$CXX" = "xmpicxx"; then - clang --version > /dev/null - if test "x$?" = "x0"; then - #export CXX=clang - AC_SUBST([CXX], [clang]) - fi - fi - if test "x$F77" = "x"; then - gfortran --version > /dev/null - if test "x$?" = "x0"; then - #export F77=gfortran - AC_SUBST([F77], [gfortran]) - fi - fi - if test "x$F77" = "x"; then - f77 --version > /dev/null - if test "x$?" = "x0"; then - #export F77=f77 - AC_SUBST([F77], [f77]) - fi - fi - if test "x$CXX" = "x"; then - g++ --version > /dev/null - if test "x$?" = "x0"; then - #export CXX=g++ - AC_SUBST([CXX], [g++]) - fi - fi - if test "x$CXX" = "x"; then - clang --version > /dev/null - if test "x$?" = "x0"; then - #export CXX=clang - AC_SUBST([CXX], [clang]) - fi - fi - else - mpicxx --version > /dev/null - if test "x$?" = "x0"; then - #export CXX=mpicxx - #export F77=mpif90 - AC_SUBST([CXX], [mpicxx]) - AC_SUBST([F77], [mpif90]) - else - AC_MSG_ERROR(["MPI was enabled, but no MPI compiler was found!"]) - fi - fi - ], + [AS_HELP_STRING([--enable-mpi], [enable MPI compilation [default=auto]])], + [AC_MSG_NOTICE([Handling explicit option.])], [ - if test "x$CXX" = "x"; then - mpicxx --version > /dev/null - if test "x$?" = "x0"; then - #export CXX=mpicxx - #export F77=mpif90 - AC_SUBST([CXX], [mpicxx]) - AC_SUBST([F77], [mpif90]) - fi - fi - if test "x$CXX" = "x"; then - g++ --version > /dev/null - if test "x$?" = "x0"; then - #export CXX=g++ - AC_SUBST([CXX], [g++]) - fi - fi - if test "x$CXX" = "x"; then - clang --version > /dev/null - if test "x$?" = "x0"; then - #export CXX=clang - AC_SUBST([CXX], [clang]) - fi - fi + AC_MSG_NOTICE([Handling implicit option.]) + AX_PROG_CXX_MPI() ] ) -AC_PROG_CXX([$CXX]) -AC_PROG_F77([$F77]) +AS_IF( + [test "x$CXX" = "x"], + [AC_PROG_CXX([g++ clang])], + [AC_MSG_NOTICE([Using $CXX])] +) +AC_PROG_F77([mpif90 gfortran f77]) # Libtool initialization LT_INIT -- GitLab