aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesonbuild/cmake/executor.py25
-rw-r--r--mesonbuild/compilers/__init__.py4
-rw-r--r--mesonbuild/compilers/objc.py5
-rw-r--r--mesonbuild/compilers/objcpp.py6
-rw-r--r--mesonbuild/environment.py9
5 files changed, 41 insertions, 8 deletions
diff --git a/mesonbuild/cmake/executor.py b/mesonbuild/cmake/executor.py
index e29e67a..2226c02 100644
--- a/mesonbuild/cmake/executor.py
+++ b/mesonbuild/cmake/executor.py
@@ -29,13 +29,18 @@ from .. import mlog, mesonlib
from ..mesonlib import PerMachine, Popen_safe, version_compare, MachineChoice
from ..environment import Environment
from ..envconfig import get_env_var
+from ..compilers import (
+ AppleClangCCompiler, AppleClangCPPCompiler, AppleClangObjCCompiler,
+ AppleClangObjCPPCompiler
+)
if T.TYPE_CHECKING:
from ..dependencies.base import ExternalProgram
+ from ..compilers import Compiler
TYPE_result = T.Tuple[int, T.Optional[str], T.Optional[str]]
-MESON_TO_CMAKE_MAPPING = {
+_MESON_TO_CMAKE_MAPPING = {
'arm': 'ARMCC',
'armclang': 'ARMClang',
'clang': 'Clang',
@@ -51,13 +56,21 @@ MESON_TO_CMAKE_MAPPING = {
'sun': 'SunPro',
}
-def meson_compiler_to_cmake_id(cobj):
- # cland and apple clang both map to 'clang' in meson, so we need to look at
- # the linker that's being used
- if cobj.linker.get_id() == 'ld64':
+def meson_compiler_to_cmake_id(cobj: 'Compiler') -> str:
+ """Translate meson compiler's into CMAKE compiler ID's.
+
+ Most of these can be handled by a simple table lookup, with a few
+ exceptions.
+
+ Clang and Apple's Clang are both identified as "clang" by meson. To make
+ things more complicated gcc and vanilla clang both use Apple's ld64 on
+ macOS. The only way to know for sure is to do an isinstance() check.
+ """
+ if isinstance(cobj, (AppleClangCCompiler, AppleClangCPPCompiler,
+ AppleClangObjCCompiler, AppleClangObjCPPCompiler)):
return 'AppleClang'
# If no mapping, try GNU and hope that the build files don't care
- return MESON_TO_CMAKE_MAPPING.get(cobj.get_id(), 'GNU')
+ return _MESON_TO_CMAKE_MAPPING.get(cobj.get_id(), 'GNU')
class CMakeExecutor:
diff --git a/mesonbuild/compilers/__init__.py b/mesonbuild/compilers/__init__.py
index 2e673da..b8d8678 100644
--- a/mesonbuild/compilers/__init__.py
+++ b/mesonbuild/compilers/__init__.py
@@ -36,6 +36,8 @@ __all__ = [
'AppleClangCCompiler',
'AppleClangCPPCompiler',
+ 'AppleClangObjCCompiler',
+ 'AppleClangObjCPPCompiler',
'ArmCCompiler',
'ArmCPPCompiler',
'ArmclangCCompiler',
@@ -189,11 +191,13 @@ from .fortran import (
from .java import JavaCompiler
from .objc import (
ObjCCompiler,
+ AppleClangObjCCompiler,
ClangObjCCompiler,
GnuObjCCompiler,
)
from .objcpp import (
ObjCPPCompiler,
+ AppleClangObjCPPCompiler,
ClangObjCPPCompiler,
GnuObjCPPCompiler,
)
diff --git a/mesonbuild/compilers/objc.py b/mesonbuild/compilers/objc.py
index d351c88..254a609 100644
--- a/mesonbuild/compilers/objc.py
+++ b/mesonbuild/compilers/objc.py
@@ -92,3 +92,8 @@ class ClangObjCCompiler(ClangCompiler, ObjCCompiler):
'1': default_warn_args,
'2': default_warn_args + ['-Wextra'],
'3': default_warn_args + ['-Wextra', '-Wpedantic']}
+
+
+class AppleClangObjCCompiler(ClangObjCCompiler):
+
+ """Handle the differences between Apple's clang and vanilla clang."""
diff --git a/mesonbuild/compilers/objcpp.py b/mesonbuild/compilers/objcpp.py
index 10555b4..3197abc 100644
--- a/mesonbuild/compilers/objcpp.py
+++ b/mesonbuild/compilers/objcpp.py
@@ -90,3 +90,9 @@ class ClangObjCPPCompiler(ClangCompiler, ObjCPPCompiler):
'1': default_warn_args,
'2': default_warn_args + ['-Wextra'],
'3': default_warn_args + ['-Wextra', '-Wpedantic']}
+
+
+
+class AppleClangObjCPPCompiler(ClangObjCPPCompiler):
+
+ """Handle the differences between Apple's clang and vanilla clang."""
diff --git a/mesonbuild/environment.py b/mesonbuild/environment.py
index 18ecff4..492789c 100644
--- a/mesonbuild/environment.py
+++ b/mesonbuild/environment.py
@@ -76,6 +76,8 @@ from .compilers import (
ArmclangCPPCompiler,
AppleClangCCompiler,
AppleClangCPPCompiler,
+ AppleClangObjCCompiler,
+ AppleClangObjCPPCompiler,
ClangCCompiler,
ClangCPPCompiler,
ClangObjCCompiler,
@@ -1527,7 +1529,7 @@ class Environment:
def detect_objcpp_compiler(self, for_machine: MachineInfo) -> 'Compiler':
return self._detect_objc_or_objcpp_compiler(for_machine, False)
- def _detect_objc_or_objcpp_compiler(self, for_machine: MachineInfo, objc: bool) -> 'Compiler':
+ def _detect_objc_or_objcpp_compiler(self, for_machine: MachineChoice, objc: bool) -> 'Compiler':
popen_exceptions = {}
compilers, ccache, exe_wrap = self._get_compilers('objc' if objc else 'objcpp', for_machine)
is_cross = self.is_cross_build(for_machine)
@@ -1556,7 +1558,10 @@ class Environment:
exe_wrap, defines, linker=linker)
if 'clang' in out:
linker = None
- comp = ClangObjCCompiler if objc else ClangObjCPPCompiler
+ if 'Apple' in out:
+ comp = AppleClangObjCCompiler if objc else AppleClangObjCPPCompiler
+ else:
+ comp = ClangObjCCompiler if objc else ClangObjCPPCompiler
if 'windows' in out or self.machines[for_machine].is_windows():
# If we're in a MINGW context this actually will use a gnu style ld
try: