1{ stdenv, lib, fetchurl, perl, gfortran
2, openssh, hwloc, python3
3, darwin
4# either libfabric or ucx work for ch4backend on linux. On darwin, neither of
5# these libraries currently build so this argument is ignored on Darwin.
6, ch4backend
7# Process managers to build (`--with-pm`),
8# cf. https://github.com/pmodels/mpich/blob/b80a6d7c24defe7cdf6c57c52430f8075a0a41d6/README.vin#L562-L586
9, withPm ? [ "hydra" "gforker" ]
10, pmix
11# PMIX support is likely incompatible with process managers (`--with-pm`)
12# https://github.com/NixOS/nixpkgs/pull/274804#discussion_r1432601476
13, pmixSupport ? false
14} :
15
16let
17 withPmStr = if withPm != [ ] then builtins.concatStringsSep ":" withPm else "no";
18in
19
20assert (ch4backend.pname == "ucx" || ch4backend.pname == "libfabric");
21
22stdenv.mkDerivation rec {
23 pname = "mpich";
24 version = "4.2.2";
25
26 src = fetchurl {
27 url = "https://www.mpich.org/static/downloads/${version}/mpich-${version}.tar.gz";
28 sha256 = "sha256-iD9bs66r9ifLhJLKAqA7GR0Jg2u+D1mdhQg1EXl4HUE=";
29 };
30
31 outputs = [ "out" "doc" "man" ];
32
33 configureFlags = [
34 "--enable-shared"
35 "--with-pm=${withPmStr}"
36 ] ++ lib.optionals (lib.versionAtLeast gfortran.version "10") [
37 "FFLAGS=-fallow-argument-mismatch" # https://github.com/pmodels/mpich/issues/4300
38 "FCFLAGS=-fallow-argument-mismatch"
39 ] ++ lib.optionals pmixSupport [
40 "--with-pmix"
41 ];
42
43 enableParallelBuilding = true;
44
45 nativeBuildInputs = [ gfortran python3 ];
46 buildInputs = [ perl openssh hwloc ]
47 ++ lib.optional (!stdenv.isDarwin) ch4backend
48 ++ lib.optional pmixSupport pmix
49 ++ lib.optional stdenv.isDarwin darwin.apple_sdk.frameworks.Foundation;
50
51 # test_double_serializer.test fails on darwin
52 doCheck = !stdenv.isDarwin;
53
54 preFixup = ''
55 # Ensure the default compilers are the ones mpich was built with
56 sed -i 's:CC="gcc":CC=${stdenv.cc}/bin/gcc:' $out/bin/mpicc
57 sed -i 's:CXX="g++":CXX=${stdenv.cc}/bin/g++:' $out/bin/mpicxx
58 sed -i 's:FC="gfortran":FC=${gfortran}/bin/gfortran:' $out/bin/mpifort
59 '';
60
61 meta = with lib; {
62 # As far as we know, --with-pmix silently disables all of `--with-pm`
63 broken = pmixSupport && withPm != [ ];
64
65 description = "Implementation of the Message Passing Interface (MPI) standard";
66
67 longDescription = ''
68 MPICH2 is a free high-performance and portable implementation of
69 the Message Passing Interface (MPI) standard, both version 1 and
70 version 2.
71 '';
72 homepage = "http://www.mcs.anl.gov/mpi/mpich2/";
73 license = {
74 url = "http://git.mpich.org/mpich.git/blob/a385d6d0d55e83c3709ae851967ce613e892cd21:/COPYRIGHT";
75 fullName = "MPICH license (permissive)";
76 };
77 maintainers = [ maintainers.markuskowa ];
78 platforms = platforms.linux ++ platforms.darwin;
79 };
80}