| # SPDX-License-Identifier: Apache-2.0 |
| # Copyright 2012-2019 The Meson development team |
| |
| from __future__ import annotations |
| |
| """Representations specific to the Metrowerks/Freescale Embedded C/C++ compiler family.""" |
| |
| import os |
| import typing as T |
| |
| from ...mesonlib import EnvironmentException, OptionKey |
| |
| if T.TYPE_CHECKING: |
| from ...envconfig import MachineInfo |
| from ...compilers.compilers import Compiler, CompileCheckMode |
| else: |
| # This is a bit clever, for mypy we pretend that these mixins descend from |
| # Compiler, so we get all of the methods and attributes defined for us, but |
| # for runtime we make them descend from object (which all classes normally |
| # do). This gives up DRYer type checking, with no runtime impact |
| Compiler = object |
| |
| mwccarm_instruction_set_args: T.Dict[str, T.List[str]] = { |
| 'generic': ['-proc', 'generic'], |
| 'v4': ['-proc', 'v4'], |
| 'v4t': ['-proc', 'v4t'], |
| 'v5t': ['-proc', 'v5t'], |
| 'v5te': ['-proc', 'v5te'], |
| 'v6': ['-proc', 'v6'], |
| 'arm7tdmi': ['-proc', 'arm7tdmi'], |
| 'arm710t': ['-proc', 'arm710t'], |
| 'arm720t': ['-proc', 'arm720t'], |
| 'arm740t': ['-proc', 'arm740t'], |
| 'arm7ej': ['-proc', 'arm7ej'], |
| 'arm9tdmi': ['-proc', 'arm9tdmi'], |
| 'arm920t': ['-proc', 'arm920t'], |
| 'arm922t': ['-proc', 'arm922t'], |
| 'arm940t': ['-proc', 'arm940t'], |
| 'arm9ej': ['-proc', 'arm9ej'], |
| 'arm926ej': ['-proc', 'arm926ej'], |
| 'arm946e': ['-proc', 'arm946e'], |
| 'arm966e': ['-proc', 'arm966e'], |
| 'arm1020e': ['-proc', 'arm1020e'], |
| 'arm1022e': ['-proc', 'arm1022e'], |
| 'arm1026ej': ['-proc', 'arm1026ej'], |
| 'dbmx1': ['-proc', 'dbmx1'], |
| 'dbmxl': ['-proc', 'dbmxl'], |
| 'XScale': ['-proc', 'XScale'], |
| 'pxa255': ['-proc', 'pxa255'], |
| 'pxa261': ['-proc', 'pxa261'], |
| 'pxa262': ['-proc', 'pxa262'], |
| 'pxa263': ['-proc', 'pxa263'] |
| } |
| |
| mwcceppc_instruction_set_args: T.Dict[str, T.List[str]] = { |
| 'generic': ['-proc', 'generic'], |
| '401': ['-proc', '401'], |
| '403': ['-proc', '403'], |
| '505': ['-proc', '505'], |
| '509': ['-proc', '509'], |
| '555': ['-proc', '555'], |
| '601': ['-proc', '601'], |
| '602': ['-proc', '602'], |
| '603': ['-proc', '603'], |
| '603e': ['-proc', '603e'], |
| '604': ['-proc', '604'], |
| '604e': ['-proc', '604e'], |
| '740': ['-proc', '740'], |
| '750': ['-proc', '750'], |
| '801': ['-proc', '801'], |
| '821': ['-proc', '821'], |
| '823': ['-proc', '823'], |
| '850': ['-proc', '850'], |
| '860': ['-proc', '860'], |
| '7400': ['-proc', '7400'], |
| '7450': ['-proc', '7450'], |
| '8240': ['-proc', '8240'], |
| '8260': ['-proc', '8260'], |
| 'e500': ['-proc', 'e500'], |
| 'gekko': ['-proc', 'gekko'], |
| } |
| |
| mwasmarm_instruction_set_args: T.Dict[str, T.List[str]] = { |
| 'arm4': ['-proc', 'arm4'], |
| 'arm4t': ['-proc', 'arm4t'], |
| 'arm4xm': ['-proc', 'arm4xm'], |
| 'arm4txm': ['-proc', 'arm4txm'], |
| 'arm5': ['-proc', 'arm5'], |
| 'arm5T': ['-proc', 'arm5T'], |
| 'arm5xM': ['-proc', 'arm5xM'], |
| 'arm5TxM': ['-proc', 'arm5TxM'], |
| 'arm5TE': ['-proc', 'arm5TE'], |
| 'arm5TExP': ['-proc', 'arm5TExP'], |
| 'arm6': ['-proc', 'arm6'], |
| 'xscale': ['-proc', 'xscale'] |
| } |
| |
| mwasmeppc_instruction_set_args: T.Dict[str, T.List[str]] = { |
| '401': ['-proc', '401'], |
| '403': ['-proc', '403'], |
| '505': ['-proc', '505'], |
| '509': ['-proc', '509'], |
| '555': ['-proc', '555'], |
| '56X': ['-proc', '56X'], |
| '601': ['-proc', '601'], |
| '602': ['-proc', '602'], |
| '603': ['-proc', '603'], |
| '603e': ['-proc', '603e'], |
| '604': ['-proc', '604'], |
| '604e': ['-proc', '604e'], |
| '740': ['-proc', '740'], |
| '74X': ['-proc', '74X'], |
| '750': ['-proc', '750'], |
| '75X': ['-proc', '75X'], |
| '801': ['-proc', '801'], |
| '821': ['-proc', '821'], |
| '823': ['-proc', '823'], |
| '850': ['-proc', '850'], |
| '85X': ['-proc', '85X'], |
| '860': ['-proc', '860'], |
| '86X': ['-proc', '86X'], |
| '87X': ['-proc', '87X'], |
| '88X': ['-proc', '88X'], |
| '5100': ['-proc', '5100'], |
| '5200': ['-proc', '5200'], |
| '7400': ['-proc', '7400'], |
| '744X': ['-proc', '744X'], |
| '7450': ['-proc', '7450'], |
| '745X': ['-proc', '745X'], |
| '82XX': ['-proc', '82XX'], |
| '8240': ['-proc', '8240'], |
| '824X': ['-proc', '824X'], |
| '8260': ['-proc', '8260'], |
| '827X': ['-proc', '827X'], |
| '8280': ['-proc', '8280'], |
| 'e300': ['-proc', 'e300'], |
| 'e300c2': ['-proc', 'e300c2'], |
| 'e300c3': ['-proc', 'e300c3'], |
| 'e300c4': ['-proc', 'e300c4'], |
| 'e600': ['-proc', 'e600'], |
| '85xx': ['-proc', '85xx'], |
| 'e500': ['-proc', 'e500'], |
| 'e500v2': ['-proc', 'e500v2'], |
| 'Zen': ['-proc', 'Zen'], |
| '5565': ['-proc', '5565'], |
| '5674': ['-proc', '5674'], |
| 'gekko': ['-proc', 'gekko'], |
| 'generic': ['-proc', 'generic'], |
| } |
| |
| mwcc_optimization_args: T.Dict[str, T.List[str]] = { |
| 'plain': [], |
| '0': ['-O0'], |
| 'g': ['-Op'], |
| '1': ['-O1'], |
| '2': ['-O2'], |
| '3': ['-O4,p'], |
| 's': ['-Os'] |
| } |
| |
| mwcc_debug_args: T.Dict[bool, T.List[str]] = { |
| False: [], |
| True: ['-g'] |
| } |
| |
| |
| class MetrowerksCompiler(Compiler): |
| id = 'mwcc' |
| |
| # These compilers can actually invoke the linker, but they choke on |
| # linker-specific flags. So it's best to invoke the linker directly |
| INVOKES_LINKER = False |
| |
| def __init__(self) -> None: |
| if not self.is_cross: |
| raise EnvironmentException(f'{id} supports only cross-compilation.') |
| |
| self.base_options = { |
| OptionKey(o) for o in ['b_pch', 'b_ndebug']} |
| |
| default_warn_args: T.List[str] = [] |
| self.warn_args: T.Dict[str, T.List[str]] = { |
| '0': ['-w', 'off'], |
| '1': default_warn_args, |
| '2': default_warn_args + ['-w', 'most'], |
| '3': default_warn_args + ['-w', 'all'], |
| 'everything': default_warn_args + ['-w', 'full']} |
| |
| def depfile_for_object(self, objfile: str) -> T.Optional[str]: |
| # Earlier versions of these compilers do not support specifying |
| # a custom name for a depfile, and can only generate '<input_file>.d' |
| return os.path.splitext(objfile)[0] + '.' + self.get_depfile_suffix() |
| |
| def get_always_args(self) -> T.List[str]: |
| return ['-gccinc'] |
| |
| def get_compiler_check_args(self, mode: CompileCheckMode) -> T.List[str]: |
| return [] |
| |
| def get_compile_only_args(self) -> T.List[str]: |
| return ['-c'] |
| |
| def get_debug_args(self, is_debug: bool) -> T.List[str]: |
| return mwcc_debug_args[is_debug] |
| |
| def get_dependency_gen_args(self, outtarget: str, outfile: str) -> T.List[str]: |
| # Check comment in depfile_for_object() |
| return ['-gccdep', '-MD'] |
| |
| def get_depfile_suffix(self) -> str: |
| return 'd' |
| |
| def get_include_args(self, path: str, is_system: bool) -> T.List[str]: |
| if not path: |
| path = '.' |
| return ['-I' + path] |
| |
| def get_no_optimization_args(self) -> T.List[str]: |
| return ['-opt', 'off'] |
| |
| def get_no_stdinc_args(self) -> T.List[str]: |
| return ['-nostdinc'] |
| |
| def get_no_stdlib_link_args(self) -> T.List[str]: |
| return ['-nostdlib'] |
| |
| def get_optimization_args(self, optimization_level: str) -> T.List[str]: |
| return mwcc_optimization_args[optimization_level] |
| |
| def get_output_args(self, outputname: str) -> T.List[str]: |
| return ['-o', outputname] |
| |
| def get_pic_args(self) -> T.List[str]: |
| return ['-pic'] |
| |
| def get_preprocess_only_args(self) -> T.List[str]: |
| return ['-E'] |
| |
| def get_preprocess_to_file_args(self) -> T.List[str]: |
| return ['-P'] |
| |
| def get_pch_use_args(self, pch_dir: str, header: str) -> T.List[str]: |
| return ['-prefix', self.get_pch_name(header)] |
| |
| def get_pch_name(self, name: str) -> str: |
| return os.path.basename(name) + '.' + self.get_pch_suffix() |
| |
| def get_pch_suffix(self) -> str: |
| return 'mch' |
| |
| def get_warn_args(self, level: str) -> T.List[str]: |
| return self.warn_args[level] |
| |
| def get_werror_args(self) -> T.List[str]: |
| return ['-w', 'error'] |
| |
| @classmethod |
| def _unix_args_to_native(cls, args: T.List[str], info: MachineInfo) -> T.List[str]: |
| result: T.List[str] = [] |
| for i in args: |
| if i.startswith('-D'): |
| i = '-D' + i[2:] |
| if i.startswith('-I'): |
| i = '-I' + i[2:] |
| if i.startswith('-Wl,-rpath='): |
| continue |
| elif i == '--print-search-dirs': |
| continue |
| elif i.startswith('-L'): |
| continue |
| result.append(i) |
| return result |
| |
| 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[:2] == '-I': |
| parameter_list[idx] = i[:9] + os.path.normpath(os.path.join(build_dir, i[9:])) |
| |
| return parameter_list |