mirror of
https://github.com/python/cpython.git
synced 2025-10-17 20:28:43 +00:00
This patch fixes the following bugs:
[#413582] g++ must be called for c++ extensions [#454030] distutils cannot link C++ code with GCC topdir = "Lib/distutils" * bcppcompiler.py (BCPPCompiler.create_static_lib): Fixed prototype, removing extra_preargs and extra_postargs parameters. Included target_lang parameter. (BCPPCompiler.link): Included target_lang parameter. * msvccompiler.py (MSVCCompiler.create_static_lib): Fixed prototype, removing extra_preargs and extra_postargs parameters. Included target_lang parameter. (MSVCCompiler.link): Included target_lang parameter. * ccompiler.py (CCompiler): New language_map and language_order attributes, used by CCompiler.detect_language(). (CCompiler.detect_language): New method, will return the language of a given source, or list of sources. Individual source language is detected using the language_map dict. When mixed sources are used, language_order will stablish the language precedence. (CCompiler.create_static_lib, CCompiler.link, CCompiler.link_executable, CCompiler.link_shared_object, CCompiler.link_shared_lib): Inlcuded target_lang parameter. * cygwinccompiler.py (CygwinCCompiler.link): Included target_lang parameter. * emxccompiler.py (EMXCCompiler.link): Included target_lang parameter. * mwerkscompiler.py (MWerksCompiler.link): Included target_lang parameter. * extension.py (Extension.__init__): New 'language' parameter/attribute, initialized to None by default. If provided will overlap the automatic detection made by CCompiler.detect_language(), in build_ext command. * sysconfig.py (customize_compiler): Check Makefile for CXX option, and also the environment variable CXX. Use the resulting value in the 'compiler_cxx' parameter of compiler.set_executables(). * unixccompiler.py (UnixCCompiler): Included 'compiler_cxx' in executables dict, defaulting to 'cc'. (UnixCCompiler.create_static_lib): Included target_lang parameter. (UnixCCompiler.link): Included target_lang parameter, and made linker command use compiler_cxx, if target_lang is 'c++'. * command/build_ext.py (build_ext.build_extension): Pass new ext.language attribute to compiler.link_shared_object()'s target_lang parameter. If ext.language is not provided, detect language using compiler.detect_language(sources) instead. * command/config.py (config._link): Pass already available lang parameter as target_lang parameter of compiler.link_executable().
This commit is contained in:
parent
173f11da5d
commit
6b016852f8
11 changed files with 96 additions and 35 deletions
|
@ -74,6 +74,19 @@ class CCompiler:
|
|||
shared_lib_format = None # prob. same as static_lib_format
|
||||
exe_extension = None # string
|
||||
|
||||
# Default language settings. language_map is used to detect a source
|
||||
# file or Extension target language, checking source filenames.
|
||||
# language_order is used to detect the language precedence, when deciding
|
||||
# what language to use when mixing source types. For example, if some
|
||||
# extension has two files with ".c" extension, and one with ".cpp", it
|
||||
# is still linked as c++.
|
||||
language_map = {".c" : "c",
|
||||
".cc" : "c++",
|
||||
".cpp" : "c++",
|
||||
".cxx" : "c++",
|
||||
".m" : "objc",
|
||||
}
|
||||
language_order = ["c++", "objc", "c"]
|
||||
|
||||
def __init__ (self,
|
||||
verbose=0,
|
||||
|
@ -572,6 +585,27 @@ class CCompiler:
|
|||
|
||||
# _need_link ()
|
||||
|
||||
def detect_language (self, sources):
|
||||
"""Detect the language of a given file, or list of files. Uses
|
||||
language_map, and language_order to do the job.
|
||||
"""
|
||||
if type(sources) is not ListType:
|
||||
sources = [sources]
|
||||
lang = None
|
||||
index = len(self.language_order)
|
||||
for source in sources:
|
||||
base, ext = os.path.splitext(source)
|
||||
extlang = self.language_map.get(ext)
|
||||
try:
|
||||
extindex = self.language_order.index(extlang)
|
||||
if extindex < index:
|
||||
lang = extlang
|
||||
index = extindex
|
||||
except ValueError:
|
||||
pass
|
||||
return lang
|
||||
|
||||
# detect_language ()
|
||||
|
||||
# -- Worker methods ------------------------------------------------
|
||||
# (must be implemented by subclasses)
|
||||
|
@ -671,7 +705,8 @@ class CCompiler:
|
|||
objects,
|
||||
output_libname,
|
||||
output_dir=None,
|
||||
debug=0):
|
||||
debug=0,
|
||||
target_lang=None):
|
||||
"""Link a bunch of stuff together to create a static library file.
|
||||
The "bunch of stuff" consists of the list of object files supplied
|
||||
as 'objects', the extra object files supplied to
|
||||
|
@ -688,6 +723,10 @@ class CCompiler:
|
|||
compile step where this matters: the 'debug' flag is included here
|
||||
just for consistency).
|
||||
|
||||
'target_lang' is the target language for which the given objects
|
||||
are being compiled. This allows specific linkage time treatment of
|
||||
certain languages.
|
||||
|
||||
Raises LibError on failure.
|
||||
"""
|
||||
pass
|
||||
|
@ -710,7 +749,8 @@ class CCompiler:
|
|||
debug=0,
|
||||
extra_preargs=None,
|
||||
extra_postargs=None,
|
||||
build_temp=None):
|
||||
build_temp=None,
|
||||
target_lang=None):
|
||||
"""Link a bunch of stuff together to create an executable or
|
||||
shared library file.
|
||||
|
||||
|
@ -748,6 +788,10 @@ class CCompiler:
|
|||
of course that they supply command-line arguments for the
|
||||
particular linker being used).
|
||||
|
||||
'target_lang' is the target language for which the given objects
|
||||
are being compiled. This allows specific linkage time treatment of
|
||||
certain languages.
|
||||
|
||||
Raises LinkError on failure.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
@ -766,13 +810,14 @@ class CCompiler:
|
|||
debug=0,
|
||||
extra_preargs=None,
|
||||
extra_postargs=None,
|
||||
build_temp=None):
|
||||
build_temp=None,
|
||||
target_lang=None):
|
||||
self.link(CCompiler.SHARED_LIBRARY, objects,
|
||||
self.library_filename(output_libname, lib_type='shared'),
|
||||
output_dir,
|
||||
libraries, library_dirs, runtime_library_dirs,
|
||||
export_symbols, debug,
|
||||
extra_preargs, extra_postargs, build_temp)
|
||||
extra_preargs, extra_postargs, build_temp, target_lang)
|
||||
|
||||
|
||||
def link_shared_object (self,
|
||||
|
@ -786,12 +831,13 @@ class CCompiler:
|
|||
debug=0,
|
||||
extra_preargs=None,
|
||||
extra_postargs=None,
|
||||
build_temp=None):
|
||||
build_temp=None,
|
||||
target_lang=None):
|
||||
self.link(CCompiler.SHARED_OBJECT, objects,
|
||||
output_filename, output_dir,
|
||||
libraries, library_dirs, runtime_library_dirs,
|
||||
export_symbols, debug,
|
||||
extra_preargs, extra_postargs, build_temp)
|
||||
extra_preargs, extra_postargs, build_temp, target_lang)
|
||||
|
||||
|
||||
def link_executable (self,
|
||||
|
@ -803,11 +849,12 @@ class CCompiler:
|
|||
runtime_library_dirs=None,
|
||||
debug=0,
|
||||
extra_preargs=None,
|
||||
extra_postargs=None):
|
||||
extra_postargs=None,
|
||||
target_lang=None):
|
||||
self.link(CCompiler.EXECUTABLE, objects,
|
||||
self.executable_filename(output_progname), output_dir,
|
||||
libraries, library_dirs, runtime_library_dirs, None,
|
||||
debug, extra_preargs, extra_postargs, None)
|
||||
debug, extra_preargs, extra_postargs, None, target_lang)
|
||||
|
||||
|
||||
# -- Miscellaneous methods -----------------------------------------
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue