Which requires injecting some extra paths and the `-Xpreprocess` flag, as well as extra search paths for libomp and the headers. Fixes: #7435pull/13356/head
parent
07ef85ee22
commit
d6bddafa26
5 changed files with 62 additions and 6 deletions
@ -0,0 +1,57 @@ |
|||||||
|
# SPDX-License-Identifier: Apache-2.0 |
||||||
|
# Copyright © 2024 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 |
Loading…
Reference in new issue