diff --git a/pkgs/by-name/pe/petsc/package.nix b/pkgs/by-name/pe/petsc/package.nix index c3a642e0656c..d31359143af8 100644 --- a/pkgs/by-name/pe/petsc/package.nix +++ b/pkgs/by-name/pe/petsc/package.nix @@ -2,7 +2,6 @@ lib, stdenv, fetchzip, - cctools, gfortran, replaceVars, python3, @@ -12,21 +11,24 @@ zlib, # propagated by p4est but required by petsc mpi, # generic mpi dependency mpiCheckPhaseHook, + bash, # Build options petsc-optimized ? true, petsc-scalar-type ? "real", petsc-precision ? "double", mpiSupport ? true, - withPetsc4py ? false, # petsc python binding + pythonSupport ? false, # petsc python binding + withExamples ? false, withFullDeps ? false, # full External libraries support + withCommonDeps ? true, # common External libraries support # External libraries options - withHdf5 ? true, - withMetis ? withFullDeps, - withParmetis ? false, # parmetis is unfree and should be enabled manualy - withPtscotch ? withFullDeps, + withHdf5 ? withCommonDeps, + withMetis ? withCommonDeps, withScalapack ? withFullDeps, + withParmetis ? withFullDeps, # parmetis is unfree + withPtscotch ? withFullDeps, withMumps ? withFullDeps, withP4est ? withFullDeps, @@ -40,6 +42,7 @@ pkg-config, p4est, }: +assert withFullDeps -> withCommonDeps; # This version of PETSc does not support a non-MPI p4est build assert withP4est -> (p4est.mpiSupport && mpiSupport); @@ -69,7 +72,7 @@ stdenv.mkDerivation rec { pkg-config ] ++ lib.optional mpiSupport mpi - ++ lib.optionals withPetsc4py [ + ++ lib.optionals pythonSupport [ python3Packages.setuptools python3Packages.cython ]; @@ -87,7 +90,7 @@ stdenv.mkDerivation rec { ++ lib.optional withScalapack scalapack ++ lib.optional withMumps mumps_par; - propagatedBuildInputs = lib.optional withPetsc4py python3Packages.numpy; + propagatedBuildInputs = lib.optional pythonSupport python3Packages.numpy; patches = [ (replaceVars ./fix-petsc4py-install-prefix.patch { @@ -95,14 +98,12 @@ stdenv.mkDerivation rec { }) ]; - postPatch = - '' - patchShebangs ./lib/petsc/bin - '' - + lib.optionalString stdenv.hostPlatform.isDarwin '' - substituteInPlace config/install.py \ - --replace /usr/bin/install_name_tool ${cctools}/bin/install_name_tool - ''; + postPatch = '' + patchShebangs ./lib/petsc/bin + + substituteInPlace config/example_template.py \ + --replace-fail "/usr/bin/env bash" "${bash}/bin/bash" + ''; configureFlags = [ @@ -112,7 +113,7 @@ stdenv.mkDerivation rec { "--with-precision=${petsc-precision}" "--with-mpi=${if mpiSupport then "1" else "0"}" ] - ++ lib.optional withPetsc4py "--with-petsc4py=1" + ++ lib.optional pythonSupport "--with-petsc4py=1" ++ lib.optionals mpiSupport [ "--CC=mpicc" "--with-cxx=mpicxx" @@ -163,7 +164,7 @@ stdenv.mkDerivation rec { "fortify3" ]; - configureScript = "python ./configure"; + installTargets = [ (if withExamples then "install" else "install-lib") ]; enableParallelBuilding = true; @@ -173,10 +174,31 @@ stdenv.mkDerivation rec { # the library is installed and available. doInstallCheck = true; installCheckTarget = "check_install"; - nativeInstallCheckInputs = [ mpiCheckPhaseHook ]; + + # The PETSC4PY=no flag disables the ex100 test, + # which compiles C code to load Python modules for solving a math problem. + # This test fails on the Darwin platform but is rarely a common use case for petsc4py. + installCheckFlags = lib.optional stdenv.hostPlatform.isDarwin "PETSC4PY=no"; + + nativeInstallCheckInputs = + [ + mpiCheckPhaseHook + ] + ++ lib.optionals pythonSupport [ + python3Packages.pythonImportsCheckHook + python3Packages.unittestCheckHook + ]; + + unittestFlagsArray = [ + "-s" + "src/binding/petsc4py/test" + "-v" + ]; + + pythonImportsCheck = [ "petsc4py" ]; passthru = { - inherit mpiSupport; + inherit mpiSupport pythonSupport; }; setupHook = ./setup-hook.sh; @@ -185,6 +207,7 @@ stdenv.mkDerivation rec { description = "Portable Extensible Toolkit for Scientific computation"; homepage = "https://petsc.org/release/"; license = licenses.bsd2; + platforms = lib.platforms.unix; maintainers = with maintainers; [ cburstedde qbisi diff --git a/pkgs/by-name/sl/slepc/package.nix b/pkgs/by-name/sl/slepc/package.nix new file mode 100644 index 000000000000..371cd1d15805 --- /dev/null +++ b/pkgs/by-name/sl/slepc/package.nix @@ -0,0 +1,119 @@ +{ + lib, + stdenv, + fetchFromGitLab, + sowing, + python3, + python3Packages, + arpack-mpi, + petsc, + mpi, + mpiCheckPhaseHook, + pythonSupport ? false, + withExamples ? false, + withArpack ? stdenv.hostPlatform.isLinux, +}: +assert petsc.mpiSupport; +assert pythonSupport -> petsc.pythonSupport; +stdenv.mkDerivation (finalAttrs: { + pname = "slepc"; + version = "3.22.2"; + + src = fetchFromGitLab { + owner = "slepc"; + repo = "slepc"; + tag = "v${finalAttrs.version}"; + hash = "sha256-a5DmsA7NAlhrEaS43TYPk7vtDfhXLEP+5sftu2A9Yt4="; + }; + + postPatch = '' + # Fix slepc4py install prefix + substituteInPlace config/packages/slepc4py.py \ + --replace-fail "slepc.prefixdir,'lib'" \ + "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 + # other projects, e.g when `petsc` is `./configure`d with + # `--download-slepc=1`. This instructs the slepc to be built as a standalone + # project. + preConfigure = '' + export SLEPC_DIR=$PWD + ''; + + nativeBuildInputs = + [ + python3 + ] + ++ lib.optionals pythonSupport [ + python3Packages.setuptools + python3Packages.cython + ]; + + configureFlags = + lib.optionals withArpack [ + "--with-arpack=1" + ] + ++ lib.optionals pythonSupport [ + "--with-slepc4py=1" + ]; + + buildInputs = + [ + mpi + ] + ++ lib.optionals withArpack [ + arpack-mpi + ]; + + propagatedBuildInputs = [ + petsc + ]; + + enableParallelBuilding = true; + + installTargets = [ (if withExamples then "install" else "install-lib") ]; + + nativeInstallCheckInputs = + [ + mpiCheckPhaseHook + ] + ++ lib.optionals pythonSupport [ + python3Packages.pythonImportsCheckHook + python3Packages.unittestCheckHook + ]; + + doInstallCheck = true; + + installCheckTarget = [ "check_install" ]; + + unittestFlagsArray = [ + "-s" + "src/binding/slepc4py/test" + "-v" + ]; + + pythonImportsCheck = [ "slepc4py" ]; + + shellHook = ./setup-hook.sh; + + meta = { + description = "Scalable Library for Eigenvalue Problem Computations"; + homepage = "https://slepc.upv.es"; + changelog = "https://gitlab.com/slepc/slepc/blob/${finalAttrs.src.tag}/CHANGELOG.md"; + license = with lib.licenses; [ + bsd2 + ]; + platforms = lib.platforms.unix; + maintainers = with lib.maintainers; [ qbisi ]; + # Possible error running Fortran src/eps/tests/test7f with 1 MPI process + broken = stdenv.hostPlatform.isDarwin && withArpack; + }; +}) diff --git a/pkgs/by-name/sl/slepc/setup-hook.sh b/pkgs/by-name/sl/slepc/setup-hook.sh new file mode 100644 index 000000000000..838c82aaeee9 --- /dev/null +++ b/pkgs/by-name/sl/slepc/setup-hook.sh @@ -0,0 +1 @@ +export SLEPC_DIR=@out@ diff --git a/pkgs/by-name/so/sowing/package.nix b/pkgs/by-name/so/sowing/package.nix new file mode 100644 index 000000000000..a81fc9fdc654 --- /dev/null +++ b/pkgs/by-name/so/sowing/package.nix @@ -0,0 +1,25 @@ +{ + lib, + stdenv, + fetchFromBitbucket, +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "sowing"; + version = "1.1.26.12"; + + src = fetchFromBitbucket { + owner = "petsc"; + repo = "pkg-sowing"; + rev = "v${finalAttrs.version}"; + hash = "sha256-ol0xNAnL7ULU1CiGCFZrV37IAV4z1bcWa0f+tuMhQC8="; + }; + + meta = { + description = "Tools for documenting and improving portability"; + homepage = "https://wgropp.cs.illinois.edu/projects/software/sowing/"; + license = lib.licenses.mit; + maintainers = with lib.maintainers; [ qbisi ]; + platforms = lib.platforms.unix; + }; +}) diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index 85ac3492daa4..fc41fd196b00 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -10504,8 +10504,7 @@ self: super: with self; { petsc4py = toPythonModule (pkgs.petsc.override { python3 = python; python3Packages = self; - withPetsc4py = true; - withFullDeps = true; + pythonSupport = true; }); pex = callPackage ../development/python-modules/pex { }; @@ -15351,6 +15350,13 @@ self: super: with self; { sleepyq = callPackage ../development/python-modules/sleepyq { }; + slepc4py = toPythonModule (pkgs.slepc.override { + pythonSupport = true; + python3 = self.python; + python3Packages = self; + petsc = petsc4py; + }); + sleqp = toPythonModule (pkgs.sleqp.override { pythonSupport = true; python3Packages = self; }); slicedimage = callPackage ../development/python-modules/slicedimage { };