From 28de74c9944bdbdf18ffccc91d2d96a0cd4ade48 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Thu, 16 Dec 2021 17:08:10 -0500 Subject: [PATCH 1/3] armclang: clarify that this is support for the Keil cross-compiler --- mesonbuild/compilers/c.py | 4 ++++ mesonbuild/compilers/cpp.py | 4 ++++ mesonbuild/compilers/mixins/arm.py | 3 +++ 3 files changed, 11 insertions(+) diff --git a/mesonbuild/compilers/c.py b/mesonbuild/compilers/c.py index 9d4a77934..c5314470c 100644 --- a/mesonbuild/compilers/c.py +++ b/mesonbuild/compilers/c.py @@ -211,6 +211,10 @@ class EmscriptenCCompiler(EmscriptenMixin, ClangCCompiler): class ArmclangCCompiler(ArmclangCompiler, CCompiler): + ''' + Keil armclang + ''' + def __init__(self, exelist: T.List[str], version: str, for_machine: MachineChoice, is_cross: bool, info: 'MachineInfo', exe_wrapper: T.Optional['ExternalProgram'] = None, linker: T.Optional['DynamicLinker'] = None, diff --git a/mesonbuild/compilers/cpp.py b/mesonbuild/compilers/cpp.py index 8bc013f22..635cc5593 100644 --- a/mesonbuild/compilers/cpp.py +++ b/mesonbuild/compilers/cpp.py @@ -296,6 +296,10 @@ class EmscriptenCPPCompiler(EmscriptenMixin, ClangCPPCompiler): class ArmclangCPPCompiler(ArmclangCompiler, CPPCompiler): + ''' + Keil armclang + ''' + def __init__(self, exelist: T.List[str], version: str, for_machine: MachineChoice, is_cross: bool, info: 'MachineInfo', exe_wrapper: T.Optional['ExternalProgram'] = None, linker: T.Optional['DynamicLinker'] = None, diff --git a/mesonbuild/compilers/mixins/arm.py b/mesonbuild/compilers/mixins/arm.py index 4e1898ae7..fc39851ba 100644 --- a/mesonbuild/compilers/mixins/arm.py +++ b/mesonbuild/compilers/mixins/arm.py @@ -136,6 +136,9 @@ class ArmCompiler(Compiler): class ArmclangCompiler(Compiler): + ''' + This is the Keil armclang. + ''' def __init__(self) -> None: if not self.is_cross: From 786d4379824a370b3a6ea415dc48aadb3b1f9dd2 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Thu, 16 Dec 2021 17:08:26 -0500 Subject: [PATCH 2/3] armclang: extend the prefix detection for Keil armclang This will avoid false positives with the ARM Ltd. `armclang` compiler. --- mesonbuild/build.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mesonbuild/build.py b/mesonbuild/build.py index 6515f429d..9fc31c6b2 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -1777,8 +1777,8 @@ class Executable(BuildTarget): self.suffix = 'exe' elif machine.system.startswith('wasm') or machine.system == 'emscripten': self.suffix = 'js' - elif ('c' in self.compilers and self.compilers['c'].get_id().startswith('arm') or - 'cpp' in self.compilers and self.compilers['cpp'].get_id().startswith('arm')): + elif ('c' in self.compilers and self.compilers['c'].get_id().startswith('armclang') or + 'cpp' in self.compilers and self.compilers['cpp'].get_id().startswith('armclang')): self.suffix = 'axf' elif ('c' in self.compilers and self.compilers['c'].get_id().startswith('ccrx') or 'cpp' in self.compilers and self.compilers['cpp'].get_id().startswith('ccrx')): From f30e83efd6968eacf07ebe3f1400e06a8a529778 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Thu, 16 Dec 2021 17:09:06 -0500 Subject: [PATCH 3/3] 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 --- docs/markdown/snippets/armclang-support.md | 6 +++++ mesonbuild/compilers/c.py | 7 ++++++ mesonbuild/compilers/cpp.py | 8 ++++++- mesonbuild/compilers/detect.py | 28 ++++++++++++++++++++++ mesonbuild/compilers/fortran.py | 6 +++++ 5 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 docs/markdown/snippets/armclang-support.md diff --git a/docs/markdown/snippets/armclang-support.md b/docs/markdown/snippets/armclang-support.md new file mode 100644 index 000000000..80e7af23c --- /dev/null +++ b/docs/markdown/snippets/armclang-support.md @@ -0,0 +1,6 @@ +## Support for ARM Ltd. Clang toolchain + +Support for the `armltdclang` compiler has been added. This differs from the +existing `armclang` toolchain in that it is a fork of Clang by ARM Ltd. and +supports native compilation. The Keil `armclang` toolchain only supports +cross-compilation to embedded devices. diff --git a/mesonbuild/compilers/c.py b/mesonbuild/compilers/c.py index c5314470c..30768ad6d 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 635cc5593..20df35969 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 03c5226d2..572ec351a 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 6a4a34380..e701ed8d5 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,