Unverified Commit 250b695f authored by Nick Cao's avatar Nick Cao Committed by GitHub
Browse files

petsc: refactor inputs, configureFlags; add tests, petscPackages scope (#392392)

parents effac2a6 26d320d7
Loading
Loading
Loading
Loading
+132 −75
Original line number Diff line number Diff line
{
  lib,
  newScope,
  stdenv,
  fetchzip,
  gfortran,
  replaceVars,
  python3,
  python3Packages,
  blas,
  lapack,
  zlib, # propagated by p4est but required by petsc
  bash,
  pkg-config,
  gfortran,
  bison,
  mpi, # generic mpi dependency
  mpiCheckPhaseHook,
  bash,
  python3,
  python3Packages,

  # Build options
  petsc-optimized ? true,
  petsc-scalar-type ? "real",
  petsc-precision ? "double",
  debug ? false,
  scalarType ? "real",
  precision ? "double",
  mpiSupport ? true,
  fortranSupport ? true,
  pythonSupport ? false, # petsc python binding
  withExamples ? false,
  withFullDeps ? false, # full External libraries support
@@ -26,41 +27,88 @@
  # External libraries options
  withHdf5 ? withCommonDeps,
  withMetis ? withCommonDeps,
  withScalapack ? withFullDeps,
  withZlib ? (withP4est || withPtscotch),
  withScalapack ? withCommonDeps && mpiSupport,
  withParmetis ? withFullDeps, # parmetis is unfree
  withPtscotch ? withFullDeps,
  withMumps ? withFullDeps,
  withPtscotch ? withCommonDeps && mpiSupport,
  withMumps ? withCommonDeps,
  withP4est ? withFullDeps,
  withHypre ? withCommonDeps && mpiSupport,
  withFftw ? withCommonDeps,
  withSuperLu ? withCommonDeps,
  withSuitesparse ? withCommonDeps,

  # External libraries
  hdf5-fortran-mpi,
  blas,
  lapack,
  hdf5,
  metis,
  parmetis,
  scotch,
  scalapack,
  mumps_par,
  pkg-config,
  mumps,
  p4est,
  zlib, # propagated by p4est but required by petsc
  hypre,
  fftw,
  superlu,
  suitesparse,

  # Used in passthru.tests
  petsc,
}:
assert withFullDeps -> withCommonDeps;

# This version of PETSc does not support a non-MPI p4est build
assert withP4est -> (p4est.mpiSupport && mpiSupport);
assert withP4est -> (mpiSupport && withZlib);

# Package parmetis depend on metis and mpi support
assert withParmetis -> (withMetis && mpiSupport);

assert withPtscotch -> mpiSupport;
assert withPtscotch -> (mpiSupport && withZlib);
assert withScalapack -> mpiSupport;
assert withMumps -> withScalapack;
assert (withMumps && mpiSupport) -> withScalapack;
assert withHypre -> mpiSupport;

stdenv.mkDerivation rec {
let
  petscPackages = lib.makeScope newScope (self: {
    inherit
      # global override options
      mpiSupport
      fortranSupport
      pythonSupport
      precision
      ;
    enableMpi = self.mpiSupport;

    petscPackages = self;
    # external libraries
    mpi = self.callPackage mpi.override { };
    blas = self.callPackage blas.override { };
    lapack = self.callPackage lapack.override { };
    hdf5 = self.callPackage hdf5.override {
      fortran = gfortran;
      cppSupport = !mpiSupport;
    };
    metis = self.callPackage metis.override { };
    parmetis = self.callPackage parmetis.override { };
    scotch = self.callPackage scotch.override { };
    scalapack = self.callPackage scalapack.override { };
    mumps = self.callPackage mumps.override { };
    p4est = self.callPackage p4est.override { };
    hypre = self.callPackage hypre.override { };
    fftw = self.callPackage fftw.override { };
    superlu = self.callPackage superlu.override { };
    suitesparse = self.callPackage suitesparse.override { };
  });
in
stdenv.mkDerivation (finalAttrs: {
  pname = "petsc";
  version = "3.22.4";
  version = "3.23.0";

  src = fetchzip {
    url = "https://web.cels.anl.gov/projects/petsc/download/release-snapshots/petsc-${version}.tar.gz";
    hash = "sha256-8WV1ylXytkhiNa7YpWSOIpSvzLCCjdVVe5SiGfhicas=";
    url = "https://web.cels.anl.gov/projects/petsc/download/release-snapshots/petsc-${finalAttrs.version}.tar.gz";
    hash = "sha256-OcI4iyDOR0YTVV+JoOhbfutoW00EmfapNaMnD/JJFsI=";
  };

  strictDeps = true;
@@ -70,6 +118,7 @@ stdenv.mkDerivation rec {
      python3
      gfortran
      pkg-config
      bison
    ]
    ++ lib.optional mpiSupport mpi
    ++ lib.optionals pythonSupport [
@@ -79,16 +128,21 @@ stdenv.mkDerivation rec {

  buildInputs =
    [
      blas
      lapack
      petscPackages.blas
      petscPackages.lapack
    ]
    ++ lib.optional withHdf5 hdf5-fortran-mpi
    ++ lib.optional withP4est p4est
    ++ lib.optional withMetis metis
    ++ lib.optional withParmetis parmetis
    ++ lib.optional withPtscotch scotch
    ++ lib.optional withScalapack scalapack
    ++ lib.optional withMumps mumps_par;
    ++ lib.optional withZlib zlib
    ++ lib.optional withHdf5 petscPackages.hdf5
    ++ lib.optional withP4est petscPackages.p4est
    ++ lib.optional withMetis petscPackages.metis
    ++ lib.optional withParmetis petscPackages.parmetis
    ++ lib.optional withPtscotch petscPackages.scotch
    ++ lib.optional withScalapack petscPackages.scalapack
    ++ lib.optional withMumps petscPackages.mumps
    ++ lib.optional withHypre petscPackages.hypre
    ++ lib.optional withSuperLu petscPackages.superlu
    ++ lib.optional withFftw petscPackages.fftw
    ++ lib.optional withSuitesparse petscPackages.suitesparse;

  propagatedBuildInputs = lib.optional pythonSupport python3Packages.numpy;

@@ -109,57 +163,39 @@ stdenv.mkDerivation rec {
    [
      "--with-blas=1"
      "--with-lapack=1"
      "--with-scalar-type=${petsc-scalar-type}"
      "--with-precision=${petsc-precision}"
      "--with-scalar-type=${scalarType}"
      "--with-precision=${precision}"
      "--with-mpi=${if mpiSupport then "1" else "0"}"
    ]
    ++ lib.optional pythonSupport "--with-petsc4py=1"
    ++ lib.optionals mpiSupport [
      "--CC=mpicc"
      "--with-cxx=mpicxx"
      "--with-fc=mpif90"
    ]
    ++ lib.optionals withMetis [
      "--with-metis=1"
      "--with-metis-dir=${metis}"
    ]
    ++ lib.optionals withParmetis [
      "--with-parmetis=1"
      "--with-parmetis-dir=${parmetis}"
    ]
    ++ lib.optionals withPtscotch [
      "--with-ptscotch=1"
      "--with-ptscotch-include=${lib.getDev scotch}/include"
      "--with-ptscotch-lib=[-L${lib.getLib scotch}/lib,-lptscotch,-lptesmumps,-lptscotchparmetisv3,-lptscotcherr,-lesmumps,-lscotch,-lscotcherr]"
    ]
    ++ lib.optionals withScalapack [
      "--with-scalapack=1"
      "--with-scalapack-dir=${scalapack}"
    ]
    ++ lib.optionals withMumps [
      "--with-mumps=1"
      "--with-mumps-dir=${mumps_par}"
    ]
    ++ lib.optionals withP4est [
      "--with-p4est=1"
      "--with-zlib-include=${lib.getDev zlib}/include"
      "--with-zlib-lib=[-L${lib.getLib zlib}/lib,-lz]"
    ]
    ++ lib.optionals withHdf5 [
      "--with-hdf5=1"
      "--with-hdf5-fortran-bindings=1"
      "--with-hdf5-include=${lib.getDev hdf5-fortran-mpi}/include"
      "--with-hdf5-lib=[-L${lib.getLib hdf5-fortran-mpi}/lib,-lhdf5]"
    ]
    ++ lib.optionals petsc-optimized [
    ++ lib.optionals (!debug) [
      "--with-debugging=0"
      "COPTFLAGS=-O3"
      "FOPTFLAGS=-O3"
      "CXXOPTFLAGS=-O3"
      "CXXFLAGS=-O3"
    ];
    ]
    ++ lib.optional (!fortranSupport) "--with-fortran-bindings=0"
    ++ lib.optional pythonSupport "--with-petsc4py=1"
    ++ lib.optional withMetis "--with-metis=1"
    ++ lib.optional withParmetis "--with-parmetis=1"
    ++ lib.optional withPtscotch "--with-ptscotch=1"
    ++ lib.optional withScalapack "--with-scalapack=1"
    ++ lib.optional withMumps "--with-mumps=1"
    ++ lib.optional (withMumps && !mpiSupport) "--with-mumps-serial=1"
    ++ lib.optional withP4est "--with-p4est=1"
    ++ lib.optional withZlib "--with-zlib=1"
    ++ lib.optional withHdf5 "--with-hdf5=1"
    ++ lib.optional withHypre "--with-hypre=1"
    ++ lib.optional withSuperLu "--with-superlu=1"
    ++ lib.optional withFftw "--with-fftw=1"
    ++ lib.optional withSuitesparse "--with-suitesparse=1";

  hardeningDisable = lib.optionals (!petsc-optimized) [
  hardeningDisable = lib.optionals debug [
    "fortify"
    "fortify3"
  ];
@@ -198,19 +234,40 @@ stdenv.mkDerivation rec {
  pythonImportsCheck = [ "petsc4py" ];

  passthru = {
    inherit mpiSupport pythonSupport;
    inherit
      mpiSupport
      pythonSupport
      fortranSupport
      ;
    petscPackages = petscPackages.overrideScope (
      final: prev: {
        petsc = finalAttrs.finalPackage;
      }
    );
    tests =
      {
        serial = petsc.override {
          mpiSupport = false;
        };
      }
      // lib.optionalAttrs stdenv.hostPlatform.isLinux {
        fullDeps = petsc.override {
          withFullDeps = true;
          withParmetis = false;
        };
      };
  };

  setupHook = ./setup-hook.sh;

  meta = with lib; {
  meta = {
    description = "Portable Extensible Toolkit for Scientific computation";
    homepage = "https://petsc.org/release/";
    license = licenses.bsd2;
    license = lib.licenses.bsd2;
    platforms = lib.platforms.unix;
    maintainers = with maintainers; [
    maintainers = with lib.maintainers; [
      cburstedde
      qbisi
    ];
  };
}
})
+2 −8
Original line number Diff line number Diff line
@@ -2,7 +2,6 @@
  lib,
  stdenv,
  fetchFromGitLab,
  sowing,
  python3,
  python3Packages,
  arpack-mpi,
@@ -17,13 +16,13 @@ assert petsc.mpiSupport;
assert pythonSupport -> petsc.pythonSupport;
stdenv.mkDerivation (finalAttrs: {
  pname = "slepc";
  version = "3.22.2";
  version = "3.23.0";

  src = fetchFromGitLab {
    owner = "slepc";
    repo = "slepc";
    tag = "v${finalAttrs.version}";
    hash = "sha256-a5DmsA7NAlhrEaS43TYPk7vtDfhXLEP+5sftu2A9Yt4=";
    hash = "sha256-Z9CVZQ/Ezb1S2EkTb9amAPxaN4tiUnKrbvQIc3BnVuU=";
  };

  postPatch = ''
@@ -33,11 +32,6 @@ stdenv.mkDerivation (finalAttrs: {
      "slepc.prefixdir,'${python3.sitePackages}'"

    patchShebangs lib/slepc/bin

    # Use system bfort
    substituteInPlace config/packages/sowing.py \
      --replace-fail "bfort = os.path.join(archdir,'bin','bfort')" \
      "bfort = '${sowing}/bin/bfort'"
  '';

  # Usually this project is being built as part of a `petsc` build or as part of