Author: Wim Lavrijsen <wlavrij...@lbl.gov> Branch: cppyy-packaging Changeset: r92595:582dbcdc2741 Date: 2017-10-03 15:44 -0700 http://bitbucket.org/pypy/pypy/changeset/582dbcdc2741/
Log: allow envar CPPYY_BACKEND_LIBRARY to direct the location of the backend library diff --git a/pypy/module/_cppyy/capi/loadable_capi.py b/pypy/module/_cppyy/capi/loadable_capi.py --- a/pypy/module/_cppyy/capi/loadable_capi.py +++ b/pypy/module/_cppyy/capi/loadable_capi.py @@ -1,3 +1,4 @@ +import os from rpython.rtyper.lltypesystem import rffi, lltype from rpython.rlib.rarithmetic import intmask from rpython.rlib import jit, jit_libffi, libffi, rdynload, objectmodel @@ -15,7 +16,7 @@ C_METHOD, C_INDEX, C_INDEX_ARRAY, WLAVC_INDEX, C_FUNC_PTR -reflection_library = 'libcppyy_backend.so' +backend_library = 'libcppyy_backend.so' # this is not technically correct, but will do for now std_string_name = 'std::basic_string<char>' @@ -112,7 +113,7 @@ class State(object): def __init__(self, space): - self.library = None + self.backend = None self.capi_calls = {} nt = newtype # module from _cffi_backend @@ -261,24 +262,32 @@ self.c_offset_farg = 0 -def load_reflection_library(space): +def load_backend(space): state = space.fromcache(State) - if state.library is None: + if state.backend is None: from pypy.module._cffi_backend.libraryobj import W_Library - state.library = W_Library(space, reflection_library, rdynload.RTLD_LOCAL | rdynload.RTLD_LAZY) - if state.library: + dldflags = rdynload.RTLD_LOCAL | rdynload.RTLD_LAZY + if os.environ.get('CPPYY_BACKEND_LIBRARY'): + libname = os.environ['CPPYY_BACKEND_LIBRARY'] + state.backend = W_Library(space, libname, dldflags) + else: + # try usual lookups + state.backend = W_Library(space, backend_library, dldflags) + + if state.backend: # fix constants - state.c_sizeof_farg = _cdata_to_size_t(space, call_capi(space, 'function_arg_sizeof', [])) - state.c_offset_farg = _cdata_to_size_t(space, call_capi(space, 'function_arg_typeoffset', [])) - return state.library + state.c_sizeof_farg = _cdata_to_size_t( + space, call_capi(space, 'function_arg_sizeof', [])) + state.c_offset_farg = _cdata_to_size_t( + space, call_capi(space, 'function_arg_typeoffset', [])) def verify_backend(space): try: - load_reflection_library(space) + load_backend(space) except Exception: if objectmodel.we_are_translated(): raise oefmt(space.w_ImportError, - "missing reflection library %s", reflection_library) + "missing reflection library %s", backend_library) return False return True @@ -287,11 +296,11 @@ try: c_call = state.capi_calls[name] except KeyError: - if state.library is None: - load_reflection_library(space) + if state.backend is None: + load_backend(space) iface = state.capi_call_ifaces[name] cfunc = W_RCTypeFunc(space, iface[0], iface[1], False) - c_call = state.library.load_function(cfunc, 'cppyy_'+name) + c_call = state.backend.load_function(cfunc, 'cppyy_'+name) # TODO: there must be a better way to trick the leakfinder ... if not objectmodel.we_are_translated(): leakfinder.remember_free(c_call.ctype.cif_descr._obj0) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit