File: microchip.py

package info (click to toggle)
meson 1.10.0-1
  • links: PTS
  • area: main
  • in suites: forky, sid
  • size: 24,680 kB
  • sloc: python: 90,528; ansic: 7,377; cpp: 2,434; f90: 482; asm: 218; sh: 143; xml: 109; java: 97; cs: 62; objc: 33; lex: 13; fortran: 12; makefile: 10; yacc: 9; javascript: 6
file content (195 lines) | stat: -rw-r--r-- 6,023 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
# SPDX-License-Identifier: Apache-2.0
# Copyright 2012-2019 The Meson development team

from __future__ import annotations

"""Representations specific to the Microchip XC C/C++ compiler family."""

import os
import typing as T

from .gnu import GnuCStds, GnuCPPStds
from ..compilers import Compiler
from ...mesonlib import EnvironmentException, version_compare

if T.TYPE_CHECKING:
    from ...build import BuildTarget
    from ...envconfig import MachineInfo

    CompilerBase = Compiler
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
    CompilerBase = object

xc16_optimization_args: T.Dict[str, T.List[str]] = {
    'plain': [],
    '0': ['-O0'],
    'g': ['-O0'],
    '1': ['-O1'],
    '2': ['-O2'],
    '3': ['-O3'],
    's': ['-Os']
}

xc16_debug_args: T.Dict[bool, T.List[str]] = {
    False: [],
    True: []
}


class Xc16Compiler(Compiler):

    id = 'xc16'

    def __init__(self) -> None:
        if not self.is_cross:
            raise EnvironmentException('xc16 supports only cross-compilation.')
        # Assembly
        self.can_compile_suffixes.add('s')
        self.can_compile_suffixes.add('sx')
        default_warn_args: T.List[str] = []
        self.warn_args = {'0': [],
                          '1': default_warn_args,
                          '2': default_warn_args + [],
                          '3': default_warn_args + [],
                          'everything': default_warn_args + []}

    def get_always_args(self) -> T.List[str]:
        return []

    def get_pic_args(self) -> T.List[str]:
        # PIC support is not enabled by default for xc16,
        # if users want to use it, they need to add the required arguments explicitly
        return []

    def get_pch_suffix(self) -> str:
        return 'pch'

    def get_pch_use_args(self, pch_dir: str, header: str) -> T.List[str]:
        return []

    def thread_flags(self) -> T.List[str]:
        return []

    def get_coverage_args(self) -> T.List[str]:
        return []

    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 xc16_optimization_args[optimization_level]

    def get_debug_args(self, is_debug: bool) -> T.List[str]:
        return xc16_debug_args[is_debug]

    @classmethod
    def _unix_args_to_native(cls, args: T.List[str], info: MachineInfo) -> T.List[str]:
        result = []
        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[:9] == '-I':
                parameter_list[idx] = i[:9] + os.path.normpath(os.path.join(build_dir, i[9:]))

        return parameter_list


class Xc32Compiler(CompilerBase):

    """Microchip XC32 compiler mixin. GCC based with some options disabled."""

    id = 'xc32-gcc'

    gcc_version = '4.5.1'  # Defaults to GCC version used by first XC32 release (v1.00).

    _COLOR_VERSION = ">=3.0"       # XC32 version based on GCC 8.3.1+
    _WPEDANTIC_VERSION = ">=1.40"  # XC32 version based on GCC 4.8.3+
    _LTO_AUTO_VERSION = "==-1"
    _USE_MOLD_VERSION = "==-1"

    def __init__(self) -> None:
        if not self.is_cross:
            raise EnvironmentException("XC32 supports only cross-compilation.")

    def get_instruction_set_args(self, instruction_set: str) -> T.Optional[T.List[str]]:
        return None

    def thread_flags(self) -> T.List[str]:
        return []

    def openmp_flags(self) -> T.List[str]:
        return Compiler.openmp_flags(self)

    def get_pic_args(self) -> T.List[str]:
        return Compiler.get_pic_args(self)

    def get_pie_args(self) -> T.List[str]:
        return Compiler.get_pie_args(self)

    def get_profile_generate_args(self) -> T.List[str]:
        return Compiler.get_profile_generate_args(self)

    def get_profile_use_args(self) -> T.List[str]:
        return Compiler.get_profile_use_args(self)

    def sanitizer_compile_args(self, target: T.Optional[BuildTarget], value: T.List[str]) -> T.List[str]:
        return []

    @classmethod
    def use_linker_args(cls, linker: str, version: str) -> T.List[str]:
        return []

    def get_coverage_args(self) -> T.List[str]:
        return []

    def get_largefile_args(self) -> T.List[str]:
        return []

    def get_prelink_args(self, prelink_name: str, obj_list: T.List[str]) -> T.Tuple[T.List[str], T.List[str]]:
        return Compiler.get_prelink_args(self, prelink_name, obj_list)

    def get_prelink_append_compile_args(self) -> bool:
        return False

    def supported_warn_args(self, warn_args_by_version: T.Dict[str, T.List[str]]) -> T.List[str]:
        result: T.List[str] = []
        for version, warn_args in warn_args_by_version.items():
            if version_compare(self.gcc_version, '>=' + version):
                result += warn_args
        return result

class Xc32CStds(GnuCStds):

    """Mixin for setting C standards based on XC32 version."""

    _C18_VERSION = ">=3.0"
    _C2X_VERSION = "==-1"
    _C23_VERSION = "==-1"
    _C2Y_VERSION = "==-1"

class Xc32CPPStds(GnuCPPStds):

    """Mixin for setting C++ standards based on XC32 version."""

    _CPP23_VERSION = "==-1"
    _CPP26_VERSION = "==-1"