]> git.proxmox.com Git - rustc.git/blob - src/doc/rustc/src/target-tier-policy.md
New upstream version 1.54.0+dfsg1
[rustc.git] / src / doc / rustc / src / target-tier-policy.md
1 # Target Tier Policy
2
3 ## Table of Contents
4
5 * [General](#general)
6 * [Tier 3 target policy](#tier-3-target-policy)
7 * [Tier 2 target policy](#tier-2-target-policy)
8 * [Tier 2 with host tools](#tier-2-with-host-tools)
9 * [Tier 1 target policy](#tier-1-target-policy)
10 * [Tier 1 with host tools](#tier-1-with-host-tools)
11
12 ## General
13
14 Rust provides three tiers of target support:
15
16 - Rust provides no guarantees about tier 3 targets; they exist in the codebase,
17 but may or may not build.
18 - Rust's continuous integration checks that tier 2 targets will always build,
19 but they may or may not pass tests.
20 - Rust's continuous integration checks that tier 1 targets will always build
21 and pass tests.
22
23 Adding a new tier 3 target imposes minimal requirements; we focus primarily on
24 avoiding disruption to other ongoing Rust development.
25
26 Tier 2 and tier 1 targets place work on Rust project developers as a whole, to
27 avoid breaking the target. The broader Rust community may also feel more
28 inclined to support higher-tier targets in their crates (though they are not
29 obligated to do so). Thus, these tiers require commensurate and ongoing efforts
30 from the maintainers of the target, to demonstrate value and to minimize any
31 disruptions to ongoing Rust development.
32
33 This policy defines the requirements for accepting a proposed target at a given
34 level of support.
35
36 Each tier builds on all the requirements from the previous tier, unless
37 overridden by a stronger requirement. Targets at tier 2 and tier 1 may also
38 provide *host tools* (such as `rustc` and `cargo`); each of those tiers
39 includes a set of supplementary requirements that must be met if supplying host
40 tools for the target. A target at tier 2 or tier 1 is not required to supply
41 host tools, but if it does, it must meet the corresponding additional
42 requirements for host tools.
43
44 The policy for each tier also documents the Rust governance teams that must
45 approve the addition of any target at that tier. Those teams are responsible
46 for reviewing and evaluating the target, based on these requirements and their
47 own judgment. Those teams may apply additional requirements, including
48 subjective requirements, such as to deal with issues not foreseen by this
49 policy. (Such requirements may subsequently motivate additions to this policy.)
50
51 While these criteria attempt to document the policy, that policy still involves
52 human judgment. Targets must fulfill the spirit of the requirements as well, as
53 determined by the judgment of the approving teams. Reviewers and team members
54 evaluating targets and target-specific patches should always use their own best
55 judgment regarding the quality of work, and the suitability of a target for the
56 Rust project. Neither this policy nor any decisions made regarding targets
57 shall create any binding agreement or estoppel by any party.
58
59 Before filing an issue or pull request (PR) to introduce or promote a target,
60 the target should already meet the corresponding tier requirements. This does
61 not preclude an existing target's maintainers using issues (on the Rust
62 repository or otherwise) to track requirements that have not yet been met, as
63 appropriate; however, before officially proposing the introduction or promotion
64 of a target, it should meet all of the necessary requirements. A target
65 proposal is encouraged to quote the corresponding requirements verbatim as part
66 of explaining how the target meets those requirements.
67
68 For a list of all supported targets and their corresponding tiers ("tier 3",
69 "tier 2", "tier 2 with host tools", "tier 1", or "tier 1 with host tools"), see
70 [platform support](platform-support.md).
71
72 Note that a target must have already received approval for the next lower tier,
73 and spent a reasonable amount of time at that tier, before making a proposal
74 for promotion to the next higher tier; this is true even if a target meets the
75 requirements for several tiers at once. This policy leaves the precise
76 interpretation of "reasonable amount of time" up to the approving teams; those
77 teams may scale the amount of time required based on their confidence in the
78 target and its demonstrated track record at its current tier. At a minimum,
79 multiple stable releases of Rust should typically occur between promotions of a
80 target.
81
82 The availability or tier of a target in stable Rust is not a hard stability
83 guarantee about the future availability or tier of that target. Higher-level
84 target tiers are an increasing commitment to the support of a target, and we
85 will take that commitment and potential disruptions into account when
86 evaluating the potential demotion or removal of a target that has been part of
87 a stable release. The promotion or demotion of a target will not generally
88 affect existing stable releases, only current development and future releases.
89
90 In this policy, the words "must" and "must not" specify absolute requirements
91 that a target must meet to qualify for a tier. The words "should" and "should
92 not" specify requirements that apply in almost all cases, but for which the
93 approving teams may grant an exception for good reason. The word "may"
94 indicates something entirely optional, and does not indicate guidance or
95 recommendations. This language is based on [IETF RFC
96 2119](https://tools.ietf.org/html/rfc2119).
97
98 ## Tier 3 target policy
99
100 At this tier, the Rust project provides no official support for a target, so we
101 place minimal requirements on the introduction of targets.
102
103 A proposed new tier 3 target must be reviewed and approved by a member of the
104 compiler team based on these requirements. The reviewer may choose to gauge
105 broader compiler team consensus via a [Major Change Proposal (MCP)][MCP].
106
107 A proposed target or target-specific patch that substantially changes code
108 shared with other targets (not just target-specific code) must be reviewed and
109 approved by the appropriate team for that shared code before acceptance.
110
111 - A tier 3 target must have a designated developer or developers (the "target
112 maintainers") on record to be CCed when issues arise regarding the target.
113 (The mechanism to track and CC such developers may evolve over time.)
114 - Targets must use naming consistent with any existing targets; for instance, a
115 target for the same CPU or OS as an existing Rust target should use the same
116 name for that CPU or OS. Targets should normally use the same names and
117 naming conventions as used elsewhere in the broader ecosystem beyond Rust
118 (such as in other toolchains), unless they have a very good reason to
119 diverge. Changing the name of a target can be highly disruptive, especially
120 once the target reaches a higher tier, so getting the name right is important
121 even for a tier 3 target.
122 - Target names should not introduce undue confusion or ambiguity unless
123 absolutely necessary to maintain ecosystem compatibility. For example, if
124 the name of the target makes people extremely likely to form incorrect
125 beliefs about what it targets, the name should be changed or augmented to
126 disambiguate it.
127 - Tier 3 targets may have unusual requirements to build or use, but must not
128 create legal issues or impose onerous legal terms for the Rust project or for
129 Rust developers or users.
130 - The target must not introduce license incompatibilities.
131 - Anything added to the Rust repository must be under the standard Rust
132 license (`MIT OR Apache-2.0`).
133 - The target must not cause the Rust tools or libraries built for any other
134 host (even when supporting cross-compilation to the target) to depend
135 on any new dependency less permissive than the Rust licensing policy. This
136 applies whether the dependency is a Rust crate that would require adding
137 new license exceptions (as specified by the `tidy` tool in the
138 rust-lang/rust repository), or whether the dependency is a native library
139 or binary. In other words, the introduction of the target must not cause a
140 user installing or running a version of Rust or the Rust tools to be
141 subject to any new license requirements.
142 - If the target supports building host tools (such as `rustc` or `cargo`),
143 those host tools must not depend on proprietary (non-FOSS) libraries, other
144 than ordinary runtime libraries supplied by the platform and commonly used
145 by other binaries built for the target. For instance, `rustc` built for the
146 target may depend on a common proprietary C runtime library or console
147 output library, but must not depend on a proprietary code generation
148 library or code optimization library. Rust's license permits such
149 combinations, but the Rust project has no interest in maintaining such
150 combinations within the scope of Rust itself, even at tier 3.
151 - Targets should not require proprietary (non-FOSS) components to link a
152 functional binary or library.
153 - "onerous" here is an intentionally subjective term. At a minimum, "onerous"
154 legal/licensing terms include but are *not* limited to: non-disclosure
155 requirements, non-compete requirements, contributor license agreements
156 (CLAs) or equivalent, "non-commercial"/"research-only"/etc terms,
157 requirements conditional on the employer or employment of any particular
158 Rust developers, revocable terms, any requirements that create liability
159 for the Rust project or its developers or users, or any requirements that
160 adversely affect the livelihood or prospects of the Rust project or its
161 developers or users.
162 - Neither this policy nor any decisions made regarding targets shall create any
163 binding agreement or estoppel by any party. If any member of an approving
164 Rust team serves as one of the maintainers of a target, or has any legal or
165 employment requirement (explicit or implicit) that might affect their
166 decisions regarding a target, they must recuse themselves from any approval
167 decisions regarding the target's tier status, though they may otherwise
168 participate in discussions.
169 - This requirement does not prevent part or all of this policy from being
170 cited in an explicit contract or work agreement (e.g. to implement or
171 maintain support for a target). This requirement exists to ensure that a
172 developer or team responsible for reviewing and approving a target does not
173 face any legal threats or obligations that would prevent them from freely
174 exercising their judgment in such approval, even if such judgment involves
175 subjective matters or goes beyond the letter of these requirements.
176 - Tier 3 targets should attempt to implement as much of the standard libraries
177 as possible and appropriate (`core` for most targets, `alloc` for targets
178 that can support dynamic memory allocation, `std` for targets with an
179 operating system or equivalent layer of system-provided functionality), but
180 may leave some code unimplemented (either unavailable or stubbed out as
181 appropriate), whether because the target makes it impossible to implement or
182 challenging to implement. The authors of pull requests are not obligated to
183 avoid calling any portions of the standard library on the basis of a tier 3
184 target not implementing those portions.
185 - The target must provide documentation for the Rust community explaining how
186 to build for the target, using cross-compilation if possible. If the target
187 supports running tests (even if they do not pass), the documentation must
188 explain how to run tests for the target, using emulation if possible or
189 dedicated hardware if necessary.
190 - Tier 3 targets must not impose burden on the authors of pull requests, or
191 other developers in the community, to maintain the target. In particular,
192 do not post comments (automated or manual) on a PR that derail or suggest a
193 block on the PR based on a tier 3 target. Do not send automated messages or
194 notifications (via any medium, including via `@`) to a PR author or others
195 involved with a PR regarding a tier 3 target, unless they have opted into
196 such messages.
197 - Backlinks such as those generated by the issue/PR tracker when linking to
198 an issue or PR are not considered a violation of this policy, within
199 reason. However, such messages (even on a separate repository) must not
200 generate notifications to anyone involved with a PR who has not requested
201 such notifications.
202 - Patches adding or updating tier 3 targets must not break any existing tier 2
203 or tier 1 target, and must not knowingly break another tier 3 target without
204 approval of either the compiler team or the maintainers of the other tier 3
205 target.
206 - In particular, this may come up when working on closely related targets,
207 such as variations of the same architecture with different features. Avoid
208 introducing unconditional uses of features that another variation of the
209 target may not have; use conditional compilation or runtime detection, as
210 appropriate, to let each target run code supported by that target.
211
212 If a tier 3 target stops meeting these requirements, or the target maintainers
213 no longer have interest or time, or the target shows no signs of activity and
214 has not built for some time, or removing the target would improve the quality
215 of the Rust codebase, we may post a PR to remove it; any such PR will be CCed
216 to the target maintainers (and potentially other people who have previously
217 worked on the target), to check potential interest in improving the situation.
218
219 ## Tier 2 target policy
220
221 At this tier, the Rust project guarantees that a target builds, and will reject
222 patches that fail to build on a target. Thus, we place requirements that ensure
223 the target will not block forward progress of the Rust project.
224
225 A proposed new tier 2 target must be reviewed and approved by the compiler team
226 based on these requirements. Such review and approval may occur via a [Major
227 Change Proposal (MCP)][MCP].
228
229 In addition, the infrastructure team must approve the integration of the target
230 into Continuous Integration (CI), and the tier 2 CI-related requirements. This
231 review and approval may take place in a PR adding the target to CI, or simply
232 by an infrastructure team member reporting the outcome of a team discussion.
233
234 - A tier 2 target must have value to people other than its maintainers. (It may
235 still be a niche target, but it must not be exclusively useful for an
236 inherently closed group.)
237 - A tier 2 target must have a designated team of developers (the "target
238 maintainers") available to consult on target-specific build-breaking issues,
239 or if necessary to develop target-specific language or library implementation
240 details. This team must have at least 2 developers.
241 - The target maintainers should not only fix target-specific issues, but
242 should use any such issue as an opportunity to educate the Rust community
243 about portability to their target, and enhance documentation of the target.
244 - The target must not place undue burden on Rust developers not specifically
245 concerned with that target. Rust developers are expected to not gratuitously
246 break a tier 2 target, but are not expected to become experts in every tier 2
247 target, and are not expected to provide target-specific implementations for
248 every tier 2 target.
249 - The target must provide documentation for the Rust community explaining how
250 to build for the target using cross-compilation, and explaining how to run
251 tests for the target. If at all possible, this documentation should show how
252 to run Rust programs and tests for the target using emulation, to allow
253 anyone to do so. If the target cannot be feasibly emulated, the documentation
254 should explain how to obtain and work with physical hardware, cloud systems,
255 or equivalent.
256 - The target must document its baseline expectations for the features or
257 versions of CPUs, operating systems, libraries, runtime environments, and
258 similar.
259 - If introducing a new tier 2 or higher target that is identical to an existing
260 Rust target except for the baseline expectations for the features or versions
261 of CPUs, operating systems, libraries, runtime environments, and similar,
262 then the proposed target must document to the satisfaction of the approving
263 teams why the specific difference in baseline expectations provides
264 sufficient value to justify a separate target.
265 - Note that in some cases, based on the usage of existing targets within the
266 Rust community, Rust developers or a target's maintainers may wish to
267 modify the baseline expectations of a target, or split an existing target
268 into multiple targets with different baseline expectations. A proposal to
269 do so will be treated similarly to the analogous promotion, demotion, or
270 removal of a target, according to this policy, with the same team approvals
271 required.
272 - For instance, if an OS version has become obsolete and unsupported, a
273 target for that OS may raise its baseline expectations for OS version
274 (treated as though removing a target corresponding to the older
275 versions), or a target for that OS may split out support for older OS
276 versions into a lower-tier target (treated as though demoting a target
277 corresponding to the older versions, and requiring justification for a
278 new target at a lower tier for the older OS versions).
279 - Tier 2 targets must not leave any significant portions of `core` or the
280 standard library unimplemented or stubbed out, unless they cannot possibly be
281 supported on the target.
282 - The right approach to handling a missing feature from a target may depend
283 on whether the target seems likely to develop the feature in the future. In
284 some cases, a target may be co-developed along with Rust support, and Rust
285 may gain new features on the target as that target gains the capabilities
286 to support those features.
287 - As an exception, a target identical to an existing tier 1 target except for
288 lower baseline expectations for the OS, CPU, or similar, may propose to
289 qualify as tier 2 (but not higher) without support for `std` if the target
290 will primarily be used in `no_std` applications, to reduce the support
291 burden for the standard library. In this case, evaluation of the proposed
292 target's value will take this limitation into account.
293 - The code generation backend for the target should not have deficiencies that
294 invalidate Rust safety properties, as evaluated by the Rust compiler team.
295 (This requirement does not apply to arbitrary security enhancements or
296 mitigations provided by code generation backends, only to those properties
297 needed to ensure safe Rust code cannot cause undefined behavior or other
298 unsoundness.) If this requirement does not hold, the target must clearly and
299 prominently document any such limitations as part of the target's entry in
300 the target tier list, and ideally also via a failing test in the testsuite.
301 The Rust compiler team must be satisfied with the balance between these
302 limitations and the difficulty of implementing the necessary features.
303 - For example, if Rust relies on a specific code generation feature to ensure
304 that safe code cannot overflow the stack, the code generation for the
305 target should support that feature.
306 - If the Rust compiler introduces new safety properties (such as via new
307 capabilities of a compiler backend), the Rust compiler team will determine
308 if they consider those new safety properties a best-effort improvement for
309 specific targets, or a required property for all Rust targets. In the
310 latter case, the compiler team may require the maintainers of existing
311 targets to either implement and confirm support for the property or update
312 the target tier list with documentation of the missing property.
313 - If the target supports C code, and the target has an interoperable calling
314 convention for C code, the Rust target must support that C calling convention
315 for the platform via `extern "C"`. The C calling convention does not need to
316 be the default Rust calling convention for the target, however.
317 - The target must build reliably in CI, for all components that Rust's CI
318 considers mandatory.
319 - The approving teams may additionally require that a subset of tests pass in
320 CI, such as enough to build a functional "hello world" program, `./x.py test
321 --no-run`, or equivalent "smoke tests". In particular, this requirement may
322 apply if the target builds host tools, or if the tests in question provide
323 substantial value via early detection of critical problems.
324 - Building the target in CI must not take substantially longer than the current
325 slowest target in CI, and should not substantially raise the maintenance
326 burden of the CI infrastructure. This requirement is subjective, to be
327 evaluated by the infrastructure team, and will take the community importance
328 of the target into account.
329 - Tier 2 targets should, if at all possible, support cross-compiling. Tier 2
330 targets should not require using the target as the host for builds, even if
331 the target supports host tools.
332 - In addition to the legal requirements for all targets (specified in the tier
333 3 requirements), because a tier 2 target typically involves the Rust project
334 building and supplying various compiled binaries, incorporating the target
335 and redistributing any resulting compiled binaries (e.g. built libraries,
336 host tools if any) must not impose any onerous license requirements on any
337 members of the Rust project, including infrastructure team members and those
338 operating CI systems. This is a subjective requirement, to be evaluated by
339 the approving teams.
340 - As an exception to this, if the target's primary purpose is to build
341 components for a Free and Open Source Software (FOSS) project licensed
342 under "copyleft" terms (terms which require licensing other code under
343 compatible FOSS terms), such as kernel modules or plugins, then the
344 standard libraries for the target may potentially be subject to copyleft
345 terms, as long as such terms are satisfied by Rust's existing practices of
346 providing full corresponding source code. Note that anything added to the
347 Rust repository itself must still use Rust's standard license terms.
348 - Tier 2 targets must not impose burden on the authors of pull requests, or
349 other developers in the community, to ensure that tests pass for the target.
350 In particular, do not post comments (automated or manual) on a PR that derail
351 or suggest a block on the PR based on tests failing for the target. Do not
352 send automated messages or notifications (via any medium, including via `@`)
353 to a PR author or others involved with a PR regarding the PR breaking tests
354 on a tier 2 target, unless they have opted into such messages.
355 - Backlinks such as those generated by the issue/PR tracker when linking to
356 an issue or PR are not considered a violation of this policy, within
357 reason. However, such messages (even on a separate repository) must not
358 generate notifications to anyone involved with a PR who has not requested
359 such notifications.
360 - The target maintainers should regularly run the testsuite for the target, and
361 should fix any test failures in a reasonably timely fashion.
362 - All requirements for tier 3 apply.
363
364 A tier 2 target may be demoted or removed if it no longer meets these
365 requirements. Any proposal for demotion or removal will be CCed to the target
366 maintainers, and will be communicated widely to the Rust community before being
367 dropped from a stable release. (The amount of time between such communication
368 and the next stable release may depend on the nature and severity of the failed
369 requirement, the timing of its discovery, whether the target has been part of a
370 stable release yet, and whether the demotion or removal can be a planned and
371 scheduled action.)
372
373 In some circumstances, especially if the target maintainers do not respond in a
374 timely fashion, Rust teams may land pull requests that temporarily disable some
375 targets in the nightly compiler, in order to implement a feature not yet
376 supported by those targets. (As an example, this happened when introducing the
377 128-bit types `u128` and `i128`.) Such a pull request will include notification
378 and coordination with the maintainers of such targets, and will ideally happen
379 towards the beginning of a new development cycle to give maintainers time to
380 update their targets. The maintainers of such targets will then be expected to
381 implement the corresponding target-specific support in order to re-enable the
382 target. If the maintainers of such targets cannot provide such support in time
383 for the next stable release, this may result in demoting or removing the
384 targets.
385
386 ### Tier 2 with host tools
387
388 Some tier 2 targets may additionally have binaries built to run on them as a
389 host (such as `rustc` and `cargo`). This allows the target to be used as a
390 development platform, not just a compilation target.
391
392 A proposed new tier 2 target with host tools must be reviewed and approved by
393 the compiler team based on these requirements. Such review and approval may
394 occur via a [Major Change Proposal (MCP)][MCP].
395
396 In addition, the infrastructure team must approve the integration of the
397 target's host tools into Continuous Integration (CI), and the CI-related
398 requirements for host tools. This review and approval may take place in a PR
399 adding the target's host tools to CI, or simply by an infrastructure team
400 member reporting the outcome of a team discussion.
401
402 - Depending on the target, its capabilities, its performance, and the
403 likelihood of use for any given tool, the host tools provided for a tier 2
404 target may include only `rustc` and `cargo`, or may include additional tools
405 such as `clippy` and `rustfmt`.
406 - Approval of host tools will take into account the additional time required to
407 build the host tools, and the substantial additional storage required for the
408 host tools.
409 - The host tools must have direct value to people other than the target's
410 maintainers. (It may still be a niche target, but the host tools must not be
411 exclusively useful for an inherently closed group.) This requirement will be
412 evaluated independently from the corresponding tier 2 requirement.
413 - The requirement to provide "direct value" means that it does not suffice to
414 argue that having host tools will help the target's maintainers more easily
415 provide the target to others. The tools themselves must provide value to
416 others.
417 - There must be a reasonable expectation that the host tools will be used, for
418 purposes other than to prove that they can be used.
419 - The host tools must build and run reliably in CI (for all components that
420 Rust's CI considers mandatory), though they may or may not pass tests.
421 - Building host tools for the target must not take substantially longer than
422 building host tools for other targets, and should not substantially raise the
423 maintenance burden of the CI infrastructure.
424 - The host tools must provide a substantively similar experience as on other
425 targets, subject to reasonable target limitations.
426 - Adding a substantively different interface to an existing tool, or a
427 target-specific interface to the functionality of an existing tool,
428 requires design and implementation approval (e.g. RFC/MCP) from the
429 appropriate approving teams for that tool.
430 - Such an interface should have a design that could potentially work for
431 other targets with similar properties.
432 - This should happen separately from the review and approval of the target,
433 to simplify the target review and approval processes, and to simplify the
434 review and approval processes for the proposed new interface.
435 - By way of example, a target that runs within a sandbox may need to modify
436 the handling of files, tool invocation, and similar to meet the
437 expectations and conventions of the sandbox, but must not introduce a
438 separate "sandboxed compilation" interface separate from the CLI interface
439 without going through the normal approval process for such an interface.
440 Such an interface should take into account potential other targets with
441 similar sandboxes.
442 - If the host tools for the platform would normally be expected to be signed or
443 equivalent (e.g. if running unsigned binaries or similar involves a
444 "developer mode" or an additional prompt), it must be possible for the Rust
445 project's automated builds to apply the appropriate signature process,
446 without any manual intervention by either Rust developers, target
447 maintainers, or a third party. This process must meet the approval of the
448 infrastructure team.
449 - This process may require one-time or semi-regular manual steps by the
450 infrastructure team, such as registration or renewal of a signing key. Any
451 such manual process must meet the approval of the infrastructure team.
452 - This process may require the execution of a legal agreement with the
453 signature provider. Such a legal agreement may be revocable, and may
454 potentially require a nominal fee, but must not be otherwise onerous. Any
455 such legal agreement must meet the approval of the infrastructure team.
456 (The infrastructure team is not expected or required to sign binding legal
457 agreements on behalf of the Rust project; this review and approval exists
458 to ensure no terms are onerous or cause problems for infrastructure,
459 especially if such terms may impose requirements or obligations on people
460 who have access to target-specific infrastructure.)
461 - Changes to this process, or to any legal agreements involved, may
462 cause a target to stop meeting this requirement.
463 - This process involved must be available under substantially similar
464 non-onerous terms to the general public. Making it available exclusively to
465 the Rust project does not suffice.
466 - This requirement exists to ensure that Rust builds, including nightly
467 builds, can meet the necessary requirements to allow users to smoothly run
468 the host tools.
469 - Providing host tools does not exempt a target from requirements to support
470 cross-compilation if at all possible.
471 - All requirements for tier 2 apply.
472
473 A target may be promoted directly from tier 3 to tier 2 with host tools if it
474 meets all the necessary requirements, but doing so may introduce substantial
475 additional complexity. If in doubt, the target should qualify for tier 2
476 without host tools first.
477
478 ## Tier 1 target policy
479
480 At this tier, the Rust project guarantees that a target builds and passes all
481 tests, and will reject patches that fail to build or pass the testsuite on a
482 target. We hold tier 1 targets to our highest standard of requirements.
483
484 A proposed new tier 1 target must be reviewed and approved by the compiler team
485 based on these requirements. In addition, the release team must approve the
486 viability and value of supporting the target. For a tier 1 target, this will
487 typically take place via a full RFC proposing the target, to be jointly
488 reviewed and approved by the compiler team and release team.
489
490 In addition, the infrastructure team must approve the integration of the target
491 into Continuous Integration (CI), and the tier 1 CI-related requirements. This
492 review and approval may take place in a PR adding the target to CI, by an
493 infrastructure team member reporting the outcome of a team discussion, or by
494 including the infrastructure team in the RFC proposing the target.
495
496 - Tier 1 targets must have substantial, widespread interest within the
497 developer community, and must serve the ongoing needs of multiple production
498 users of Rust across multiple organizations or projects. These requirements
499 are subjective, and determined by consensus of the approving teams. A tier 1
500 target may be demoted or removed if it becomes obsolete or no longer meets
501 this requirement.
502 - The target maintainer team must include at least 3 developers.
503 - The target must build and pass tests reliably in CI, for all components that
504 Rust's CI considers mandatory.
505 - The target must not disable an excessive number of tests or pieces of tests
506 in the testsuite in order to do so. This is a subjective requirement.
507 - If the target does not have host tools support, or if the target has low
508 performance, the infrastructure team may choose to have CI cross-compile
509 the testsuite from another platform, and then run the compiled tests
510 either natively or via accurate emulation. However, the approving teams may
511 take such performance considerations into account when determining the
512 viability of the target or of its host tools.
513 - The target must provide as much of the Rust standard library as is feasible
514 and appropriate to provide. For instance, if the target can support dynamic
515 memory allocation, it must provide an implementation of `alloc` and the
516 associated data structures.
517 - Building the target and running the testsuite for the target must not take
518 substantially longer than other targets, and should not substantially raise
519 the maintenance burden of the CI infrastructure.
520 - In particular, if building the target takes a reasonable amount of time,
521 but the target cannot run the testsuite in a timely fashion due to low
522 performance of either native code or accurate emulation, that alone may
523 prevent the target from qualifying as tier 1.
524 - If running the testsuite requires additional infrastructure (such as physical
525 systems running the target), the target maintainers must arrange to provide
526 such resources to the Rust project, to the satisfaction and approval of the
527 Rust infrastructure team.
528 - Such resources may be provided via cloud systems, via emulation, or via
529 physical hardware.
530 - If the target requires the use of emulation to meet any of the tier
531 requirements, the approving teams for those requirements must have high
532 confidence in the accuracy of the emulation, such that discrepancies
533 between emulation and native operation that affect test results will
534 constitute a high-priority bug in either the emulation or the
535 implementation of the target.
536 - If it is not possible to run the target via emulation, these resources must
537 additionally be sufficient for the Rust infrastructure team to make them
538 available for access by Rust team members, for the purposes of development
539 and testing. (Note that the responsibility for doing target-specific
540 development to keep the target well maintained remains with the target
541 maintainers. This requirement ensures that it is possible for other
542 Rust developers to test the target, but does not obligate other Rust
543 developers to make target-specific fixes.)
544 - Resources provided for CI and similar infrastructure must be available for
545 continuous exclusive use by the Rust project. Resources provided
546 for access by Rust team members for development and testing must be
547 available on an exclusive basis when in use, but need not be available on a
548 continuous basis when not in use.
549 - Tier 1 targets must not have a hard requirement for signed, verified, or
550 otherwise "approved" binaries. Developers must be able to build, run, and
551 test binaries for the target on systems they control, or provide such
552 binaries for others to run. (Doing so may require enabling some appropriate
553 "developer mode" on such systems, but must not require the payment of any
554 additional fee or other consideration, or agreement to any onerous legal
555 agreements.)
556 - The Rust project may decide to supply appropriately signed binaries if
557 doing so provides a smoother experience for developers using the target,
558 and a tier 2 target with host tools already requires providing appropriate
559 mechanisms that enable our infrastructure to provide such signed binaries.
560 However, this additional tier 1 requirement ensures that Rust developers
561 can develop and test Rust software for the target (including Rust itself),
562 and that development or testing for the target is not limited.
563 - All requirements for tier 2 apply.
564
565 A tier 1 target may be demoted if it no longer meets these requirements but
566 still meets the requirements for a lower tier. Any proposal for demotion of a
567 tier 1 target requires a full RFC process, with approval by the compiler and
568 release teams. Any such proposal will be communicated widely to the Rust
569 community, both when initially proposed and before being dropped from a stable
570 release. A tier 1 target is highly unlikely to be directly removed without
571 first being demoted to tier 2 or tier 3. (The amount of time between such
572 communication and the next stable release may depend on the nature and severity
573 of the failed requirement, the timing of its discovery, whether the target has
574 been part of a stable release yet, and whether the demotion or removal can be a
575 planned and scheduled action.)
576
577 Raising the baseline expectations of a tier 1 target (such as the minimum CPU
578 features or OS version required) requires the approval of the compiler and
579 release teams, and should be widely communicated as well, but does not
580 necessarily require a full RFC.
581
582 ### Tier 1 with host tools
583
584 Some tier 1 targets may additionally have binaries built to run on them as a
585 host (such as `rustc` and `cargo`). This allows the target to be used as a
586 development platform, not just a compilation target.
587
588 A proposed new tier 1 target with host tools must be reviewed and approved by
589 the compiler team based on these requirements. In addition, the release team
590 must approve the viability and value of supporting host tools for the target.
591 For a tier 1 target, this will typically take place via a full RFC proposing
592 the target, to be jointly reviewed and approved by the compiler team and
593 release team.
594
595 In addition, the infrastructure team must approve the integration of the
596 target's host tools into Continuous Integration (CI), and the CI-related
597 requirements for host tools. This review and approval may take place in a PR
598 adding the target's host tools to CI, by an infrastructure team member
599 reporting the outcome of a team discussion, or by including the infrastructure
600 team in the RFC proposing the target.
601
602 - Tier 1 targets with host tools should typically include all of the additional
603 tools such as `clippy` and `rustfmt`, unless there is a target-specific
604 reason why a tool cannot possibly make sense for the target.
605 - Unlike with tier 2, for tier 1 we will not exclude specific tools on the
606 sole basis of them being less likely to be used; rather, we'll take that
607 into account when considering whether the target should be at tier 1 with
608 host tools. In general, on any tier 1 target with host tools, people
609 should be able to expect to find and install all the same components that
610 they would for any other tier 1 target with host tools.
611 - Approval of host tools will take into account the additional time required to
612 build the host tools, and the substantial additional storage required for the
613 host tools.
614 - Host tools for the target must have substantial, widespread interest within
615 the developer community, and must serve the ongoing needs of multiple
616 production users of Rust across multiple organizations or projects. These
617 requirements are subjective, and determined by consensus of the approving
618 teams. This requirement will be evaluated independently from the
619 corresponding tier 1 requirement; it is possible for a target to have
620 sufficient interest for cross-compilation, but not have sufficient interest
621 for native compilation. The host tools may be dropped if they no longer meet
622 this requirement, even if the target otherwise qualifies as tier 1.
623 - The host tools must build, run, and pass tests reliably in CI, for all
624 components that Rust's CI considers mandatory.
625 - The target must not disable an excessive number of tests or pieces of tests
626 in the testsuite in order to do so. This is a subjective requirement.
627 - Building the host tools and running the testsuite for the host tools must not
628 take substantially longer than other targets, and should not substantially raise
629 the maintenance burden of the CI infrastructure.
630 - In particular, if building the target's host tools takes a reasonable
631 amount of time, but the target cannot run the testsuite in a timely fashion
632 due to low performance of either native code or accurate emulation, that
633 alone may prevent the target from qualifying as tier 1 with host tools.
634 - Providing host tools does not exempt a target from requirements to support
635 cross-compilation if at all possible.
636 - All requirements for tier 2 targets with host tools apply.
637 - All requirements for tier 1 apply.
638
639 A target seeking promotion to tier 1 with host tools should typically either be
640 tier 2 with host tools or tier 1 without host tools, to reduce the number of
641 requirements to simultaneously review and approve.
642
643 In addition to the general process for demoting a tier 1 target, a tier 1
644 target with host tools may be demoted (including having its host tools dropped,
645 or being demoted to tier 2 with host tools) if it no longer meets these
646 requirements but still meets the requirements for a lower tier. Any proposal
647 for demotion of a tier 1 target (with or without host tools) requires a full
648 RFC process, with approval by the compiler and release teams. Any such proposal
649 will be communicated widely to the Rust community, both when initially proposed
650 and before being dropped from a stable release.
651
652 [MCP]: https://forge.rust-lang.org/compiler/mcp.html