summaryrefslogtreecommitdiff
path: root/cffi/ffiplatform.py
diff options
context:
space:
mode:
authorArmin Rigo <arigo@tunes.org>2012-06-15 11:02:36 +0200
committerArmin Rigo <arigo@tunes.org>2012-06-15 11:02:36 +0200
commitbacf16c5ffcf059ea0b92408043ccd189522b4d8 (patch)
tree1fc4bf90bd8c0504e1a705a1254ed36daa00f8aa /cffi/ffiplatform.py
parenta7bb30e0dd4f8058989e78a41d804475416d62de (diff)
downloadcffi-bacf16c5ffcf059ea0b92408043ccd189522b4d8.tar.gz
Use distutils. Took me a while to figure out these lines.
Diffstat (limited to 'cffi/ffiplatform.py')
-rw-r--r--cffi/ffiplatform.py33
1 files changed, 33 insertions, 0 deletions
diff --git a/cffi/ffiplatform.py b/cffi/ffiplatform.py
index e248f7f..3d144f7 100644
--- a/cffi/ffiplatform.py
+++ b/cffi/ffiplatform.py
@@ -29,3 +29,36 @@ def tmpdir():
pass
_tmpdir = os.path.abspath('__pycache__')
return _tmpdir
+
+
+def compile(tmpdir, modname, **kwds):
+ """Compile a C extension module using distutils."""
+
+ saved_environ = os.environ.copy()
+ saved_path = os.getcwd()
+ try:
+ os.chdir(tmpdir)
+ outputfilename = _build(modname, kwds)
+ outputfilename = os.path.abspath(outputfilename)
+ finally:
+ os.chdir(saved_path)
+ # workaround for a distutils bugs where some env vars can
+ # become longer and longer every time it is used
+ for key, value in saved_environ.items():
+ if os.environ.get(key) != value:
+ os.environ[key] = value
+ return outputfilename
+
+def _build(modname, kwds):
+ # XXX compact but horrible :-(
+ from distutils.core import Distribution, Extension
+ ext = Extension(name=modname, sources=[modname + '.c'], **kwds)
+ dist = Distribution({'ext_modules': [ext]})
+ options = dist.get_option_dict('build_ext')
+ options['force'] = ('ffiplatform', True)
+ #
+ dist.run_command('build_ext')
+ #
+ cmd_obj = dist.get_command_obj('build_ext')
+ [soname] = cmd_obj.get_outputs()
+ return soname