aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild
diff options
context:
space:
mode:
authorBen Boeckel <ben.boeckel@kitware.com>2021-12-16 17:09:06 -0500
committerBen Boeckel <ben.boeckel@kitware.com>2022-01-03 12:49:04 -0500
commitf30e83efd6968eacf07ebe3f1400e06a8a529778 (patch)
treee14f358550c0f389ea64ba0b27178e456098d492 /mesonbuild
parent786d4379824a370b3a6ea415dc48aadb3b1f9dd2 (diff)
downloadmeson-f30e83efd6968eacf07ebe3f1400e06a8a529778.zip
meson-f30e83efd6968eacf07ebe3f1400e06a8a529778.tar.gz
meson-f30e83efd6968eacf07ebe3f1400e06a8a529778.tar.bz2
armltdclang: add support for ARM Ltd.'s `armclang` toolchain
This is another toolchain also called `armclang`, but it is not a cross compiler like Keil's `armclang`. It is essentially the same as `clang` based on its interface and CMake's support of the toolchain. Use an `armltd` prefix for the compiler ID. Fixes: #7255
Diffstat (limited to 'mesonbuild')
-rw-r--r--mesonbuild/compilers/c.py7
-rw-r--r--mesonbuild/compilers/cpp.py8
-rw-r--r--mesonbuild/compilers/detect.py28
-rw-r--r--mesonbuild/compilers/fortran.py6
4 files changed, 48 insertions, 1 deletions
diff --git a/mesonbuild/compilers/c.py b/mesonbuild/compilers/c.py
index c531447..30768ad 100644
--- a/mesonbuild/compilers/c.py
+++ b/mesonbuild/compilers/c.py
@@ -183,6 +183,13 @@ class ClangCCompiler(_ClangCStds, ClangCompiler, CCompiler):
return []
+class ArmLtdClangCCompiler(ClangCCompiler):
+
+ def __init__(self, *args, **kwargs):
+ ClangCCompiler.__init__(self, *args, **kwargs)
+ self.id = 'armltdclang'
+
+
class AppleClangCCompiler(ClangCCompiler):
"""Handle the differences between Apple Clang and Vanilla Clang.
diff --git a/mesonbuild/compilers/cpp.py b/mesonbuild/compilers/cpp.py
index 635cc55..20df359 100644
--- a/mesonbuild/compilers/cpp.py
+++ b/mesonbuild/compilers/cpp.py
@@ -155,7 +155,7 @@ class CPPCompiler(CLikeCompiler, Compiler):
}
# Currently, remapping is only supported for Clang, Elbrus and GCC
- assert self.id in frozenset(['clang', 'lcc', 'gcc', 'emscripten'])
+ assert self.id in frozenset(['clang', 'lcc', 'gcc', 'emscripten', 'armltdclang'])
if cpp_std not in CPP_FALLBACKS:
# 'c++03' and 'c++98' don't have fallback types
@@ -259,6 +259,12 @@ class ClangCPPCompiler(ClangCompiler, CPPCompiler):
return search_dirs + ['-lstdc++']
+class ArmLtdClangCPPCompiler(ClangCPPCompiler):
+ def __init__(self, *args, **kwargs):
+ ClangCPPCompiler.__init__(self, *args, **kwargs)
+ self.id = 'armltdclang'
+
+
class AppleClangCPPCompiler(ClangCPPCompiler):
def language_stdlib_only_link_flags(self, env: 'Environment') -> T.List[str]:
# We need to apply the search prefix here, as these link arguments may
diff --git a/mesonbuild/compilers/detect.py b/mesonbuild/compilers/detect.py
index 03c5226..572ec35 100644
--- a/mesonbuild/compilers/detect.py
+++ b/mesonbuild/compilers/detect.py
@@ -54,6 +54,7 @@ from .c import (
AppleClangCCompiler,
ArmCCompiler,
ArmclangCCompiler,
+ ArmLtdClangCCompiler,
ClangCCompiler,
ClangClCCompiler,
GnuCCompiler,
@@ -74,6 +75,7 @@ from .cpp import (
AppleClangCPPCompiler,
ArmCPPCompiler,
ArmclangCPPCompiler,
+ ArmLtdClangCPPCompiler,
ClangCPPCompiler,
ClangClCPPCompiler,
GnuCPPCompiler,
@@ -97,6 +99,7 @@ from .d import (
from .cuda import CudaCompiler
from .fortran import (
FortranCompiler,
+ ArmLtdFlangFortranCompiler,
G95FortranCompiler,
GnuFortranCompiler,
ElbrusFortranCompiler,
@@ -462,6 +465,20 @@ def _detect_c_or_cpp_compiler(env: 'Environment', lang: str, for_machine: Machin
ccache + compiler, version, for_machine, is_cross, info,
exe_wrap, linker=linker, full_version=full_version)
+ if 'Arm C/C++/Fortran Compiler' in out:
+ arm_ver_match = re.search('version (\d+)\.(\d+) \(build number (\d+)\)', out)
+ arm_ver_major = arm_ver_match.group(1)
+ arm_ver_minor = arm_ver_match.group(2)
+ arm_ver_build = arm_ver_match.group(3)
+ version = '.'.join([arm_ver_major, arm_ver_minor, arm_ver_build])
+ if lang == 'c':
+ cls = ArmLtdClangCCompiler
+ elif lang == 'cpp':
+ cls = ArmLtdClangCPPCompiler
+ linker = guess_nix_linker(env, compiler, cls, for_machine)
+ return cls(
+ ccache + compiler, version, for_machine, is_cross, info,
+ exe_wrap, linker=linker)
if 'armclang' in out:
# The compiler version is not present in the first line of output,
# instead it is present in second line, startswith 'Component:'.
@@ -711,6 +728,17 @@ def detect_fortran_compiler(env: 'Environment', for_machine: MachineChoice) -> C
compiler, version, for_machine, is_cross, info,
exe_wrap, defines, full_version=full_version, linker=linker)
+ if 'Arm C/C++/Fortran Compiler' in out:
+ cls = ArmLtdFlangFortranCompiler
+ arm_ver_match = re.search('version (\d+)\.(\d+) \(build number (\d+)\)', out)
+ arm_ver_major = arm_ver_match.group(1)
+ arm_ver_minor = arm_ver_match.group(2)
+ arm_ver_build = arm_ver_match.group(3)
+ version = '.'.join([arm_ver_major, arm_ver_minor, arm_ver_build])
+ linker = guess_nix_linker(env, compiler, cls, for_machine)
+ return cls(
+ ccache + compiler, version, for_machine, is_cross, info,
+ exe_wrap, linker=linker)
if 'G95' in out:
cls = G95FortranCompiler
linker = guess_nix_linker(env, compiler, cls, for_machine)
diff --git a/mesonbuild/compilers/fortran.py b/mesonbuild/compilers/fortran.py
index 6a4a343..e701ed8 100644
--- a/mesonbuild/compilers/fortran.py
+++ b/mesonbuild/compilers/fortran.py
@@ -494,6 +494,12 @@ class FlangFortranCompiler(ClangCompiler, FortranCompiler):
search_dirs.append(f'-L{d}')
return search_dirs + ['-lflang', '-lpgmath']
+class ArmLtdFlangFortranCompiler(FlangFortranCompiler):
+
+ def __init__(self, *args, **kwargs):
+ FlangFortranCompiler.__init__(self, *args, **kwargs)
+ self.id = 'armltdflang'
+
class Open64FortranCompiler(FortranCompiler):
def __init__(self, exelist: T.List[str], version: str, for_machine: MachineChoice, is_cross: bool,