1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
{ 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, 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
, Cocoa
}:
let
interactive = enableTk || enableGtk3 || enableQt;
in
buildPythonPackage rec {
version = "3.5.3";
pname = "matplotlib";
format = "setuptools";
disabled = !isPy3k;
src = fetchPypi {
inherit pname version;
sha256 = "sha256-M5ysSLgN28i/0F2q4KOnNBRlGoWWkEwqiBz9Httl8mw=";
};
XDG_RUNTIME_DIR = "/tmp";
nativeBuildInputs = [
pkg-config
setuptools-scm
setuptools-scm-git-archive
];
buildInputs = [
which
sphinx
] ++ lib.optionals enableGhostscript [
ghostscript
] ++ lib.optionals stdenv.isDarwin [
Cocoa
];
propagatedBuildInputs = [
certifi
cycler
fonttools
freetype
kiwisolver
libpng
mock
numpy
packaging
pillow
pyparsing
python-dateutil
pytz
qhull
tornado
] ++ lib.optionals enableGtk3 [
cairo
gobject-introspection
gtk3
pycairo
pygobject3
] ++ lib.optionals enableTk [
libX11
tcl
tk
tkinter
] ++ lib.optionals enableQt [
pyqt5
];
passthru.config = {
directories = { basedirlist = "."; };
libs = {
system_freetype = true;
system_qhull = true;
} // lib.optionalAttrs stdenv.isDarwin {
# LTO not working in darwin stdenv, see #19312
enable_lto = false;
};
};
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"
'';
# Matplotlib needs to be built against a specific version of freetype in
# order for all of the tests to pass.
doCheck = false;
meta = with lib; {
description = "Python plotting library, making publication quality plots";
homepage = "https://matplotlib.org/";
license = with licenses; [ psfl bsd0 ];
maintainers = with maintainers; [ lovek323 veprbl ];
};
}
|