diff --git a/numpy/distutils/ccompiler.py b/numpy/distutils/ccompiler.py index 8697fae620dc..f0487cb64fdb 100644 --- a/numpy/distutils/ccompiler.py +++ b/numpy/distutils/ccompiler.py @@ -686,10 +686,17 @@ def CCompiler_cxx_compiler(self): cxx.compiler_cxx = cxx.compiler_cxx cxx.compiler_so = [cxx.compiler_cxx[0]] + \ sanitize_cxx_flags(cxx.compiler_so[1:]) - if sys.platform.startswith('aix') and 'ld_so_aix' in cxx.linker_so[0]: + if (sys.platform.startswith(('aix', 'os400')) and + 'ld_so_aix' in cxx.linker_so[0]): # AIX needs the ld_so_aix script included with Python cxx.linker_so = [cxx.linker_so[0], cxx.compiler_cxx[0]] \ + cxx.linker_so[2:] + if sys.platform.startswith('os400'): + #This is required by i 7.4 and prievous for PRId64 in printf() call. + cxx.compiler_so.append('-D__STDC_FORMAT_MACROS') + #This a bug of gcc10.3, which failed to handle the TLS init. + cxx.compiler_so.append('-fno-extern-tls-init') + cxx.linker_so.append('-fno-extern-tls-init') else: cxx.linker_so = [cxx.compiler_cxx[0]] + cxx.linker_so[1:] return cxx diff --git a/numpy/distutils/fcompiler/__init__.py b/numpy/distutils/fcompiler/__init__.py index d8dcfa8994e1..ecba3e5d581c 100644 --- a/numpy/distutils/fcompiler/__init__.py +++ b/numpy/distutils/fcompiler/__init__.py @@ -527,6 +527,12 @@ def get_flags(tag, flags): ld_so_aix = os.path.join(python_lib, 'config', 'ld_so_aix') python_exp = os.path.join(python_lib, 'config', 'python.exp') linker_so = [ld_so_aix] + linker_so + ['-bI:'+python_exp] + if sys.platform.startswith('os400'): + from distutils.sysconfig import get_config_var + python_config = get_config_var('LIBPL') + ld_so_aix = os.path.join(python_config, 'ld_so_aix') + python_exp = os.path.join(python_config, 'python.exp') + linker_so = [ld_so_aix] + linker_so + ['-bI:'+python_exp] self.set_commands(linker_so=linker_so+linker_so_flags) linker_exe = self.linker_exe diff --git a/numpy/distutils/fcompiler/gnu.py b/numpy/distutils/fcompiler/gnu.py index cdb6aef946cd..3472b5d4c095 100644 --- a/numpy/distutils/fcompiler/gnu.py +++ b/numpy/distutils/fcompiler/gnu.py @@ -256,7 +256,7 @@ def runtime_library_dir_option(self, dir): if sys.platform == 'darwin': return f'-Wl,-rpath,{dir}' - elif sys.platform[:3] == 'aix': + elif sys.platform.startswith(('aix', 'os400')): # AIX RPATH is called LIBPATH return f'-Wl,-blibpath:{dir}' else: @@ -305,7 +305,7 @@ def version_match(self, version_string): module_dir_switch = '-J' module_include_switch = '-I' - if sys.platform[:3] == 'aix': + if sys.platform.startswith(('aix', 'os400')): executables['linker_so'].append('-lpthread') if platform.architecture()[0][:2] == '64': for key in ['compiler_f77', 'compiler_f90','compiler_fix','linker_so', 'linker_exe']: