From 5ca45626481778f12654cd2ea8c45b5eeb2363c6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= <mgorny@gentoo.org>
Date: Fri, 13 Nov 2020 01:02:28 +0100
Subject: [PATCH] Fancy patch for distutils C++ support, rebased for
 pypy7.3.3rc1

---
 lib-python/2.7/_osx_support.py                | 10 ++--
 lib-python/2.7/distutils/cygwinccompiler.py   | 21 ++++++-
 lib-python/2.7/distutils/emxccompiler.py      | 14 ++++-
 lib-python/2.7/distutils/sysconfig_cpython.py | 26 +++++++--
 lib-python/2.7/distutils/sysconfig_pypy.py    | 37 ++++++++++---
 lib-python/2.7/distutils/unixccompiler.py     | 55 ++++++++++---------
 6 files changed, 112 insertions(+), 51 deletions(-)

diff --git a/lib-python/2.7/_osx_support.py b/lib-python/2.7/_osx_support.py
index d2aaae7..8bcdb05 100644
--- a/lib-python/2.7/_osx_support.py
+++ b/lib-python/2.7/_osx_support.py
@@ -14,13 +14,13 @@ __all__ = [
 # configuration variables that may contain universal build flags,
 # like "-arch" or "-isdkroot", that may need customization for
 # the user environment
-_UNIVERSAL_CONFIG_VARS = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS', 'BASECFLAGS',
-                            'BLDSHARED', 'LDSHARED', 'CC', 'CXX',
-                            'PY_CFLAGS', 'PY_LDFLAGS', 'PY_CPPFLAGS',
-                            'PY_CORE_CFLAGS')
+_UNIVERSAL_CONFIG_VARS = ('CFLAGS', 'CXXFLAGS', 'LDFLAGS', 'CPPFLAGS',
+                          'BASECFLAGS', 'BLDSHARED', 'LDSHARED', 'LDCXXSHARED',
+                          'CC', 'CXX', 'PY_CFLAGS', 'PY_LDFLAGS',
+                          'PY_CPPFLAGS', 'PY_CORE_CFLAGS')
 
 # configuration variables that may contain compiler calls
-_COMPILER_CONFIG_VARS = ('BLDSHARED', 'LDSHARED', 'CC', 'CXX')
+_COMPILER_CONFIG_VARS = ('BLDSHARED', 'LDSHARED', 'LDCXXSHARED', 'CC', 'CXX')
 
 # prefix added to original configuration variable names
 _INITPRE = '_OSX_SUPPORT_INITIAL_'
diff --git a/lib-python/2.7/distutils/cygwinccompiler.py b/lib-python/2.7/distutils/cygwinccompiler.py
index 767400c..7133097 100644
--- a/lib-python/2.7/distutils/cygwinccompiler.py
+++ b/lib-python/2.7/distutils/cygwinccompiler.py
@@ -120,8 +120,10 @@ class CygwinCCompiler (UnixCCompiler):
         # dllwrap 2.10.90 is buggy
         if self.ld_version >= "2.10.90":
             self.linker_dll = "gcc"
+            self.linker_dll_cxx = "g++"
         else:
             self.linker_dll = "dllwrap"
+            self.linker_dll_cxx = "dllwrap"
 
         # ld_version >= "2.13" support -shared so use it instead of
         # -mdll -static
@@ -135,9 +137,13 @@ class CygwinCCompiler (UnixCCompiler):
         self.set_executables(compiler='gcc -mcygwin -O -Wall',
                              compiler_so='gcc -mcygwin -mdll -O -Wall',
                              compiler_cxx='g++ -mcygwin -O -Wall',
+                             compiler_so_cxx='g++ -mcygwin -mdll -O -Wall',
                              linker_exe='gcc -mcygwin',
                              linker_so=('%s -mcygwin %s' %
-                                        (self.linker_dll, shared_option)))
+                                        (self.linker_dll, shared_option)),
+                             linker_exe_cxx='g++ -mcygwin',
+                             linker_so_cxx=('%s -mcygwin %s' %
+                                            (self.linker_dll_cxx, shared_option)))
 
         # cygwin and mingw32 need different sets of libraries
         if self.gcc_version == "2.91.57":
