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
This commit is contained in:
parent
786d437982
commit
f30e83efd6
|
@ -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.
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue