codekingpro/portable-devtools
114k
1"""distutils.zosccompiler2 3Contains the selection of the c & c++ compilers on z/OS. There are several4different c compilers on z/OS, all of them are optional, so the correct5one needs to be chosen based on the users input. This is compatible with6the following compilers:7 8IBM C/C++ For Open Enterprise Languages on z/OS 2.09IBM Open XL C/C++ 1.1 for z/OS10IBM XL C/C++ V2.4.1 for z/OS 2.4 and 2.511IBM z/OS XL C/C++12"""13 14import os15 16from ... import sysconfig17from ...errors import DistutilsExecError18from . import unix19from .errors import CompileError20 21_cc_args = {22 'ibm-openxl': [23 '-m64',24 '-fvisibility=default',25 '-fzos-le-char-mode=ascii',26 '-fno-short-enums',27 ],28 'ibm-xlclang': [29 '-q64',30 '-qexportall',31 '-qascii',32 '-qstrict',33 '-qnocsect',34 '-Wa,asa,goff',35 '-Wa,xplink',36 '-qgonumber',37 '-qenum=int',38 '-Wc,DLL',39 ],40 'ibm-xlc': [41 '-q64',42 '-qexportall',43 '-qascii',44 '-qstrict',45 '-qnocsect',46 '-Wa,asa,goff',47 '-Wa,xplink',48 '-qgonumber',49 '-qenum=int',50 '-Wc,DLL',51 '-qlanglvl=extc99',52 ],53}54 55_cxx_args = {56 'ibm-openxl': [57 '-m64',58 '-fvisibility=default',59 '-fzos-le-char-mode=ascii',60 '-fno-short-enums',61 ],62 'ibm-xlclang': [63 '-q64',64 '-qexportall',65 '-qascii',66 '-qstrict',67 '-qnocsect',68 '-Wa,asa,goff',69 '-Wa,xplink',70 '-qgonumber',71 '-qenum=int',72 '-Wc,DLL',73 ],74 'ibm-xlc': [75 '-q64',76 '-qexportall',77 '-qascii',78 '-qstrict',79 '-qnocsect',80 '-Wa,asa,goff',81 '-Wa,xplink',82 '-qgonumber',83 '-qenum=int',84 '-Wc,DLL',85 '-qlanglvl=extended0x',86 ],87}88 89_asm_args = {90 'ibm-openxl': ['-fasm', '-fno-integrated-as', '-Wa,--ASA', '-Wa,--GOFF'],91 'ibm-xlclang': [],92 'ibm-xlc': [],93}94 95_ld_args = {96 'ibm-openxl': [],97 'ibm-xlclang': ['-Wl,dll', '-q64'],98 'ibm-xlc': ['-Wl,dll', '-q64'],99}100 101 102# Python on z/OS is built with no compiler specific options in it's CFLAGS.103# But each compiler requires it's own specific options to build successfully,104# though some of the options are common between them105class Compiler(unix.Compiler):106 src_extensions = ['.c', '.C', '.cc', '.cxx', '.cpp', '.m', '.s']107 _cpp_extensions = ['.cc', '.cpp', '.cxx', '.C']108 _asm_extensions = ['.s']109 110 def _get_zos_compiler_name(self):111 zos_compiler_names = [112 os.path.basename(binary)113 for envvar in ('CC', 'CXX', 'LDSHARED')114 if (binary := os.environ.get(envvar, None))115 ]116 if len(zos_compiler_names) == 0:117 return 'ibm-openxl'118 119 zos_compilers = {}120 for compiler in (121 'ibm-clang',122 'ibm-clang64',123 'ibm-clang++',124 'ibm-clang++64',125 'clang',126 'clang++',127 'clang-14',128 ):129 zos_compilers[compiler] = 'ibm-openxl'130 131 for compiler in ('xlclang', 'xlclang++', 'njsc', 'njsc++'):132 zos_compilers[compiler] = 'ibm-xlclang'133 134 for compiler in ('xlc', 'xlC', 'xlc++'):135 zos_compilers[compiler] = 'ibm-xlc'136 137 return zos_compilers.get(zos_compiler_names[0], 'ibm-openxl')138 139 def __init__(self, verbose=False, force=False):140 super().__init__(verbose, force=force)141 self.zos_compiler = self._get_zos_compiler_name()142 sysconfig.customize_compiler(self)143 144 def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts):145 local_args = []146 if ext in self._cpp_extensions:147 compiler = self.compiler_cxx148 local_args.extend(_cxx_args[self.zos_compiler])149 elif ext in self._asm_extensions:150 compiler = self.compiler_so151 local_args.extend(_cc_args[self.zos_compiler])152 local_args.extend(_asm_args[self.zos_compiler])153 else:154 compiler = self.compiler_so155 local_args.extend(_cc_args[self.zos_compiler])156 local_args.extend(cc_args)157 158 try:159 self.spawn(compiler + local_args + [src, '-o', obj] + extra_postargs)160 except DistutilsExecError as msg:161 raise CompileError(msg)162 163 def runtime_library_dir_option(self, dir):164 return '-L' + dir165 166 def link(167 self,168 target_desc,169 objects,170 output_filename,171 output_dir=None,172 libraries=None,173 library_dirs=None,174 runtime_library_dirs=None,175 export_symbols=None,176 debug=False,177 extra_preargs=None,178 extra_postargs=None,179 build_temp=None,180 target_lang=None,181 ):182 # For a built module to use functions from cpython, it needs to use Pythons183 # side deck file. The side deck is located beside the libpython3.xx.so184 ldversion = sysconfig.get_config_var('LDVERSION')185 if sysconfig.python_build:186 side_deck_path = os.path.join(187 sysconfig.get_config_var('abs_builddir'),188 f'libpython{ldversion}.x',189 )190 else:191 side_deck_path = os.path.join(192 sysconfig.get_config_var('installed_base'),193 sysconfig.get_config_var('platlibdir'),194 f'libpython{ldversion}.x',195 )196 197 if os.path.exists(side_deck_path):198 if extra_postargs:199 extra_postargs.append(side_deck_path)200 else:201 extra_postargs = [side_deck_path]202 203 # Check and replace libraries included side deck files204 if runtime_library_dirs:205 for dir in runtime_library_dirs:206 for library in libraries[:]:207 library_side_deck = os.path.join(dir, f'{library}.x')208 if os.path.exists(library_side_deck):209 libraries.remove(library)210 extra_postargs.append(library_side_deck)211 break212 213 # Any required ld args for the given compiler214 extra_postargs.extend(_ld_args[self.zos_compiler])215 216 super().link(217 target_desc,218 objects,219 output_filename,220 output_dir,221 libraries,222 library_dirs,223 runtime_library_dirs,224 export_symbols,225 debug,226 extra_preargs,227 extra_postargs,228 build_temp,229 target_lang,230 )231 