Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r363:b8bff874b2ce Date: 2012-06-15 11:02 +0200 http://bitbucket.org/cffi/cffi/changeset/b8bff874b2ce/
Log: Use distutils. Took me a while to figure out these lines. diff --git a/cffi/ffiplatform.py b/cffi/ffiplatform.py --- a/cffi/ffiplatform.py +++ b/cffi/ffiplatform.py @@ -29,3 +29,36 @@ 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 diff --git a/cffi/verifier.py b/cffi/verifier.py --- a/cffi/verifier.py +++ b/cffi/verifier.py @@ -18,10 +18,10 @@ self.typesdict[type] = num return num - def verify(self, preamble, stop_on_warnings=True): - # XXX take **kwds + def verify(self, preamble, **kwds): modname = ffiplatform.undercffi_module_name() - filebase = os.path.join(ffiplatform.tmpdir(), modname) + tmpdir = ffiplatform.tmpdir() + filebase = os.path.join(tmpdir, modname) self.chained_list_constants = None with open(filebase + '.c', 'w') as f: @@ -62,21 +62,11 @@ # del self.f - # XXX use more distutils? - import distutils.sysconfig - python_h = distutils.sysconfig.get_python_inc() - cmdline = "gcc -I'%s' -O2 -shared -fPIC %s.c -o %s.so" % ( - python_h, filebase, filebase) - if stop_on_warnings: - cmdline += " -Werror" - err = os.system(cmdline) - if err: - raise ffiplatform.VerificationError( - '%s.c: see compilation errors above' % (filebase,)) + outputfilename = ffiplatform.compile(tmpdir, modname, **kwds) # import imp try: - module = imp.load_dynamic(modname, '%s.so' % filebase) + module = imp.load_dynamic(modname, outputfilename) except ImportError, e: raise ffiplatform.VerificationError(str(e)) # _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit