changeset 188:e18b5861868b

Compilation of all current FLAVORS of pypy3 works for 7.3.19. BUGS: Not yet tested.
author Franz Glasner <fzglas.hg@dom66.de>
date Fri, 14 Mar 2025 16:09:28 +0100
parents 13e07e75c111
children 6ff66311cfe5
files uwsginl-plugin-lang-pypy3/Makefile uwsginl-plugin-lang-pypy3/files/extra/patch-plugins_pypy_pypy__plugin.c uwsginl-plugin-lang-pypy3/files/extra/patch-plugins_pypy_pypy__setup.py
diffstat 3 files changed, 37 insertions(+), 103 deletions(-) [+]
line wrap: on
line diff
--- a/uwsginl-plugin-lang-pypy3/Makefile	Fri Mar 14 14:45:38 2025 +0100
+++ b/uwsginl-plugin-lang-pypy3/Makefile	Fri Mar 14 16:09:28 2025 +0100
@@ -19,7 +19,7 @@
 LICENSE_FILE=	${WRKSRC}/LICENSE
 LICENSE_PERMS=	dist-mirror dist-sell pkg-mirror pkg-sell auto-accept
 
-FLAVORS=	pypy3 pypy39 pypy310
+FLAVORS=	pypy3 pypy310 pypy311
 FLAVOR?=	pypy3
 
 BUILD_DEPENDS+=	${UWSGI_NAME}==${PORTVERSION}:www/uwsginl
@@ -42,18 +42,18 @@
 PYPY_EXECUTABLE=	pypy3.10
 PYPY_LDLIBRARY=	libpypy3.10-c.so
 PYPY_LIBDIR=	lib/pypy3.10
-.elif ${FLAVOR} == pypy39
-PLUGIN_NAME=	pypy39
-PYPY_PACKAGE=	pypy39
-PYPY_EXECUTABLE=	pypy3.9
-PYPY_LDLIBRARY=	libpypy3.9-c.so
-PYPY_LIBDIR=	lib/pypy3.9
 .elif ${FLAVOR} == pypy310
 PLUGIN_NAME=	pypy310
 PYPY_PACKAGE=	pypy310
 PYPY_EXECUTABLE=	pypy3.10
 PYPY_LDLIBRARY=	libpypy3.10-c.so
 PYPY_LIBDIR=	lib/pypy3.10
+.elif ${FLAVOR} == pypy311
+PLUGIN_NAME=	pypy311
+PYPY_PACKAGE=	pypy311
+PYPY_EXECUTABLE=	pypy3.11
+PYPY_LDLIBRARY=	libpypy3.11-c.so
+PYPY_LIBDIR=	lib/pypy3.11
 .endif
 
 CFLAGS+=	-DPYPY_LDLIBRARY="${PYPY_LDLIBRARY}" -DPYPY_LIBDIR="${PYPY_LIBDIR}" -DPYPY_PLUGIN_NAME="${PLUGIN_NAME}"
--- a/uwsginl-plugin-lang-pypy3/files/extra/patch-plugins_pypy_pypy__plugin.c	Fri Mar 14 14:45:38 2025 +0100
+++ b/uwsginl-plugin-lang-pypy3/files/extra/patch-plugins_pypy_pypy__plugin.c	Fri Mar 14 16:09:28 2025 +0100
@@ -1,4 +1,4 @@
---- plugins/pypy/pypy_plugin.c.orig	2022-09-21 14:46:45 UTC
+--- plugins/pypy/pypy_plugin.c.orig	2024-10-26 09:39:02 UTC
 +++ plugins/pypy/pypy_plugin.c
 @@ -9,6 +9,24 @@
  