@@ -163,8 +169,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, msg:
                 raise CompileError, msg
 
@@ -330,9 +340,14 @@ class Mingw32CCompiler (CygwinCCompiler):
         self.set_executables(compiler='gcc%s -O -Wall' % no_cygwin,
                              compiler_so='gcc%s -mdll -O -Wall' % no_cygwin,
                              compiler_cxx='g++%s -O -Wall' % no_cygwin,
+                             compiler_so_cxx='g++%s -mdll -O -Wall' % no_cygwin,
                              linker_exe='gcc%s' % no_cygwin,
                              linker_so='%s%s %s %s'
                                     % (self.linker_dll, no_cygwin,
+                                       shared_option, entry_point),
+                             linker_exe_cxx='g++%s' % no_cygwin,
+                             linker_so_cxx='%s%s %s %s'
+                                    % (self.linker_dll_cxx, no_cygwin,
                                        shared_option, entry_point))
         # Maybe we should also append -mthreads, but then the finished
         # dlls need another dll (mingwm10.dll see Mingw32 docs)
diff --git a/lib-python/2.7/distutils/emxccompiler.py b/lib-python/2.7/distutils/emxccompiler.py
index a017205..bdc532c 100644
--- a/lib-python/2.7/distutils/emxccompiler.py
+++ b/lib-python/2.7/distutils/emxccompiler.py
@@ -65,8 +65,12 @@ class EMXCCompiler (UnixCCompiler):
         # XXX optimization, warnings etc. should be customizable.
         self.set_executables(compiler='gcc -Zomf -Zmt -O3 -fomit-frame-pointer -mprobe -Wall',
                              compiler_so='gcc -Zomf -Zmt -O3 -fomit-frame-pointer -mprobe -Wall',
+                             compiler_cxx='g++ -Zomf -Zmt -O3 -fomit-frame-pointer -mprobe -Wall',
+                             compiler_so_cxx='g++ -Zomf -Zmt -O3 -fomit-frame-pointer -mprobe -Wall',
                              linker_exe='gcc -Zomf -Zmt -Zcrtdll',
-                             linker_so='gcc -Zomf -Zmt -Zcrtdll -Zdll')
+                             linker_so='gcc -Zomf -Zmt -Zcrtdll -Zdll',
+                             linker_exe_cxx='g++ -Zomf -Zmt -Zcrtdll',
+                             linker_so_cxx='g++ -Zomf -Zmt -Zcrtdll -Zdll')
 
         # want the gcc library statically linked (so that we don't have
         # to distribute a version dependent on the compiler we have)
@@ -83,8 +87,12 @@ class EMXCCompiler (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, msg:
                 raise CompileError, msg
 
diff --git a/lib-python/2.7/distutils/sysconfig_cpython.py b/lib-python/2.7/distutils/sysconfig_cpython.py
index 6a14f70..2cce5bc 100644
--- a/lib-python/2.7/distutils/sysconfig_cpython.py
+++ b/lib-python/2.7/distutils/sysconfig_cpython.py
@@ -181,10 +181,12 @@ def customize_compiler(compiler):
                 _osx_support.customize_compiler(_config_vars)
                 _config_vars['CUSTOMIZED_OSX_COMPILER'] = 'True'
 
-        (cc, cxx, cflags, ccshared, ldshared, so_ext, ar, ar_flags) = \
-            get_config_vars('CC', 'CXX', 'CFLAGS',
-                            'CCSHARED', 'LDSHARED', 'SO', 'AR',
-                            'ARFLAGS')
+        (cc, cxx, ccshared, ldshared, ldcxxshared, so_ext, ar, ar_flags) = \
+            get_config_vars('CC', 'CXX', 'CCSHARED', 'LDSHARED', 'LDCXXSHARED',
+                            'SO', 'AR', 'ARFLAGS')
+
+        cflags = ''
+        cxxflags = ''
 
         if 'CC' in os.environ:
             newcc = os.environ['CC']
@@ -199,19 +201,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:
@@ -220,13 +230,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)
 
         compiler.shared_lib_extension = so_ext
