diff --git a/pkgs/top-level/release-alternatives.nix b/pkgs/top-level/release-alternatives.nix new file mode 100644 index 00000000000..230e20417bc --- /dev/null +++ b/pkgs/top-level/release-alternatives.nix @@ -0,0 +1,91 @@ +{ pkgsFun ? import ../.. +, lib ? import ../../lib +, supportedSystems ? ["x86_64-linux"] +, allowUnfree ? false }: + +let + + # called BLAS here, but also tests LAPACK + blasUsers = [ + # "julia_07" "julia_10" "julia_11" "julia_13" "octave" "octaveFull" + "fflas-ffpack" "linbox" "R" "ipopt" "hpl" "rspamd" "octopus" + "sundials" "sundials_2" "superlu" "suitesparse_5_3" "suitesparse_4_4" + "suitesparse_4_2" "scs" "scalapack" "petsc" "cholmod-extra" + "arpack" "qrupdate" "libcint" "iml" "globalarrays" "arrayfire" "armadillo" + "xfitter" "lammps" "plink-ng" "quantum-espresso" "siesta" + "siesta-mpi" "shogun" "calculix" "csdp" "getdp" "giac" "gmsh" "jags" + "lammps" "lammps-mpi" + + # requires openblas + # "caffe" "mxnet" "flint" "sage" "sageWithDoc" + + # broken + # "gnss-sdr" "octave-jit" "openmodelica" "torch" + + # subpackages + ["pythonPackages" "numpy"] ["pythonPackages" "prox-tv"] ["pythonPackages" "scs"] + ["pythonPackages" "pysparse"] ["pythonPackages" "cvxopt"] + # ["pythonPackages" "fenics"] + ["rPackages" "slfm"] ["rPackages" "SamplerCompare"] + # ["rPackages" "EMCluster"] + # ["ocamlPackages" "lacaml"] + # ["ocamlPackages" "owl"] + ["haskellPackages" "bindings-levmar"] + ] ++ lib.optionals allowUnfree [ "magma" ]; + blas64Users = [ + "rspamd" "suitesparse_5_3" "suitesparse_4_4" + "suitesparse_4_2" "scs" "petsc" "magma" "cholmod-extra" + "arpack" "qrupdate" "iml" "globalarrays" "arrayfire" + "xfitter" "lammps" "plink-ng" "quantum-espresso" + "calculix" "csdp" "getdp" "giac" "jags" + "lammps" "lammps-mpi" + # ["ocamlPackages" "lacaml"] + ["haskellPackages" "bindings-levmar"] + ] ++ lib.optionals allowUnfree [ "magma" ]; + blasProviders = system: [ "openblasCompat" "lapack-reference" "openblas" ] + ++ lib.optionals (allowUnfree && system.isx86) ["mkl" "mkl64"]; + + blas64Providers = [ "mkl64" "openblas"]; + + mapListToAttrs = xs: f: builtins.listToAttrs (map (name: { + name = if builtins.isList name + then builtins.elemAt name (builtins.length name - 1) + else name; + value = f name; + }) xs); + +in + +{ + blas = mapListToAttrs supportedSystems (system': let system = lib.systems.elaborate { system = system'; }; + in mapListToAttrs (blasProviders system) (provider: let + is64bit = builtins.elem provider (["mkl64"] ++ lib.optional system.is64bit "openblas"); + pkgs = pkgsFun { + config = { inherit allowUnfree; }; + system = system'; + overlays = [(self: super: { + lapack = super.lapack.override { + lapackProvider = if provider == "mkl64" + then super.mkl + else builtins.getAttr provider super; + inherit is64bit; + }; + blas = super.blas.override { + blasProvider = if provider == "mkl64" + then super.mkl + else builtins.getAttr provider super; + inherit is64bit; + }; + })]; + }; + in mapListToAttrs (if builtins.elem provider blas64Providers + then blas64Users else blasUsers) + (attr: if builtins.isList attr + then lib.getAttrFromPath attr pkgs + else builtins.getAttr attr pkgs) + + // { recurseForDerivations = true; }) + // { recurseForDerivations = true; }) + // { recurseForDerivations = true; }; + recurseForDerivations = true; +}