Team Ai
Datasetpublic

codekingpro/portable-devtools

sourceHugging Faceupdated 5mo agoView on Hugging Face
1likes14kdownloads
zos.py231 linesDownload Raw Back to C
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 
codekingpro/portable-devtools · Team Ai