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 []
|
return []
|
||||||
|
|
||||||
|
|
||||||
|
class ArmLtdClangCCompiler(ClangCCompiler):
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
ClangCCompiler.__init__(self, *args, **kwargs)
|
||||||
|
self.id = 'armltdclang'
|
||||||
|
|
||||||
|
|
||||||
class AppleClangCCompiler(ClangCCompiler):
|
class AppleClangCCompiler(ClangCCompiler):
|
||||||
|
|
||||||
"""Handle the differences between Apple Clang and Vanilla Clang.
|
"""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
|
# 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:
|
if cpp_std not in CPP_FALLBACKS:
|
||||||
# 'c++03' and 'c++98' don't have fallback types
|
# 'c++03' and 'c++98' don't have fallback types
|
||||||
|
@ -259,6 +259,12 @@ class ClangCPPCompiler(ClangCompiler, CPPCompiler):
|
||||||
return search_dirs + ['-lstdc++']
|
return search_dirs + ['-lstdc++']
|
||||||
|
|
||||||
|
|
||||||
|
class ArmLtdClangCPPCompiler(ClangCPPCompiler):
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
ClangCPPCompiler.__init__(self, *args, **kwargs)
|
||||||
|
self.id = 'armltdclang'
|
||||||
|
|
||||||
|
|
||||||
class AppleClangCPPCompiler(ClangCPPCompiler):
|
class AppleClangCPPCompiler(ClangCPPCompiler):
|
||||||
def language_stdlib_only_link_flags(self, env: 'Environment') -> T.List[str]:
|
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
|
# We need to apply the search prefix here, as these link arguments may
|
||||||
|
|
|
@ -54,6 +54,7 @@ from .c import (
|
||||||
AppleClangCCompiler,
|
AppleClangCCompiler,
|
||||||
ArmCCompiler,
|
ArmCCompiler,
|
||||||
ArmclangCCompiler,
|
ArmclangCCompiler,
|
||||||
|
ArmLtdClangCCompiler,
|
||||||
ClangCCompiler,
|
ClangCCompiler,
|
||||||
ClangClCCompiler,
|
ClangClCCompiler,
|
||||||
GnuCCompiler,
|
GnuCCompiler,
|
||||||
|
@ -74,6 +75,7 @@ from .cpp import (
|
||||||
AppleClangCPPCompiler,
|
AppleClangCPPCompiler,
|
||||||
ArmCPPCompiler,
|
ArmCPPCompiler,
|
||||||
ArmclangCPPCompiler,
|
ArmclangCPPCompiler,
|
||||||
|
ArmLtdClangCPPCompiler,
|
||||||
ClangCPPCompiler,
|
ClangCPPCompiler,
|
||||||
ClangClCPPCompiler,
|
ClangClCPPCompiler,
|
||||||
GnuCPPCompiler,
|
GnuCPPCompiler,
|
||||||
|
@ -97,6 +99,7 @@ from .d import (
|
||||||
from .cuda import CudaCompiler
|
from .cuda import CudaCompiler
|
||||||
from .fortran import (
|
from .fortran import (
|
||||||
FortranCompiler,
|
FortranCompiler,
|
||||||
|
ArmLtdFlangFortranCompiler,
|
||||||
G95FortranCompiler,
|
G95FortranCompiler,
|
||||||
GnuFortranCompiler,
|
GnuFortranCompiler,
|
||||||
ElbrusFortranCompiler,
|
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,
|
ccache + compiler, version, for_machine, is_cross, info,
|
||||||
exe_wrap, linker=linker, full_version=full_version)
|
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:
|
if 'armclang' in out:
|
||||||
# The compiler version is not present in the first line of output,
|
# The compiler version is not present in the first line of output,
|
||||||
# instead it is present in second line, startswith 'Component:'.
|
# 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,
|
compiler, version, for_machine, is_cross, info,
|
||||||
exe_wrap, defines, full_version=full_version, linker=linker)
|
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:
|
if 'G95' in out:
|
||||||
cls = G95FortranCompiler
|
cls = G95FortranCompiler
|
||||||
linker = guess_nix_linker(env, compiler, cls, for_machine)
|
linker = guess_nix_linker(env, compiler, cls, for_machine)
|
||||||
|
|
|
@ -494,6 +494,12 @@ class FlangFortranCompiler(ClangCompiler, FortranCompiler):
|
||||||
search_dirs.append(f'-L{d}')
|
search_dirs.append(f'-L{d}')
|
||||||
return search_dirs + ['-lflang', '-lpgmath']
|
return search_dirs + ['-lflang', '-lpgmath']
|
||||||
|
|
||||||
|
class ArmLtdFlangFortranCompiler(FlangFortranCompiler):
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
FlangFortranCompiler.__init__(self, *args, **kwargs)
|
||||||
|
self.id = 'armltdflang'
|
||||||
|
|
||||||
class Open64FortranCompiler(FortranCompiler):
|
class Open64FortranCompiler(FortranCompiler):
|
||||||
|
|
||||||
def __init__(self, exelist: T.List[str], version: str, for_machine: MachineChoice, is_cross: bool,
|
def __init__(self, exelist: T.List[str], version: str, for_machine: MachineChoice, is_cross: bool,
|
||||||
|
|
Loading…
Reference in New Issue