diff --git a/pkgs/development/libraries/openmpi/default.nix b/pkgs/development/libraries/openmpi/default.nix index 55fc330024d1..dedd49cd346f 100644 --- a/pkgs/development/libraries/openmpi/default.nix +++ b/pkgs/development/libraries/openmpi/default.nix @@ -1,31 +1,47 @@ -{ lib, stdenv, fetchurl, removeReferencesTo, gfortran, perl, libnl -, rdma-core, zlib, numactl, libevent, hwloc, targetPackages -, libpsm2, libfabric, pmix, ucx, ucc, makeWrapper -, config -# Enable CUDA support -, cudaSupport ? config.cudaSupport, cudaPackages - -# Enable the Sun Grid Engine bindings -, enableSGE ? false - -# Pass PATH/LD_LIBRARY_PATH to point to current mpirun by default -, enablePrefix ? false - -# Enable libfabric support (necessary for Omnipath networks) on x86_64 linux -, fabricSupport ? stdenv.isLinux && stdenv.isx86_64 - -# Enable Fortran support -, fortranSupport ? true +{ + lib, + stdenv, + fetchurl, + removeReferencesTo, + gfortran, + perl, + libnl, + rdma-core, + zlib, + numactl, + libevent, + hwloc, + targetPackages, + libpsm2, + libfabric, + pmix, + ucx, + ucc, + makeWrapper, + config, + # Enable CUDA support + cudaSupport ? config.cudaSupport, + cudaPackages, + # Enable the Sun Grid Engine bindings + enableSGE ? false, + # Pass PATH/LD_LIBRARY_PATH to point to current mpirun by default + enablePrefix ? false, + # Enable libfabric support (necessary for Omnipath networks) on x86_64 linux + fabricSupport ? stdenv.isLinux && stdenv.isx86_64, + # Enable Fortran support + fortranSupport ? true, }: stdenv.mkDerivation rec { pname = "openmpi"; version = "4.1.6"; - src = with lib.versions; fetchurl { - url = "https://www.open-mpi.org/software/ompi/v${major version}.${minor version}/downloads/${pname}-${version}.tar.bz2"; - sha256 = "sha256-90CZRIVRbetjtTEa8SLCZRefUyig2FelZ7hdsAsR5BU="; - }; + src = + with lib.versions; + fetchurl { + url = "https://www.open-mpi.org/software/ompi/v${major version}.${minor version}/downloads/${pname}-${version}.tar.bz2"; + sha256 = "sha256-90CZRIVRbetjtTEa8SLCZRefUyig2FelZ7hdsAsR5BU="; + }; postPatch = '' patchShebangs ./ @@ -38,34 +54,63 @@ stdenv.mkDerivation rec { find -name "Makefile.in" -exec sed -i "s/\`date\`/$ts/" \{} \; ''; - outputs = [ "out" "man" "dev" ]; + outputs = [ + "out" + "man" + "dev" + ]; - buildInputs = [ zlib ] - ++ lib.optionals stdenv.isLinux [ libnl numactl pmix ucx ucc ] + buildInputs = + [ zlib ] + ++ lib.optionals stdenv.isLinux [ + libnl + numactl + pmix + ucx + ucc + ] ++ lib.optionals cudaSupport [ cudaPackages.cuda_cudart ] - ++ [ libevent hwloc ] + ++ [ + libevent + hwloc + ] ++ lib.optional (stdenv.isLinux || stdenv.isFreeBSD) rdma-core - ++ lib.optionals fabricSupport [ libpsm2 libfabric ]; + ++ lib.optionals fabricSupport [ + libpsm2 + libfabric + ]; - nativeBuildInputs = [ perl removeReferencesTo makeWrapper ] + nativeBuildInputs = + [ + perl + removeReferencesTo + makeWrapper + ] ++ lib.optionals cudaSupport [ cudaPackages.cuda_nvcc ] ++ lib.optionals fortranSupport [ gfortran ]; - configureFlags = lib.optional (!cudaSupport) "--disable-mca-dso" + configureFlags = + lib.optional (!cudaSupport) "--disable-mca-dso" ++ lib.optional (!fortranSupport) "--disable-mpi-fortran" - ++ lib.optionals stdenv.isLinux [ + ++ lib.optionals stdenv.isLinux [ "--with-libnl=${lib.getDev libnl}" "--with-pmix=${lib.getDev pmix}" "--with-pmix-libdir=${pmix}/lib" "--enable-mpi-cxx" - ] ++ lib.optional enableSGE "--with-sge" + ] + ++ lib.optional enableSGE "--with-sge" ++ lib.optional enablePrefix "--enable-mpirun-prefix-by-default" # TODO: add UCX support, which is recommended to use with cuda for the most robust OpenMPI build # https://github.com/openucx/ucx # https://www.open-mpi.org/faq/?category=buildcuda - ++ lib.optionals cudaSupport [ "--with-cuda=${lib.getDev cudaPackages.cuda_cudart}" "--enable-dlopen" ] - ++ lib.optionals fabricSupport [ "--with-psm2=${lib.getDev libpsm2}" "--with-libfabric=${lib.getDev libfabric}" ] - ; + ++ lib.optionals cudaSupport [ + "--with-cuda=${lib.getDev cudaPackages.cuda_cudart}" + "--enable-dlopen" + ] + ++ lib.optionals fabricSupport [ + "--with-psm2=${lib.getDev libpsm2}" + "--with-libfabric=${lib.getDev libfabric}" + ]; enableParallelBuilding = true; @@ -85,39 +130,41 @@ stdenv.mkDerivation rec { done moveToOutput "share/openmpi/ortecc-wrapper-data.txt" "''${!outputDev}" - ''; - - postFixup = '' - remove-references-to -t $dev $(readlink -f $out/lib/libopen-pal${stdenv.hostPlatform.extensions.sharedLibrary}) - remove-references-to -t $man $(readlink -f $out/lib/libopen-pal${stdenv.hostPlatform.extensions.sharedLibrary}) - - # The path to the wrapper is hard coded in libopen-pal.so, which we just cleared. - wrapProgram $dev/bin/opal_wrapper \ - --set OPAL_INCLUDEDIR $dev/include \ - --set OPAL_PKGDATADIR $dev/share/openmpi - - # default compilers should be indentical to the - # compilers at build time - - echo "$dev/share/openmpi/mpicc-wrapper-data.txt" - sed -i 's:compiler=.*:compiler=${targetPackages.stdenv.cc}/bin/${targetPackages.stdenv.cc.targetPrefix}cc:' \ - $dev/share/openmpi/mpicc-wrapper-data.txt - - echo "$dev/share/openmpi/ortecc-wrapper-data.txt" - sed -i 's:compiler=.*:compiler=${targetPackages.stdenv.cc}/bin/${targetPackages.stdenv.cc.targetPrefix}cc:' \ - $dev/share/openmpi/ortecc-wrapper-data.txt - - echo "$dev/share/openmpi/mpic++-wrapper-data.txt" - sed -i 's:compiler=.*:compiler=${targetPackages.stdenv.cc}/bin/${targetPackages.stdenv.cc.targetPrefix}c++:' \ - $dev/share/openmpi/mpic++-wrapper-data.txt - '' + lib.optionalString fortranSupport '' - - echo "$dev/share/openmpi/mpifort-wrapper-data.txt" - sed -i 's:compiler=.*:compiler=${gfortran}/bin/${gfortran.targetPrefix}gfortran:' \ - $dev/share/openmpi/mpifort-wrapper-data.txt - ''; + postFixup = + '' + remove-references-to -t $dev $(readlink -f $out/lib/libopen-pal${stdenv.hostPlatform.extensions.sharedLibrary}) + remove-references-to -t $man $(readlink -f $out/lib/libopen-pal${stdenv.hostPlatform.extensions.sharedLibrary}) + + # The path to the wrapper is hard coded in libopen-pal.so, which we just cleared. + wrapProgram $dev/bin/opal_wrapper \ + --set OPAL_INCLUDEDIR $dev/include \ + --set OPAL_PKGDATADIR $dev/share/openmpi + + # default compilers should be indentical to the + # compilers at build time + + echo "$dev/share/openmpi/mpicc-wrapper-data.txt" + sed -i 's:compiler=.*:compiler=${targetPackages.stdenv.cc}/bin/${targetPackages.stdenv.cc.targetPrefix}cc:' \ + $dev/share/openmpi/mpicc-wrapper-data.txt + + echo "$dev/share/openmpi/ortecc-wrapper-data.txt" + sed -i 's:compiler=.*:compiler=${targetPackages.stdenv.cc}/bin/${targetPackages.stdenv.cc.targetPrefix}cc:' \ + $dev/share/openmpi/ortecc-wrapper-data.txt + + echo "$dev/share/openmpi/mpic++-wrapper-data.txt" + sed -i 's:compiler=.*:compiler=${targetPackages.stdenv.cc}/bin/${targetPackages.stdenv.cc.targetPrefix}c++:' \ + $dev/share/openmpi/mpic++-wrapper-data.txt + '' + + lib.optionalString fortranSupport '' + + echo "$dev/share/openmpi/mpifort-wrapper-data.txt" + sed -i 's:compiler=.*:compiler=${gfortran}/bin/${gfortran.targetPrefix}gfortran:' \ + $dev/share/openmpi/mpifort-wrapper-data.txt + + ''; + doCheck = true; passthru = {