Author: Ronan Lamy <ronan.l...@gmail.com> Branch: Changeset: r86947:006a4e6fc3a9 Date: 2016-09-07 18:51 +0100 http://bitbucket.org/pypy/pypy/changeset/006a4e6fc3a9/
Log: Bundle all the static bits of compilation info into a SystemCompilationInfo object diff --git a/pypy/module/cpyext/test/test_cpyext.py b/pypy/module/cpyext/test/test_cpyext.py --- a/pypy/module/cpyext/test/test_cpyext.py +++ b/pypy/module/cpyext/test/test_cpyext.py @@ -53,7 +53,21 @@ libraries=libraries) return soname -def get_extra_args(space): +class SystemCompilationInfo(object): + """Bundles all the generic information required to compile extensions. + + Note: here, 'system' means OS + target interpreter + test config + ... + """ + def __init__(self, include_extra=None, compile_extra=None, link_extra=None, + extra_libs=None, ext=None): + self.include_extra = include_extra or [] + self.compile_extra = compile_extra + self.link_extra = link_extra + self.extra_libs = extra_libs + self.ext = ext + +def get_cpyext_info(space): + from pypy.module.imp.importing import get_so_extension state = space.fromcache(State) api_library = state.api_lib if sys.platform == 'win32': @@ -63,14 +77,21 @@ # prevent linking with PythonXX.lib w_maj, w_min = space.fixedview(space.sys.get('version_info'), 5)[:2] link_extra = ["/NODEFAULTLIB:Python%d%d.lib" % - (space.int_w(w_maj), space.int_w(w_min))] + (space.int_w(w_maj), space.int_w(w_min))] else: libraries = [] if sys.platform.startswith('linux'): - compile_extra = ["-Werror", "-g", "-O0", "-Wp,-U_FORTIFY_SOURCE", "-fPIC"] + compile_extra = [ + "-Werror", "-g", "-O0", "-Wp,-U_FORTIFY_SOURCE", "-fPIC"] link_extra = ["-g"] else: compile_extra = link_extra = None + return SystemCompilationInfo( + include_extra=api.include_dirs, + compile_extra=compile_extra, + link_extra=link_extra, + extra_libs=libraries, + ext=get_so_extension(space)) def compile_extension_module(space, modname, include_dirs=[], @@ -85,39 +106,21 @@ Any extra keyword arguments are passed on to ExternalCompilationInfo to build the module (so specify your source with one of those). """ - state = space.fromcache(State) - api_library = state.api_lib - if sys.platform == 'win32': - libraries = [api_library] - # '%s' undefined; assuming extern returning int - compile_extra = ["/we4013"] - # prevent linking with PythonXX.lib - w_maj, w_min = space.fixedview(space.sys.get('version_info'), 5)[:2] - link_extra = ["/NODEFAULTLIB:Python%d%d.lib" % - (space.int_w(w_maj), space.int_w(w_min))] - else: - libraries = [] - if sys.platform.startswith('linux'): - compile_extra = ["-Werror", "-g", "-O0", "-Wp,-U_FORTIFY_SOURCE", "-fPIC"] - link_extra = ["-g"] - else: - compile_extra = link_extra = None - from pypy.module.imp.importing import get_so_extension - ext = get_so_extension(space) - include_extra = api.include_dirs - extra_libs = libraries - return _compile_ext(modname, include_dirs, source_files, source_strings, include_extra, compile_extra, link_extra, extra_libs, ext) + sys_info = get_cpyext_info(space) + return _compile_ext( + modname, include_dirs, source_files, source_strings, sys_info) -def _compile_ext(modname, include_dirs, source_files, source_strings, include_extra, compile_extra, link_extra, extra_libs, ext): + +def _compile_ext(modname, include_dirs, source_files, source_strings, sys_info): modname = modname.split('.')[-1] soname = create_so(modname, - include_dirs=include_extra + include_dirs, - source_files=source_files, - source_strings=source_strings, - compile_extra=compile_extra, - link_extra=link_extra, - libraries=extra_libs) - pydname = soname.new(purebasename=modname, ext=ext) + include_dirs=sys_info.include_extra + include_dirs, + source_files=source_files, + source_strings=source_strings, + compile_extra=sys_info.compile_extra, + link_extra=sys_info.link_extra, + libraries=sys_info.extra_libs) + pydname = soname.new(purebasename=modname, ext=sys_info.ext) soname.rename(pydname) return str(pydname) @@ -130,6 +133,24 @@ raise RuntimeError("This interpreter does not define a filename " "suffix for C extensions!") +def get_sys_info_app(space): + if sys.platform == 'win32': + compile_extra = ["/we4013"] + link_extra = ["/LIBPATH:" + os.path.join(sys.exec_prefix, 'libs')] + elif sys.platform == 'darwin': + compile_extra = link_extra = None + pass + elif sys.platform.startswith('linux'): + compile_extra = [ + "-O0", "-g", "-Werror=implicit-function-declaration", "-fPIC"] + link_extra = None + ext = get_so_suffix() + return SystemCompilationInfo( + include_extra=[space.include_dir], + compile_extra=compile_extra, + link_extra=link_extra, + ext=get_so_suffix()) + def compile_extension_module_applevel(space, modname, include_dirs=[], source_files=None, source_strings=None): """ @@ -142,20 +163,9 @@ Any extra keyword arguments are passed on to ExternalCompilationInfo to build the module (so specify your source with one of those). """ - if sys.platform == 'win32': - compile_extra = ["/we4013"] - link_extra = ["/LIBPATH:" + os.path.join(sys.exec_prefix, 'libs')] - elif sys.platform == 'darwin': - compile_extra = link_extra = None - pass - elif sys.platform.startswith('linux'): - compile_extra = [ - "-O0", "-g", "-Werror=implicit-function-declaration", "-fPIC"] - link_extra = None - ext = get_so_suffix() - include_extra = [space.include_dir] - extra_libs = None - return _compile_ext(modname, include_dirs, source_files, source_strings, include_extra, compile_extra, link_extra, extra_libs, ext) + sys_info = get_sys_info_app(space) + return _compile_ext( + modname, include_dirs, source_files, source_strings, sys_info) def freeze_refcnts(self): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit