commit:     bd5773dfbc5239b498a994d96cb87c8fd6f815fa
Author:     Vic Kerr <wikky <AT> memleek <DOT> org>
AuthorDate: Thu Jul 25 08:03:34 2024 +0000
Commit:     orbea <orbea <AT> riseup <DOT> net>
CommitDate: Thu Jul 25 18:01:38 2024 +0000
URL:        https://gitweb.gentoo.org/repo/proj/libressl.git/commit/?id=bd5773df

dev-python/pypy3_10: new package

Most patches are from OpenBSD:
https://github.com/openbsd/ports/tree/master/lang/pypy/patches

The rest are for compatibility with pypy 7.3.16 and libressl 3.9.2.

Signed-off-by: Vic Kerr <wikky <AT> memleek.org>
Closes: https://github.com/gentoo/libressl/pull/567
Signed-off-by: orbea <orbea <AT> riseup.net>

 dev-python/pypy3_10/Manifest                       |   2 +
 .../pypy3_10/files/pypy3_10-7.3.16-libressl.patch  | 276 +++++++++++++++++++++
 dev-python/pypy3_10/metadata.xml                   |  18 ++
 dev-python/pypy3_10/pypy3_10-7.3.16.ebuild         | 213 ++++++++++++++++
 4 files changed, 509 insertions(+)

diff --git a/dev-python/pypy3_10/Manifest b/dev-python/pypy3_10/Manifest
new file mode 100644
index 0000000..98534aa
--- /dev/null
+++ b/dev-python/pypy3_10/Manifest
@@ -0,0 +1,2 @@
+DIST pypy3.10-gentoo-patches-7.3.16.tar.xz 4752 BLAKE2B 
a5cd87f30c0b20bf5d49c3b5c979c12231d6b67750e777d4488093094d5998e6f0d9adba51c04704eb31d621089aeb12ee5a6b0a58dad0ecda0d60d2ecbdab6d
 SHA512 
e2779841a3e56e384134416ce2a10e1e00a11d7c720023506370fb9f54363da6b7300b4019c121aa1874152b62d9679ebcd3dd679fd0dbd2bf524520990b6f38
+DIST pypy3.10-v7.3.16-src.tar.bz2 23358556 BLAKE2B 
4eddae47dea1005b9450b9d3d23bd90782dffecdc252eff4fd3195a61e0e7ebbdafaf4c4b5d318c88534f152c1110c3bc4f76f43a7e711a859dd4330841a0e0b
 SHA512 
5b941e3b5c7b0c7a50413e16122bad3e167dcc4ee159ce53e9716e9d5af79d600823f3d7442b7562bb568ff027723e22904fc0840dc06bd26e3da38c93cc5b94

diff --git a/dev-python/pypy3_10/files/pypy3_10-7.3.16-libressl.patch 
b/dev-python/pypy3_10/files/pypy3_10-7.3.16-libressl.patch
new file mode 100644
index 0000000..47a905e
--- /dev/null
+++ b/dev-python/pypy3_10/files/pypy3_10-7.3.16-libressl.patch
@@ -0,0 +1,276 @@
+LibreSSL defines OPENSSL_NO_ENGINE yet provides some ENGINE symbols.
+I am not sure about the value of Cryptography_HAS_ENGINE in this case but at 
least this prevents symbol collisions.
+
+diff -u a/lib_pypy/_cffi_ssl/_cffi_src/openssl/engine.py 
b/lib_pypy/_cffi_ssl/_cffi_src/openssl/engine.py
+--- a/lib_pypy/_cffi_ssl/_cffi_src/openssl/engine.py   2024-04-21 
01:03:52.000000000 +0000
++++ b/lib_pypy/_cffi_ssl/_cffi_src/openssl/engine.py   2024-07-17 
07:40:07.395339433 +0000
+@@ -30,6 +30,7 @@
+ CUSTOMIZATIONS = """
+ #ifdef OPENSSL_NO_ENGINE
+ static const long Cryptography_HAS_ENGINE = 0;
++#ifndef CRYPTOGRAPHY_IS_LIBRESSL
+ 
+ ENGINE *(*ENGINE_by_id)(const char *) = NULL;
+ int ENGINE_init(ENGINE *);
+@@ -34,9 +34,11 @@
+ ENGINE *(*ENGINE_by_id)(const char *) = NULL;
+ int (*ENGINE_init)(ENGINE *) = NULL;
+ int (*ENGINE_finish)(ENGINE *) = NULL;
++#endif
+ ENGINE *(*ENGINE_get_default_RAND)(void) = NULL;
+ int (*ENGINE_set_default_RAND)(ENGINE *) = NULL;
+ void (*ENGINE_unregister_RAND)(ENGINE *) = NULL;
++#ifndef CRYPTOGRAPHY_IS_LIBRESSL
+ int (*ENGINE_ctrl_cmd)(ENGINE *, const char *, long, void *,
+                        void (*)(void), int) = NULL;
+ 
+@@ -47,6 +47,7 @@
+ const char *(*ENGINE_get_id)(const ENGINE *) = NULL;
+ const char *(*ENGINE_get_name)(const ENGINE *) = NULL;
+ 
++#endif
+ #else
+ static const long Cryptography_HAS_ENGINE = 1;
+ #endif
+diff -ru pypy2.7-v7.3.16-src/lib_pypy/_cffi_ssl/_cffi_src/openssl/err.py 
b/lib_pypy/_cffi_ssl/_cffi_src/openssl/err.py
+--- pypy2.7-v7.3.16-src/lib_pypy/_cffi_ssl/_cffi_src/openssl/err.py    
2024-04-21 01:03:52.000000000 +0000
++++ b/lib_pypy/_cffi_ssl/_cffi_src/openssl/err.py      2024-07-19 
12:51:27.645284720 +0000
+@@ -232,5 +232,10 @@
+ static const int ERR_LIB_OSSL_ENCODER = -42;
+ static const int ERR_LIB_PROP = -42;
+ static const int ERR_LIB_PROV = -42;
++#ifdef CRYPTOGRAPHY_IS_LIBRESSL
++static const int ERR_LIB_ASYNC = -42;
++static const int ERR_LIB_OSSL_STORE = -42;
++static const int ERR_LIB_SM2 = -42;
++#endif
+ #endif
+ """
+LibreSSL now provides OPENSSL_cleanup()
+
+Index: lib_pypy/_cffi_ssl/_cffi_src/openssl/crypto.py
+--- a/lib_pypy/_cffi_ssl/_cffi_src/openssl/crypto.py
++++ b/lib_pypy/_cffi_ssl/_cffi_src/openssl/crypto.py
+@@ -92,9 +92,7 @@ static const long Cryptography_HAS_LOCKING_CALLBACKS =
+ #endif
+ 
+ #if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110
+-static const long Cryptography_HAS_OPENSSL_CLEANUP = 0;
+-
+-void (*OPENSSL_cleanup)(void) = NULL;
++static const long Cryptography_HAS_OPENSSL_CLEANUP = 1;
+ 
+ /* This function has a significantly different signature pre-1.1.0. since it 
is
+  * for testing only, we don't bother to expose it on older OpenSSLs.
+Adapt for Certificate Transparency support in LibreSSL 3.5
+
+Index: lib_pypy/_cffi_ssl/_cffi_src/openssl/ct.py
+--- a/lib_pypy/_cffi_ssl/_cffi_src/openssl/ct.py
++++ b/lib_pypy/_cffi_ssl/_cffi_src/openssl/ct.py
+@@ -5,7 +5,7 @@
+ from __future__ import absolute_import, division, print_function
+ 
+ INCLUDES = """
+-#if CRYPTOGRAPHY_OPENSSL_110_OR_GREATER
++#if CRYPTOGRAPHY_OPENSSL_110_OR_GREATER || CRYPTOGRAPHY_IS_LIBRESSL
+ #include <openssl/ct.h>
+ 
+ typedef STACK_OF(SCT) Cryptography_STACK_OF_SCT;
+@@ -65,7 +65,7 @@ int SCT_set_log_entry_type(SCT *, ct_log_entry_type_t)
+ """
+ 
+ CUSTOMIZATIONS = """
+-#if CRYPTOGRAPHY_OPENSSL_110_OR_GREATER
++#if CRYPTOGRAPHY_OPENSSL_110_OR_GREATER || CRYPTOGRAPHY_IS_LIBRESSL
+ static const long Cryptography_HAS_SCT = 1;
+ #else
+ static const long Cryptography_HAS_SCT = 0;
+Do not redefine a constant available in LibreSSL's headers.
+
+Index: lib_pypy/_cffi_ssl/_cffi_src/openssl/dh.py
+--- a/lib_pypy/_cffi_ssl/_cffi_src/openssl/dh.py
++++ b/lib_pypy/_cffi_ssl/_cffi_src/openssl/dh.py
+@@ -110,7 +110,7 @@ int DH_set0_key(DH *dh, BIGNUM *pub_key, BIGNUM *priv_
+ }
+ #endif
+ 
+-#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110
++#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110 && !CRYPTOGRAPHY_LIBRESSL_27_OR_GREATER
+ #ifndef DH_CHECK_Q_NOT_PRIME
+ #define DH_CHECK_Q_NOT_PRIME            0x10
+ #endif
+Index: lib_pypy/_cffi_ssl/_cffi_src/openssl/evp.py
+--- a/lib_pypy/_cffi_ssl/_cffi_src/openssl/evp.py
++++ b/lib_pypy/_cffi_ssl/_cffi_src/openssl/evp.py
+@@ -212,10 +212,11 @@ int (*EVP_PKEY_set1_tls_encodedpoint)(EVP_PKEY *, cons
+ #endif
+ 
+ #if CRYPTOGRAPHY_OPENSSL_LESS_THAN_111
+-static const long Cryptography_HAS_ONESHOT_EVP_DIGEST_SIGN_VERIFY = 0;
+-static const long Cryptography_HAS_RAW_KEY = 0;
+ static const long Cryptography_HAS_EVP_DIGESTFINAL_XOF = 0;
+ int (*EVP_DigestFinalXOF)(EVP_MD_CTX *, unsigned char *, size_t) = NULL;
++#if defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x3070000fL
++static const long Cryptography_HAS_RAW_KEY = 0;
++static const long Cryptography_HAS_ONESHOT_EVP_DIGEST_SIGN_VERIFY = 0;
+ int (*EVP_DigestSign)(EVP_MD_CTX *, unsigned char *, size_t *,
+                       const unsigned char *tbs, size_t) = NULL;
+ int (*EVP_DigestVerify)(EVP_MD_CTX *, const unsigned char *, size_t,
+@@ -228,6 +229,10 @@ int (*EVP_PKEY_get_raw_private_key)(const EVP_PKEY *, 
+                                     size_t *) = NULL;
+ int (*EVP_PKEY_get_raw_public_key)(const EVP_PKEY *, unsigned char *,
+                                    size_t *) = NULL;
++#else
++static const long Cryptography_HAS_ONESHOT_EVP_DIGEST_SIGN_VERIFY = 1;
++static const long Cryptography_HAS_RAW_KEY = 1;
++#endif
+ #else
+ static const long Cryptography_HAS_ONESHOT_EVP_DIGEST_SIGN_VERIFY = 1;
+ static const long Cryptography_HAS_RAW_KEY = 1;
+Fix build with opaque OCSP in LibreSSL 3.5.
+
+Index: lib_pypy/_cffi_ssl/_cffi_src/openssl/ocsp.py
+--- a/lib_pypy/_cffi_ssl/_cffi_src/openssl/ocsp.py
++++ b/lib_pypy/_cffi_ssl/_cffi_src/openssl/ocsp.py
+@@ -109,7 +109,7 @@ struct ocsp_basic_response_st {
+ };
+ #endif
+ 
+-#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110
++#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110 && LIBRESSL_VERSION_NUMBER < 
0x3050000fL
+ /* These functions are all taken from ocsp_cl.c in OpenSSL 1.1.0 */
+ const OCSP_CERTID *OCSP_SINGLERESP_get0_id(const OCSP_SINGLERESP *single)
+ {
+@@ -148,7 +148,7 @@ const ASN1_OCTET_STRING *OCSP_resp_get0_signature(cons
+ }
+ #endif
+ 
+-#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110J
++#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110J && LIBRESSL_VERSION_NUMBER < 
0x3050000fL
+ const X509_ALGOR *OCSP_resp_get0_tbs_sigalg(const OCSP_BASICRESP *bs)
+ {
+ #if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110
+Fix build with opaque SSL_CTX and COMP_METHOD and do not redefine
+DTLSv1.2 and TLSv1.3 related defined vailable in recent LibreSSL versions.
+
++ SSL_CTX_*_min_proto_version
+Index: lib_pypy/_cffi_ssl/_cffi_src/openssl/ssl.py
+--- a/lib_pypy/_cffi_ssl/_cffi_src/openssl/ssl.py
++++ b/lib_pypy/_cffi_ssl/_cffi_src/openssl/ssl.py
+@@ -552,7 +552,7 @@ int SSL_CTX_set_max_early_data(SSL_CTX *, uint32_t);
+ CUSTOMIZATIONS = """
+ /* Added in 1.0.2 but we need it in all versions now due to the great
+    opaquing. */
+-#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_102
++#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_102 && !CRYPTOGRAPHY_IS_LIBRESSL
+ /* from ssl/ssl_lib.c */
+ const SSL_METHOD *SSL_CTX_get_ssl_method(SSL_CTX *ctx) {
+     return ctx->method;
+@@ -729,8 +729,6 @@ const SSL_METHOD *(*DTLS_client_method)(void) = NULL;
+ static const long Cryptography_HAS_GENERIC_DTLS_METHOD = 1;
+ #endif
+ #if CRYPTOGRAPHY_OPENSSL_LESS_THAN_102
+-static const long SSL_OP_NO_DTLSv1 = 0;
+-static const long SSL_OP_NO_DTLSv1_2 = 0;
+ long (*DTLS_set_link_mtu)(SSL *, long) = NULL;
+ long (*DTLS_get_link_min_mtu)(SSL *) = NULL;
+ #endif
+@@ -836,7 +834,7 @@ static const long Cryptography_HAS_CIPHER_DETAILS = 0;
+ static const long Cryptography_HAS_CIPHER_DETAILS = 1;
+ #endif
+ 
+-#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_111
++#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_111 && !CRYPTOGRAPHY_IS_LIBRESSL
+ static const long Cryptography_HAS_TLSv1_3 = 0;
+ static const long SSL_OP_NO_TLSv1_3 = 0;
+ static const long SSL_VERIFY_POST_HANDSHAKE = 0;
+Index: lib_pypy/_cffi_ssl/_cffi_src/openssl/x509name.py
+--- a/lib_pypy/_cffi_ssl/_cffi_src/openssl/x509name.py
++++ b/lib_pypy/_cffi_ssl/_cffi_src/openssl/x509name.py
+@@ -75,7 +75,7 @@ Cryptography_STACK_OF_X509_NAME_ENTRY *sk_X509_NAME_EN
+ """
+ 
+ CUSTOMIZATIONS = """
+-#if CRYPTOGRAPHY_OPENSSL_110_OR_GREATER
++#if CRYPTOGRAPHY_OPENSSL_110_OR_GREATER || defined(LIBRESSL_VERSION_NUMBER)
+ int Cryptography_X509_NAME_ENTRY_set(X509_NAME_ENTRY *ne) {
+     return X509_NAME_ENTRY_set(ne);
+ }
+Index: lib_pypy/_cffi_ssl/_cffi_src/openssl/x509.py
+--- a/lib_pypy/_cffi_ssl/_cffi_src/openssl/x509.py
++++ b/lib_pypy/_cffi_ssl/_cffi_src/openssl/x509.py
+@@ -282,7 +282,7 @@ int X509_get_signature_nid(const X509 *x)
+ 
+ /* Added in 1.0.2 but we need it in all versions now due to the great
+    opaquing. */
+-#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_102
++#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_102 && !defined(LIBRESSL_VERSION_NUMBER)
+ /* from x509/x_x509.c */
+ int i2d_re_X509_tbs(X509 *x, unsigned char **pp)
+ {
+@@ -308,7 +308,7 @@ X509_REVOKED *Cryptography_X509_REVOKED_dup(X509_REVOK
+ 
+ /* Added in 1.1.0 but we need it in all versions now due to the great
+    opaquing. */
+-#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110
++#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110 && !defined(LIBRESSL_VERSION_NUMBER)
+ int i2d_re_X509_REQ_tbs(X509_REQ *req, unsigned char **pp)
+ {
+     req->req_info->enc.modified = 1;
+diff -ru a/lib_pypy/_cffi_ssl/_cffi_src/openssl/ssl.py 
b/lib_pypy/_cffi_ssl/_cffi_src/openssl/ssl.py
+--- a/lib_pypy/_cffi_ssl/_cffi_src/openssl/ssl.py      2024-07-19 
10:38:37.482873478 +0000
++++ b/lib_pypy/_cffi_ssl/_cffi_src/openssl/ssl.py      2024-07-19 
10:41:18.411921508 +0000
+@@ -153,10 +153,6 @@
+ static const long SSL3_RT_HANDSHAKE;
+ static const long SSL3_RT_APPLICATION_DATA;
+ 
+-static const long SSL3_RT_HEADER;
+-static const long SSL3_RT_INNER_CONTENT_TYPE;
+-
+-static const long SSL3_MT_CHANGE_CIPHER_SPEC;
+ 
+ typedef ... SSL_METHOD;
+ typedef ... SSL_CTX;
+@@ -577,7 +577,7 @@
+ """
+ 
+ CUSTOMIZATIONS = """
+-#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_102
++#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_102 && !CRYPTOGRAPHY_IS_LIBRESSL
+ #error Python 3.7 requires OpenSSL >= 1.0.2
+ #endif
+ 
+@@ -739,7 +739,7 @@
+ int (*SSL_get_min_proto_version)(SSL *ssl) = NULL;
+ int (*SSL_get_max_proto_version)(SSL *ssl) = NULL;
+ #endif
+-#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110
++#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_110 && !CRYPTOGRAPHY_IS_LIBRESSL
+ int (*SSL_CTX_set_min_proto_version)(SSL_CTX *ctx, int version) = NULL;
+ int (*SSL_CTX_set_max_proto_version)(SSL_CTX *ctx, int version) = NULL;
+ int (*SSL_set_min_proto_version)(SSL *ssl, int version) = NULL;
+
+ 
+diff -ru a/lib_pypy/_cffi_ssl/_cffi_src/openssl/x509v3.py 
b/lib_pypy/_cffi_ssl/_cffi_src/openssl/x509v3.py
+--- a/lib_pypy/_cffi_ssl/_cffi_src/openssl/x509v3.py   2024-04-21 
01:03:52.000000000 +0000
++++ b/lib_pypy/_cffi_ssl/_cffi_src/openssl/x509v3.py   2024-07-19 
13:16:55.369740670 +0000
+@@ -320,4 +320,7 @@
+ """
+ 
+ CUSTOMIZATIONS = """
++#ifdef CRYPTOGRAPHY_IS_LIBRESSL
++int (*X509V3_EXT_add_alias)(int, int) = NULL;
++#endif
+ """
+diff -ru pypy3.10-v7.3.16-src/lib_pypy/_cffi_ssl/_cffi_src/openssl/x509_vfy.py 
b/lib_pypy/_cffi_ssl/_cffi_src/openssl/x509_vfy.py
+--- pypy3.10-v7.3.16-src/lib_pypy/_cffi_ssl/_cffi_src/openssl/x509_vfy.py      
2024-04-21 01:08:49.000000000 +0000
++++ b/lib_pypy/_cffi_ssl/_cffi_src/openssl/x509_vfy.py 2024-07-25 
07:06:06.259878466 +0000
+@@ -347,7 +347,7 @@
+ static const long Cryptography_HAS_X509_STORE_CTX_GET_ISSUER = 1;
+ #endif
+ 
+-#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_330
++#if CRYPTOGRAPHY_OPENSSL_LESS_THAN_330 && !CRYPTOGRAPHY_IS_LIBRESSL
+ static X509_OBJECT *x509_object_dup(const X509_OBJECT *obj)
+ {
+     int ok;

diff --git a/dev-python/pypy3_10/metadata.xml b/dev-python/pypy3_10/metadata.xml
new file mode 100644
index 0000000..2a6a5bd
--- /dev/null
+++ b/dev-python/pypy3_10/metadata.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd";>
+<pkgmetadata>
+       <maintainer type="project">
+               <email>[email protected]</email>
+               <name>Python</name>
+       </maintainer>
+       <upstream>
+               <remote-id type="github">pypy/pypy</remote-id>
+       </upstream>
+       <use>
+               <flag name="ensurepip">
+                       Install the ensurepip module that uses bundled wheels
+                       to bootstrap pip and setuptools (if disabled, it will
+                       be only possible to use venv `--without-pip`)
+               </flag>
+       </use>
+</pkgmetadata>

diff --git a/dev-python/pypy3_10/pypy3_10-7.3.16.ebuild 
b/dev-python/pypy3_10/pypy3_10-7.3.16.ebuild
new file mode 100644
index 0000000..14b88a9
--- /dev/null
+++ b/dev-python/pypy3_10/pypy3_10-7.3.16.ebuild
@@ -0,0 +1,213 @@
+# Copyright 1999-2024 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+inherit multiprocessing pax-utils toolchain-funcs
+
+PYPY_PV=${PV%_p*}
+PYVER=3.10
+MY_P="pypy${PYVER}-v${PYPY_PV/_}"
+PATCHSET="pypy${PYVER}-gentoo-patches-${PV/_rc/rc}"
+
+DESCRIPTION="A fast, compliant alternative implementation of the Python 
(${PYVER}) language"
+HOMEPAGE="
+       https://www.pypy.org/
+       https://github.com/pypy/pypy/
+"
+SRC_URI="
+       https://downloads.python.org/pypy/${MY_P}-src.tar.bz2
+       https://buildbot.pypy.org/pypy/${MY_P}-src.tar.bz2
+       https://dev.gentoo.org/~mgorny/dist/python/${PATCHSET}.tar.xz
+"
+S="${WORKDIR}/${MY_P}-src"
+
+LICENSE="MIT"
+# pypy3 -c 'import sysconfig; print(sysconfig.get_config_var("SOABI"))'
+# also check pypy/interpreter/pycode.py -> pypy_incremental_magic
+SLOT="0/pypy310-pp73-384"
+KEYWORDS="amd64 ~arm64 ~ppc64 x86 ~amd64-linux ~x86-linux"
+IUSE="+ensurepip gdbm +jit ncurses sqlite tk"
+# many tests are failing upstream
+# see https://buildbot.pypy.org/summary?branch=py${PYVER}
+RESTRICT="test"
+
+RDEPEND="
+       || (
+               >=dev-python/${PN}-exe-${PYPY_PV}:${PYPY_PV}[bzip2(+),ncurses?]
+               >=dev-python/${PN}-exe-bin-${PYPY_PV}:${PYPY_PV}
+       )
+       dev-lang/python-exec[python_targets_pypy3(-)]
+       dev-libs/openssl:0=
+       dev-python/gentoo-common
+       ensurepip? ( dev-python/ensurepip-wheels )
+       gdbm? ( sys-libs/gdbm:0= )
+       sqlite? ( dev-db/sqlite:3= )
+       tk? (
+               dev-lang/tk:0=
+               dev-tcltk/tix:0=
+       )
+"
+DEPEND="
+       ${RDEPEND}
+"
+
+src_prepare() {
+       local PATCHES=(
+               "${WORKDIR}/${PATCHSET}"
+               "${FILESDIR}"/${PN}-7.3.16-libressl.patch
+       )
+
+       default
+}
+
+src_configure() {
+       tc-export CC
+}
+
+src_compile() {
+       mkdir bin || die
+       # switch to the layout expected for cffi module builds
+       mkdir include/pypy${PYVER} || die
+       # copy over to make sys.prefix happy
+       cp -p "${BROOT}"/usr/bin/pypy${PYVER}-c-${PYPY_PV} pypy${PYVER}-c || die
+       cp -p "${BROOT}"/usr/include/pypy${PYVER}/${PYPY_PV}/* 
include/pypy${PYVER}/ || die
+       # (not installed by pypy-exe)
+       rm pypy/module/cpyext/include/_numpypy/numpy/README || die
+       mv pypy/module/cpyext/include/* include/pypy${PYVER}/ || die
+       mv pypy/module/cpyext/parse/*.h include/pypy${PYVER}/ || die
+       pax-mark m pypy${PYVER}-c
+
+       # verify the subslot
+       local soabi=$(
+               ./pypy${PYVER}-c - <<-EOF
+                       import importlib.util
+                       import sysconfig
+                       soabi = sysconfig.get_config_var("SOABI")
+                       magic = importlib.util._RAW_MAGIC_NUMBER & 0xffff
+                       print(f"{soabi}-{magic}")
+               EOF
+       )
+       [[ ${soabi} == ${SLOT#*/} ]] || die "update subslot to ${soabi}"
+
+       # Add epython.py to the distribution
+       echo 'EPYTHON="pypy3"' > lib-python/3/epython.py || die
+
+       einfo "Generating caches and CFFI modules ..."
+
+       # Generate sysconfig data
+       local host_gnu_type=$(sh pypy/tool/release/config.guess)
+       local overrides=(
+               HOST_GNU_TYPE "${host_gnu_type:-unknown}"
+               INCLUDEPY "${EPREFIX}/usr/include/pypy${PYVER}"
+               LIBDIR "${EPREFIX}/usr/$(get_libdir)"
+               TZPATH "${EPREFIX}/usr/share/zoneinfo"
+               WHEEL_PKG_DIR "${EPREFIX}/usr/lib/python/ensurepip"
+       )
+       ./pypy${PYVER}-c -m sysconfig --generate-posix-vars "${overrides[@]}" 
|| die
+       local outdir
+       outdir=$(<pybuilddir.txt) || die
+       cp "${outdir}"/_sysconfigdata__*.py lib-python/3/ || die
+
+       # Generate Grammar and PatternGrammar pickles.
+       ./pypy${PYVER}-c - <<-EOF || die "Generation of Grammar and 
PatternGrammar pickles failed"
+               import lib2to3.pygram
+               import lib2to3.patcomp
+               lib2to3.patcomp.PatternCompiler()
+       EOF
+
+       # Generate cffi modules
+       # Please keep in sync with lib_pypy/pypy_tools/build_cffi_imports.py!
+       # (NB: we build CFFI modules first to avoid error log when importing
+       # build_cffi_imports).
+       cffi_targets=(
+               pypy_util blake2/_blake2 sha3/_sha3 ssl
+               audioop syslog pwdgrp resource lzma posixshmem
+               ctypes_test testmultiphase
+       )
+       use gdbm && cffi_targets+=( gdbm )
+       use ncurses && cffi_targets+=( curses )
+       use sqlite && cffi_targets+=( sqlite3 )
+       use tk && cffi_targets+=( tkinter/tklib )
+
+       local t
+       # all modules except tkinter output to .
+       # tkinter outputs to the correct dir ...
+       cd lib_pypy || die
+       for t in "${cffi_targets[@]}"; do
+               # tkinter doesn't work via -m
+               ../pypy${PYVER}-c "_${t}_build.py" || die "Failed to build CFFI 
bindings for ${t}"
+       done
+       # testcapi does not have a "build" script
+       ../pypy${PYVER}-c -c "import _testcapi" || die
+
+       # Verify that CFFI module list is up-to-date
+       local expected_cksum=a4138e48
+       local local_cksum=$(
+               ../pypy${PYVER}-c - <<-EOF
+                       import binascii
+                       import json
+                       from pypy_tools.build_cffi_imports import 
cffi_build_scripts as x
+                       print("%08x" % 
(binascii.crc32(json.dumps(x).encode()),))
+               EOF
+       )
+       if [[ ${local_cksum} != ${expected_cksum} ]]; then
+               die "Please verify cffi_targets and update checksum to 
${local_cksum}"
+       fi
+
+       # Cleanup temporary objects
+       find \( -name "*_cffi.c" -o -name '*.o' \) -delete || die
+       find -type d -empty -delete || die
+}
+
+src_install() {
+       einfo "Installing PyPy ..."
+       dodir /usr/bin
+       dosym pypy${PYVER}-c-${PYPY_PV} /usr/bin/pypy${PYVER}
+       insinto /usr/lib/pypy${PYVER}
+       # preserve mtimes to avoid obsoleting caches
+       insopts -p
+       doins -r lib-python/3/. lib_pypy/.
+       insinto /usr/include
+       doins -r include/pypy${PYVER}
+
+       # replace copied headers with symlinks
+       for x in "${BROOT}"/usr/include/pypy${PYVER}/${PYPY_PV}/*; do
+               dosym "${PYPY_PV}/${x##*/}" "/usr/include/pypy${PYVER}/${x##*/}"
+       done
+
+       dodoc README.rst
+
+       local dest=/usr/lib/pypy${PYVER}
+       rm -r "${ED}${dest}"/ensurepip/_bundled || die
+       if ! use ensurepip; then
+               rm -r "${ED}${dest}"/ensurepip || die
+       fi
+       if ! use gdbm; then
+               rm -r "${ED}${dest}"/_gdbm* || die
+       fi
+       if ! use sqlite; then
+               rm -r "${ED}${dest}"/sqlite3 \
+                       "${ED}${dest}"/_sqlite3* \
+                       "${ED}${dest}"/test/test_sqlite.py || die
+       fi
+       if ! use tk; then
+               rm -r "${ED}${dest}"/{idlelib,tkinter} \
+                       "${ED}${dest}"/_tkinter \
+                       "${ED}${dest}"/test/test_{tcl,tk,ttk*}.py || die
+       fi
+       dosym ../python/EXTERNALLY-MANAGED "${dest}/EXTERNALLY-MANAGED"
+
+       local -x PYTHON=${ED}/usr/bin/pypy${PYVER}-c-${PYPY_PV}
+       # temporarily copy to build tree to facilitate module builds
+       cp -p "${BROOT}/usr/bin/pypy${PYVER}-c-${PYPY_PV}" "${PYTHON}" || die
+
+       einfo "Byte-compiling Python standard library..."
+       # exclude list from CPython Makefile.pre.in
+       "${PYTHON}" -m compileall -j "$(makeopts_jobs)" -o 0 -o 1 -o 2 \
+               -x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \
+               --hardlink-dupes -q -f -d "${dest}" "${ED}${dest}" || die
+
+       # remove to avoid collisions
+       rm "${PYTHON}" || die
+}

Reply via email to