# -*- shell-script ; indent-tabs-mode:nil -*- # # Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana # University Research and Technology # Corporation. All rights reserved. # Copyright (c) 2004-2005 The University of Tennessee and The University # of Tennessee Research Foundation. All rights # reserved. # Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, # University of Stuttgart. All rights reserved. # Copyright (c) 2004-2005 The Regents of the University of California. # All rights reserved. # Copyright (c) 2009-2015 Cisco Systems, Inc. All rights reserved. # Copyright (c) 2011-2014 Los Alamos National Security, LLC. All rights # reserved. # Copyright (c) 2014-2019 Intel, Inc. All rights reserved. # Copyright (c) 2014-2021 Research Organization for Information Science # and Technology (RIST). All rights reserved. # Copyright (c) 2016-2021 IBM Corporation. All rights reserved. # $COPYRIGHT$ # # Additional copyrights may follow # # $HEADER$ # # define an internal function for checking the existence # and validity of a PMI library # # OPAL_CHECK_PMI_LIB(installdir, libdir, pmi, function, [action-if-slurm], [action-if-valid], [action-if-not-valid]) # -------------------------------------------------------- AC_DEFUN([OPAL_CHECK_PMI_LIB], [ # save flags opal_check_$3_save_CPPFLAGS=$CPPFLAGS opal_check_$3_save_LDFLAGS=$LDFLAGS opal_check_$3_save_LIBS=$LIBS opal_check_$3_hdr_happy= opal_check_$3_mycppflags= # check for the header AS_IF([test -n "$1"], [AC_MSG_CHECKING([for $3.h in $1]) AS_IF([test -f $1/$3.h && test -r $1/$3.h], [AC_MSG_RESULT([found]) opal_check_$3_mycppflags="-I$1"], [AC_MSG_RESULT([not found]) AC_MSG_CHECKING([for $3.h in $1/include]) AS_IF([test -f $1/include/$3.h && test -r $1/include/$3.h], [AC_MSG_RESULT([found]) opal_check_$3_mycppflags="-I$1/include"], [AC_MSG_RESULT([not found]) AC_MSG_CHECKING([for $3.h in $1/include/slurm]) AS_IF([test -f $1/include/slurm/$3.h && test -r $1/include/slurm/$3.h], [AC_MSG_RESULT([found]) opal_check_$3_mycppflags="-I$1/include/slurm" $5], [AC_MSG_RESULT([not found]) opal_check_$3_hdr_happy=no])])])], [AC_MSG_CHECKING([for $3.h in /usr/include]) AS_IF([test -f /usr/include/$3.h && test -r /usr/include/$3.h], [AC_MSG_RESULT([found])], [AC_MSG_RESULT([not found]) AC_MSG_CHECKING([for $3.h in /usr/include/slurm]) AS_IF([test -f /usr/include/slurm/$3.h && test -r /usr/include/slurm/$3.h], [AC_MSG_RESULT([found]) opal_check_$3_mycppflags="-I/usr/include/slurm" $5], [AC_MSG_RESULT([not found]) opal_check_$3_hdr_happy=no])])]) AS_IF([test "$opal_check_$3_hdr_happy" != "no"], [CPPFLAGS="$CPPFLAGS $opal_check_$3_mycppflags" AC_CHECK_HEADER([$3.h], [opal_check_$3_hdr_happy=yes $3_CPPFLAGS="$opal_check_$3_mycppflags"], [opal_check_$3_hdr_happy=no])]) # check for library and function opal_check_$3_lib_happy= LIBS="$LIBS -l$3" # check for the library in the given location in case # an exact path was given AS_IF([test -z "$1" && test -z "$2"], [AC_CHECK_LIB([$3], [$4], [opal_check_$3_lib_happy=yes], [opal_check_$3_lib_happy=no])], [AS_IF([test -n "$2"], [AC_MSG_CHECKING([for lib$3 in $2]) files=`ls $2/lib$3.* 2> /dev/null | wc -l` AS_IF([test "$files" -gt "0"], [AC_MSG_RESULT([found]) LDFLAGS="$LDFLAGS -L$2" AC_CHECK_LIB([$3], [$4], [opal_check_$3_lib_happy=yes $3_LDFLAGS=-L$2 $3_rpath=$2], [opal_check_$3_lib_happy=no])], [opal_check_$3_lib_happy=no AC_MSG_RESULT([not found])])], [AC_MSG_CHECKING([for lib$3 in $1/lib]) files=`ls $1/lib/lib$3.* 2> /dev/null | wc -l` AS_IF([test "$files" -gt "0"], [AC_MSG_RESULT([found]) LDFLAGS="$LDFLAGS -L$1/lib" AC_CHECK_LIB([$3], [$4], [opal_check_$3_lib_happy=yes $3_LDFLAGS=-L$1/lib $3_rpath=$1/lib], [opal_check_$3_lib_happy=no])], [# check for presence of lib64 directory - if found, see if the # desired library is present and matches our build requirements AC_MSG_CHECKING([for lib$3 in $1/lib64]) files=`ls $1/lib64/lib$3.* 2> /dev/null | wc -l` AS_IF([test "$files" -gt "0"], [AC_MSG_RESULT([found]) LDFLAGS="$LDFLAGS -L$1/lib64" AC_CHECK_LIB([$3], [$4], [opal_check_$3_lib_happy=yes $3_LDFLAGS=-L$1/lib64 $3_rpath=$1/lib64], [opal_check_$3_lib_happy=no])], [opal_check_$3_lib_happy=no AC_MSG_RESULT([not found])])])])]) # restore flags CPPFLAGS=$opal_check_$3_save_CPPFLAGS LDFLAGS=$opal_check_$3_save_LDFLAGS LIBS=$opal_check_$3_save_LIBS AS_IF([test "$opal_check_$3_hdr_happy" = "yes" && test "$opal_check_$3_lib_happy" = "yes"], [$6], [$7]) ]) # OPAL_CHECK_PMI() # -------------------------------------------------------- AC_DEFUN([OPAL_CHECK_PMI],[ OPAL_VAR_SCOPE_PUSH([check_pmi_install_dir check_pmi_lib_dir default_pmi_libloc slurm_pmi_found]) check_pmi_install_dir= check_pmi_lib_dir= default_pmi_libloc= slurm_pmi_found= opal_enable_pmix=no AC_MSG_CHECKING([if user requested PMI support]) AS_IF([test "$with_pmi" = "no"], [AC_MSG_RESULT([no]) $3], [AC_MSG_RESULT([yes]) # cannot use OPAL_CHECK_PACKAGE as its backend header # support appends "include" to the path, which won't # work with slurm :-( AS_IF([test -n "$with_pmi" && test "$with_pmi" != "yes"], [check_pmi_install_dir=$with_pmi]) AS_IF([test -n "$with_pmi_libdir"], [check_pmi_lib_dir=$with_pmi_libdir]) # check for pmi-1 lib */ slurm_pmi_found=no OPAL_CHECK_PMI_LIB([$check_pmi_install_dir], [$check_pmi_lib_dir], [pmi], [PMI_Init], [slurm_pmi_found=yes], [opal_enable_pmi1=yes opal_pmi1_LIBS="-lpmi" AC_SUBST(opal_pmi1_LIBS)], [opal_enable_pmi1=no]) AS_IF([test "$opal_enable_pmi1" = "yes"], [AS_IF([test "$slurm_pmi_found" = "yes"], [opal_pmi1_CPPFLAGS="$pmi_CPPFLAGS" AC_SUBST(opal_pmi1_CPPFLAGS)]) AS_IF([test "$slurm_pmi_found" = "yes"], [opal_pmi1_LDFLAGS="$pmi_LDFLAGS" AC_SUBST(opal_pmi1_LDFLAGS) opal_pmi1_rpath="$pmi_rpath" AC_SUBST(opal_pmi1_rpath)])]) # check for pmi2 lib */ slurm_pmi_found=no OPAL_CHECK_PMI_LIB([$check_pmi_install_dir], [$check_pmi_lib_dir], [pmi2], [PMI2_Init], [slurm_pmi_found=yes], [opal_enable_pmi2=yes opal_pmi2_LIBS="-lpmi2" AC_SUBST(opal_pmi2_LIBS)], [opal_enable_pmi2=no]) AS_IF([test "$opal_enable_pmi2" = "yes"], [AS_IF([test "$slurm_pmi_found" = "yes"], [opal_pmi2_CPPFLAGS="$pmi2_CPPFLAGS" AC_SUBST(opal_pmi2_CPPFLAGS)]) AS_IF([test "$slurm_pmi_found" = "yes"], [opal_pmi2_LDFLAGS="$pmi2_LDFLAGS" AC_SUBST(opal_pmi2_LDFLAGS) opal_pmi2_rpath="$pmi2_rpath" AC_SUBST(opal_pmi2_rpath)])]) # check for pmix lib installed by slurm unless an other PMIx library is requested AS_IF([test -z "$with_pmix" || test "$with_pmix" = "yes" || test "$with_pmix" = "external"], [OPAL_CHECK_PMIX_LIB([$check_pmi_install_dir], [$check_pmi_lib_dir], [opal_enable_pmix=yes], [opal_enable_pmix=no])]) # since support was explicitly requested, then we should error out # if we didn't find the required support AC_MSG_CHECKING([can PMI support be built]) AS_IF([test "$opal_enable_pmi1" != "yes" && test "$opal_enable_pmi2" != "yes" && test "$opal_enable_pmix" != "yes"], [AC_MSG_RESULT([no]) AC_MSG_WARN([PMI support requested (via --with-pmi) but neither pmi.h,]) AC_MSG_WARN([pmi2.h or pmix.h were found under locations:]) AC_MSG_WARN([ $check_pmi_install_dir]) AC_MSG_WARN([ $check_pmi_install_dir/slurm]) AC_MSG_WARN([Specified path: $with_pmi]) AC_MSG_WARN([OR neither libpmi, libpmi2, or libpmix were found under:]) AC_MSG_WARN([ $check_pmi_lib_dir/lib]) AC_MSG_WARN([ $check_pmi_lib_dir/lib64]) AC_MSG_WARN([Specified path: $with_pmi_libdir]) AC_MSG_ERROR([Aborting])], [AC_MSG_RESULT([yes])]) ]) OPAL_VAR_SCOPE_POP ]) # define an internal function for checking the existence # and validity of an external PMIx library # # OPAL_CHECK_PMIX_LIB(installdir, libdir, [action-if-valid], [action-if-not-valid]) AC_DEFUN([OPAL_CHECK_PMIX_LIB],[ OPAL_VAR_SCOPE_PUSH([opal_external_pmix_save_CPPFLAGS opal_external_pmix_save_LDFLAGS opal_external_pmix_save_LIBS]) opal_external_pmix_happy=no # Make sure we have the headers and libs in the correct location AC_MSG_CHECKING([for pmix.h in $1]) files=`ls $1/pmix.h 2> /dev/null | wc -l` AS_IF([test "$files" -gt 0], [AC_MSG_RESULT([found]) opal_external_pmix_header_happy=yes], [AC_MSG_RESULT([not found]) AC_MSG_CHECKING([for pmix.h in $1/include]) files=`ls $1/include/pmix.h 2> /dev/null | wc -l` AS_IF([test "$files" -gt 0], [AC_MSG_RESULT([found]) opal_external_pmix_header_happy=yes], [AC_MSG_RESULT([not found]) opal_external_pmix_header_happy=no])]) AS_IF([test "$opal_external_pmix_header_happy" = "yes"], [AS_IF([test -n "$2"], [AC_MSG_CHECKING([libpmix.* in $2]) files=`ls $2/libpmix.* 2> /dev/null | wc -l` AS_IF([test "$files" -gt 0], [AC_MSG_RESULT([found]) pmix_ext_install_libdir=$2], [AC_MSG_RESULT([not found]) AC_MSG_CHECKING([libpmix.* in $2/lib64]) files=`ls $2/lib64/libpmix.* 2> /dev/null | wc -l` AS_IF([test "$files" -gt 0], [AC_MSG_RESULT([found]) pmix_ext_install_libdir=$2/lib64], [AC_MSG_RESULT([not found]) AC_MSG_CHECKING([libpmix.* in $2/lib]) files=`ls $2/lib/libpmix.* 2> /dev/null | wc -l` AS_IF([test "$files" -gt 0], [AC_MSG_RESULT([found]) pmix_ext_install_libdir=$2/lib], [AC_MSG_RESULT([not found]) AC_MSG_ERROR([Cannot continue])])])])], [# check for presence of lib64 directory - if found, see if the # desired library is present and matches our build requirements AC_MSG_CHECKING([libpmix.* in $1/lib64]) files=`ls $1/lib64/libpmix.* 2> /dev/null | wc -l` AS_IF([test "$files" -gt 0], [AC_MSG_RESULT([found]) pmix_ext_install_libdir=$1/lib64], [AC_MSG_RESULT([not found]) AC_MSG_CHECKING([libpmix.* in $1/lib]) files=`ls $1/lib/libpmix.* 2> /dev/null | wc -l` AS_IF([test "$files" -gt 0], [AC_MSG_RESULT([found]) pmix_ext_install_libdir=$1/lib], [AC_MSG_RESULT([not found]) AC_MSG_ERROR([Cannot continue])])])]) # check the version opal_external_pmix_save_CPPFLAGS=$CPPFLAGS opal_external_pmix_save_LDFLAGS=$LDFLAGS opal_external_pmix_save_LIBS=$LIBS # if the pmix_version.h file does not exist, then # this must be from a pre-1.1.5 version OMPI does # NOT support anything older than v1.2.5 AC_MSG_CHECKING([PMIx version]) CPPFLAGS="-I$1/include $CPPFLAGS" AS_IF([test "x`ls $1/include/pmix_version.h 2> /dev/null`" = "x"], [AC_MSG_RESULT([version file not found - assuming v1.1.4]) opal_external_pmix_version_found=1 opal_external_pmix_happy=no opal_external_pmix_version=internal], [AC_MSG_RESULT([version file found]) opal_external_pmix_version_found=0]) # if it does exist, then we need to parse it to find # the actual release series AS_IF([test "$opal_external_pmix_version_found" = "0"], [AC_MSG_CHECKING([version 4x]) AC_PREPROC_IFELSE([AC_LANG_PROGRAM([ #include #if (PMIX_VERSION_MAJOR < 4L) #error "not version 4 or above" #endif ], [])], [AC_MSG_RESULT([found]) opal_external_pmix_version=4x opal_external_pmix_version_major=4 opal_external_pmix_version_found=1 opal_external_pmix_happy=yes], [AC_MSG_RESULT([not found])])]) AS_IF([test "$opal_external_pmix_version_found" = "0"], [AC_MSG_CHECKING([version 3x or above]) AC_PREPROC_IFELSE([AC_LANG_PROGRAM([ #include #if (PMIX_VERSION_MAJOR != 3L) #error "not version 3" #endif ], [])], [AC_MSG_RESULT([found]) opal_external_pmix_version=3x opal_external_pmix_version_major=3 opal_external_pmix_version_found=1 opal_external_pmix_happy=yes], [AC_MSG_RESULT([not found])])]) AS_IF([test "$opal_external_pmix_version_found" = "0"], [AC_MSG_CHECKING([version 2x]) AC_PREPROC_IFELSE([AC_LANG_PROGRAM([ #include #if (PMIX_VERSION_MAJOR != 2L) #error "not version 2" #endif ], [])], [AC_MSG_RESULT([found]) opal_external_pmix_version=2x opal_external_pmix_version_major=2 opal_external_pmix_version_found=1 opal_external_pmix_happy=yes], [AC_MSG_RESULT([not found])])]) AS_IF([test "$opal_external_pmix_version_found" = "0"], [AC_MSG_CHECKING([version 1x]) AC_PREPROC_IFELSE([AC_LANG_PROGRAM([ #include #if (PMIX_VERSION_MAJOR != 1L && PMIX_VERSION_MINOR != 2L) #error "not version 1.2.x" #endif ], [])], [AC_MSG_RESULT([found]) opal_external_pmix_version=1x opal_external_pmix_version_major=1 opal_external_pmix_version_found=1 opal_external_have_pmix1=1 opal_external_pmix_happy=yes], [AC_MSG_RESULT([not found])])]) AS_IF([test "x$opal_external_pmix_version" = "x"], [AC_MSG_WARN([External PMIx support detected, but version]) AC_MSG_WARN([information of the external lib could not]) AC_MSG_WARN([be detected]) opal_external_pmix_happy=no]) CPPFLAGS=$opal_external_pmix_save_CPPFLAGS LDFLAGS=$opal_external_pmix_save_LDFLAGS LIBS=$opal_external_pmix_save_LIBS ]) AS_IF([test "$opal_external_pmix_happy" = "yes"], [$3], [$4]) OPAL_VAR_SCOPE_POP ]) AC_DEFUN([OPAL_CHECK_PMIX],[ AS_IF([test "$with_pmix" = "no"], [AC_MSG_WARN([Open MPI requires PMIx support. It can be built]) AC_MSG_WARN([with either its own internal copy of PMIx, or with]) AC_MSG_WARN([an external copy that you supply.]) AC_MSG_ERROR([Cannot continue])]) opal_external_have_pmix1=0 AS_IF([test "$opal_enable_pmix" = "no"], [AC_MSG_CHECKING([if user requested internal PMIx support($with_pmix)]) opal_external_pmix_happy=no pmix_ext_install_libdir= pmix_ext_install_dir= AS_IF([test "$with_pmix" = "internal"], [AC_MSG_RESULT([yes]) opal_external_pmix_happy=no opal_external_pmix_version=internal opal_enable_pmix=yes], [AC_MSG_RESULT([no]) # check for external pmix lib */ AS_IF([test -z "$with_pmix" || test "$with_pmix" = "yes" || test "$with_pmix" = "external"], [pmix_ext_install_dir=/usr], [pmix_ext_install_dir=$with_pmix]) AS_IF([test -n "$with_pmix_libdir"], [pmix_ext_install_libdir=$with_pmix_libdir]) OPAL_CHECK_PMIX_LIB([$pmix_ext_install_dir], [$pmix_ext_install_libdir], [opal_external_pmix_happy=yes opal_enable_pmix=yes], [opal_external_pmix_happy=no])]) # Final check - if they explicitly pointed us at an external # installation that wasn't acceptable, then error out AS_IF([test -n "$with_pmix" && test "$with_pmix" != "yes" && test "$with_pmix" != "external" && test "$with_pmix" != "internal" && test "$opal_external_pmix_happy" = "no"], [AC_MSG_WARN([External PMIx support requested, but either the version]) AC_MSG_WARN([of the external lib was not supported or the required]) AC_MSG_WARN([header/library files were not found]) AC_MSG_ERROR([Cannot continue])]) # Final check - if they didn't point us explicitly at an external version # but we found one anyway, use the internal version if it is higher AS_IF([test "$opal_external_pmix_version" != "internal" && (test -z "$with_pmix" || test "$with_pmix" = "yes")], [AS_IF([test "$opal_external_pmix_version" != "3x"], [AC_MSG_WARN([discovered external PMIx version is less than internal version 3.x]) AC_MSG_WARN([using internal PMIx]) opal_external_pmix_version=internal opal_external_pmix_happy=no])]) ]) AS_IF([test "$opal_enable_pmix" = "yes"], [AC_MSG_CHECKING([PMIx version to be used]) AS_IF([test "$opal_external_pmix_happy" = "yes"], [AC_MSG_RESULT([external($opal_external_pmix_version)]) AS_IF([test "$pmix_ext_install_dir" != "/usr"], [opal_external_pmix_CPPFLAGS="-I$pmix_ext_install_dir/include" opal_external_pmix_LDFLAGS=-L$pmix_ext_install_libdir]) opal_external_pmix_LIBS=-lpmix], [AC_MSG_RESULT([internal])])]) AC_DEFINE_UNQUOTED([OPAL_PMIX_V1],[$opal_external_have_pmix1], [Whether the external PMIx library is v1]) AS_IF([test "$opal_external_pmix_happy" = "yes"], [AS_IF([test "$opal_external_pmix_version" = "1x"], [OPAL_SUMMARY_ADD([[Miscellaneous]],[[PMIx support]], [opal_pmix], [External (1.2.5) WARNING - DYNAMIC OPS NOT SUPPORTED])], [OPAL_SUMMARY_ADD([[Miscellaneous]],[[PMIx support]], [opal_pmix], [External ($opal_external_pmix_version)])])], [OPAL_SUMMARY_ADD([[Miscellaneous]], [[PMIx support]], [opal_pmix], [Internal])]) ]) # Check both PMI and PMIx # # OPAL_CHECK_ALL_PMI() # -------------------------------------------------------- AC_DEFUN([OPAL_CHECK_ALL_PMI], [ AC_ARG_WITH([pmi], [AC_HELP_STRING([--with-pmi(=DIR)], [Build PMI support, optionally adding DIR to the search path (default: no)])], [], with_pmi=no) AC_ARG_WITH([pmi-libdir], [AC_HELP_STRING([--with-pmi-libdir=DIR], [Look for libpmi or libpmi2 in the given directory DIR, DIR/lib or DIR/lib64])]) AC_ARG_WITH([pmix], [AC_HELP_STRING([--with-pmix(=DIR)], [Build PMIx support. DIR can take one of three values: "internal", "external", or a valid directory name. "internal" (or no DIR value) forces Open MPI to use its internal copy of PMIx. "external" forces Open MPI to use an external installation of PMIx. Supplying a valid directory name also forces Open MPI to use an external installation of PMIx, and adds DIR/include, DIR/lib, and DIR/lib64 to the search path for headers and libraries. Note that Open MPI does not support --without-pmix.])]) AC_ARG_WITH([pmix-libdir], [AC_HELP_STRING([--with-pmix-libdir=DIR], [Look for libpmix the given directory DIR, DIR/lib or DIR/lib64])]) OPAL_CHECK_PMI OPAL_CHECK_PMIX ])