python: fix patch issue for 2.7.X, 3.7.X (#17140)
* python: fixing patch issue for 2.7.X, 3.7.X versions (#17128) * python: fixing the C/C++ 'distutils' patching for @3.7.0:3.7.1
This commit is contained in:
		| @@ -167,9 +167,11 @@ class Python(AutotoolsPackage): | ||||
|     # C/C++ modules, consider installing a Spack-managed Python with | ||||
|     # this patch instead. For more information, see: | ||||
|     # https://github.com/spack/spack/pull/16856 | ||||
|     patch('python-2.7-distutils-C++.patch', when='@2.7') | ||||
|     patch('python-3.6-distutils-C++.patch', when='@3.6') | ||||
|     patch('python-3.7+-distutils-C++.patch', when='@3.7:3.8') | ||||
|     patch('python-2.7.8-distutils-C++.patch', when='@2.7.8:2.7.16') | ||||
|     patch('python-2.7.17+-distutils-C++.patch', when='@2.7.17:2.7.18') | ||||
|     patch('python-3.6.8-distutils-C++.patch', when='@3.6.8,3.7.2') | ||||
|     patch('python-3.7.3-distutils-C++.patch', when='@3.7.3') | ||||
|     patch('python-3.7.4+-distutils-C++.patch', when='@3.7.4:3.8') | ||||
| 
 | ||||
|     patch('tkinter.patch', when='@:2.8,3.3:3.7 platform=darwin') | ||||
| 
 | ||||
| @@ -267,6 +269,15 @@ def setup_build_environment(self, env): | ||||
|             tty.warn(('Python v{0} may not install properly if Python ' | ||||
|                       'user configurations are present.').format(self.version)) | ||||
| 
 | ||||
|         # TODO: Python has incomplete support for Python modules with mixed | ||||
|         # C/C++ source, and patches are required to enable building for these | ||||
|         # modules. All Python versions without a viable patch are installed | ||||
|         # with a warning message about this potentially erroneous behavior. | ||||
|         if not spec.satisfies('@2.7.8:2.7.18,3.6.8,3.7.2:3.8.3'): | ||||
|             tty.warn(('Python v{0} does not have the C++ "distutils" patch; ' | ||||
|                       'errors may occur when installing Python modules w/ ' | ||||
|                       'mixed C/C++ source files.').format(self.version)) | ||||
| 
 | ||||
|         # Need this to allow python build to find the Python installation. | ||||
|         env.set('MACOSX_DEPLOYMENT_TARGET', platform.mac_ver()[0]) | ||||
| 
 | ||||
|   | ||||
| @@ -0,0 +1,269 @@ | ||||
| diff --git a/Lib/_osx_support.py b/Lib/_osx_support.py | ||||
| index d2aaae7..8bcdb05 100644 | ||||
| --- a/Lib/_osx_support.py | ||||
| +++ b/Lib/_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/distutils/cygwinccompiler.py b/Lib/distutils/cygwinccompiler.py | ||||
| index 258e138..13b7d0c 100644 | ||||
| --- a/Lib/distutils/cygwinccompiler.py | ||||
| +++ b/Lib/distutils/cygwinccompiler.py | ||||
| @@ -117,8 +117,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 | ||||
| @@ -132,9 +134,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": | ||||
| @@ -160,8 +166,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 | ||||
|   | ||||
| @@ -327,9 +337,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/distutils/emxccompiler.py b/Lib/distutils/emxccompiler.py | ||||
| index a017205..bdc532c 100644 | ||||
| --- a/Lib/distutils/emxccompiler.py | ||||
| +++ b/Lib/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/distutils/sysconfig.py b/Lib/distutils/sysconfig.py | ||||
| index 1a4b792..9d724b2 100644 | ||||
| --- a/Lib/distutils/sysconfig.py | ||||
| +++ b/Lib/distutils/sysconfig.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'] | ||||
|              ldshared = ldshared + ' ' + os.environ['CFLAGS'] | ||||
| +        if 'CXXFLAGS' in os.environ: | ||||
| +            cxxflags = 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/distutils/unixccompiler.py b/Lib/distutils/unixccompiler.py | ||||
| index 3af540e..f8f7efe 100644 | ||||
| --- a/Lib/distutils/unixccompiler.py | ||||
| +++ b/Lib/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' : ["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": | ||||
| @@ -114,12 +117,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 | ||||
|   | ||||
| @@ -176,23 +186,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) | ||||
| @@ -0,0 +1,256 @@ | ||||
| diff --git a/Lib/_osx_support.py b/Lib/_osx_support.py | ||||
| index db6674e..ccbe09a 100644 | ||||
| --- a/Lib/_osx_support.py | ||||
| +++ b/Lib/_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', 'PY_CORE_LDFLAGS') | ||||
| +_UNIVERSAL_CONFIG_VARS = ('CFLAGS', 'CXXFLAGS', 'LDFLAGS', 'CPPFLAGS', | ||||
| +                          'BASECFLAGS', 'BLDSHARED', 'LDSHARED', 'LDCXXSHARED', | ||||
| +                          'CC', 'CXX', 'PY_CFLAGS', 'PY_LDFLAGS', | ||||
| +                          'PY_CPPFLAGS', 'PY_CORE_LDFLAGS', '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/distutils/cygwinccompiler.py b/Lib/distutils/cygwinccompiler.py | ||||
| index 6c5d777..640fa2d 100644 | ||||
| --- a/Lib/distutils/cygwinccompiler.py | ||||
| +++ b/Lib/distutils/cygwinccompiler.py | ||||
| @@ -125,8 +125,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 | ||||
| @@ -140,9 +142,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": | ||||
| @@ -166,8 +172,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) | ||||
|   | ||||
| @@ -302,9 +312,14 @@ class Mingw32CCompiler(CygwinCCompiler): | ||||
|          self.set_executables(compiler='gcc -O -Wall', | ||||
|                               compiler_so='gcc -mdll -O -Wall', | ||||
|                               compiler_cxx='g++ -O -Wall', | ||||
| +                             compiler_so_cxx='g++ -mdll -O -Wall', | ||||
|                               linker_exe='gcc', | ||||
|                               linker_so='%s %s %s' | ||||
|                                          % (self.linker_dll, shared_option, | ||||
| +                                           entry_point), | ||||
| +                             linker_exe_cxx='g++', | ||||
| +                             linker_so_cxx='%s %s %s' | ||||
| +                                        % (self.linker_dll_cxx, 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/distutils/sysconfig.py b/Lib/distutils/sysconfig.py | ||||
| index 83160f8..b735369 100644 | ||||
| --- a/Lib/distutils/sysconfig.py | ||||
| +++ b/Lib/distutils/sysconfig.py | ||||
| @@ -183,9 +183,11 @@ def customize_compiler(compiler): | ||||
|                  _osx_support.customize_compiler(_config_vars) | ||||
|                  _config_vars['CUSTOMIZED_OSX_COMPILER'] = 'True' | ||||
|   | ||||
| -        (cc, cxx, opt, cflags, ccshared, ldshared, shlib_suffix, ar, ar_flags) = \ | ||||
| +        (cc, cxx, opt, cflags, ccshared, ldshared, ldcxxshared, shlib_suffix, ar, ar_flags) = \ | ||||
|              get_config_vars('CC', 'CXX', 'OPT', 'CFLAGS', | ||||
| -                            'CCSHARED', 'LDSHARED', 'SHLIB_SUFFIX', 'AR', 'ARFLAGS') | ||||
| +                            'CCSHARED', 'LDSHARED', 'LDCXXSHARED', 'SHLIB_SUFFIX', 'AR', 'ARFLAGS') | ||||
| + | ||||
| +        cxxflags = cflags | ||||
|   | ||||
|          if 'CC' in os.environ: | ||||
|              newcc = os.environ['CC'] | ||||
| @@ -200,19 +202,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 = opt + ' ' + os.environ['CFLAGS'] | ||||
|              ldshared = ldshared + ' ' + os.environ['CFLAGS'] | ||||
| +        if 'CXXFLAGS' in os.environ: | ||||
| +            cxxflags = opt + ' ' + os.environ['CXXFLAGS'] | ||||
| +            ldcxxshared = ldcxxshared + ' ' + os.environ['CXXFLAGS'] | ||||
|          if 'CPPFLAGS' in os.environ: | ||||
|              cpp = cpp + ' ' + os.environ['CPPFLAGS'] | ||||
| +            cxxflags = cxxflags + ' ' + os.environ['CPPFLAGS'] | ||||
|              cflags = cflags + ' ' + 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: | ||||
| @@ -221,13 +231,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 = shlib_suffix | ||||
| diff --git a/Lib/distutils/unixccompiler.py b/Lib/distutils/unixccompiler.py | ||||
| index d10a78d..7e88781 100644 | ||||
| --- a/Lib/distutils/unixccompiler.py | ||||
| +++ b/Lib/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) | ||||
| diff --git a/Makefile.pre.in b/Makefile.pre.in | ||||
| index 2d2e11f..8456e3f 100644 | ||||
| --- a/Makefile.pre.in | ||||
| +++ b/Makefile.pre.in | ||||
| @@ -615,10 +615,10 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o | ||||
|  	    *\ -s*|s*) quiet="-q";; \ | ||||
|  	    *) quiet="";; \ | ||||
|  	esac; \ | ||||
| -	echo "$(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \ | ||||
| +	echo "$(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' CFLAGS='$(PY_CFLAGS)' \ | ||||
|  		_TCLTK_INCLUDES='$(TCLTK_INCLUDES)' _TCLTK_LIBS='$(TCLTK_LIBS)' \ | ||||
|  		$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build"; \ | ||||
| -	$(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \ | ||||
| +	$(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' CFLAGS='$(PY_CFLAGS)' \ | ||||
|  		_TCLTK_INCLUDES='$(TCLTK_INCLUDES)' _TCLTK_LIBS='$(TCLTK_LIBS)' \ | ||||
|  		$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Joseph Ciurej
					Joseph Ciurej