[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