[pypy-svn] r71838 - in pypy/branch/ctypes-configure-cache/ctypes_configure: . test

fijal at codespeak.net fijal at codespeak.net
Sat Mar 6 03:33:07 CET 2010


Author: fijal
Date: Sat Mar  6 03:33:01 2010
New Revision: 71838

Modified:
   pypy/branch/ctypes-configure-cache/ctypes_configure/cbuild.py
   pypy/branch/ctypes-configure-cache/ctypes_configure/configure.py
   pypy/branch/ctypes-configure-cache/ctypes_configure/test/test_configure.py
Log:
Introduce dumping of cache to ctypes configure. Cannot handle nested structs
now (test pending), also nobody uses it so far


Modified: pypy/branch/ctypes-configure-cache/ctypes_configure/cbuild.py
==============================================================================
--- pypy/branch/ctypes-configure-cache/ctypes_configure/cbuild.py	(original)
+++ pypy/branch/ctypes-configure-cache/ctypes_configure/cbuild.py	Sat Mar  6 03:33:01 2010
@@ -5,7 +5,7 @@
 
 debug = 0
 
-configdir = py.path.local.make_numbered_dir(prefix='ctypes_configure')
+configdir = py.path.local.make_numbered_dir(prefix='ctypes_configure-')
 
 class ExternalCompilationInfo(object):
 

Modified: pypy/branch/ctypes-configure-cache/ctypes_configure/configure.py
==============================================================================
--- pypy/branch/ctypes-configure-cache/ctypes_configure/configure.py	(original)
+++ pypy/branch/ctypes-configure-cache/ctypes_configure/configure.py	Sat Mar  6 03:33:01 2010
@@ -151,11 +151,13 @@
         return try_compile([self.path], eci)
 
         
-def configure(CConfig, noerr=False):
+def configure(CConfig, savecache=None, noerr=False):
     """Examine the local system by running the C compiler.
     The CConfig class contains CConfigEntry attribues that describe
     what should be inspected; configure() returns a dict mapping
     names to the results.
+
+    savecache contains a path where to save (append) results of a call
     """
     for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_',
                  '_include_dirs_', '_header_']:
@@ -164,7 +166,7 @@
     for key in dir(CConfig):
         value = getattr(CConfig, key)
         if isinstance(value, CConfigEntry):
-            entries.append((key, value))            
+            entries.append((key, value))
 
     if entries:   # can be empty if there are only CConfigSingleEntries
         writer = _CWriter(CConfig)
@@ -202,15 +204,36 @@
             writer.write_header()
             res[key] = value.question(writer.ask_gcc)
 
+    if savecache is not None:
+        f = py.path.local(savecache).open("w")
+        f.write('import ctypes\n\n')
+        for key, val in res.items():
+            entry = getattr(CConfig, key)
+            if isinstance(val, int):
+                f.write("%s = %d\n" % (key, val))
+            elif isinstance(val, ctypes._SimpleCData.__class__):
+                # a simple type
+                f.write("%s = %s\n" % (key, ctypes_repr(val)))
+            elif isinstance(val, ctypes.Structure.__class__):
+                f.write("class %s(ctypes.Structure):\n" % key)
+                f.write("    _fields_ = [\n")
+                for k, v in val._fields_:
+                    f.write("        ('%s', %s),\n" % (k, ctypes_repr(v)))
+                f.write("    ]\n")
+            else:
+                raise NotImplementedError("Saving of %r" % (val,))
+        f.close()
     return res
 
+def ctypes_repr(cls):
+    return "ctypes." + cls.__name__
+
 # ____________________________________________________________
 
 
 class CConfigEntry(object):
     "Abstract base class."
 
-
 class Struct(CConfigEntry):
     """An entry in a CConfig class that stands for an externally
     defined structure.
@@ -313,7 +336,6 @@
         S.__name__ = name
         return S
 
-
 class SimpleType(CConfigEntry):
     """An entry in a CConfig class that stands for an externally
     defined simple numeric type.
@@ -350,7 +372,6 @@
             ctype = fixup_ctype(ctype, self.name, (size, sign))
         return ctype
 
-
 class ConstantInteger(CConfigEntry):
     """An entry in a CConfig class that stands for an externally
     defined integer constant.

Modified: pypy/branch/ctypes-configure-cache/ctypes_configure/test/test_configure.py
==============================================================================
--- pypy/branch/ctypes-configure-cache/ctypes_configure/test/test_configure.py	(original)
+++ pypy/branch/ctypes-configure-cache/ctypes_configure/test/test_configure.py	Sat Mar  6 03:33:01 2010
@@ -126,6 +126,32 @@
                    'ushort': ctypes.c_ushort,
                    'XYZZY': 42}
 
+def test_cache():
+    configdir = configure.configdir
+    test_h = configdir.join('test_ctypes_platform2.h')
+    test_h.write('#define XYZZY 42\n')
+
+    class CConfig:
+        _compilation_info_ = ExternalCompilationInfo(
+            pre_include_lines = ["/* a C comment */",
+                                 "#include <stdio.h>",
+                                 "#include <test_ctypes_platform2.h>"],
+            include_dirs = [str(configdir)]
+        )
+
+        FILE = configure.Struct('FILE', [])
+        ushort = configure.SimpleType('unsigned short')
+        XYZZY = configure.ConstantInteger('XYZZY')
+
+    cachefile = configdir.join('cache')
+    res = configure.configure(CConfig, savecache=configdir.join('cache'))
+    d = {}
+    execfile(str(cachefile), d)
+    assert d['XYZZY'] == res['XYZZY']
+    assert d['ushort'] == res['ushort']
+    assert d['FILE']._fields_ == res['FILE']._fields_
+    assert d['FILE'].__mro__[1:] == res['FILE'].__mro__[1:]
+
 def test_ifdef():
     class CConfig:
         _compilation_info_ = ExternalCompilationInfo(



More information about the Pypy-commit mailing list