setuptools 60.x (re-)introduces a bundled distutils, which we need to patch with C++ support in the same way as we do with the stdlib's distutils (mostly to placate clang on macos)
217 lines
10 KiB
Diff
217 lines
10 KiB
Diff
Based on pkgs/development/interpreters/python/cpython/3.7/python-3.x-distutils-C++.patch,
|
|
adapted to apply to setuptools 60.x's bundled distutils.
|
|
|
|
diff --git a/setuptools/_distutils/cygwinccompiler.py b/setuptools/_distutils/cygwinccompiler.py
|
|
index c5c86d8f..b879e447 100644
|
|
--- a/setuptools/_distutils/cygwinccompiler.py
|
|
+++ b/setuptools/_distutils/cygwinccompiler.py
|
|
@@ -124,14 +124,19 @@ class CygwinCCompiler(UnixCCompiler):
|
|
self.cxx = os.environ.get('CXX', 'g++')
|
|
|
|
self.linker_dll = self.cc
|
|
+ self.linker_dll_cxx = self.cxx
|
|
shared_option = "-shared"
|
|
|
|
self.set_executables(compiler='%s -mcygwin -O -Wall' % self.cc,
|
|
compiler_so='%s -mcygwin -mdll -O -Wall' % self.cc,
|
|
compiler_cxx='%s -mcygwin -O -Wall' % self.cxx,
|
|
+ compiler_so_cxx='%s -mcygwin -mdll -O -Wall' % self.cxx,
|
|
linker_exe='%s -mcygwin' % self.cc,
|
|
linker_so=('%s -mcygwin %s' %
|
|
- (self.linker_dll, shared_option)))
|
|
+ (self.linker_dll, shared_option)),
|
|
+ linker_exe_cxx='%s -mcygwin' % self.cxx,
|
|
+ linker_so_cxx=('%s -mcygwin %s' %
|
|
+ (self.linker_dll_cxx, shared_option)))
|
|
|
|
# Include the appropriate MSVC runtime library if Python was built
|
|
# with MSVC 7.0 or later.
|
|
@@ -162,8 +167,12 @@ class CygwinCCompiler(UnixCCompiler):
|
|
raise CompileError(msg)
|
|
else: # for other files use the C-compiler
|
|
try:
|
|
- self.spawn(self.compiler_so + cc_args + [src, '-o', obj] +
|
|
- extra_postargs)
|
|
+ if self.detect_language(src) == 'c++':
|
|
+ self.spawn(self.compiler_so_cxx + cc_args + [src, '-o', obj] +
|
|
+ extra_postargs)
|
|
+ else:
|
|
+ self.spawn(self.compiler_so + cc_args + [src, '-o', obj] +
|
|
+ extra_postargs)
|
|
except DistutilsExecError as msg:
|
|
raise CompileError(msg)
|
|
|
|
@@ -279,9 +288,13 @@ class Mingw32CCompiler(CygwinCCompiler):
|
|
self.set_executables(compiler='%s -O -Wall' % self.cc,
|
|
compiler_so='%s -mdll -O -Wall' % self.cc,
|
|
compiler_cxx='%s -O -Wall' % self.cxx,
|
|
+ compiler_so_cxx='%s -mdll -O -Wall' % self.cxx,
|
|
linker_exe='%s' % self.cc,
|
|
linker_so='%s %s'
|
|
- % (self.linker_dll, shared_option))
|
|
+ % (self.linker_dll, shared_option),
|
|
+ linker_exe_cxx='%s' % self.cxx,
|
|
+ linker_so_cxx='%s %s'
|
|
+ % (self.linker_dll_cxx, shared_option))
|
|
|
|
# Maybe we should also append -mthreads, but then the finished
|
|
# dlls need another dll (mingwm10.dll see Mingw32 docs)
|
|
diff --git a/setuptools/_distutils/sysconfig.py b/setuptools/_distutils/sysconfig.py
|
|
index 4a77a431..1ad85181 100644
|
|
--- a/setuptools/_distutils/sysconfig.py
|
|
+++ b/setuptools/_distutils/sysconfig.py
|
|
@@ -216,9 +216,11 @@ def customize_compiler(compiler):
|
|
_osx_support.customize_compiler(_config_vars)
|
|
_config_vars['CUSTOMIZED_OSX_COMPILER'] = 'True'
|
|
|
|
- (cc, cxx, cflags, ccshared, ldshared, shlib_suffix, ar, ar_flags) = \
|
|
- get_config_vars('CC', 'CXX', 'CFLAGS',
|
|
- 'CCSHARED', 'LDSHARED', 'SHLIB_SUFFIX', 'AR', 'ARFLAGS')
|
|
+ (cc, cxx, cflags, ccshared, ldshared, ldcxxshared, shlib_suffix, ar, ar_flags) = \
|
|
+ get_config_vars('CC', 'CXX', 'CFLAGS', 'CCSHARED', 'LDSHARED', 'LDCXXSHARED',
|
|
+ 'SHLIB_SUFFIX', 'AR', 'ARFLAGS')
|
|
+
|
|
+ cxxflags = cflags
|
|
|
|
if 'CC' in os.environ:
|
|
newcc = os.environ['CC']
|
|
@@ -232,19 +234,27 @@ def customize_compiler(compiler):
|
|
cxx = os.environ['CXX']
|
|
if 'LDSHARED' in os.environ:
|
|
ldshared = os.environ['LDSHARED']
|
|
+ if 'LDCXXSHARED' in os.environ:
|
|
+ ldcxxshared = os.environ['LDCXXSHARED']
|
|
if 'CPP' in os.environ:
|
|
cpp = os.environ['CPP']
|
|
else:
|
|
cpp = cc + " -E" # not always
|
|
if 'LDFLAGS' in os.environ:
|
|
ldshared = ldshared + ' ' + os.environ['LDFLAGS']
|
|
+ ldcxxshared = ldcxxshared + ' ' + os.environ['LDFLAGS']
|
|
if 'CFLAGS' in os.environ:
|
|
- cflags = cflags + ' ' + os.environ['CFLAGS']
|
|
+ cflags = os.environ['CFLAGS']
|
|
ldshared = ldshared + ' ' + os.environ['CFLAGS']
|
|
+ if 'CXXFLAGS' in os.environ:
|
|
+ cxxflags = os.environ['CXXFLAGS']
|
|
+ ldcxxshared = ldcxxshared + ' ' + os.environ['CXXFLAGS']
|
|
if 'CPPFLAGS' in os.environ:
|
|
cpp = cpp + ' ' + os.environ['CPPFLAGS']
|
|
cflags = cflags + ' ' + os.environ['CPPFLAGS']
|
|
+ cxxflags = cxxflags + ' ' + os.environ['CPPFLAGS']
|
|
ldshared = ldshared + ' ' + os.environ['CPPFLAGS']
|
|
+ ldcxxshared = ldcxxshared + ' ' + os.environ['CPPFLAGS']
|
|
if 'AR' in os.environ:
|
|
ar = os.environ['AR']
|
|
if 'ARFLAGS' in os.environ:
|
|
@@ -253,13 +263,17 @@ def customize_compiler(compiler):
|
|
archiver = ar + ' ' + ar_flags
|
|
|
|
cc_cmd = cc + ' ' + cflags
|
|
+ cxx_cmd = cxx + ' ' + cxxflags
|
|
compiler.set_executables(
|
|
preprocessor=cpp,
|
|
compiler=cc_cmd,
|
|
compiler_so=cc_cmd + ' ' + ccshared,
|
|
- compiler_cxx=cxx,
|
|
+ compiler_cxx=cxx_cmd,
|
|
+ compiler_so_cxx=cxx_cmd + ' ' + ccshared,
|
|
linker_so=ldshared,
|
|
linker_exe=cc,
|
|
+ linker_so_cxx=ldcxxshared,
|
|
+ linker_exe_cxx=cxx,
|
|
archiver=archiver)
|
|
|
|
if 'RANLIB' in os.environ and compiler.executables.get('ranlib', None):
|
|
diff --git a/setuptools/_distutils/unixccompiler.py b/setuptools/_distutils/unixccompiler.py
|
|
index a07e5988..576ef490 100644
|
|
--- a/setuptools/_distutils/unixccompiler.py
|
|
+++ b/setuptools/_distutils/unixccompiler.py
|
|
@@ -52,14 +52,17 @@ class UnixCCompiler(CCompiler):
|
|
# are pretty generic; they will probably have to be set by an outsider
|
|
# (eg. using information discovered by the sysconfig about building
|
|
# Python extensions).
|
|
- executables = {'preprocessor' : None,
|
|
- 'compiler' : ["cc"],
|
|
- 'compiler_so' : ["cc"],
|
|
- 'compiler_cxx' : ["cc"],
|
|
- 'linker_so' : ["cc", "-shared"],
|
|
- 'linker_exe' : ["cc"],
|
|
- 'archiver' : ["ar", "-cr"],
|
|
- 'ranlib' : None,
|
|
+ executables = {'preprocessor' : None,
|
|
+ 'compiler' : ["cc"],
|
|
+ 'compiler_so' : ["cc"],
|
|
+ 'compiler_cxx' : ["c++"],
|
|
+ 'compiler_so_cxx' : ["c++"],
|
|
+ 'linker_so' : ["cc", "-shared"],
|
|
+ 'linker_exe' : ["cc"],
|
|
+ 'linker_so_cxx' : ["c++", "-shared"],
|
|
+ 'linker_exe_cxx' : ["c++"],
|
|
+ 'archiver' : ["ar", "-cr"],
|
|
+ 'ranlib' : None,
|
|
}
|
|
|
|
if sys.platform[:6] == "darwin":
|
|
@@ -110,12 +113,19 @@ class UnixCCompiler(CCompiler):
|
|
|
|
def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts):
|
|
compiler_so = self.compiler_so
|
|
+ compiler_so_cxx = self.compiler_so_cxx
|
|
if sys.platform == 'darwin':
|
|
compiler_so = _osx_support.compiler_fixup(compiler_so,
|
|
cc_args + extra_postargs)
|
|
+ compiler_so_cxx = _osx_support.compiler_fixup(compiler_so_cxx,
|
|
+ cc_args + extra_postargs)
|
|
try:
|
|
- self.spawn(compiler_so + cc_args + [src, '-o', obj] +
|
|
- extra_postargs)
|
|
+ if self.detect_language(src) == 'c++':
|
|
+ self.spawn(compiler_so_cxx + cc_args + [src, '-o', obj] +
|
|
+ extra_postargs)
|
|
+ else:
|
|
+ self.spawn(compiler_so + cc_args + [src, '-o', obj] +
|
|
+ extra_postargs)
|
|
except DistutilsExecError as msg:
|
|
raise CompileError(msg)
|
|
|
|
@@ -173,30 +183,16 @@ class UnixCCompiler(CCompiler):
|
|
ld_args.extend(extra_postargs)
|
|
self.mkpath(os.path.dirname(output_filename))
|
|
try:
|
|
- if target_desc == CCompiler.EXECUTABLE:
|
|
- linker = self.linker_exe[:]
|
|
+ if target_lang == "c++":
|
|
+ if target_desc == CCompiler.EXECUTABLE:
|
|
+ linker = self.linker_exe_cxx[:]
|
|
+ else:
|
|
+ linker = self.linker_so_cxx[:]
|
|
else:
|
|
- linker = self.linker_so[:]
|
|
- if target_lang == "c++" and self.compiler_cxx:
|
|
- # skip over environment variable settings if /usr/bin/env
|
|
- # is used to set up the linker's environment.
|
|
- # This is needed on OSX. Note: this assumes that the
|
|
- # normal and C++ compiler have the same environment
|
|
- # settings.
|
|
- i = 0
|
|
- if os.path.basename(linker[0]) == "env":
|
|
- i = 1
|
|
- while '=' in linker[i]:
|
|
- i += 1
|
|
-
|
|
- if os.path.basename(linker[i]) == 'ld_so_aix':
|
|
- # AIX platforms prefix the compiler with the ld_so_aix
|
|
- # script, so we need to adjust our linker index
|
|
- offset = 1
|
|
+ if target_desc == CCompiler.EXECUTABLE:
|
|
+ linker = self.linker_exe[:]
|
|
else:
|
|
- offset = 0
|
|
-
|
|
- linker[i+offset] = self.compiler_cxx[i]
|
|
+ linker = self.linker_so[:]
|
|
|
|
if sys.platform == 'darwin':
|
|
linker = _osx_support.compiler_fixup(linker, ld_args)
|