[pypy-svn] r45329 - in pypy/dist/pypy/translator: c/src tool tool/test

fijal at codespeak.net fijal at codespeak.net
Wed Jul 25 16:49:47 CEST 2007


Author: fijal
Date: Wed Jul 25 16:49:46 2007
New Revision: 45329

Added:
   pypy/dist/pypy/translator/c/src/thread.c
Modified:
   pypy/dist/pypy/translator/tool/cbuild.py
   pypy/dist/pypy/translator/tool/test/test_cbuild.py
Log:
Small wrapper to create c library prior to compiling with c module


Added: pypy/dist/pypy/translator/c/src/thread.c
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/translator/c/src/thread.c	Wed Jul 25 16:49:46 2007
@@ -0,0 +1,2 @@
+#include <unistd.h>
+#include <thread.h>

Modified: pypy/dist/pypy/translator/tool/cbuild.py
==============================================================================
--- pypy/dist/pypy/translator/tool/cbuild.py	(original)
+++ pypy/dist/pypy/translator/tool/cbuild.py	Wed Jul 25 16:49:46 2007
@@ -153,6 +153,24 @@
     finally:
         lastdir.chdir()
 
+def cache_c_module(cfiles, modname, cache_dir=None,
+                   include_dirs=None, libraries=[]):
+    """ Same as build c module, but instead caches results and
+    checks timestamps (eventually, not supported yet)
+    """
+    from pypy.tool.autopath import pypydir
+    if cache_dir is None:
+        cache_dir = py.path.local(pypydir).join('_cache')
+    else:
+        cache_dir = py.path.local(cache_dir)
+    if cache_dir.check(dir=1):
+        # XXX check timestamps of all cfiles
+        if not cache_dir.join(modname + '.so').check():
+            modname = str(cache_dir.join(modname))
+            compile_c_module(cfiles, modname, include_dirs=include_dirs,
+                             libraries=libraries)
+            
+
 def make_module_from_c(cfile, include_dirs=None, libraries=[]):
     cfile = py.path.local(cfile)
     modname = cfile.purebasename

Modified: pypy/dist/pypy/translator/tool/test/test_cbuild.py
==============================================================================
--- pypy/dist/pypy/translator/tool/test/test_cbuild.py	(original)
+++ pypy/dist/pypy/translator/tool/test/test_cbuild.py	Wed Jul 25 16:49:46 2007
@@ -1,7 +1,7 @@
-import py
+import py, sys
 
 from pypy.tool.udir import udir 
-from pypy.translator.tool.cbuild import build_executable 
+from pypy.translator.tool.cbuild import build_executable, cache_c_module
 
 def test_simple_executable(): 
     print udir
@@ -18,3 +18,20 @@
     out = py.process.cmdexec(testexec)
     assert out.startswith('hello world')
     
+def test_compile_threads():
+    if sys.platform == 'nt':
+        py.test.skip("Linux-specific test")
+    try:
+        import ctypes
+    except ImportError:
+        py.test.skip("Need ctypes for that test")
+    from pypy.tool.autopath import pypydir
+    pypydir = py.path.local(pypydir)
+    csourcedir = pypydir.join('translator', 'c', 'src')
+    include_dirs = [str(csourcedir)]
+    files = [csourcedir.join('thread.c')]
+    cache_c_module(files, '_thread', cache_dir=udir, include_dirs=include_dirs,
+                   libraries=['pthread'])
+    cdll = ctypes.CDLL(str(udir.join('_thread.so')))
+    assert hasattr(cdll, 'RPyThreadLockInit')
+



More information about the Pypy-commit mailing list