diff options
Diffstat (limited to 'pkgs/development/python-modules/matplotlib/default.nix')
-rw-r--r-- | pkgs/development/python-modules/matplotlib/default.nix | 190 |
1 files changed, 125 insertions, 65 deletions
diff --git a/pkgs/development/python-modules/matplotlib/default.nix b/pkgs/development/python-modules/matplotlib/default.nix index a033e8a11bab9..b029b4cd26541 100644 --- a/pkgs/development/python-modules/matplotlib/default.nix +++ b/pkgs/development/python-modules/matplotlib/default.nix @@ -1,15 +1,74 @@ -{ lib, stdenv, fetchPypi, writeText, buildPythonPackage, isPy3k, pycairo -, which, cycler, python-dateutil, numpy, pyparsing, sphinx, tornado, kiwisolver -, freetype, qhull, libpng, pkg-config, mock, pytz, pygobject3, gobject-introspection -, certifi, contourpy, pillow, fonttools, setuptools-scm, setuptools-scm-git-archive, packaging -, enableGhostscript ? true, ghostscript, gtk3 -, enableGtk3 ? false, cairo -# darwin has its own "MacOSX" backend -, enableTk ? !stdenv.isDarwin, tcl, tk, tkinter -, enableQt ? false, pyqt5 -# required for headless detection -, libX11, wayland +{ lib +, stdenv +, fetchPypi +, writeText +, buildPythonPackage +, pythonOlder + +# https://github.com/matplotlib/matplotlib/blob/main/doc/devel/dependencies.rst +# build-system +, pkg-config +, pybind11 +, setuptools +, setuptools-scm + +# native libraries +, ffmpeg-headless +, fontconfig +, freetype +, imagemagick +, qhull + +# propagates +, contourpy +, cycler +, fonttools +, kiwisolver +, numpy +, packaging +, pillow +, pyparsing +, python-dateutil + +# optional +, importlib-resources + +# GTK3 +, enableGtk3 ? false +, cairo +, gobject-introspection +, gtk3 +, pycairo +, pygobject3 + +# Tk +, enableTk ? !stdenv.isDarwin # darwin has its own "MacOSX" backend +, tcl +, tk +, tkinter + +# Ghostscript +, enableGhostscript ? true +, ghostscript + +# Qt +, enableQt ? false +, pyqt5 + +# Webagg +, enableWebagg ? false +, tornado + +# nbagg +, enableNbagg ? false +, ipykernel + +# darwin , Cocoa + +# required for headless detection +, libX11 +, wayland }: let @@ -17,30 +76,66 @@ let in buildPythonPackage rec { - version = "3.6.2"; + version = "3.7.0"; pname = "matplotlib"; - format = "setuptools"; + format = "pyproject"; - disabled = !isPy3k; + disabled = pythonOlder "3.9"; src = fetchPypi { inherit pname version; - sha256 = "sha256-sD/RChcJ0BAcBUiDtVD3xMXpdPdR4mgDGHWa8AWWSZA="; + hash = "sha256-j279MTQw1+9wo4oydigcsuhkazois7IesifaIOFeaBM="; }; - XDG_RUNTIME_DIR = "/tmp"; + env.XDG_RUNTIME_DIR = "/tmp"; + + # Matplotlib tries to find Tcl/Tk by opening a Tk window and asking the + # corresponding interpreter object for its library paths. This fails if + # `$DISPLAY` is not set. The fallback option assumes that Tcl/Tk are both + # installed under the same path which is not true in Nix. + # With the following patch we just hard-code these paths into the install + # script. + postPatch = + let + tcl_tk_cache = ''"${tk}/lib", "${tcl}/lib", "${lib.strings.substring 0 3 tk.version}"''; + in + lib.optionalString enableTk '' + sed -i '/self.tcl_tk_cache = None/s|None|${tcl_tk_cache}|' setupext.py + '' + lib.optionalString (stdenv.isLinux && interactive) '' + # fix paths to libraries in dlopen calls (headless detection) + substituteInPlace src/_c_internal_utils.c \ + --replace libX11.so.6 ${libX11}/lib/libX11.so.6 \ + --replace libwayland-client.so.0 ${wayland}/lib/libwayland-client.so.0 + '' + + # bring our own system libraries + # https://github.com/matplotlib/matplotlib/blob/main/doc/devel/dependencies.rst#c-libraries + '' + echo "[libs] + system_freetype=true + system_qhull=true" > mplsetup.cfg + ''; nativeBuildInputs = [ pkg-config + pybind11 setuptools-scm - setuptools-scm-git-archive ]; buildInputs = [ - which - sphinx + ffmpeg-headless + freetype + qhull ] ++ lib.optionals enableGhostscript [ ghostscript + ] ++ lib.optionals enableGtk3 [ + cairo + gobject-introspection + gtk3 + ] ++ lib.optionals enableTk [ + libX11 + tcl + tk + tkinter ] ++ lib.optionals stdenv.isDarwin [ Cocoa ]; @@ -51,35 +146,27 @@ buildPythonPackage rec { ]; propagatedBuildInputs = [ - certifi + # explicit contourpy cycler fonttools - freetype kiwisolver - libpng - mock numpy packaging pillow pyparsing python-dateutil - pytz - qhull - tornado + ] ++ lib.optionals (pythonOlder "3.10") [ + importlib-resources ] ++ lib.optionals enableGtk3 [ - cairo - gobject-introspection - gtk3 pycairo pygobject3 - ] ++ lib.optionals enableTk [ - libX11 - tcl - tk - tkinter ] ++ lib.optionals enableQt [ pyqt5 + ] ++ lib.optionals enableWebagg [ + tornado + ] ++ lib.optionals enableNbagg [ + ipykernel ]; passthru.config = { @@ -93,35 +180,7 @@ buildPythonPackage rec { }; }; - MPLSETUPCFG = writeText "mplsetup.cfg" (lib.generators.toINI {} passthru.config); - - # Matplotlib tries to find Tcl/Tk by opening a Tk window and asking the - # corresponding interpreter object for its library paths. This fails if - # `$DISPLAY` is not set. The fallback option assumes that Tcl/Tk are both - # installed under the same path which is not true in Nix. - # With the following patch we just hard-code these paths into the install - # script. - postPatch = - let - tcl_tk_cache = ''"${tk}/lib", "${tcl}/lib", "${lib.strings.substring 0 3 tk.version}"''; - in - lib.optionalString enableTk '' - sed -i '/self.tcl_tk_cache = None/s|None|${tcl_tk_cache}|' setupext.py - '' + lib.optionalString (stdenv.isLinux && interactive) '' - # fix paths to libraries in dlopen calls (headless detection) - substituteInPlace src/_c_internal_utils.c \ - --replace libX11.so.6 ${libX11}/lib/libX11.so.6 \ - --replace libwayland-client.so.0 ${wayland}/lib/libwayland-client.so.0 - '' + - # avoid matplotlib trying to download dependencies - '' - echo "[libs] - system_freetype=true - system_qhull=true" > mplsetup.cfg - - substituteInPlace setup.py \ - --replace "setuptools_scm>=4,<7" "setuptools_scm>=4" - ''; + env.MPLSETUPCFG = writeText "mplsetup.cfg" (lib.generators.toINI {} passthru.config); # Matplotlib needs to be built against a specific version of freetype in # order for all of the tests to pass. @@ -129,8 +188,9 @@ buildPythonPackage rec { meta = with lib; { description = "Python plotting library, making publication quality plots"; - homepage = "https://matplotlib.org/"; - license = with licenses; [ psfl bsd0 ]; + homepage = "https://matplotlib.org/"; + changelog = "https://github.com/matplotlib/matplotlib/releases/tag/v${version}"; + license = with licenses; [ psfl bsd0 ]; maintainers = with maintainers; [ lovek323 veprbl ]; }; } |