diff options
author | Armin Rigo <arigo@tunes.org> | 2012-06-15 11:02:36 +0200 |
---|---|---|
committer | Armin Rigo <arigo@tunes.org> | 2012-06-15 11:02:36 +0200 |
commit | bacf16c5ffcf059ea0b92408043ccd189522b4d8 (patch) | |
tree | 1fc4bf90bd8c0504e1a705a1254ed36daa00f8aa /cffi/ffiplatform.py | |
parent | a7bb30e0dd4f8058989e78a41d804475416d62de (diff) | |
download | cffi-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.py | 33 |
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 |