From 84dee61d6363ab52dd97c9ed0c795bea21b8c541 Mon Sep 17 00:00:00 2001 From: Maxim Cournoyer Date: Wed, 8 Oct 2025 23:29:17 +0900 Subject: [PATCH] gnu: Add pypy2. * gnu/packages/pypy.scm (pypy2): New variable. Change-Id: Ie13e63b037f6bb515683502310a3c1be748252cc --- gnu/packages/pypy.scm | 159 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 158 insertions(+), 1 deletion(-) diff --git a/gnu/packages/pypy.scm b/gnu/packages/pypy.scm index dc602d21a9e0143b590e311b197c3da5cadd06f1..886450edbcdc1222967d5ab4f2c5b0d1e7907ad6 100644 --- a/gnu/packages/pypy.scm +++ b/gnu/packages/pypy.scm @@ -1,7 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2021 Lars-Dominik Braun ;;; Copyright © 2021 Ludovic Courtès -;;; Copyright © 2021, 2022 Maxim Cournoyer +;;; Copyright © 2021, 2022, 2025 Maxim Cournoyer ;;; Copyright © 2021 Leo Famulari ;;; Copyright © 2025 Laura Kirsch ;;; @@ -38,8 +38,165 @@ #:use-module (guix gexp) #:use-module (guix packages) #:use-module (guix download) + #:use-module (guix utils) #:use-module (guix build-system gnu)) +;;; This Python 2 alternative implementation is useful for allowing faster +;;; iterations on the development of Pypy 3. +(define-public pypy2 + (package + (name "pypy2") + (version "7.3.20") + (source (origin + (method url-fetch) + (uri (string-append "https://downloads.python.org/pypy/" + "pypy2.7-v" version "-src.tar.bz2")) + (sha256 + (base32 + "0qiyd9bajxyzh4j5swk14iwyh4b7pn38sg3j721zfysz8jc895dz")))) + (build-system gnu-build-system) + (arguments + (list + #:modules '((ice-9 ftw) (ice-9 match) + (guix build utils) (guix build gnu-build-system)) + ;; The stdlib tests do not all pass, this is known and tracked upstream + ;; on their buildbot instance, for example at: + ;; . That's also true + ;; for Pypy 3. The tests are also disabled to avoid having to package + ;; extra Python 2 dependencies like python2-hypothesis. + #:tests? #f + ;; XXX: ELF file 'pypy.debug' makes 'validate-needed-in-runpath' throw: + ;; . + #:validate-runpath? #f + #:phases + #~(modify-phases %standard-phases + (delete 'configure) + (add-after 'unpack 'patch-source + (lambda* (#:key inputs #:allow-other-keys) + (substitute* '("rpython/rlib/clibffi.py") + ;; find_library does not work for libc + (("ctypes\\.util\\.find_library\\('c'\\)") "'libc.so'")) + (substitute* '("lib_pypy/cffi/_pycparser/ply/cpp.py") + ;; Make reproducible (XXX: unused?) + (("time\\.localtime\\(\\)") "time.gmtime(0)")) + (substitute* '("pypy/module/sys/version.py") + ;; Make reproducible + (("t\\.gmtime\\(\\)") "t.gmtime(0)")) + (substitute* '("lib_pypy/_tkinter/tklib_build.py") + ;; Link to versioned libtcl and libtk + (("linklibs = \\['tcl', 'tk'\\]") + "linklibs = ['tcl8.6', 'tk8.6']") + (("incdirs = \\[\\]") + (string-append + "incdirs = ['" + #$(this-package-input "tcl") "/include', '" + #$(this-package-input "tk") "/include']"))) + (substitute* '("lib_pypy/_curses_build.py") + ;; Find curses + (("/usr/local") + #$(this-package-input "ncurses"))) + (substitute* '("lib_pypy/dbm.py") + ;; Use gdbm compat library, so we don’t need to pull + ;; in bdb. + (("ctypes.util.find_library\\('db'\\)") + (format #f "~s" (search-input-file + inputs "lib/libgdbm_compat.so")))) + (substitute* '("lib_pypy/_sqlite3_build.py") + ;; Always use search paths + (("sys\\.platform\\.startswith\\('freebsd'\\)") "True") + ;; Find sqlite3 + (("/usr/local") (assoc-ref inputs "sqlite")) + (("libname = 'sqlite3'") + (format #f "libname = ~s" + (search-input-file inputs "lib/libsqlite3.so.0")))) + (substitute* '("lib-python/2.7/subprocess.py") + ;; Fix shell path + (("/bin/sh") + (search-input-file inputs "/bin/sh"))) + (substitute* '("lib-python/2.7/distutils/unixccompiler.py") + ;; gcc-toolchain does not provide symlink cc -> gcc + (("\"cc\"") (format #f "~s" #$(cc-for-target)))) + (substitute* "lib-python/2.7/distutils/sysconfig_pypy.py" + (("\"cc ") + (string-append "\"" #$(cc-for-target) " "))))) + (add-after 'unpack 'set-source-file-times-to-1980 + ;; copied from python package, required by zip testcase + (lambda _ + (let ((circa-1980 (* 10 366 24 60 60))) + (ftw "." (lambda (file stat flag) + (utime file circa-1980 circa-1980) + #t))))) + (replace 'build + (lambda _ + (setenv "CC" #$(cc-for-target)) + (with-directory-excursion "pypy/goal" + ;; Build with jit optimization. + (invoke "python2" + "../../rpython/bin/rpython" + (string-append "--cc=" #$(cc-for-target)) + (string-append "--make-jobs=" + (number->string (parallel-job-count))) + "-Ojit" + "targetpypystandalone" + "--allworkingmodules")) + ;; Build c modules and package everything, so tests work. + (with-directory-excursion "pypy/tool/release" + (invoke "python2" "package.py" + "--archive-name" "pypy-dist" + "--builddir" (getcwd))))) + (replace 'install + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((bin-pypy2 (string-append #$output "/bin/pypy2")) + (shebang-match-python "#!.+/bin/python") + (shebang-pypy2 (string-append "#!" bin-pypy2)) + (dist-dir "pypy/tool/release/pypy-dist")) + (with-directory-excursion dist-dir + ;; Delete test data. + (for-each + (lambda (x) + (delete-file-recursively (string-append + "lib-python/2.7/" x))) + '("lib-tk/test" + "test" + "lib2to3/tests" + "idlelib/idle_test" + "distutils/tests" + "ctypes/test" + "unittest/test")) + ;; Patch shebang referencing python. + (substitute* '("lib-python/2.7/cgi.py" + "lib-python/2.7/encodings/rot_13.py") + ((shebang-match-python) shebang-pypy2))) + (copy-recursively dist-dir #$output))))))) + (native-inputs + (list nss-certs ; For ssl tests + pkg-config + python-2 + python2-cffi)) + (inputs + (list bzip2 + expat + gdbm + libffi-pic + ncurses + openssl + sqlite + tcl + tk + zlib)) + (home-page "https://www.pypy.org/") + (synopsis "Python implementation with just-in-time compilation") + (description "PyPy is a faster, alternative implementation of the Python +programming language employing a just-in-time compiler. It supports most +Python code natively, including C extensions.") + (license (list license:expat ; pypy itself; _pytest/ + license:psfl ; python standard library in lib-python/ + license:asl2.0 ; dotviewer/font/ and some of lib-python/ + license:gpl3+ ; ./rpython/rlib/rvmprof/src/shared/libbacktrace/dwarf2.* + license:bsd-3 ; lib_pypy/cffi/_pycparser/ply/ + (license:non-copyleft + "http://www.unicode.org/copyright.html"))))) + (define-public pypy (package (name "pypy")