@@ -25,7 +25,7 @@
  struct uwsgi_pypy {
  	void *handler;
  	char *lib;
-@@ -42,9 +60,10 @@ void (*uwsgi_pypy_hook_paste_loader)(char *);
+@@ -42,9 +60,10 @@ void (*uwsgi_pypy_post_fork_hook)(void);
  void (*uwsgi_pypy_hook_pythonpath)(char *);
  void (*uwsgi_pypy_hook_request)(void *, int);
  void (*uwsgi_pypy_post_fork_hook)(void);
--- a/uwsginl-plugin-lang-pypy3/files/extra/patch-plugins_pypy_pypy__setup.py	Fri Mar 14 14:45:38 2025 +0100
+++ b/uwsginl-plugin-lang-pypy3/files/extra/patch-plugins_pypy_pypy__setup.py	Fri Mar 14 16:09:28 2025 +0100
@@ -1,36 +1,19 @@
---- plugins/pypy/pypy_setup.py.orig	2022-09-21 14:46:45 UTC
+--- plugins/pypy/pypy_setup.py.orig	2024-10-26 09:39:02 UTC
 +++ plugins/pypy/pypy_setup.py
-@@ -31,8 +31,15 @@ extern void (*uwsgi_pypy_hook_paste_loader)(char *);
+@@ -31,6 +31,7 @@ extern void (*uwsgi_pypy_post_fork_hook)(void);
  extern void (*uwsgi_pypy_hook_pythonpath)(char *);
  extern void (*uwsgi_pypy_hook_request)(struct wsgi_request *);
  extern void (*uwsgi_pypy_post_fork_hook)(void);
 +extern void (*uwsgi_pypy_hook_atexit)(void);
  '''
  
-+
-+# Convert a byte string to a native string using the default encoding
-+def n(b):
-+    return b.decode()
-+
-+
  # here we load CFLAGS and uwsgi.h from the binary
- defines0 = '''
- char *uwsgi_get_cflags();
-@@ -46,7 +53,7 @@ lib0 = ffi.verify(defines0)
- # basically it build a list of #define from binary CFLAGS
- uwsgi_cdef = []
- uwsgi_defines = []
--uwsgi_cflags = ffi.string(lib0.uwsgi_get_cflags()).split()
-+uwsgi_cflags = n(ffi.string(lib0.uwsgi_get_cflags())).split()
- for cflag in uwsgi_cflags:
-     if cflag.startswith('-D'):
-         line = cflag[2:]
-@@ -57,8 +64,14 @@ for cflag in uwsgi_cflags:
+@@ -57,8 +58,14 @@ for cflag in uwsgi_cflags:
          else:
              uwsgi_cdef.append('#define %s ...' % line)
              uwsgi_defines.append('#define %s 1' % line)
 -uwsgi_dot_h = ffi.string(lib0.uwsgi_get_dot_h())
-+uwsgi_dot_h = n(ffi.string(lib0.uwsgi_get_dot_h()))
++uwsgi_dot_h = ffi.string(lib0.uwsgi_get_dot_h()).decode()
  
 +#
 +# Replace #include <pcre.h> on FreeBSD because it is found on a non-standard
@@ -41,7 +24,7 @@
  # uwsgi definitions
  cdefines = '''
  %s
-@@ -110,6 +123,8 @@ struct uwsgi_worker {
+@@ -110,6 +117,8 @@ struct uwsgi_worker {
          uint64_t running_time;
          uint64_t avg_response_time;
          uint64_t tx;
@@ -50,7 +33,7 @@
          ...;
  };
  
-@@ -164,11 +179,14 @@ struct uwsgi_server {
+@@ -164,11 +173,14 @@ struct uwsgi_server {
          struct wsgi_request *wsgi_req;
  
          struct uwsgi_plugin *p[];
@@ -59,60 +42,27 @@
 +
          ...;
  };
- struct uwsgi_server uwsgi;
+ extern struct uwsgi_server uwsgi;
  
--struct uwsgi_plugin pypy_plugin;
-+struct uwsgi_plugin pypy3_plugin;
+-extern struct uwsgi_plugin pypy_plugin;
++extern struct uwsgi_plugin pypy3_plugin;
  
- const char *uwsgi_pypy_version;
+ extern const char *uwsgi_pypy_version;
  
-@@ -269,7 +287,7 @@ const char *uwsgi_pypy_version = UWSGI_VERSION;
+@@ -269,9 +281,9 @@ extern struct uwsgi_server uwsgi;
  %s
  
  extern struct uwsgi_server uwsgi;
 -extern struct uwsgi_plugin pypy_plugin;
 +extern struct uwsgi_plugin pypy3_plugin;
  %s
- ''' % ('\n'.join(uwsgi_defines), uwsgi_dot_h, hooks)
- 
-@@ -286,7 +304,7 @@ wsgi_application = None
- 
- # fix argv if needed
- if len(sys.argv) == 0:
--    sys.argv.insert(0, ffi.string(lib.uwsgi_binary_path()))
-+    sys.argv.insert(0, n(ffi.string(lib.uwsgi_binary_path())))
- 
+-''' % ('\n'.join(uwsgi_defines), uwsgi_dot_h.decode(), hooks)
++''' % ('\n'.join(uwsgi_defines), uwsgi_dot_h, hooks)
  
- @ffi.callback("void(char *)")
-@@ -305,7 +323,7 @@ def uwsgi_pypy_loader(module):
-     load a wsgi module
-     """
-     global wsgi_application
--    m = ffi.string(module)
-+    m = n(ffi.string(module))
-     c = 'application'
-     if ':' in m:
-         m, c = m.split(':')
-@@ -322,7 +340,7 @@ def uwsgi_pypy_file_loader(filename):
-     load a mod_wsgi compliant .wsgi file
-     """
-     global wsgi_application
--    w = ffi.string(filename)
-+    w = n(ffi.string(filename))
-     c = 'application'
-     mod = imp.load_source('uwsgi_file_wsgi', w)
-     wsgi_application = getattr(mod, c)
-@@ -334,7 +352,7 @@ def uwsgi_pypy_paste_loader(config):
-     load a .ini paste app
-     """
-     global wsgi_application
--    c = ffi.string(config)
-+    c = n(ffi.string(config))
-     if c.startswith('config:'):
-         c = c[7:]
-     if c[0] != '/':
-@@ -358,12 +376,47 @@ def uwsgi_pypy_post_fork_hook():
-         uwsgi.post_fork_hook()
+ ffi.cdef(cdefines)
+ lib = ffi.verify(cverify)
+@@ -368,6 +380,41 @@ def uwsgi_pypy_pythonpath(item):
+     print("added %s to pythonpath" % path)
  
  
 +@ffi.callback("void()")
@@ -150,23 +100,18 @@
 +        print("!!! atexit._run_exitfuncs() not found !!!")
 +
 +
- @ffi.callback("void(char *)")
- def uwsgi_pypy_pythonpath(item):
-     """
-     add an item to the pythonpath
+ class WSGIfilewrapper(object):
      """
--    path = ffi.string(item)
-+    path = n(ffi.string(item))
-     sys.path.append(path)
-     print("added %s to pythonpath" % path)
- 
-@@ -470,15 +523,17 @@ def uwsgi_pypy_wsgi_handler(wsgi_req):
+     class implementing wsgi.file_wrapper
+@@ -470,17 +517,17 @@ def uwsgi_pypy_wsgi_handler(wsgi_req):
      def start_response(status, headers, exc_info=None):
          if exc_info:
              traceback.print_exception(*exc_info)
+-        status = status.encode()
 +        status = status.encode("latin1")
          lib.uwsgi_response_prepare_headers(wsgi_req, ffi.new("char[]", status), len(status))
          for hh in headers:
+-            hh = (hh[0].encode(), hh[1].encode())
 +            hh = (hh[0].encode("latin1"), hh[1].encode("latin1"))
              lib.uwsgi_response_add_header(wsgi_req, ffi.new("char[]", hh[0]), len(hh[0]), ffi.new("char[]", hh[1]), len(hh[1]))
          return writer
@@ -174,12 +119,12 @@
      environ = {}
      iov = wsgi_req.hvec
      for i in range(0, wsgi_req.var_cnt, 2):
--        environ[ffi.string(ffi.cast("char*", iov[i].iov_base), iov[i].iov_len)] = ffi.string(ffi.cast("char*", iov[i+1].iov_base), iov[i+1].iov_len)
+-        environ[ffi.string(ffi.cast("char*", iov[i].iov_base), iov[i].iov_len).decode()] = ffi.string(ffi.cast("char*", iov[i+1].iov_base), iov[i+1].iov_len).decode()
 +        environ[ffi.string(ffi.cast("char*", iov[i].iov_base), iov[i].iov_len).decode("latin1")] = ffi.string(ffi.cast("char*", iov[i+1].iov_base), iov[i+1].iov_len).decode("latin1")
  
      environ['wsgi.version'] = (1, 0)
      scheme = 'http'
-@@ -523,6 +578,7 @@ lib.uwsgi_pypy_hook_paste_loader = uwsgi_pypy_paste_lo
+@@ -525,6 +572,7 @@ lib.uwsgi_pypy_post_fork_hook = uwsgi_pypy_post_fork_h
  lib.uwsgi_pypy_hook_pythonpath = uwsgi_pypy_pythonpath
  lib.uwsgi_pypy_hook_request = uwsgi_pypy_wsgi_handler
  lib.uwsgi_pypy_post_fork_hook = uwsgi_pypy_post_fork_hook
@@ -187,7 +132,7 @@
  
  """
  Here we define the "uwsgi" virtual module
-@@ -537,7 +593,7 @@ uwsgi.hostname = ffi.string(lib.uwsgi.hostname)
+@@ -539,7 +587,7 @@ def uwsgi_pypy_uwsgi_register_signal(signum, kind, han
  def uwsgi_pypy_uwsgi_register_signal(signum, kind, handler):
      cb = ffi.callback('void(int)', handler)
      uwsgi_gc.append(cb)
@@ -196,7 +141,7 @@
          raise Exception("unable to register signal %d" % signum)
  uwsgi.register_signal = uwsgi_pypy_uwsgi_register_signal
  
-@@ -562,7 +618,7 @@ def uwsgi_pypy_uwsgi_register_rpc(name, func, argc=0):
+@@ -564,7 +612,7 @@ def uwsgi_pypy_uwsgi_register_rpc(name, func, argc=0):
      rpc_func = uwsgi_pypy_RPC(func)
      cb = ffi.callback("int(int, char*[], int[], char**)", rpc_func)
      uwsgi_gc.append(cb)
@@ -205,22 +150,11 @@
          raise Exception("unable to register rpc func %s" % name)
  uwsgi.register_rpc = uwsgi_pypy_uwsgi_register_rpc
  
-@@ -598,8 +654,8 @@ uwsgi.rpc = uwsgi_pypy_rpc
- 
- def uwsgi_pypy_call(func, *args):
-     node = None
--    if '@' in func:
--        (func, node) = func.split('@')
-+    if b'@' in func:
-+        (func, node) = func.split(b'@')
-     return uwsgi_pypy_rpc(node, func, *args)
- uwsgi.call = uwsgi_pypy_call
- 
-@@ -1067,7 +1123,7 @@ def uwsgi_pypy_continulet_switch(wsgi_req):
+@@ -1069,7 +1117,7 @@ def uwsgi_pypy_setup_continulets():
  
  
  def uwsgi_pypy_setup_continulets():
--    if lib.uwsgi.async < 1:
+-    if lib.uwsgi["async"] < 1:
 +    if getattr(lib.uwsgi, "async") < 1:
          raise Exception("pypy continulets require async mode !!!")
      lib.uwsgi.schedule_to_main = uwsgi_pypy_continulet_switch