diff --git a/lib-python/2.7/distutils/sysconfig_pypy.py b/lib-python/2.7/distutils/sysconfig_pypy.py
index ec9f5a3..192974d 100644
--- a/lib-python/2.7/distutils/sysconfig_pypy.py
+++ b/lib-python/2.7/distutils/sysconfig_pypy.py
@@ -67,6 +67,7 @@ def _init_posix():
     g['CFLAGS'] = "-DNDEBUG -O2"
     g['CCSHARED'] = "-fPIC"
     g['LDSHARED'] = "cc -pthread -shared"
+    g['LDCXXSHARED'] = "c++ -pthread -shared"
     g['SO'] = [s[0] for s in imp.get_suffixes() if s[2] == imp.C_EXTENSION][0]
     g['AR'] = "ar"
     g['ARFLAGS'] = "rc"
@@ -85,6 +86,7 @@ def _init_posix():
             # just a guess
             arch = platform.machine()
         g['LDSHARED'] += ' -undefined dynamic_lookup'
+        g['LDCXXSHARED'] += ' -undefined dynamic_lookup'
         g['CC'] += ' -arch %s' % (arch,)
         g['MACOSX_DEPLOYMENT_TARGET'] = '10.7'
 
@@ -183,37 +185,52 @@ def customize_compiler(compiler):
                 _osx_support.customize_compiler(_config_vars)
                 _config_vars['CUSTOMIZED_OSX_COMPILER'] = 'True'
 
-        (cc, cxx, opt, cflags, ccshared, ldshared, so_ext, ar, ar_flags) = \
-            get_config_vars('CC', 'CXX', 'OPT', 'CFLAGS',
-                            'CCSHARED', 'LDSHARED', 'SO', 'AR',
-                            'ARFLAGS')
+        (cc, cxx, ccshared, ldshared, ldcxxshared, so_ext, ar, ar_flags) = \
+            get_config_vars('CC', 'CXX', 'CCSHARED', 'LDSHARED', 'LDCXXSHARED',
+                            'SO', 'AR', 'ARFLAGS')
+
+        cflags = ''
+        cxxflags = ''
 
         if 'CC' in os.environ:
             newcc = os.environ['CC']
-            if (sys.platform == 'darwin'
+            if (True
                     and 'LDSHARED' not in os.environ
                     and ldshared.startswith(cc)):
                 # On OS X, if CC is overridden, use that as the default
                 #       command for LDSHARED as well
+                # Gentoo: s/OS X/every system/
                 ldshared = newcc + ldshared[len(cc):]
             cc = newcc
         if 'CXX' in os.environ:
-            cxx = os.environ['CXX']
+            newcxx = os.environ['CXX']
+            if ('LDCXXSHARED' not in os.environ
+                    and ldcxxshared.startswith(cxx)):
+                ldcxxshared = newcxx + ldcxxshared[len(cxx):]
+            cxx = newcxx
         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 = opt + ' ' + 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:
@@ -222,13 +239,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)
 
         compiler.shared_lib_extension = so_ext
diff --git a/lib-python/2.7/distutils/unixccompiler.py b/lib-python/2.7/distutils/unixccompiler.py
index 250ff12..7e64543 100644
--- a/lib-python/2.7/distutils/unixccompiler.py
+++ b/lib-python/2.7/distutils/unixccompiler.py
@@ -55,14 +55,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' : ["c++"],  # pypy: changed, 'cc' is bogus
-                   '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":
@@ -129,12 +132,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, msg:
             raise CompileError, msg
 
@@ -191,23 +201,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 = i + 1
-
-                    linker[i] = self.compiler_cxx[i]
+                    if target_desc == CCompiler.EXECUTABLE:
+                        linker = self.linker_exe[:]
+                    else:
+                        linker = self.linker_so[:]
 
                 if sys.platform == 'darwin':
                     linker = _osx_support.compiler_fixup(linker, ld_args)
-- 
2.29.2

