From a2f7eda6deb6062798aefdad39b1de090954f5a6 Mon Sep 17 00:00:00 2001 From: Tyson Whitehead Date: Mon, 1 May 2017 20:09:09 -0400 Subject: [PATCH] firedrake: Initial packaging --- firedrake/coffee.nix | 32 +++++++++++++++++ firedrake/default.nix | 57 ++++++++++++++++++++++++++++++ firedrake/exodus-include.patch | 10 ++++++ firedrake/exodus.nix | 28 +++++++++++++++ firedrake/fiat.nix | 25 ++++++++++++++ firedrake/finat.nix | 30 ++++++++++++++++ firedrake/firedrake-setup.patch | 14 ++++++++ firedrake/hypre.nix | 30 ++++++++++++++++ firedrake/metis.nix | 24 +++++++++++++ firedrake/mpi4py.nix | 57 ++++++++++++++++++++++++++++++ firedrake/parmetis.nix | 33 ++++++++++++++++++ firedrake/petsc.nix | 61 +++++++++++++++++++++++++++++++++ firedrake/petsc4py.nix | 36 +++++++++++++++++++ firedrake/pulp.nix | 33 ++++++++++++++++++ firedrake/pyop2.nix | 52 ++++++++++++++++++++++++++++ firedrake/sowing.nix | 23 +++++++++++++ firedrake/tsfc.nix | 38 ++++++++++++++++++++ firedrake/ufl.nix | 24 +++++++++++++ 18 files changed, 607 insertions(+) create mode 100644 firedrake/coffee.nix create mode 100644 firedrake/default.nix create mode 100644 firedrake/exodus-include.patch create mode 100644 firedrake/exodus.nix create mode 100644 firedrake/fiat.nix create mode 100644 firedrake/finat.nix create mode 100644 firedrake/firedrake-setup.patch create mode 100644 firedrake/hypre.nix create mode 100644 firedrake/metis.nix create mode 100644 firedrake/mpi4py.nix create mode 100644 firedrake/parmetis.nix create mode 100644 firedrake/petsc.nix create mode 100644 firedrake/petsc4py.nix create mode 100644 firedrake/pulp.nix create mode 100644 firedrake/pyop2.nix create mode 100644 firedrake/sowing.nix create mode 100644 firedrake/tsfc.nix create mode 100644 firedrake/ufl.nix diff --git a/firedrake/coffee.nix b/firedrake/coffee.nix new file mode 100644 index 0000000..ee95e27 --- /dev/null +++ b/firedrake/coffee.nix @@ -0,0 +1,32 @@ +with import {}; + +let + + pulp = import ./pulp.nix; + +in + + python27Packages.buildPythonPackage rec { + version = "bdbc5fc0a8dfc45683489c6835c3c00cb27c0427"; + name = "firedrake-COFFEE-${version}"; + + src = fetchFromGitHub { + owner = "coneoproject"; + repo = "COFFEE"; + rev = "${version}"; + sha256 = "0b4jgnz05n6lapcnljpnq1p5z6j4bbdnq0mm3c53gzx4r47rkgyk"; + }; + + propagatedBuildInputs = [ + python27Packages.networkx + python27Packages.numpy + python27Packages.six + pulp + ]; + + meta = { + homepage = "https://github.com/coneoproject/COFFEE"; + description = "A COmpiler For Fast Expression Evaluation (COFFEE)."; + license = licenses.bsd3; + }; + } diff --git a/firedrake/default.nix b/firedrake/default.nix new file mode 100644 index 0000000..3182fd8 --- /dev/null +++ b/firedrake/default.nix @@ -0,0 +1,57 @@ +with import {}; + +let + + ufl = import ./ufl.nix; + fiat = import ./fiat.nix; + finat = import ./finat.nix; + tsfc = import ./tsfc.nix; + pyop2 = import ./pyop2.nix; + petsc = import ./petsc.nix; + petsc4py = import ./petsc4py.nix; + coffee = import ./coffee.nix; + +in + + python27Packages.buildPythonPackage rec { + version = "fe8a0b25040c785b32a859b58f5c8939de50f487"; + name = "firedrake-${version}"; + + src = fetchFromGitHub { + owner = "firedrakeproject"; + repo = "firedrake"; + rev = "${version}"; + sha256 = "1x1az48g5qjrgc1229hk7nd09d22m6sfnvhcc1kcki3h72rmqdfz"; + }; + + buildInputs = [ + openmpi + hdf5 + libspatialindex + python27Packages.cython + python27Packages.pytest_29 + python27Packages.pytest_xdist + python27Packages.pylint + petsc + ]; + + propagatedBuildInputs = [ + python27Packages.h5py + python27Packages.six + python27Packages.sympy + python27Packages.psutil + python27Packages.cachetools + python27Packages.singledispatch + python27Packages.ipython + python27Packages.matplotlib + ufl + fiat + finat + tsfc + pyop2 + petsc4py + coffee + ]; + + patches = [ ./firedrake-setup.patch ]; + } diff --git a/firedrake/exodus-include.patch b/firedrake/exodus-include.patch new file mode 100644 index 0000000..6afbbee --- /dev/null +++ b/firedrake/exodus-include.patch @@ -0,0 +1,10 @@ +--- exodus/forbind/CMakeLists.txt_ 2017-04-28 15:32:19.000000000 -0400 ++++ exodus/forbind/CMakeLists.txt 2017-04-28 15:49:31.000000000 -0400 +@@ -43,6 +43,7 @@ + INCLUDE_DIRECTORIES( + "${CMAKE_CURRENT_SOURCE_DIR}/include" + "${CMAKE_CURRENT_BINARY_DIR}/include" ++ "${CMAKE_SOURCE_DIR}/cbind/include" + "${NETCDF_INCLUDE_DIR}" + ) + diff --git a/firedrake/exodus.nix b/firedrake/exodus.nix new file mode 100644 index 0000000..e06c095 --- /dev/null +++ b/firedrake/exodus.nix @@ -0,0 +1,28 @@ +with import {}; + +stdenv.mkDerivation rec { + version = "5.24"; + name = "exodus-${version}"; + + src = fetchurl { + url = "http://ftp.mcs.anl.gov/pub/petsc/externalpackages/${name}.tar.bz2"; + sha256 = "0pai6v322x1z09z4zp0plx5p9zg1g4645mpqh3kcfh93az070sn1"; + }; + + + buildInputs = [ + gfortran + cmake + netcdf + hdf5 + ]; + + patches = ./exodus-include.patch; + sourceRoot = "${name}/exodus"; + + meta = { + homepage = "http://gsjaardema.github.io/seacas"; + description = "A model developed to store and retrieve data for finite element analyses."; + license = licenses.bsd3; + }; +} diff --git a/firedrake/fiat.nix b/firedrake/fiat.nix new file mode 100644 index 0000000..03c2e10 --- /dev/null +++ b/firedrake/fiat.nix @@ -0,0 +1,25 @@ +with import {}; + +python27Packages.buildPythonPackage rec { + version = "20847cdee0d323726571324f565ff3da6f19e700"; + name = "firedrake-fiat-${version}"; + + src = fetchFromGitHub { + owner = "firedrakeproject"; + repo = "fiat"; + rev = "${version}"; + sha256 = "1id0p06m7mwx8caz30g0cgci2n73mvqf6i6hnm1w08m605fxvwwf"; + }; + + propagatedBuildInputs = [ + python27Packages.numpy + python27Packages.sympy + python27Packages.six + ]; + + meta = { + homepage = "https://github.com/firedrakeproject/fiat"; + description = "Copy of upstream FIAT for use with Firedrake."; + license = licenses.lgpl3; + }; +} diff --git a/firedrake/finat.nix b/firedrake/finat.nix new file mode 100644 index 0000000..88e020c --- /dev/null +++ b/firedrake/finat.nix @@ -0,0 +1,30 @@ +with import {}; + +let + + fiat = import ./fiat.nix; + +in + + python27Packages.buildPythonPackage rec { + version = "fecac5b4d4ecf4b02b1ee440bdc4a57bfa9f1d87"; + name = "FInAT-${version}"; + + src = fetchFromGitHub { + owner = "FInAT"; + repo = "FInAT"; + rev = "${version}"; + sha256 = "1ad7vzpvlwmx5pgmvj2v8s6n5kdrz02j7wzj25wn974a2ff6pvvd"; + }; + + propagatedBuildInputs = [ + python27Packages.numpy + fiat + ]; + + meta = { + homepage = "https://github.com/FInAT/FInAT"; + description = "FInAT is an attempt to provide a more abstract, smarter library of finite elements."; + license = licenses.mit; + }; + } diff --git a/firedrake/firedrake-setup.patch b/firedrake/firedrake-setup.patch new file mode 100644 index 0000000..d9ea197 --- /dev/null +++ b/firedrake/firedrake-setup.patch @@ -0,0 +1,14 @@ +--- firedrake/setup.py.orig 2017-04-21 17:04:48.554347140 -0400 ++++ firedrake/setup.py 2017-04-21 23:09:34.794283607 -0400 +@@ -73,4 +73,5 @@ + url="http://firedrakeproject.org", + packages=["firedrake", "firedrake.mg", "firedrake.slope_limiter", ++ "firedrake.slate","firedrake.slate.slac", + "firedrake.matrix_free", "firedrake_configuration"], + package_data={"firedrake": ["firedrake_geometry.h", +@@ -98,4 +99,5 @@ + "%s/include" % sys.prefix], + libraries=["spatialindex_c"], ++ language="c++", + extra_link_args=["-L%s/lib" % sys.prefix, + "-Wl,-rpath,%s/lib" % sys.prefix]), diff --git a/firedrake/hypre.nix b/firedrake/hypre.nix new file mode 100644 index 0000000..04fa125 --- /dev/null +++ b/firedrake/hypre.nix @@ -0,0 +1,30 @@ +with import {}; + +stdenv.mkDerivation rec { + version = "xsdk-0.2.0-rc2"; + name = "hypre-${version}"; + + src = fetchFromGitHub { + owner = "LLNL"; + repo = "hypre"; + rev = "${version}"; + sha256 = "0ql1zs0imv14q511aj5g82mfhlycy8rqa5b6rzzw86c4cslasgch"; + }; + + buildInputs = [ + cmake + openmpi + ]; + + + sourceRoot = "${name}-src/src"; + preConfigure = "cmakeFlags=\"-DHYPRE_INSTALL_PREFIX=$prefix $cmakeFlags\""; + + makeFlags = [ "VERBOSE=1" ]; + + meta = { + homepage = "http://www.llnl.gov/casc/hypre"; + description = "Parallel solvers for sparse linear systems featuring multigrid methods."; + license = licenses.gpl2; + }; +} diff --git a/firedrake/metis.nix b/firedrake/metis.nix new file mode 100644 index 0000000..81ae578 --- /dev/null +++ b/firedrake/metis.nix @@ -0,0 +1,24 @@ +with import {}; + +stdenv.mkDerivation rec { + version = "5.1.0-p4"; + name = "metis-${version}"; + + src = fetchFromBitbucket { + owner = "petsc"; + repo = "pkg-metis"; + rev = "v${version}"; + sha256 = "1mw87w7jz8kfi7jw3kjfagxbagh2x794z0aj3g9z7w3g6wdbvlrr"; + }; + + buildInputs = [ + cmake + ]; + + makeFlags = [ "VERBOSE=1" ]; + + meta = { + homepage = "https://bitbucket.org/petsc/metis"; + description = "A set of serial programs for partitioning graphs, partitioning finite element meshes, and producing fill reducing orderings for sparse matrices."; + }; +} diff --git a/firedrake/mpi4py.nix b/firedrake/mpi4py.nix new file mode 100644 index 0000000..89ab5b2 --- /dev/null +++ b/firedrake/mpi4py.nix @@ -0,0 +1,57 @@ +with import { }; + +python27Packages.buildPythonPackage rec { + name = "mpi4py-2.0.0"; + + src = fetchurl { + url = "https://bitbucket.org/mpi4py/mpi4py/downloads/${name}.tar.gz"; + sha256 = "10fb01595rg17ycz08a23v24akm25d13srsy2rnixam7a5ca0hv5"; + }; + + passthru = { + inherit openmpi; + }; + + # The tests in the `test_spawn` module fail in the chroot build environment. + # However, they do pass in a pure, or non-pure nix-shell. Hence, we + # deactivate these particular tests. + # Unfortunately, the command-line arguments to `./setup.py test` are not + # correctly passed to the test-runner. Hence, these arguments are patched + # directly into `setup.py`. + patchPhase = '' + sed 's/err = main(cmd.args or \[\])/err = main(cmd.args or ["-v", "-e", "test_spawn"])/' -i setup.py + ''; + + configurePhase = ""; + + installPhase = '' + mkdir -p "$out/lib/${python.libPrefix}/site-packages" + export PYTHONPATH="$out/lib/${python.libPrefix}/site-packages:$PYTHONPATH" + + ${python}/bin/${python.executable} setup.py install \ + --install-lib=$out/lib/${python.libPrefix}/site-packages \ + --prefix="$out" + + # --install-lib: + # sometimes packages specify where files should be installed outside the usual + # python lib prefix, we override that back so all infrastructure (setup hooks) + # work as expected + ''; + + setupPyBuildFlags = ["--mpicc=${openmpi}/bin/mpicc"]; + + buildInputs = [ openmpi ]; + # Requires openssh for tests. Tests of dependent packages will also fail, + # if openssh is not present. E.g. h5py with mpi support. + propagatedBuildInputs = [ openssh ]; + + # hangs on some test so just disabled for now + doCheck = false; + + meta = { + description = + "Python bindings for the Message Passing Interface standard"; + homepage = "http://code.google.com/p/mpi4py/"; + license = stdenv.lib.licenses.bsd3; + }; +} diff --git a/firedrake/parmetis.nix b/firedrake/parmetis.nix new file mode 100644 index 0000000..91edb42 --- /dev/null +++ b/firedrake/parmetis.nix @@ -0,0 +1,33 @@ +with import {}; + +let + + metis = import ./metis.nix; + +in + + stdenv.mkDerivation rec { + version = "4.0.3-p4"; + name = "parmetis-${version}"; + + src = fetchFromBitbucket { + owner = "petsc"; + repo = "pkg-parmetis"; + rev = "v${version}"; + sha256 = "088pzcyjgv1i8jbdznxnxy04cd8kk5y3a46vc7mh1na901s0msm2"; + }; + + buildInputs = [ + cmake + openmpi + metis + ]; + + cmakeFlags = [ "-DGKLIB_PATH=../headers" ]; + makeFlags = [ "VERBOSE=1" ]; + + meta = { + homepage = "http://glaros.dtc.umn.edu/gkhome/metis/parmetis"; + description = "An MPI-based parallel library that implements a variety of algorithms for partitioning unstructured graphs, meshes, and for computing fill-reducing orderings of sparse matrices."; + }; + } diff --git a/firedrake/petsc.nix b/firedrake/petsc.nix new file mode 100644 index 0000000..48f8ef4 --- /dev/null +++ b/firedrake/petsc.nix @@ -0,0 +1,61 @@ +with import {}; + +let + + sowing = import ./sowing.nix; + metis = import ./metis.nix; + parmetis = import ./parmetis.nix; + hypre = import ./hypre.nix; + exodus = import ./exodus.nix; + +in + + stdenv.mkDerivation rec { + version = "156a1856fd44f55220132393778f0fda1e6096e3"; + name = "firedrake-petsc-${version}"; + + src = fetchFromGitHub { + owner = "firedrakeproject"; + repo = "petsc"; + rev = "${version}"; + sha256 = "1fmkd818idbiwbr6q9bmsxgwsc7igk13amfvb160llvsj32i93s9"; + }; + + buildInputs = [ + sowing + metis + parmetis + hypre + exodus + python27 + gfortran + openmpi + blas + liblapack + hdf5 + netcdf + eigen + ]; + + postPatch = "patchShebangs ."; + + configureFlags = [ + "--with-sowing-dir=${sowing}" + "--with-hdf5-dir=${hdf5}" + "--with-netcdf-dir=${netcdf}" + "--with-metis-dir=${metis}" + "--with-parmetis-dir=${parmetis}" + "--with-hypre-dir=${hypre}" + "--with-exodusii-dir=${exodus}" + "--with-eign-dir=${eigen}" + "--with-64-bit-indices" + ]; + + setupHook = writeText "setupHook.sh" "export PETSC_DIR=@out@"; + + meta = { + homepage = "https://github.com/firedrakeproject/petsc"; + description = "A suite of data structures and routines for the scalable (parallel) solution of scientific applications modeled by partial differential equations."; + license = licenses.bsd2; + }; + } diff --git a/firedrake/petsc4py.nix b/firedrake/petsc4py.nix new file mode 100644 index 0000000..2de6475 --- /dev/null +++ b/firedrake/petsc4py.nix @@ -0,0 +1,36 @@ +with import {}; + +let + + petsc = import ./petsc.nix; + +in + + python27Packages.buildPythonPackage rec { + version = "fbe23a494ab485f44f00ee37eee9f8be8dcd9eb5"; + name = "firedrake-petsc4py-${version}"; + + src = fetchFromGitHub { + owner = "firedrakeproject"; + repo = "petsc4py"; + rev = "${version}"; + sha256 = "0172rgpyqh2ylr4wv4a79xfls8fbbdb86n4p6r7cx5kdy8d2y05b"; + }; + + buildInputs = [ + python27Packages.cython + openmpi + hdf5 + petsc + ]; + + propagatedBuildInputs = [ + python27Packages.numpy + ]; + + meta = { + homepage = "https://bitbucket.org/petsc/petsc4py/"; + description = "Python bindings for PETSc."; + license = licenses.bsd2; + }; + } diff --git a/firedrake/pulp.nix b/firedrake/pulp.nix new file mode 100644 index 0000000..b1f9ecc --- /dev/null +++ b/firedrake/pulp.nix @@ -0,0 +1,33 @@ +with import {}; + +python27Packages.buildPythonPackage rec { + version = "1.6.4"; + name = "PuLP-${version}"; + + src = fetchFromGitHub { + owner = "coin-or"; + repo = "pulp"; + rev = "${version}"; + sha256 = "02i915ixrz66bpaka82j0x72kl76sr2b5xdx4ahwdlsffvmv9qnx"; + }; + + buildInputs = [ + glpk + cbc + ]; + + propagatedBuildInputs = [ + python27Packages.pyparsing + ]; + + postPatch = '' + sed -i -e 's|^CbcPath = .*$|CbcPath = ${cbc}/bin/cbc|' src/pulp/pulp.cfg.linux + sed -i -e 's|^GlpkPath = .*$|GlpkPath = ${glpk}/bin/glpsol|' src/pulp/pulp.cfg.linux + ''; + + meta = { + homepage = "https://github.com/coin-or/pulp"; + description = "A python Linear Programming API."; + license = licenses.mit; + }; +} diff --git a/firedrake/pyop2.nix b/firedrake/pyop2.nix new file mode 100644 index 0000000..cbbd3b7 --- /dev/null +++ b/firedrake/pyop2.nix @@ -0,0 +1,52 @@ +with import {}; + +let + + mpi4py = import ./mpi4py.nix; + coffee = import ./coffee.nix; + petsc = import ./petsc.nix; + petsc4py = import ./petsc4py.nix; + +in + + python27Packages.buildPythonPackage rec { + version = "98aab7bbbab2945317c1b9ecf5885652cf20e709"; + name = "PyOP2-${version}"; + + src = fetchFromGitHub { + owner = "OP2"; + repo = "PyOP2"; + rev = "${version}"; + sha256 = "167yl4vmw8r9pbn7issjvpflhisjnn42dnw6rfz6bp1rw9v4n4md"; + }; + + buildInputs = [ + openmpi + python27Packages.cython + python27Packages.pytest + python27Packages.flake8 + python27Packages.pycparser + petsc + ]; + + propagatedBuildInputs = [ + python27Packages.six + python27Packages.numpy + python27Packages.decorator + mpi4py + coffee + petsc4py + ]; + + postPatch = '' + sed -i -e 's|self\._cc = os\.environ\.get(ccenv, cc)|self._cc = '\'"$(type -p mpicxx)"\''' if cpp else '\'"$(type -p mpicc)"\'''|' pyop2/compilation.py + sed -i -e 's|self\._ld = os\.environ\.get('\'''LDSHARED'\''', ld)|self._ld = None|' pyop2/compilation.py + sed -i -e 's|os\.environ\['\'''PETSC_DIR'\'''\]|'\'''${petsc}'\'''|' pyop2/utils.py + ''; + + meta = { + homepage = "http://op2.github.io/PyOP2/"; + description = "Framework for performance-portable parallel computations on unstructured meshes."; + license = licenses.bsd3; + }; + } diff --git a/firedrake/sowing.nix b/firedrake/sowing.nix new file mode 100644 index 0000000..6558fa6 --- /dev/null +++ b/firedrake/sowing.nix @@ -0,0 +1,23 @@ +with import {}; + +stdenv.mkDerivation rec { + version = "1.1.25-p1"; + name = "sowing-${version}"; + + src = fetchFromBitbucket { + owner = "petsc"; + repo = "pkg-sowing"; + rev = "v${version}"; + sha256 = "0mpvq9jdavps5ljd2l1qngsyr96g2mp4ic21zf2bf80qvfjyanyw"; + }; + + + buildInputs = [ + ghostscript + ]; + + meta = { + homepage = "https://bitbucket.org/petsc/pkg-sowing"; + description = "Tools that are part of the petsc program development and maintenance environment."; + }; +} diff --git a/firedrake/tsfc.nix b/firedrake/tsfc.nix new file mode 100644 index 0000000..cf5085b --- /dev/null +++ b/firedrake/tsfc.nix @@ -0,0 +1,38 @@ +with import {}; + +let + + coffee = import ./coffee.nix; + ufl = import ./ufl.nix; + fiat = import ./fiat.nix; + finat = import ./finat.nix; + +in + + python27Packages.buildPythonPackage rec { + version = "ee5670ab1ad90aaf8f550de01255c6752583255d"; + name = "firedrake-tsfc-${version}"; + + src = fetchFromGitHub { + owner = "firedrakeproject"; + repo = "tsfc"; + rev = "${version}"; + sha256 = "07v5v1nhcywn2rpdr0380ck120ppzlvpfknmjh1rss6xkzf2s9lf"; + }; + + propagatedBuildInputs = [ + python27Packages.numpy + python27Packages.singledispatch + python27Packages.six + coffee + ufl + fiat + finat + ]; + + meta = { + homepage = "https://github.com/firedrakeproject/tsfc"; + description = "Form compiler for the Firedrake project."; + license = licenses.gpl3; + }; + } diff --git a/firedrake/ufl.nix b/firedrake/ufl.nix new file mode 100644 index 0000000..2c590b2 --- /dev/null +++ b/firedrake/ufl.nix @@ -0,0 +1,24 @@ +with import {}; + +python27Packages.buildPythonPackage rec { + version = "8c17257d325f5f040ad1cb74b866956ad42427ca"; + name = "firedrake-ufl-${version}"; + + src = fetchFromGitHub { + owner = "firedrakeproject"; + repo = "ufl"; + rev = "${version}"; + sha256 = "1ryjq5sknaw92z3zrrnfqcvkga3g071bgjf8j42acsh4iw4g6yg1"; + }; + + propagatedBuildInputs = [ + python27Packages.numpy + python27Packages.six + ]; + + meta = { + homepage = "https://github.com/firedrakeproject/ufl"; + description = "Copy of upstream UFL for use with Firedrake."; + license = licenses.lgpl3; + }; +}