[pypy-commit] pypy testing-cleanup: Don't paste in RPython defs when compiling Python extensions in cpyext tests

rlamy pypy.commits at gmail.com
Sun Jun 12 13:34:42 EDT 2016


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: testing-cleanup
Changeset: r85111:ae7a98d56f75
Date: 2016-06-12 18:33 +0100
http://bitbucket.org/pypy/pypy/changeset/ae7a98d56f75/

Log:	Don't paste in RPython defs when compiling Python extensions in
	cpyext tests

diff --git a/pypy/module/cpyext/test/test_cpyext.py b/pypy/module/cpyext/test/test_cpyext.py
--- a/pypy/module/cpyext/test/test_cpyext.py
+++ b/pypy/module/cpyext/test/test_cpyext.py
@@ -31,10 +31,28 @@
         assert 'PyModule_Check' in api.FUNCTIONS
         assert api.FUNCTIONS['PyModule_Check'].argtypes == [api.PyObject]
 
-def create_so(modname, **kwds):
-    eci = ExternalCompilationInfo(**kwds)
-    eci = eci.convert_sources_to_files()
+def convert_sources_to_files(sources, dirname):
+    files = []
+    for i, source in enumerate(sources):
+        filename = dirname / ('source_%d.c' % i)
+        with filename.open('w') as f:
+            f.write(str(source))
+        files.append(filename)
+    return files
+
+def create_so(modname, include_dirs,
+        separate_module_sources=None,
+        separate_module_files=None,
+        **kwds):
     dirname = (udir/uniquemodulename('module')).ensure(dir=1)
+    if separate_module_sources:
+        assert not separate_module_files
+        files = convert_sources_to_files(separate_module_sources, dirname)
+        separate_module_files = files
+    eci = ExternalCompilationInfo(
+        include_dirs=include_dirs,
+        separate_module_files=separate_module_files,
+        **kwds)
     soname = platform.platform.compile(
         [], eci,
         outputfilename=str(dirname/modname),
@@ -69,10 +87,11 @@
         if sys.platform.startswith('linux'):
             kwds["compile_extra"] = ["-Werror", "-g", "-O0"]
             kwds["link_extra"] = ["-g"]
-    kwds['include_dirs'] = api.include_dirs + include_dirs
 
     modname = modname.split('.')[-1]
-    soname = create_so(modname, **kwds)
+    soname = create_so(modname,
+            include_dirs=api.include_dirs + include_dirs,
+            **kwds)
     from pypy.module.imp.importing import get_so_extension
     pydname = soname.new(purebasename=modname, ext=get_so_extension(space))
     soname.rename(pydname)
@@ -95,11 +114,12 @@
     elif sys.platform == 'darwin':
         pass
     elif sys.platform.startswith('linux'):
-            kwds["compile_extra"]=["-O0", "-g","-Werror=implicit-function-declaration"]
-    kwds['include_dirs'] = [space.include_dir] + include_dirs
+        kwds["compile_extra"] = ["-O0", "-g","-Werror=implicit-function-declaration"]
 
     modname = modname.split('.')[-1]
-    soname = create_so(modname, **kwds)
+    soname = create_so(modname,
+            include_dirs=[space.include_dir] + include_dirs,
+            **kwds)
     return str(soname)
 
 def freeze_refcnts(self):
@@ -294,6 +314,11 @@
                 /* fix for cpython 2.7 Python.h if running tests with -A
                    since pypy compiles with -fvisibility-hidden */
                 #undef PyMODINIT_FUNC
+                #ifdef __GNUC__
+                #  define RPY_EXPORTED extern __attribute__((visibility("default")))
+                #else
+                #  define RPY_EXPORTED extern __declspec(dllexport)
+                #endif
                 #define PyMODINIT_FUNC RPY_EXPORTED void
 
                 %(body)s


More information about the pypy-commit mailing list