| # SPDX-License-Identifier: Apache-2.0 |
| # Copyright © 2024-2025 Intel Corporation |
| |
| """Provides mixins for Apple compilers.""" |
| |
| from __future__ import annotations |
| import typing as T |
| |
| from ...mesonlib import MesonException |
| |
| if T.TYPE_CHECKING: |
| from ..._typing import ImmutableListProtocol |
| from ...environment import Environment |
| from ..compilers import Compiler |
| else: |
| # This is a bit clever, for mypy we pretend that these mixins descend from |
| # Compiler, so we get all of the methods and attributes defined for us, but |
| # for runtime we make them descend from object (which all classes normally |
| # do). This gives up DRYer type checking, with no runtime impact |
| Compiler = object |
| |
| |
| class AppleCompilerMixin(Compiler): |
| |
| """Handle differences between Vanilla Clang and the Clang shipped with XCode.""" |
| |
| __BASE_OMP_FLAGS: ImmutableListProtocol[str] = ['-Xpreprocessor', '-fopenmp'] |
| |
| def openmp_flags(self, env: Environment) -> T.List[str]: |
| """Flags required to compile with OpenMP on Apple. |
| |
| The Apple Clang Compiler doesn't have builtin support for OpenMP, it |
| must be provided separately. As such, we need to add the -Xpreprocessor |
| argument so that an external OpenMP can be found. |
| |
| :return: A list of arguments |
| """ |
| m = env.machines[self.for_machine] |
| assert m is not None, 'for mypy' |
| if m.cpu_family.startswith('x86'): |
| root = '/usr/local' |
| else: |
| root = '/opt/homebrew' |
| return self.__BASE_OMP_FLAGS + [f'-I{root}/opt/libomp/include'] |
| |
| def openmp_link_flags(self, env: Environment) -> T.List[str]: |
| m = env.machines[self.for_machine] |
| assert m is not None, 'for mypy' |
| if m.cpu_family.startswith('x86'): |
| root = '/usr/local' |
| else: |
| root = '/opt/homebrew' |
| |
| link = self.find_library('omp', env, [f'{root}/opt/libomp/lib']) |
| if not link: |
| raise MesonException("Couldn't find libomp") |
| return self.__BASE_OMP_FLAGS + link |
| |
| def get_prelink_args(self, prelink_name: str, obj_list: T.List[str]) -> T.Tuple[T.List[str], T.List[str]]: |
| # The objects are prelinked through the compiler, which injects -lSystem |
| return [prelink_name], ['-nostdlib', '-r', '-o', prelink_name] + obj_list |
| |
| |
| class AppleCStdsMixin(Compiler): |
| |
| """Provide version overrides for the Apple Compilers.""" |
| |
| _C17_VERSION = '>=10.0.0' |
| _C18_VERSION = '>=11.0.0' |
| _C2X_VERSION = '>=11.0.0' |
| |
| |
| class AppleCPPStdsMixin(Compiler): |
| |
| """Provide version overrides for the Apple C++ Compilers.""" |
| |
| _CPP23_VERSION = '>=13.0.0' |
| _CPP26_VERSION = '>=16.0.0' |