diff options
-rw-r--r-- | cross/msp430.txt | 25 | ||||
-rw-r--r-- | docs/markdown/Reference-tables.md | 5 | ||||
-rw-r--r-- | docs/markdown/snippets/ti_compilers.md | 8 | ||||
-rw-r--r-- | mesonbuild/build.py | 4 | ||||
-rw-r--r-- | mesonbuild/compilers/__init__.py | 4 | ||||
-rw-r--r-- | mesonbuild/compilers/c.py | 25 | ||||
-rw-r--r-- | mesonbuild/compilers/cpp.py | 21 | ||||
-rw-r--r-- | mesonbuild/compilers/detect.py | 48 | ||||
-rw-r--r-- | mesonbuild/compilers/mixins/ti.py (renamed from mesonbuild/compilers/mixins/c2000.py) | 47 | ||||
-rw-r--r-- | mesonbuild/envconfig.py | 1 | ||||
-rw-r--r-- | mesonbuild/linkers/__init__.py | 4 | ||||
-rw-r--r-- | mesonbuild/linkers/linkers.py | 24 |
12 files changed, 144 insertions, 72 deletions
diff --git a/cross/msp430.txt b/cross/msp430.txt new file mode 100644 index 0000000..839c90b --- /dev/null +++ b/cross/msp430.txt @@ -0,0 +1,25 @@ +# This file assumes that path to the Texas Instruments MSP430 toolchain is added +# to the environment(PATH) variable, so that Meson can find +# cl430 and ar430 while building. +[binaries] +c = cl430 +ar = ar430 +strip = strip430 + +[host_machine] +system = 'baremetal' +cpu_family = 'msp430' +endian = 'little' + +[built-in options] +c_args = [ + '-vmsp', + '--printf_support=minimal'] +c_link_args = [ + '--rom_model', + '-llibc.a',] +cpp_args = [] +cpp_link_args = [] + +[properties] +needs_exe_wrapper = true diff --git a/docs/markdown/Reference-tables.md b/docs/markdown/Reference-tables.md index 22fb9e8..acd1297 100644 --- a/docs/markdown/Reference-tables.md +++ b/docs/markdown/Reference-tables.md @@ -9,7 +9,6 @@ These are return values of the `get_id` (Compiler family) and | ----- | --------------- | --------------- | | arm | ARM compiler | | | armclang | ARMCLANG compiler | | -| c2000 | Texas Instruments C2000 compiler | | | ccomp | The CompCert formally-verified C compiler | | | ccrx | Renesas RX Family C/C++ compiler | | | clang | The Clang compiler | gcc | @@ -32,6 +31,8 @@ These are return values of the `get_id` (Compiler family) and | pgi | Portland PGI C/C++/Fortran compilers | | | rustc | Rust compiler | | | sun | Sun Fortran compiler | | +| c2000 | Texas Instruments C/C++ Compiler (C2000) | | +| ti | Texas Instruments C/C++ Compiler | | | valac | Vala compiler | | | xc16 | Microchip XC16 C compiler | | | cython | The Cython compiler | | @@ -55,6 +56,7 @@ These are return values of the `get_linker_id` method in a compiler object. | rlink | The Renesas linker, used with CCrx only | | xc16-ar | The Microchip linker, used with XC16 only | | ar2000 | The Texas Instruments linker, used with C2000 only | +| ti-ar | The Texas Instruments linker | | armlink | The ARM linker (arm and armclang compilers) | | pgi | Portland/Nvidia PGI | | nvlink | Nvidia Linker used with cuda | @@ -97,6 +99,7 @@ set in the cross file. | microblaze | MicroBlaze processor | | mips | 32 bit MIPS processor | | mips64 | 64 bit MIPS processor | +| msp430 | 16 bit MSP430 processor | | parisc | HP PA-RISC processor | | pic24 | 16 bit Microchip PIC24 | | ppc | 32 bit PPC processors | diff --git a/docs/markdown/snippets/ti_compilers.md b/docs/markdown/snippets/ti_compilers.md new file mode 100644 index 0000000..7683331 --- /dev/null +++ b/docs/markdown/snippets/ti_compilers.md @@ -0,0 +1,8 @@ +## Added support for Texas Instruments MSP430 and ARM compilers + +Meson now supports the TI [MSP430](https://www.ti.com/tool/MSP-CGT) and +[ARM](https://www.ti.com/tool/ARM-CGT) toolchains. The compiler and linker are +identified as `ti` and `ti-ar`, respectively. To maintain backwards +compatibility with existing build definitions, the [C2000 +toolchain](https://www.ti.com/tool/C2000-CGT) is still identified as `c2000` and +`ar2000`. diff --git a/mesonbuild/build.py b/mesonbuild/build.py index 3fa647a..782f59c 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -1776,8 +1776,8 @@ class Executable(BuildTarget): self.suffix = 'abs' elif ('c' in self.compilers and self.compilers['c'].get_id().startswith('xc16')): self.suffix = 'elf' - elif ('c' in self.compilers and self.compilers['c'].get_id().startswith('c2000') or - 'cpp' in self.compilers and self.compilers['cpp'].get_id().startswith('c2000')): + elif ('c' in self.compilers and self.compilers['c'].get_id() in ('ti', 'c2000') or + 'cpp' in self.compilers and self.compilers['cpp'].get_id() in ('ti', 'c2000')): self.suffix = 'out' else: self.suffix = environment.machines[for_machine].get_exe_suffix() diff --git a/mesonbuild/compilers/__init__.py b/mesonbuild/compilers/__init__.py index 807a009..034063a 100644 --- a/mesonbuild/compilers/__init__.py +++ b/mesonbuild/compilers/__init__.py @@ -120,6 +120,8 @@ __all__ = [ 'CompCertCCompiler', 'C2000CCompiler', 'C2000CPPCompiler', + 'TICCompiler', + 'TICPPCompiler', 'SunFortranCompiler', 'SwiftCompiler', 'ValaCompiler', @@ -188,6 +190,7 @@ from .c import ( Xc16CCompiler, CompCertCCompiler, C2000CCompiler, + TICCompiler, VisualStudioCCompiler, ) from .cpp import ( @@ -206,6 +209,7 @@ from .cpp import ( PGICPPCompiler, CcrxCPPCompiler, C2000CPPCompiler, + TICPPCompiler, VisualStudioCPPCompiler, ) from .cs import MonoCompiler, VisualStudioCsCompiler diff --git a/mesonbuild/compilers/c.py b/mesonbuild/compilers/c.py index 474bf3b..610473d 100644 --- a/mesonbuild/compilers/c.py +++ b/mesonbuild/compilers/c.py @@ -23,7 +23,7 @@ from .mixins.clike import CLikeCompiler from .mixins.ccrx import CcrxCompiler from .mixins.xc16 import Xc16Compiler from .mixins.compcert import CompCertCompiler -from .mixins.c2000 import C2000Compiler +from .mixins.ti import TICompiler from .mixins.arm import ArmCompiler, ArmclangCompiler from .mixins.visualstudio import MSVCCompiler, ClangClCompiler from .mixins.gnu import GnuCompiler @@ -685,7 +685,7 @@ class CompCertCCompiler(CompCertCompiler, CCompiler): path = '.' return ['-I' + path] -class C2000CCompiler(C2000Compiler, CCompiler): +class TICCompiler(TICompiler, CCompiler): def __init__(self, exelist: T.List[str], version: str, for_machine: MachineChoice, is_cross: bool, info: 'MachineInfo', exe_wrapper: T.Optional['ExternalProgram'] = None, @@ -693,7 +693,7 @@ class C2000CCompiler(C2000Compiler, CCompiler): full_version: T.Optional[str] = None): CCompiler.__init__(self, exelist, version, for_machine, is_cross, info, exe_wrapper, linker=linker, full_version=full_version) - C2000Compiler.__init__(self) + TICompiler.__init__(self) # Override CCompiler.get_always_args def get_always_args(self) -> T.List[str]: @@ -716,19 +716,6 @@ class C2000CCompiler(C2000Compiler, CCompiler): args.append('--' + std.value) return args - def get_compile_only_args(self) -> T.List[str]: - return [] - - def get_no_optimization_args(self) -> T.List[str]: - return ['-Ooff'] - - def get_output_args(self, target: str) -> T.List[str]: - return [f'--output_file={target}'] - - def get_werror_args(self) -> T.List[str]: - return ['-change_message=error'] - - def get_include_args(self, path: str, is_system: bool) -> T.List[str]: - if path == '': - path = '.' - return ['--include_path=' + path] +class C2000CCompiler(TICCompiler): + # Required for backwards compat with projects created before ti-cgt support existed + id = 'c2000' diff --git a/mesonbuild/compilers/cpp.py b/mesonbuild/compilers/cpp.py index 749da2f..a26f731 100644 --- a/mesonbuild/compilers/cpp.py +++ b/mesonbuild/compilers/cpp.py @@ -30,7 +30,7 @@ from .compilers import ( from .c_function_attributes import CXX_FUNC_ATTRIBUTES, C_FUNC_ATTRIBUTES from .mixins.clike import CLikeCompiler from .mixins.ccrx import CcrxCompiler -from .mixins.c2000 import C2000Compiler +from .mixins.ti import TICompiler from .mixins.arm import ArmCompiler, ArmclangCompiler from .mixins.visualstudio import MSVCCompiler, ClangClCompiler from .mixins.gnu import GnuCompiler @@ -839,14 +839,14 @@ class CcrxCPPCompiler(CcrxCompiler, CPPCompiler): def get_compiler_check_args(self, mode: CompileCheckMode) -> T.List[str]: return [] -class C2000CPPCompiler(C2000Compiler, CPPCompiler): +class TICPPCompiler(TICompiler, CPPCompiler): 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, full_version: T.Optional[str] = None): CPPCompiler.__init__(self, exelist, version, for_machine, is_cross, info, exe_wrapper, linker=linker, full_version=full_version) - C2000Compiler.__init__(self) + TICompiler.__init__(self) def get_options(self) -> 'KeyedOptionDictType': opts = CPPCompiler.get_options(self) @@ -862,13 +862,12 @@ class C2000CPPCompiler(C2000Compiler, CPPCompiler): args.append('--' + std.value) return args - def get_no_optimization_args(self) -> T.List[str]: - return ['-Ooff'] + def get_always_args(self) -> T.List[str]: + return [] - def get_output_args(self, target: str) -> T.List[str]: - return [f'--output_file={target}'] + def get_option_link_args(self, options: 'KeyedOptionDictType') -> T.List[str]: + return [] - def get_include_args(self, path: str, is_system: bool) -> T.List[str]: - if path == '': - path = '.' - return ['--include_path=' + path] +class C2000CPPCompiler(TICPPCompiler): + # Required for backwards compat with projects created before ti-cgt support existed + id = 'c2000' diff --git a/mesonbuild/compilers/detect.py b/mesonbuild/compilers/detect.py index 4a5e72f..9216ecf 100644 --- a/mesonbuild/compilers/detect.py +++ b/mesonbuild/compilers/detect.py @@ -33,6 +33,8 @@ from ..linkers import ( CompCertDynamicLinker, C2000Linker, C2000DynamicLinker, + TILinker, + TIDynamicLinker, DLinker, NAGDynamicLinker, NvidiaHPC_DynamicLinker, @@ -68,6 +70,7 @@ from .c import ( Xc16CCompiler, CompCertCCompiler, C2000CCompiler, + TICCompiler, VisualStudioCCompiler, ) from .cpp import ( @@ -87,6 +90,7 @@ from .cpp import ( PGICPPCompiler, CcrxCPPCompiler, C2000CPPCompiler, + TICPPCompiler, VisualStudioCPPCompiler, ) from .cs import MonoCompiler, VisualStudioCsCompiler @@ -295,9 +299,11 @@ def detect_static_linker(env: 'Environment', compiler: Compiler) -> StaticLinker linkers = default_linkers popen_exceptions = {} for linker in linkers: - if not {'lib', 'lib.exe', 'llvm-lib', 'llvm-lib.exe', 'xilib', 'xilib.exe'}.isdisjoint(linker): + linker_name = os.path.basename(linker[0]) + + if any(os.path.basename(x) in {'lib', 'lib.exe', 'llvm-lib', 'llvm-lib.exe', 'xilib', 'xilib.exe'} for x in linker): arg = '/?' - elif not {'ar2000', 'ar2000.exe'}.isdisjoint(linker): + elif linker_name in {'ar2000', 'ar2000.exe', 'ar430', 'ar430.exe', 'armar', 'armar.exe'}: arg = '?' else: arg = '--version' @@ -312,7 +318,7 @@ def detect_static_linker(env: 'Environment', compiler: Compiler) -> StaticLinker return VisualStudioLinker(linker, getattr(compiler, 'machine', None)) if 'ar-Error-Unknown switch: --version' in err: return PGIStaticLinker(linker) - if p.returncode == 0 and ('armar' in linker or 'armar.exe' in linker): + if p.returncode == 0 and 'armar' in linker_name: return ArmarLinker(linker) if 'DMD32 D Compiler' in out or 'DMD64 D Compiler' in out: assert isinstance(compiler, DCompiler) @@ -323,12 +329,15 @@ def detect_static_linker(env: 'Environment', compiler: Compiler) -> StaticLinker if 'GDC' in out and ' based on D ' in out: assert isinstance(compiler, DCompiler) return DLinker(linker, compiler.arch) - if err.startswith('Renesas') and ('rlink' in linker or 'rlink.exe' in linker): + if err.startswith('Renesas') and 'rlink' in linker_name: return CcrxLinker(linker) - if out.startswith('GNU ar') and ('xc16-ar' in linker or 'xc16-ar.exe' in linker): + if out.startswith('GNU ar') and 'xc16-ar' in linker_name: return Xc16Linker(linker) - if out.startswith('TMS320C2000') and ('ar2000' in linker or 'ar2000.exe' in linker): - return C2000Linker(linker) + if 'Texas Instruments Incorporated' in out: + if 'ar2000' in linker_name: + return C2000Linker(linker) + else: + return TILinker(linker) if out.startswith('The CompCert'): return CompCertLinker(linker) if p.returncode == 0: @@ -397,7 +406,8 @@ def _detect_c_or_cpp_compiler(env: 'Environment', lang: str, for_machine: Machin arg = '--version' elif 'ccomp' in compiler_name: arg = '-version' - elif 'cl2000' in compiler_name: + elif compiler_name in {'cl2000', 'cl2000.exe', 'cl430', 'cl430.exe', 'armcl', 'armcl.exe'}: + # TI compiler arg = '-version' elif compiler_name in {'icl', 'icl.exe'}: # if you pass anything to icl you get stuck in a pager @@ -602,6 +612,20 @@ def _detect_c_or_cpp_compiler(env: 'Environment', lang: str, for_machine: Machin return cls( ccache + compiler, version, for_machine, is_cross, info, exe_wrap, full_version=full_version, linker=l) + if 'TMS320C2000 C/C++' in out or 'MSP430 C/C++' in out or 'TI ARM C/C++ Compiler' in out: + lnk : T.Union[T.Type[C2000DynamicLinker], T.Type[TIDynamicLinker]] + if 'TMS320C2000 C/C++' in out: + cls = C2000CCompiler if lang == 'c' else C2000CPPCompiler + lnk = C2000DynamicLinker + else: + cls = TICCompiler if lang == 'c' else TICPPCompiler + lnk = TIDynamicLinker + + env.coredata.add_lang_args(cls.language, cls, for_machine, env) + linker = lnk(compiler, for_machine, version=version) + return cls( + ccache + compiler, version, for_machine, is_cross, info, + exe_wrap, full_version=full_version, linker=linker) if 'ARM' in out: cls = ArmCCompiler if lang == 'c' else ArmCPPCompiler env.coredata.add_lang_args(cls.language, cls, for_machine, env) @@ -633,14 +657,6 @@ def _detect_c_or_cpp_compiler(env: 'Environment', lang: str, for_machine: Machin ccache + compiler, version, for_machine, is_cross, info, exe_wrap, full_version=full_version, linker=linker) - if 'TMS320C2000 C/C++' in out: - cls = C2000CCompiler if lang == 'c' else C2000CPPCompiler - env.coredata.add_lang_args(cls.language, cls, for_machine, env) - linker = C2000DynamicLinker(compiler, for_machine, version=version) - return cls( - ccache + compiler, version, for_machine, is_cross, info, - exe_wrap, full_version=full_version, linker=linker) - _handle_exceptions(popen_exceptions, compilers) raise EnvironmentException(f'Unknown compiler {compilers}') diff --git a/mesonbuild/compilers/mixins/c2000.py b/mesonbuild/compilers/mixins/ti.py index f614d16..60804f7 100644 --- a/mesonbuild/compilers/mixins/c2000.py +++ b/mesonbuild/compilers/mixins/ti.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Representations specific to the Texas Instruments C2000 compiler family.""" +"""Representations specific to the Texas Instruments compiler family.""" import os import typing as T @@ -29,7 +29,7 @@ else: # do). This gives up DRYer type checking, with no runtime impact Compiler = object -c2000_buildtype_args = { +ti_buildtype_args = { 'plain': [], 'debug': [], 'debugoptimized': [], @@ -38,7 +38,7 @@ c2000_buildtype_args = { 'custom': [], } # type: T.Dict[str, T.List[str]] -c2000_optimization_args = { +ti_optimization_args = { '0': ['-O0'], 'g': ['-Ooff'], '1': ['-O1'], @@ -47,22 +47,22 @@ c2000_optimization_args = { 's': ['-04'] } # type: T.Dict[str, T.List[str]] -c2000_debug_args = { +ti_debug_args = { False: [], True: ['-g'] } # type: T.Dict[bool, T.List[str]] -class C2000Compiler(Compiler): +class TICompiler(Compiler): - id = 'c2000' + id = 'ti' def __init__(self) -> None: if not self.is_cross: - raise EnvironmentException('c2000 supports only cross-compilation.') + raise EnvironmentException('TI compilers only support cross-compilation.') self.can_compile_suffixes.add('asm') # Assembly - self.can_compile_suffixes.add('cla') # Control Law Accelerator (CLA) + self.can_compile_suffixes.add('cla') # Control Law Accelerator (CLA) used in C2000 default_warn_args = [] # type: T.List[str] self.warn_args = {'0': [], @@ -71,12 +71,12 @@ class C2000Compiler(Compiler): '3': default_warn_args + []} # type: T.Dict[str, T.List[str]] def get_pic_args(self) -> T.List[str]: - # PIC support is not enabled by default for c2000, + # PIC support is not enabled by default for TI compilers, # if users want to use it, they need to add the required arguments explicitly return [] def get_buildtype_args(self, buildtype: str) -> T.List[str]: - return c2000_buildtype_args[buildtype] + return ti_buildtype_args[buildtype] def get_pch_suffix(self) -> str: return 'pch' @@ -97,10 +97,27 @@ class C2000Compiler(Compiler): return [] def get_optimization_args(self, optimization_level: str) -> T.List[str]: - return c2000_optimization_args[optimization_level] + return ti_optimization_args[optimization_level] def get_debug_args(self, is_debug: bool) -> T.List[str]: - return c2000_debug_args[is_debug] + return ti_debug_args[is_debug] + + def get_compile_only_args(self) -> T.List[str]: + return [] + + def get_no_optimization_args(self) -> T.List[str]: + return ['-Ooff'] + + def get_output_args(self, target: str) -> T.List[str]: + return [f'--output_file={target}'] + + def get_werror_args(self) -> T.List[str]: + return ['--emit_warnings_as_errors'] + + def get_include_args(self, path: str, is_system: bool) -> T.List[str]: + if path == '': + path = '.' + return ['-I=' + path] @classmethod def unix_args_to_native(cls, args: T.List[str]) -> T.List[str]: @@ -108,8 +125,6 @@ class C2000Compiler(Compiler): for i in args: if i.startswith('-D'): i = '--define=' + i[2:] - if i.startswith('-I'): - i = '--include_path=' + i[2:] if i.startswith('-Wl,-rpath='): continue elif i == '--print-search-dirs': @@ -121,8 +136,8 @@ class C2000Compiler(Compiler): def compute_parameters_with_absolute_paths(self, parameter_list: T.List[str], build_dir: str) -> T.List[str]: for idx, i in enumerate(parameter_list): - if i[:14] == '--include_path': - parameter_list[idx] = i[:14] + os.path.normpath(os.path.join(build_dir, i[14:])) + if i[:15] == '--include_path=': + parameter_list[idx] = i[:15] + os.path.normpath(os.path.join(build_dir, i[15:])) if i[:2] == '-I': parameter_list[idx] = i[:2] + os.path.normpath(os.path.join(build_dir, i[2:])) diff --git a/mesonbuild/envconfig.py b/mesonbuild/envconfig.py index 1b5f728..94127dc 100644 --- a/mesonbuild/envconfig.py +++ b/mesonbuild/envconfig.py @@ -53,6 +53,7 @@ known_cpu_families = ( 'microblaze', 'mips', 'mips64', + 'msp430', 'parisc', 'pic24', 'ppc', diff --git a/mesonbuild/linkers/__init__.py b/mesonbuild/linkers/__init__.py index 2e5217e..3cc3fc4 100644 --- a/mesonbuild/linkers/__init__.py +++ b/mesonbuild/linkers/__init__.py @@ -31,6 +31,7 @@ from .linkers import ( Xc16Linker, CompCertLinker, C2000Linker, + TILinker, AIXArLinker, PGIStaticLinker, NvidiaHPC_StaticLinker, @@ -48,6 +49,7 @@ from .linkers import ( Xc16DynamicLinker, CompCertDynamicLinker, C2000DynamicLinker, + TIDynamicLinker, ArmDynamicLinker, ArmClangDynamicLinker, QualcommLLVMDynamicLinker, @@ -89,6 +91,7 @@ __all__ = [ 'Xc16Linker', 'CompCertLinker', 'C2000Linker', + 'TILinker', 'AIXArLinker', 'PGIStaticLinker', 'NvidiaHPC_StaticLinker', @@ -106,6 +109,7 @@ __all__ = [ 'Xc16DynamicLinker', 'CompCertDynamicLinker', 'C2000DynamicLinker', + 'TIDynamicLinker', 'ArmDynamicLinker', 'ArmClangDynamicLinker', 'QualcommLLVMDynamicLinker', diff --git a/mesonbuild/linkers/linkers.py b/mesonbuild/linkers/linkers.py index c8489da..9cc217a 100644 --- a/mesonbuild/linkers/linkers.py +++ b/mesonbuild/linkers/linkers.py @@ -288,11 +288,11 @@ class CompCertLinker(StaticLinker): return [f'-o{target}'] -class C2000Linker(StaticLinker): +class TILinker(StaticLinker): def __init__(self, exelist: T.List[str]): super().__init__(exelist) - self.id = 'ar2000' + self.id = 'ti-ar' def can_linker_accept_rsp(self) -> bool: return False @@ -304,6 +304,11 @@ class C2000Linker(StaticLinker): return ['-r'] +class C2000Linker(TILinker): + # Required for backwards compat with projects created before ti-cgt support existed + id = 'ar2000' + + class AIXArLinker(ArLikeLinker): id = 'aixar' std_args = ['-csr', '-Xany'] @@ -971,15 +976,15 @@ class CompCertDynamicLinker(DynamicLinker): install_rpath: str) -> T.Tuple[T.List[str], T.Set[bytes]]: return ([], set()) -class C2000DynamicLinker(DynamicLinker): +class TIDynamicLinker(DynamicLinker): - """Linker for Texas Instruments C2000 compiler.""" + """Linker for Texas Instruments compiler family.""" - id = 'cl2000' + id = 'ti' def __init__(self, exelist: T.List[str], for_machine: mesonlib.MachineChoice, *, version: str = 'unknown version'): - super().__init__(exelist or ['cl2000.exe'], for_machine, '', [], + super().__init__(exelist, for_machine, '', [], version=version) def get_link_whole_for(self, args: T.List[str]) -> T.List[str]: @@ -1000,7 +1005,7 @@ class C2000DynamicLinker(DynamicLinker): return ['-z', f'--output_file={outputname}'] def get_search_args(self, dirname: str) -> 'T.NoReturn': - raise OSError('cl2000.exe does not have a search dir argument') + raise OSError('TI compilers do not have a search dir argument') def get_allow_undefined_args(self) -> T.List[str]: return [] @@ -1009,6 +1014,11 @@ class C2000DynamicLinker(DynamicLinker): return [] +class C2000DynamicLinker(TIDynamicLinker): + # Required for backwards compat with projects created before ti-cgt support existed + id = 'cl2000' + + class ArmDynamicLinker(PosixDynamicLinkerMixin, DynamicLinker): """Linker for the ARM compiler.""" |