petsc: refactor and add petsc4py support (#379406)

This commit is contained in:
Markus Kowalewski
2025-02-17 11:22:07 +01:00
committed by GitHub
4 changed files with 155 additions and 68 deletions
@@ -0,0 +1,22 @@
diff --git a/config/BuildSystem/config/packages/petsc4py.py b/config/BuildSystem/config/packages/petsc4py.py
index 4a58243..831aa04 100644
--- a/config/BuildSystem/config/packages/petsc4py.py
+++ b/config/BuildSystem/config/packages/petsc4py.py
@@ -37,7 +37,7 @@ class Configure(config.package.Package):
def Install(self):
import os
- installLibPath = os.path.join(self.installDir, 'lib')
+ installLibPath = os.path.join(self.installDir, 'lib', '@PYTHON_SITEPACKAGES@')
if self.setCompilers.isDarwin(self.log):
apple = 'You may need to\n (csh/tcsh) setenv MACOSX_DEPLOYMENT_TARGET 10.X\n (sh/bash) MACOSX_DEPLOYMENT_TARGET=10.X; export MACOSX_DEPLOYMENT_TARGET\nbefore running make on PETSc'
else:
@@ -70,7 +70,7 @@ class Configure(config.package.Package):
newdir += 'NUMPY_INCLUDE="'+numpy_include+'" '
self.addDefine('HAVE_PETSC4PY',1)
- self.addDefine('PETSC4PY_INSTALL_PATH','"'+os.path.join(self.installdir.dir,'lib')+'"')
+ self.addDefine('PETSC4PY_INSTALL_PATH','"'+installLibPath+'"')
self.addMakeMacro('PETSC4PY','yes')
self.addMakeRule('petsc4pybuild','', \
['@echo "*** Building petsc4py ***"',\
+126 -59
View File
@@ -4,28 +4,52 @@
fetchzip,
cctools,
gfortran,
replaceVars,
python3,
python3Packages,
blas,
lapack,
mpiSupport ? true,
zlib, # propagated by p4est but required by petsc
mpi, # generic mpi dependency
mpiCheckPhaseHook,
petsc-withp4est ? false,
hdf5-support ? false,
hdf5,
metis,
parmetis,
withParmetis ? false,
pkg-config,
p4est,
zlib, # propagated by p4est but required by petsc
petsc-optimized ? false,
# Build options
petsc-optimized ? true,
petsc-scalar-type ? "real",
petsc-precision ? "double",
mpiSupport ? true,
withPetsc4py ? false, # petsc python binding
withFullDeps ? false, # full External libraries support
# External libraries options
withHdf5 ? true,
withMetis ? withFullDeps,
withParmetis ? false, # parmetis is unfree and should be enabled manualy
withPtscotch ? withFullDeps,
withScalapack ? withFullDeps,
withMumps ? withFullDeps,
withP4est ? withFullDeps,
# External libraries
hdf5-fortran-mpi,
metis,
parmetis,
scotch,
scalapack,
mumps_par,
pkg-config,
p4est,
}:
# This version of PETSc does not support a non-MPI p4est build
assert petsc-withp4est -> p4est.mpiSupport;
assert withP4est -> (p4est.mpiSupport && mpiSupport);
# Package parmetis depend on metis and mpi support
assert withParmetis -> (withMetis && mpiSupport);
assert withPtscotch -> mpiSupport;
assert withScalapack -> mpiSupport;
assert withMumps -> withScalapack;
stdenv.mkDerivation rec {
pname = "petsc";
@@ -37,59 +61,102 @@ stdenv.mkDerivation rec {
};
strictDeps = true;
nativeBuildInputs = [
python3
gfortran
pkg-config
] ++ lib.optional mpiSupport mpi;
buildInputs = [
blas
lapack
] ++ lib.optional hdf5-support hdf5 ++ lib.optional petsc-withp4est p4est ++ lib.optionals withParmetis [ metis parmetis ];
prePatch = lib.optionalString stdenv.hostPlatform.isDarwin ''
substituteInPlace config/install.py \
--replace /usr/bin/install_name_tool ${cctools}/bin/install_name_tool
'';
nativeBuildInputs =
[
python3
gfortran
pkg-config
]
++ lib.optional mpiSupport mpi
++ lib.optionals withPetsc4py [
python3Packages.setuptools
python3Packages.cython
];
configureFlags = [
"--with-blas=1"
"--with-lapack=1"
"--with-scalar-type=${petsc-scalar-type}"
"--with-precision=${petsc-precision}"
"--with-mpi=${if mpiSupport then "1" else "0"}"
] ++ lib.optionals mpiSupport [
"--CC=mpicc"
"--with-cxx=mpicxx"
"--with-fc=mpif90"
] ++ lib.optionals (mpiSupport && withParmetis) [
"--with-metis=1"
"--with-metis-dir=${metis}"
"--with-parmetis=1"
"--with-parmetis-dir=${parmetis}"
] ++ lib.optionals petsc-optimized [
"--with-debugging=0"
"COPTFLAGS=-O3"
"FOPTFLAGS=-O3"
"CXXOPTFLAGS=-O3"
"CXXFLAGS=-O3"
buildInputs =
[
blas
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;
propagatedBuildInputs = lib.optional withPetsc4py python3Packages.numpy;
patches = [
(replaceVars ./fix-petsc4py-install-prefix.patch {
PYTHON_SITEPACKAGES = python3.sitePackages;
})
];
preConfigure = ''
patchShebangs ./lib/petsc/bin
'' + lib.optionalString petsc-withp4est ''
configureFlagsArray+=(
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
'';
configureFlags =
[
"--with-blas=1"
"--with-lapack=1"
"--with-scalar-type=${petsc-scalar-type}"
"--with-precision=${petsc-precision}"
"--with-mpi=${if mpiSupport then "1" else "0"}"
]
++ lib.optional withPetsc4py "--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=${zlib.dev}/include"
"--with-zlib-lib=-L${zlib}/lib -lz"
)
'' + lib.optionalString hdf5-support ''
configureFlagsArray+=(
"--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=${hdf5.dev}/include"
"--with-hdf5-lib=-L${hdf5}/lib -lhdf5"
)
'';
"--with-hdf5-include=${lib.getDev hdf5-fortran-mpi}/include"
"--with-hdf5-lib=[-L${lib.getLib hdf5-fortran-mpi}/lib,-lhdf5]"
]
++ lib.optionals petsc-optimized [
"--with-debugging=0"
"COPTFLAGS=-O3"
"FOPTFLAGS=-O3"
"CXXOPTFLAGS=-O3"
"CXXFLAGS=-O3"
];
hardeningDisable = lib.optionals (!petsc-optimized) [
"fortify"
-9
View File
@@ -17025,15 +17025,6 @@ with pkgs;
### SCIENCE/PROGRAMMING
### SCIENCE/GEOLOGY
pflotran = callPackage ../by-name/pf/pflotran/package.nix {
petsc = petsc.override {
hdf5-support = true;
hdf5 = hdf5-fortran-mpi;
petsc-optimized = true;
};
};
### SCIENCE/LOGIC
abella = callPackage ../applications/science/logic/abella {
+7
View File
@@ -10348,6 +10348,13 @@ self: super: with self; {
pesq = callPackage ../development/python-modules/pesq { };
petsc4py = toPythonModule (pkgs.petsc.override {
python3 = python;
python3Packages = self;
withPetsc4py = true;
withFullDeps = true;
});
pex = callPackage ../development/python-modules/pex { };
pexif = callPackage ../development/python-modules/pexif { };