Commit | Line | Data |
---|---|---|
a01b6da7 NK |
1 | ;;; GNU Guix --- Functional package management for GNU |
2 | ;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org> | |
a5e3d59b | 3 | ;;; Copyright © 2013, 2014, 2015, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org> |
8e451885 | 4 | ;;; Copyright © 2013, 2014, 2015, 2016 Andreas Enge <andreas@enge.fr> |
e99f4211 | 5 | ;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org> |
32922190 | 6 | ;;; Copyright © 2014, 2017, 2019 Eric Bavier <bavier@member.fsf.org> |
da6ce3f1 | 7 | ;;; Copyright © 2014, 2015 Federico Beffa <beffa@fbengineering.ch> |
e99f4211 | 8 | ;;; Copyright © 2015 Omar Radwan <toxemicsquire4@gmail.com> |
d95a56c6 | 9 | ;;; Copyright © 2015 Pierre-Antoine Rault <par@rigelk.eu> |
9fb5771a | 10 | ;;; Copyright © 2015, 2016, 2017, 2018, 2019 Ricardo Wurmus <rekado@elephly.net> |
0bdc1671 | 11 | ;;; Copyright © 2015, 2016 Christopher Allan Webber <cwebber@dustycloud.org> |
345f0611 | 12 | ;;; Copyright © 2015 Eric Dvorsak <eric@dvorsak.fr> |
2b2f2fc1 | 13 | ;;; Copyright © 2015, 2016 David Thompson <davet@gnu.org> |
7637de23 | 14 | ;;; Copyright © 2015, 2016, 2017 Leo Famulari <leo@famulari.name> |
04fb4516 | 15 | ;;; Copyright © 2015, 2017 Ben Woodcroft <donttrustben@gmail.com> |
b9893908 | 16 | ;;; Copyright © 2015, 2016 Erik Edrosa <erik.edrosa@gmail.com> |
399d89b5 | 17 | ;;; Copyright © 2015, 2016, 2017, 2018, 2019, 2020 Efraim Flashner <efraim@flashner.co.il> |
b89e3c77 | 18 | ;;; Copyright © 2015, 2017 Kyle Meyer <kyle@kyleam.com> |
daeeea71 | 19 | ;;; Copyright © 2015, 2016 Chris Marusich <cmmarusich@gmail.com> |
b31fbea5 | 20 | ;;; Copyright © 2016 Danny Milosavljevic <dannym+a@scratchpost.org> |
88bb4197 | 21 | ;;; Copyright © 2016 Lukas Gradl <lgradl@openmailbox.org> |
34581f68 | 22 | ;;; Copyright © 2016, 2018 Hartmut Goebel <h.goebel@crazy-compilers.com> |
0de78c95 | 23 | ;;; Copyright © 2016 Daniel Pimentel <d4n1@d4n1.org> |
9250b0f3 | 24 | ;;; Copyright © 2016 Sou Bunnbu <iyzsong@gmail.com> |
bb3b4b4e | 25 | ;;; Copyright © 2016, 2017 Troy Sankey <sankeytms@gmail.com> |
3c986a7d | 26 | ;;; Copyright © 2016, 2017 Nikita <nikita@n0.is> |
6eb7af2a | 27 | ;;; Copyright © 2016 Dylan Jeffers <sapientech@sapientech@openmailbox.org> |
3f641af0 | 28 | ;;; Copyright © 2016 David Craven <david@craven.ch> |
67ca82e6 | 29 | ;;; Copyright © 2016, 2017, 2018, 2019, 2020 Marius Bakke <mbakke@fastmail.com> |
ca0e62bf | 30 | ;;; Copyright © 2016, 2017 Stefan Reichör <stefan@xsteve.at> |
b04a52a6 | 31 | ;;; Copyright © 2016 Dylan Jeffers <sapientech@sapientech@openmailbox.org> |
e65acb31 | 32 | ;;; Copyright © 2016, 2017 Alex Vong <alexvong1995@gmail.com> |
fbec83b8 | 33 | ;;; Copyright © 2016, 2017, 2018 Arun Isaac <arunisaac@systemreboot.net> |
ff349415 | 34 | ;;; Copyright © 2016, 2017, 2018 Julien Lepiller <julien@lepiller.eu> |
9e8401a5 | 35 | ;;; Copyright © 2016, 2017, 2018 Tobias Geerinckx-Rice <me@tobias.gr> |
ec074213 | 36 | ;;; Copyright © 2016, 2017 Thomas Danckaert <post@thomasdanckaert.be> |
916aafa4 | 37 | ;;; Copyright © 2017 Carlo Zancanaro <carlo@zancanaro.id.au> |
1a917fc9 | 38 | ;;; Copyright © 2017 Frederick M. Muriithi <fredmanglis@gmail.com> |
09b9cf73 | 39 | ;;; Copyright © 2017, 2018 Adriano Peluso <catonano@gmail.com> |
16fe516e | 40 | ;;; Copyright © 2017 Ben Sturmfels <ben@sturm.com.au> |
57ec9861 | 41 | ;;; Copyright © 2017, 2018, 2019 Mathieu Othacehe <m.othacehe@gmail.com> |
3015d455 | 42 | ;;; Copyright © 2017 José Miguel Sánchez García <jmi2k@openmailbox.org> |
fa3f5f47 | 43 | ;;; Copyright © 2017 Roel Janssen <roel@gnu.org> |
44e4a621 | 44 | ;;; Copyright © 2017, 2018 Kei Kebreau <kkebreau@posteo.net> |
f817b4d9 | 45 | ;;; Copyright © 2017 Rutger Helling <rhelling@mykolab.com> |
3fee0039 | 46 | ;;; Copyright © 2017 Muriithi Frederick Muriuki <fredmanglis@gmail.com> |
dcfa0acd | 47 | ;;; Copyright © 2017 Brendan Tildesley <mail@brendan.scot> |
956ba99c | 48 | ;;; Copyright © 2018 Ethan R. Jones <ethanrjones97@gmail.com |
6055e88c | 49 | ;;; Copyright © 2018 Fis Trivial <ybbs.daans@hotmail.com> |
385e8614 | 50 | ;;; Copyright © 2018 Vijayalakshmi Vedantham <vijimay12@gmail.com> |
95f3b626 | 51 | ;;; Copyright © 2018 Mathieu Lirzin <mthl@gnu.org> |
c2b2f0c8 | 52 | ;;; Copyright © 2018 Adam Massmann <massmannak@gmail.com> |
15ed90b9 | 53 | ;;; Copyright © 2016, 2018 Tomáš Čech <sleep_walker@gnu.org> |
bbc8c36f | 54 | ;;; Copyright © 2018 Nicolas Goaziou <mail@nicolasgoaziou.fr> |
c0888cef | 55 | ;;; Copyright © 2018 Oleg Pykhalov <go.wigust@gmail.com> |
0dc57238 | 56 | ;;; Copyright © 2018 Clément Lassieur <clement@lassieur.org> |
e337061b | 57 | ;;; Copyright © 2018, 2019 Maxim Cournoyer <maxim.cournoyer@gmail.com> |
16d21251 | 58 | ;;; Copyright © 2018 Luther Thompson <lutheroto@gmail.com> |
9f23f6bc | 59 | ;;; Copyright © 2018 Vagrant Cascadian <vagrant@debian.org> |
af6a9fc2 | 60 | ;;; Copyright © 2019 Tanguy Le Carrour <tanguy@bioneland.org> |
189bfb55 | 61 | ;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org> |
c2b2f0c8 | 62 | ;;; |
a01b6da7 NK |
63 | ;;; This file is part of GNU Guix. |
64 | ;;; | |
65 | ;;; GNU Guix is free software; you can redistribute it and/or modify it | |
66 | ;;; under the terms of the GNU General Public License as published by | |
67 | ;;; the Free Software Foundation; either version 3 of the License, or (at | |
68 | ;;; your option) any later version. | |
69 | ;;; | |
70 | ;;; GNU Guix is distributed in the hope that it will be useful, but | |
71 | ;;; WITHOUT ANY WARRANTY; without even the implied warranty of | |
72 | ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
73 | ;;; GNU General Public License for more details. | |
74 | ;;; | |
75 | ;;; You should have received a copy of the GNU General Public License | |
76 | ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. | |
77 | ||
1ffa7090 | 78 | (define-module (gnu packages python) |
3f641af0 | 79 | #:use-module ((guix licenses) #:prefix license:) |
3fdc99da | 80 | #:use-module (gnu packages) |
680bc34d | 81 | #:use-module (gnu packages base) |
3969ca54 | 82 | #:use-module (gnu packages bash) |
625cdb05 LDB |
83 | #:use-module (gnu packages certs) |
84 | #:use-module (gnu packages check) | |
1ffa7090 | 85 | #:use-module (gnu packages compression) |
255d1bbe | 86 | #:use-module (gnu packages dbm) |
189bfb55 | 87 | #:use-module (gnu packages hurd) |
b10ab723 | 88 | #:use-module (gnu packages libffi) |
625cdb05 | 89 | #:use-module (gnu packages ncurses) |
b10ab723 | 90 | #:use-module (gnu packages pkg-config) |
625cdb05 | 91 | #:use-module (gnu packages python-xyz) |
4ed20663 | 92 | #:use-module (gnu packages readline) |
625cdb05 | 93 | #:use-module (gnu packages shells) |
cd0322a3 | 94 | #:use-module (gnu packages sqlite) |
afa181ff | 95 | #:use-module (gnu packages tcl) |
44d10b1f | 96 | #:use-module (gnu packages tls) |
d1659c0f | 97 | #:use-module (gnu packages xml) |
a01b6da7 NK |
98 | #:use-module (guix packages) |
99 | #:use-module (guix download) | |
11bb85a1 | 100 | #:use-module (guix utils) |
acc26ff1 | 101 | #:use-module (guix build-system gnu) |
67ca82e6 MB |
102 | #:use-module (guix build-system trivial) |
103 | #:use-module (srfi srfi-1) | |
104 | #:use-module (srfi srfi-26)) | |
a01b6da7 | 105 | |
45848023 | 106 | (define-public python-2.7 |
a01b6da7 | 107 | (package |
a7714d42 | 108 | (name "python2") |
2c854762 | 109 | (version "2.7.17") |
a01b6da7 NK |
110 | (source |
111 | (origin | |
112 | (method url-fetch) | |
9b43a0ff | 113 | (uri (string-append "https://www.python.org/ftp/python/" |
a01b6da7 NK |
114 | version "/Python-" version ".tar.xz")) |
115 | (sha256 | |
116 | (base32 | |
2c854762 | 117 | "0hds28cg226m8j8sr394nm9yc4gxhvlv109w0avsf2mxrlrz0hsd")) |
c3052d6b ML |
118 | (patches (search-patches "python-2.7-search-paths.patch" |
119 | "python-2-deterministic-build-info.patch" | |
15e57f57 | 120 | "python-2.7-site-prefixes.patch" |
dc5cec21 | 121 | "python-2.7-source-date-epoch.patch" |
ceb9de75 MO |
122 | "python-2.7-adjust-tests.patch" |
123 | "python-cross-compile.patch")) | |
10a42aa2 | 124 | (modules '((guix build utils))) |
10a42aa2 EF |
125 | (snippet |
126 | '(begin | |
d1659c0f MB |
127 | ;; Ensure the bundled copies of these libraries are not used. |
128 | (for-each delete-file-recursively | |
129 | '("Modules/_ctypes/libffi" "Modules/expat" "Modules/zlib")) | |
130 | ||
131 | (substitute* "Modules/Setup.dist" | |
132 | ;; Link Expat instead of embedding the bundled one. | |
133 | (("^#pyexpat.*") "pyexpat pyexpat.c -lexpat\n")) | |
134 | ||
135 | ;; Suboptimal to delete failing tests here, but if we delete them in | |
136 | ;; the arguments then we need to make sure to strip out that phase | |
137 | ;; when it gets inherited by python and python-minimal. | |
10a42aa2 EF |
138 | (for-each delete-file |
139 | '("Lib/test/test_compileall.py" | |
f0499100 | 140 | "Lib/test/test_ctypes.py" ; fails on mips64el |
10a42aa2 EF |
141 | "Lib/test/test_distutils.py" |
142 | "Lib/test/test_import.py" | |
143 | "Lib/test/test_shutil.py" | |
144 | "Lib/test/test_socket.py" | |
1bb163b0 | 145 | "Lib/test/test_subprocess.py")) |
10a42aa2 | 146 | #t)))) |
02f0c3b2 LC |
147 | (outputs '("out" |
148 | "tk")) ;tkinter; adds 50 MiB to the closure | |
a01b6da7 | 149 | (build-system gnu-build-system) |
3fdc99da | 150 | (arguments |
d6614607 | 151 | `(#:test-target "test" |
3fdc99da | 152 | #:configure-flags |
6a20289d | 153 | (list "--enable-shared" ;allow embedding |
d1659c0f | 154 | "--with-system-expat" ;for XML support |
6a20289d | 155 | "--with-system-ffi" ;build ctypes |
aaf75c89 | 156 | "--with-ensurepip=install" ;install pip and setuptools |
a282d7ff | 157 | "--enable-unicode=ucs4" |
fcb54937 MB |
158 | |
159 | ;; Prevent the installed _sysconfigdata.py from retaining a reference | |
160 | ;; to coreutils. | |
161 | "INSTALL=install -c" | |
162 | "MKDIR_P=mkdir -p" | |
163 | ||
57ec9861 MO |
164 | ;; Disable runtime check failing if cross-compiling, see: |
165 | ;; https://lists.yoctoproject.org/pipermail/poky/2013-June/008997.html | |
166 | ,@(if (%current-target-system) | |
167 | '("ac_cv_buggy_getaddrinfo=no" | |
168 | "ac_cv_file__dev_ptmx=no" | |
169 | "ac_cv_file__dev_ptc=no") | |
170 | '()) | |
6a20289d LC |
171 | (string-append "LDFLAGS=-Wl,-rpath=" |
172 | (assoc-ref %outputs "out") "/lib")) | |
5b01b603 EB |
173 | ;; With no -j argument tests use all available cpus, so provide one. |
174 | #:make-flags | |
e337061b MC |
175 | (list (string-append |
176 | (format #f "TESTOPTS=-j~d" (parallel-job-count)) | |
177 | ;; Exclude the following tests as they fail | |
178 | ;; non-deterministically with "error: [Errno 104] Connection | |
179 | ;; reset by peer." Python 3 seems unaffected. A potential fix, | |
180 | ;; yet to be backported to Python 2, is available at: | |
181 | ;; https://github.com/python/cpython/commit/529525fb5a8fd9b96ab4021311a598c77588b918. | |
182 | " --exclude test_urllib2_localnet test_httplib")) | |
fd982732 | 183 | |
d2cc9c7c LC |
184 | #:modules ((ice-9 ftw) (ice-9 match) |
185 | (guix build utils) (guix build gnu-build-system)) | |
fd982732 | 186 | #:phases |
46472ecd MW |
187 | (modify-phases %standard-phases |
188 | (add-before | |
189 | 'configure 'patch-lib-shells | |
190 | (lambda _ | |
ceb9de75 MO |
191 | ;; This variable is used in setup.py to enable cross compilation |
192 | ;; specific switches. As it is not set properly by configure | |
193 | ;; script, set it manually. | |
194 | ,@(if (%current-target-system) | |
195 | '((setenv "_PYTHON_HOST_PLATFORM" "")) | |
196 | '()) | |
46472ecd MW |
197 | ;; Filter for existing files, since some may not exist in all |
198 | ;; versions of python that are built with this recipe. | |
199 | (substitute* (filter file-exists? | |
200 | '("Lib/subprocess.py" | |
201 | "Lib/popen2.py" | |
202 | "Lib/distutils/tests/test_spawn.py" | |
b18226c3 | 203 | "Lib/test/support/__init__.py" |
46472ecd MW |
204 | "Lib/test/test_subprocess.py")) |
205 | (("/bin/sh") (which "sh"))) | |
206 | #t)) | |
189bfb55 JN |
207 | ,@(if (hurd-system?) |
208 | `((add-before 'build 'patch-regen-for-hurd | |
209 | (lambda* (#:key inputs #:allow-other-keys) | |
210 | (let ((libc (assoc-ref inputs "libc"))) | |
211 | (substitute* "Lib/plat-generic/regen" | |
212 | (("/usr/include/") (string-append libc "/include/"))) | |
213 | #t)))) | |
214 | '()) | |
5b4e2791 LC |
215 | (add-before 'configure 'do-not-record-configure-flags |
216 | (lambda* (#:key configure-flags #:allow-other-keys) | |
217 | ;; Remove configure flags from the installed '_sysconfigdata.py' | |
218 | ;; and 'Makefile' so we don't end up keeping references to the | |
219 | ;; build tools. | |
220 | ;; | |
221 | ;; Preserve at least '--with-system-ffi' since otherwise the | |
222 | ;; thing tries to build libffi, fails, and we end up with a | |
223 | ;; Python that lacks ctypes. | |
224 | (substitute* "configure" | |
225 | (("^CONFIG_ARGS=.*$") | |
226 | (format #f "CONFIG_ARGS='~a'\n" | |
227 | (if (member "--with-system-ffi" configure-flags) | |
228 | "--with-system-ffi" | |
229 | "")))) | |
230 | #t)) | |
46472ecd MW |
231 | (add-before |
232 | 'check 'pre-check | |
233 | (lambda _ | |
234 | ;; 'Lib/test/test_site.py' needs a valid $HOME | |
235 | (setenv "HOME" (getcwd)) | |
236 | #t)) | |
237 | (add-after | |
238 | 'unpack 'set-source-file-times-to-1980 | |
239 | ;; XXX One of the tests uses a ZIP library to pack up some of the | |
240 | ;; source tree, and fails with "ZIP does not support timestamps | |
241 | ;; before 1980". Work around this by setting the file times in the | |
242 | ;; source tree to sometime in early 1980. | |
243 | (lambda _ | |
244 | (let ((circa-1980 (* 10 366 24 60 60))) | |
245 | (ftw "." (lambda (file stat flag) | |
246 | (utime file circa-1980 circa-1980) | |
247 | #t)) | |
02f0c3b2 | 248 | #t))) |
9ffe61b0 LC |
249 | (add-after 'install 'remove-tests |
250 | ;; Remove 25 MiB of unneeded unit tests. Keep test_support.* | |
251 | ;; because these files are used by some libraries out there. | |
252 | (lambda* (#:key outputs #:allow-other-keys) | |
253 | (let ((out (assoc-ref outputs "out"))) | |
254 | (match (scandir (string-append out "/lib") | |
255 | (lambda (name) | |
256 | (string-prefix? "python" name))) | |
257 | ((pythonX.Y) | |
258 | (let ((testdir (string-append out "/lib/" pythonX.Y | |
259 | "/test"))) | |
260 | (with-directory-excursion testdir | |
261 | (for-each delete-file-recursively | |
262 | (scandir testdir | |
263 | (match-lambda | |
264 | ((or "." "..") #f) | |
d453b0e1 | 265 | ("support" #f) |
9ffe61b0 LC |
266 | (file |
267 | (not | |
268 | (string-prefix? "test_support." | |
269 | file)))))) | |
270 | (call-with-output-file "__init__.py" (const #t)) | |
271 | #t))))))) | |
d41f6394 RW |
272 | (add-after 'remove-tests 'rebuild-bytecode |
273 | (lambda* (#:key outputs #:allow-other-keys) | |
274 | (let ((out (assoc-ref outputs "out"))) | |
275 | ;; Disable hash randomization to ensure the generated .pycs | |
276 | ;; are reproducible. | |
277 | (setenv "PYTHONHASHSEED" "0") | |
278 | (for-each | |
279 | (lambda (opt) | |
280 | (format #t "Compiling with optimization level: ~a\n" | |
281 | (if (null? opt) "none" (car opt))) | |
282 | (for-each (lambda (file) | |
283 | (apply invoke | |
ceb9de75 MO |
284 | `(,,(if (%current-target-system) |
285 | "python2" | |
286 | '(string-append out "/bin/python")) | |
d41f6394 RW |
287 | ,@opt |
288 | "-m" "compileall" | |
289 | "-f" ; force rebuild | |
290 | ;; Don't build lib2to3, because it contains Python 3 code. | |
291 | "-x" "lib2to3/.*" | |
292 | ,file))) | |
293 | (find-files out "\\.py$"))) | |
294 | (list '() '("-O") '("-OO"))) | |
295 | #t))) | |
02f0c3b2 LC |
296 | (add-after 'install 'move-tk-inter |
297 | (lambda* (#:key outputs #:allow-other-keys) | |
298 | ;; When Tkinter support is built move it to a separate output so | |
299 | ;; that the main output doesn't contain a reference to Tcl/Tk. | |
300 | (let ((out (assoc-ref outputs "out")) | |
301 | (tk (assoc-ref outputs "tk"))) | |
302 | (when tk | |
303 | (match (find-files out "tkinter.*\\.so") | |
304 | ((tkinter.so) | |
305 | ;; The .so is in OUT/lib/pythonX.Y/lib-dynload, but we | |
306 | ;; want it under TK/lib/pythonX.Y/site-packages. | |
307 | (let* ((len (string-length out)) | |
308 | (target (string-append | |
309 | tk "/" | |
310 | (string-drop | |
311 | (dirname (dirname tkinter.so)) | |
312 | len) | |
313 | "/site-packages"))) | |
314 | (install-file tkinter.so target) | |
315 | (delete-file tkinter.so))))) | |
316 | #t)))))) | |
a01b6da7 | 317 | (inputs |
3fdc99da | 318 | `(("bzip2" ,bzip2) |
d1659c0f | 319 | ("expat" ,expat) |
3fdc99da | 320 | ("gdbm" ,gdbm) |
b10ab723 | 321 | ("libffi" ,libffi) ; for ctypes |
b88e1b0a | 322 | ("sqlite" ,sqlite) ; for sqlite extension |
a01b6da7 | 323 | ("openssl" ,openssl) |
3fdc99da | 324 | ("readline" ,readline) |
afa181ff LC |
325 | ("zlib" ,zlib) |
326 | ("tcl" ,tcl) | |
327 | ("tk" ,tk))) ; for tkinter | |
b10ab723 | 328 | (native-inputs |
57ec9861 MO |
329 | `(("pkg-config" ,pkg-config) |
330 | ;; When cross-compiling, a native version of Python itself is needed. | |
331 | ,@(if (%current-target-system) | |
ceb9de75 | 332 | `(("python2" ,this-package) |
57ec9861 MO |
333 | ("which" ,which)) |
334 | '()))) | |
9be8d7c8 LC |
335 | (native-search-paths |
336 | (list (search-path-specification | |
337 | (variable "PYTHONPATH") | |
af070955 | 338 | (files '("lib/python2.7/site-packages"))))) |
f0499100 | 339 | (home-page "https://www.python.org") |
afa181ff | 340 | (synopsis "High-level, dynamically-typed programming language") |
a01b6da7 NK |
341 | (description |
342 | "Python is a remarkably powerful dynamic programming language that | |
343 | is used in a wide variety of application domains. Some of its key | |
344 | distinguishing features include: clear, readable syntax; strong | |
345 | introspection capabilities; intuitive object orientation; natural | |
346 | expression of procedural code; full modularity, supporting hierarchical | |
347 | packages; exception-based error handling; and very high level dynamic | |
348 | data types.") | |
cb13618b | 349 | (properties '((cpe-name . "python"))) |
3f641af0 | 350 | (license license:psfl))) |
acc26ff1 | 351 | |
45848023 HG |
352 | ;; Current 2.x version. |
353 | (define-public python-2 python-2.7) | |
354 | ||
b63f6c01 LC |
355 | (define-public python2-called-python |
356 | ;; Both 2.x and 3.x used to be called "python". In commit | |
357 | ;; a7714d42de2c3082f3609d1e63c83d703fb39cf9 (March 2018), we renamed the | |
358 | ;; Python 2.x package to "python2". | |
359 | (package | |
360 | (inherit python-2) | |
361 | (name "python") | |
362 | (properties `((superseded . ,python-2))))) | |
363 | ||
b15d1c46 | 364 | (define-public python-3.8 |
b24d1cfc | 365 | (package (inherit python-2) |
b4d0cf40 | 366 | (name "python") |
53453242 | 367 | (version "3.8.2") |
717003e3 LC |
368 | (source (origin |
369 | (method url-fetch) | |
370 | (uri (string-append "https://www.python.org/ftp/python/" | |
371 | version "/Python-" version ".tar.xz")) | |
3cff86db MB |
372 | (patches (search-patches |
373 | "python-3-fix-tests.patch" | |
374 | "python-3.8-fix-tests.patch" | |
375 | "python-3-deterministic-build-info.patch" | |
376 | "python-3-search-paths.patch")) | |
717003e3 LC |
377 | (sha256 |
378 | (base32 | |
53453242 | 379 | "1ps5v323cp5czfshqjmbsqw7nvrdpcbk06f62jbzaqik4gfffii6")) |
d1659c0f | 380 | (modules '((guix build utils))) |
fd615918 | 381 | (snippet |
e46e9573 | 382 | '(begin |
d1659c0f MB |
383 | ;; Delete the bundled copy of libexpat. |
384 | (delete-file-recursively "Modules/expat") | |
b15d1c46 | 385 | (substitute* "Modules/Setup" |
d1659c0f MB |
386 | ;; Link Expat instead of embedding the bundled one. |
387 | (("^#pyexpat.*") "pyexpat pyexpat.c -lexpat\n")) | |
e46e9573 | 388 | #t)))) |
9b7e389d RW |
389 | (arguments |
390 | (substitute-keyword-arguments (package-arguments python-2) | |
e337061b | 391 | ((#:make-flags _) |
a5e9413c MC |
392 | `(list (string-append |
393 | (format #f "TESTOPTS=-j~d" (parallel-job-count)) | |
680bc34d MB |
394 | ;; test_mmap fails on low-memory systems. |
395 | " --exclude test_mmap" | |
396 | ;; test_socket may hang and eventually run out of memory | |
397 | ;; on some systems: <https://bugs.python.org/issue34587>. | |
5f1000d5 | 398 | " test_socket"))) |
9b7e389d | 399 | ((#:phases phases) |
a1454169 | 400 | `(modify-phases ,phases |
189bfb55 JN |
401 | ,@(if (hurd-system?) |
402 | `((delete 'patch-regen-for-hurd)) ;regen was removed after 3.5.9 | |
403 | '()) | |
c8a4e59a MB |
404 | ,@(if (hurd-target?) |
405 | ;; The build system refuses to cross-compile for unknown targets | |
406 | ;; even though it works fine. Add GNU/Hurd target. | |
407 | ;; TODO: Make it a patch in a future rebuild cycle. | |
408 | '((add-before 'configure 'support-hurd-cross-compile | |
409 | (lambda _ | |
410 | (substitute* "configure" | |
411 | (("\\*-\\*-vxworks.*" all) | |
412 | (string-append "*-*-gnu)\nac_sys_system=GNU\n;;\n" all))) | |
413 | #t))) | |
414 | '()) | |
680bc34d | 415 | (add-before 'check 'set-TZDIR |
ceb9de75 | 416 | (lambda* (#:key inputs native-inputs #:allow-other-keys) |
680bc34d MB |
417 | ;; test_email requires the Olson time zone database. |
418 | (setenv "TZDIR" | |
ceb9de75 MO |
419 | (string-append (assoc-ref |
420 | (or native-inputs inputs) "tzdata") | |
680bc34d MB |
421 | "/share/zoneinfo")) |
422 | #t)) | |
a1454169 MB |
423 | ;; Unset SOURCE_DATE_EPOCH while running the test-suite and set it |
424 | ;; again afterwards. See <https://bugs.python.org/issue34022>. | |
425 | (add-before 'check 'unset-SOURCE_DATE_EPOCH | |
426 | (lambda _ (unsetenv "SOURCE_DATE_EPOCH") #t)) | |
427 | (add-after 'check 'reset-SOURCE_DATE_EPOCH | |
428 | (lambda _ (setenv "SOURCE_DATE_EPOCH" "1") #t)) | |
d41f6394 | 429 | (replace 'rebuild-bytecode |
9b7e389d | 430 | (lambda* (#:key outputs #:allow-other-keys) |
9b7e389d | 431 | (let ((out (assoc-ref outputs "out"))) |
a422e247 MB |
432 | ;; Disable hash randomization to ensure the generated .pycs |
433 | ;; are reproducible. | |
434 | (setenv "PYTHONHASHSEED" "0") | |
9b7e389d RW |
435 | (for-each |
436 | (lambda (opt) | |
437 | (format #t "Compiling with optimization level: ~a\n" | |
438 | (if (null? opt) "none" (car opt))) | |
439 | (for-each (lambda (file) | |
440 | (apply invoke | |
57ec9861 MO |
441 | `(,,(if (%current-target-system) |
442 | "python3" | |
443 | '(string-append out | |
444 | "/bin/python3")) | |
445 | ,@opt | |
446 | "-m" "compileall" | |
447 | "-f" ; force rebuild | |
448 | ;; Don't build lib2to3, because it's Python 2 code. | |
449 | "-x" "lib2to3/.*" | |
450 | ,file))) | |
9b7e389d | 451 | (find-files out "\\.py$"))) |
b4291db2 | 452 | (list '() '("-O") '("-OO"))) |
3cff86db MB |
453 | #t))) |
454 | ;; XXX: Apply patch on ARM platforms only to avoid a full rebuild. | |
455 | ;; Remove this phase in the next rebuild cycle. | |
456 | ,@(let ((system (or (%current-target-system) | |
457 | (%current-system)))) | |
458 | (if (any (cute string-prefix? <> system) | |
459 | '("arm" "aarch64")) | |
460 | '((add-after 'unpack 'apply-alignment-patch | |
461 | (lambda* (#:key native-inputs inputs #:allow-other-keys) | |
462 | (invoke "patch" "-p1" "--force" "--input" | |
463 | (assoc-ref (or native-inputs inputs) | |
464 | "arm-alignment.patch"))))) | |
465 | '())))))) | |
680bc34d MB |
466 | (native-inputs |
467 | `(("tzdata" ,tzdata-for-tests) | |
3cff86db MB |
468 | |
469 | ;; Disable unaligned accesses in the sha3 module on ARM as | |
470 | ;; it causes a test failure when building 32-bit Python on a | |
471 | ;; 64-bit kernel. See <https://bugs.python.org/issue36515>. | |
472 | ;; TODO: make this a regular patch in the next rebuild cycle. | |
473 | ,@(let ((system (or (%current-target-system) | |
474 | (%current-system)))) | |
475 | (if (any (cute string-prefix? <> system) | |
476 | '("arm" "aarch64")) | |
477 | `(("arm-alignment.patch" ,(search-patch "python-3-arm-alignment.patch"))) | |
478 | '())) | |
479 | ||
ceb9de75 MO |
480 | ,@(if (%current-target-system) |
481 | `(("python3" ,this-package)) | |
482 | '()) | |
680bc34d | 483 | ,@(package-native-inputs python-2))) |
1aebc0cb AE |
484 | (native-search-paths |
485 | (list (search-path-specification | |
486 | (variable "PYTHONPATH") | |
0e05d01e SB |
487 | (files (list (string-append "lib/python" |
488 | (version-major+minor version) | |
489 | "/site-packages")))))))) | |
f26a77ff | 490 | |
45848023 | 491 | ;; Current 3.x version. |
b15d1c46 | 492 | (define-public python-3 python-3.8) |
45848023 HG |
493 | |
494 | ;; Current major version. | |
495 | (define-public python python-3) | |
496 | ||
95288fcc LC |
497 | ;; Minimal variants of Python, mostly used to break the cycle between Tk and |
498 | ;; Python (Tk -> libxcb -> Python.) | |
499 | ||
500 | (define-public python2-minimal | |
a55ebe2e | 501 | (package/inherit python-2 |
23c0d40e | 502 | (name "python2-minimal") |
02f0c3b2 | 503 | (outputs '("out")) |
5927a843 LC |
504 | |
505 | ;; Keep zlib, which is used by 'pip' (via the 'zipimport' module), which | |
506 | ;; is invoked upon 'make install'. 'pip' also expects 'ctypes' and thus | |
d1659c0f MB |
507 | ;; libffi. Expat is needed for XML support which is expected by a lot |
508 | ;; of libraries out there. | |
509 | (inputs `(("expat" ,expat) | |
510 | ("libffi" ,libffi) | |
5927a843 | 511 | ("zlib" ,zlib))))) |
95288fcc LC |
512 | |
513 | (define-public python-minimal | |
90aeaee8 | 514 | (package/inherit python |
95288fcc | 515 | (name "python-minimal") |
02f0c3b2 | 516 | (outputs '("out")) |
95288fcc | 517 | |
d0b73960 | 518 | ;; Build fails due to missing ctypes without libffi. |
95288fcc | 519 | ;; OpenSSL is a mandatory dependency of Python 3.x, for urllib; |
d1659c0f MB |
520 | ;; zlib is required by 'zipimport', used by pip. Expat is needed |
521 | ;; for XML support, which is generally expected to be available. | |
522 | (inputs `(("expat" ,expat) | |
523 | ("libffi" ,libffi) | |
d0b73960 | 524 | ("openssl" ,openssl) |
95288fcc LC |
525 | ("zlib" ,zlib))))) |
526 | ||
9c3f2c2e | 527 | (define-public python-debug |
90aeaee8 | 528 | (package/inherit python |
9c3f2c2e LC |
529 | (name "python-debug") |
530 | (outputs '("out" "debug")) | |
531 | (build-system gnu-build-system) | |
532 | (arguments | |
533 | (substitute-keyword-arguments (package-arguments python) | |
534 | ((#:configure-flags flags '()) | |
535 | `(cons "--with-pydebug" ,flags)))) | |
536 | (synopsis | |
537 | "High-level, dynamically-typed programming language (for debugging)") | |
538 | (description | |
539 | "This variant of Python provides an interpreter built with | |
540 | @code{--with-pydebug} to help develop and debug extensions. See | |
541 | @url{https://pythonextensionpatterns.readthedocs.io/en/latest/debugging/debug.html}, | |
542 | for more information."))) | |
543 | ||
64cb064c LC |
544 | (define* (wrap-python3 python |
545 | #:optional | |
546 | (name (string-append (package-name python) "-wrapper"))) | |
90aeaee8 | 547 | (package/inherit python |
95288fcc | 548 | (name name) |
898238b9 AE |
549 | (source #f) |
550 | (build-system trivial-build-system) | |
02f0c3b2 | 551 | (outputs '("out")) |
3969ca54 | 552 | (inputs `(("bash" ,bash))) |
3c0f2329 | 553 | (propagated-inputs `(("python" ,python))) |
898238b9 AE |
554 | (arguments |
555 | `(#:modules ((guix build utils)) | |
556 | #:builder | |
557 | (begin | |
558 | (use-modules (guix build utils)) | |
559 | (let ((bin (string-append (assoc-ref %outputs "out") "/bin")) | |
560 | (python (string-append (assoc-ref %build-inputs "python") "/bin/"))) | |
561 | (mkdir-p bin) | |
562 | (for-each | |
563 | (lambda (old new) | |
564 | (symlink (string-append python old) | |
565 | (string-append bin "/" new))) | |
3969ca54 SB |
566 | `("python3" ,"pydoc3" ,"idle3" ,"pip3") |
567 | `("python" ,"pydoc" ,"idle" ,"pip")) | |
568 | ;; python-config outputs search paths based upon its location, | |
569 | ;; use a bash wrapper to avoid changing its outputs. | |
570 | (let ((bash (string-append (assoc-ref %build-inputs "bash") | |
571 | "/bin/bash")) | |
572 | (old (string-append python "python3-config")) | |
573 | (new (string-append bin "/python-config"))) | |
574 | (with-output-to-file new | |
575 | (lambda () | |
576 | (format #t "#!~a~%" bash) | |
577 | (format #t "exec \"~a\" \"$@\"~%" old) | |
578 | (chmod new #o755) | |
579 | #t))))))) | |
0d56e3e1 LC |
580 | (synopsis "Wrapper for the Python 3 commands") |
581 | (description | |
582 | "This package provides wrappers for the commands of Python@tie{}3.x such | |
583 | that they can be invoked under their usual name---e.g., @command{python} | |
24244f3f PN |
584 | instead of @command{python3} or @command{pip} instead of @command{pip3}. |
585 | To function properly, this package should not be installed together with the | |
586 | @command{python} package."))) | |
0d56e3e1 | 587 | |
95288fcc LC |
588 | (define-public python-wrapper (wrap-python3 python)) |
589 | (define-public python-minimal-wrapper (wrap-python3 python-minimal)) | |
20801f9d EF |
590 | |
591 | (define-public micropython | |
592 | (package | |
593 | (name "micropython") | |
399d89b5 | 594 | (version "1.12") |
20801f9d EF |
595 | (source |
596 | (origin | |
597 | (method url-fetch) | |
598 | (uri (string-append "https://github.com/micropython/micropython/" | |
599 | "releases/download/v" version | |
600 | "/micropython-" version ".tar.gz")) | |
601 | (sha256 | |
602 | (base32 | |
399d89b5 | 603 | "1fl1dm2aay23hyqbarnv69qj7z2wljcvkwmvfwfac8yadcv05zcq")) |
20801f9d EF |
604 | (modules '((guix build utils))) |
605 | (snippet | |
606 | '(begin | |
607 | (delete-file-recursively "ports/cc3200/FreeRTOS") | |
608 | (with-directory-excursion "lib" | |
609 | ;; TODO: Unbundle axtls and berkley-db-1.xx | |
610 | (for-each delete-file-recursively | |
611 | '("libffi" "lwip" "stm32lib" "nrfx"))) | |
612 | #t)))) | |
613 | (build-system gnu-build-system) | |
614 | (arguments | |
615 | `(#:phases | |
616 | (modify-phases %standard-phases | |
399d89b5 EF |
617 | (add-before 'build 'build-mpy-cross |
618 | (lambda* (#:key make-flags #:allow-other-keys) | |
619 | (with-directory-excursion "mpy-cross" | |
620 | (apply invoke "make" make-flags)))) | |
621 | (add-after 'build-mpy-cross 'prepare-build | |
20801f9d EF |
622 | (lambda _ |
623 | (chdir "ports/unix") | |
624 | ;; see: https://github.com/micropython/micropython/pull/4246 | |
625 | (substitute* "Makefile" | |
626 | (("-Os") "-Os -ffp-contract=off")) | |
627 | #t)) | |
628 | (replace 'install-license-files | |
629 | ;; We don't build in the root directory so the file isn't found. | |
630 | (lambda* (#:key outputs #:allow-other-keys) | |
631 | (let* ((out (assoc-ref outputs "out")) | |
632 | (dest (string-append out "/share/doc/" ,name "-" ,version "/"))) | |
633 | (install-file "../../LICENSE" dest)) | |
634 | #t)) | |
635 | (delete 'configure)) ; no configure | |
636 | #:make-flags (list (string-append "PREFIX=" (assoc-ref %outputs "out")) | |
637 | "V=1") | |
638 | #:test-target "test")) | |
639 | (native-inputs | |
640 | `(("pkg-config" ,pkg-config) | |
641 | ("python" ,python-wrapper))) | |
642 | (inputs | |
643 | `(("libffi" ,libffi))) | |
644 | (home-page "https://micropython.org/") | |
645 | (synopsis "Python implementation for microcontrollers and constrained systems") | |
646 | (description "MicroPython is a lean and efficient implementation of the | |
647 | Python 3 programming language that includes a small subset of the Python | |
648 | standard library and is optimised to run on microcontrollers and in constrained | |
649 | environments. MicroPython is packed full of advanced features such as an | |
650 | interactive prompt, arbitrary precision integers, closures, list comprehension, | |
651 | generators, exception handling and more. Still it is compact enough to fit and | |
652 | run within just 256k of code space and 16k of RAM. MicroPython aims to be as | |
653 | compatible with normal Python as possible to allow you to transfer code with | |
654 | ease from the desktop to a microcontroller or embedded system.") | |
655 | (license license:expat))) | |
625cdb05 LDB |
656 | |
657 | (define-public pypy3 | |
658 | (package | |
659 | (name "pypy3") | |
660 | (version "7.3.1") | |
661 | (source (origin | |
662 | (method url-fetch) | |
663 | (uri (string-append "https://bitbucket.org/pypy/pypy/downloads/" ; | |
664 | "pypy3.6-v" version "-src.tar.bz2")) | |
665 | (sha256 | |
666 | (base32 | |
667 | "10zsk8jby8j6visk5mzikpb1cidvz27qq4pfpa26jv53klic6b0c")) | |
668 | (patches (search-patches "pypy3-7.3.1-fix-tests.patch")))) | |
669 | (build-system gnu-build-system) | |
670 | (native-inputs | |
671 | `(("python-2" ,python-2) | |
672 | ("pkg-config" ,pkg-config) | |
673 | ("tar" ,tar) ; Required for package.py | |
674 | ("python2-pycparser" ,python2-pycparser) | |
675 | ("python2-hypothesis" ,python2-hypothesis) | |
676 | ("nss-certs" ,nss-certs) ; For ssl tests | |
677 | ("gzip" ,gzip))) | |
678 | (inputs | |
679 | `(("libffi" ,libffi) | |
680 | ("zlib" ,zlib) | |
681 | ("ncurses" ,ncurses) | |
682 | ("openssl" ,openssl) | |
683 | ("expat" ,expat) | |
684 | ("bzip2" ,bzip2) | |
685 | ("sqlite" ,sqlite) | |
686 | ("gdbm" ,gdbm) | |
687 | ("tcl" ,tcl) | |
688 | ("tk" ,tk) | |
689 | ("glibc" ,glibc) | |
690 | ("bash-minimal" ,bash-minimal) ; Used as /bin/sh | |
691 | ("xz" ,xz))) ; liblzma | |
692 | (arguments | |
693 | `(#:tests? #f ;FIXME: Disabled for now, there are many tests failing. | |
694 | #:modules ((ice-9 ftw) (ice-9 match) | |
695 | (guix build utils) (guix build gnu-build-system)) | |
696 | #:phases (modify-phases %standard-phases | |
697 | (delete 'configure) | |
698 | (add-after 'unpack 'patch-source | |
699 | (lambda* (#:key inputs outputs #:allow-other-keys) | |
700 | (substitute* '("rpython/rlib/clibffi.py") | |
701 | ;; find_library does not work for libc | |
702 | (("ctypes\\.util\\.find_library\\('c'\\)") "'libc.so'")) | |
703 | (substitute* '("lib_pypy/cffi/_pycparser/ply/cpp.py") | |
704 | ;; Make reproducible (XXX: unused?) | |
705 | (("time\\.localtime\\(\\)") "time.gmtime(0)")) | |
706 | (substitute* '("pypy/module/sys/version.py") | |
707 | ;; Make reproducible | |
708 | (("t\\.gmtime\\(\\)") "t.gmtime(0)")) | |
709 | (substitute* '("lib_pypy/_tkinter/tklib_build.py") | |
710 | ;; Link to versioned libtcl and libtk | |
711 | (("linklibs = \\['tcl', 'tk'\\]") | |
712 | "linklibs = ['tcl8.6', 'tk8.6']") | |
713 | (("incdirs = \\[\\]") | |
714 | (string-append "incdirs = ['" | |
715 | (assoc-ref inputs "tcl") | |
716 | "/include', '" | |
717 | (assoc-ref inputs "tk") | |
718 | "/include']"))) | |
719 | (substitute* '("lib_pypy/_curses_build.py") | |
720 | ;; Find curses | |
721 | (("/usr/local") (assoc-ref inputs "ncurses"))) | |
722 | (substitute* '("lib_pypy/_sqlite3_build.py") | |
723 | ;; Always use search paths | |
724 | (("sys\\.platform\\.startswith\\('freebsd'\\)") "True") | |
725 | ;; Find sqlite3 | |
726 | (("/usr/local") (assoc-ref inputs "sqlite")) | |
727 | (("libname = 'sqlite3'") | |
728 | (string-append "libname = '" | |
729 | (assoc-ref inputs "sqlite") | |
730 | "/lib/libsqlite3.so.0'"))) | |
731 | (substitute* '("lib-python/3/subprocess.py") | |
732 | ;; Fix shell path | |
733 | (("/bin/sh") | |
734 | (string-append (assoc-ref inputs "bash-minimal") "/bin/sh"))) | |
735 | (substitute* '("lib-python/3/distutils/unixccompiler.py") | |
736 | ;; gcc-toolchain does not provide symlink cc -> gcc | |
737 | (("\"cc\"") "\"gcc\"")) | |
738 | #t)) | |
739 | (add-after | |
740 | 'unpack 'set-source-file-times-to-1980 | |
741 | ;; copied from python package, required by zip testcase | |
742 | (lambda _ | |
743 | (let ((circa-1980 (* 10 366 24 60 60))) | |
744 | (ftw "." (lambda (file stat flag) | |
745 | (utime file circa-1980 circa-1980) | |
746 | #t)) | |
747 | #t))) | |
748 | (replace 'build | |
749 | (lambda* (#:key inputs #:allow-other-keys) | |
750 | (with-directory-excursion "pypy/goal" | |
751 | ;; Build with jit optimization. | |
752 | (invoke "python2" | |
753 | "../../rpython/bin/rpython" | |
754 | (string-append "--make-jobs=" | |
755 | (number->string (parallel-job-count))) | |
756 | "-Ojit" | |
757 | "targetpypystandalone")) | |
758 | ;; Build c modules and package everything, so tests work. | |
759 | (with-directory-excursion "pypy/tool/release" | |
760 | (unsetenv "PYTHONPATH") ; Do not use the system’s python libs: | |
761 | ; AttributeError: module 'enum' has no | |
762 | ; attribute 'IntFlag' | |
763 | (invoke "python2" "package.py" | |
764 | "--archive-name" "pypy-dist" | |
765 | "--builddir" (getcwd))))) | |
766 | (replace 'check | |
767 | (lambda* (#:key tests? #:allow-other-keys) | |
768 | (if tests? | |
769 | (begin | |
770 | (setenv "HOME" "/tmp") ; test_with_pip tries to | |
771 | ; access ~/.cache/pip | |
772 | ;; Run library tests only (no interpreter unit | |
773 | ;; tests). This is what Gentoo does. | |
774 | (invoke | |
775 | "python2" | |
776 | "pypy/test_all.py" | |
777 | "--pypy=pypy/tool/release/pypy-dist/bin/pypy3" | |
778 | "lib-python")) | |
779 | (format #t "test suite not run~%")) | |
780 | #t)) | |
781 | (replace 'install | |
782 | (lambda* (#:key inputs outputs #:allow-other-keys) | |
783 | (with-directory-excursion "pypy/tool/release" | |
784 | ;; Delete test data. | |
785 | (for-each | |
786 | (lambda (x) | |
787 | (delete-file-recursively (string-append | |
788 | "pypy-dist/lib-python/3/" x))) | |
789 | '("tkinter/test" | |
790 | "test" | |
791 | "sqlite3/test" | |
792 | "lib2to3/tests" | |
793 | "idlelib/idle_test" | |
794 | "distutils/tests" | |
795 | "ctypes/test" | |
796 | "unittest/test")) | |
797 | ;; Patch shebang referencing python2 | |
798 | (substitute* '("pypy-dist/lib-python/3/cgi.py" | |
799 | "pypy-dist/lib-python/3/encodings/rot_13.py") | |
800 | (("#!.+/bin/python") | |
801 | (string-append "#!" (assoc-ref outputs "out") "/bin/pypy3"))) | |
802 | (with-fluids ((%default-port-encoding "ISO-8859-1")) | |
803 | (substitute* '("pypy-dist/lib_pypy/_md5.py" | |
804 | "pypy-dist/lib_pypy/_sha1.py") | |
805 | (("#!.+/bin/python") | |
806 | (string-append "#!" (assoc-ref outputs "out") "/bin/pypy3")))) | |
807 | (copy-recursively "pypy-dist" (assoc-ref outputs "out"))) | |
808 | #t))))) | |
809 | (home-page "https://www.pypy.org/") | |
810 | (synopsis "Python implementation with just-in-time compilation") | |
811 | (description "PyPy is a faster, alternative implementation of the Python | |
812 | programming language employing a just-in-time compiler. It supports most | |
813 | Python code natively, including C extensions.") | |
814 | (license (list license:expat ; pypy itself; _pytest/ | |
815 | license:psfl ; python standard library in lib-python/ | |
816 | license:asl2.0 ; dotviewer/font/ and some of lib-python/ | |
817 | license:gpl3+ ; ./rpython/rlib/rvmprof/src/shared/libbacktrace/dwarf2.* | |
818 | license:bsd-3 ; lib_pypy/cffi/_pycparser/ply/ | |
819 | (license:non-copyleft | |
820 | "http://www.unicode.org/copyright.html"))))) | |
821 |