mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-28 01:34:21 +00:00
Add the target tier policy from accepted RFC 2803
This commit is contained in:
parent
f8f5968255
commit
dc455a338e
@ -13,6 +13,7 @@
|
||||
- [JSON Output](json.md)
|
||||
- [Tests](tests/index.md)
|
||||
- [Platform Support](platform-support.md)
|
||||
- [Target Tier Policy](target-tier-policy.md)
|
||||
- [Targets](targets/index.md)
|
||||
- [Built-in Targets](targets/built-in.md)
|
||||
- [Custom Targets](targets/custom.md)
|
||||
|
639
src/doc/rustc/src/target-tier-policy.md
Normal file
639
src/doc/rustc/src/target-tier-policy.md
Normal file
@ -0,0 +1,639 @@
|
||||
# Target Tier Policy
|
||||
|
||||
Rust provides three tiers of target support:
|
||||
|
||||
- Rust provides no guarantees about tier 3 targets; they exist in the codebase,
|
||||
but may or may not build.
|
||||
- Rust's continuous integration checks that tier 2 targets will always build,
|
||||
but they may or may not pass tests.
|
||||
- Rust's continuous integration checks that tier 1 targets will always build
|
||||
and pass tests.
|
||||
|
||||
Adding a new tier 3 target imposes minimal requirements; we focus primarily on
|
||||
avoiding disruption to other ongoing Rust development.
|
||||
|
||||
Tier 2 and tier 1 targets place work on Rust project developers as a whole, to
|
||||
avoid breaking the target. The broader Rust community may also feel more
|
||||
inclined to support higher-tier targets in their crates (though they are not
|
||||
obligated to do so). Thus, these tiers require commensurate and ongoing efforts
|
||||
from the maintainers of the target, to demonstrate value and to minimize any
|
||||
disruptions to ongoing Rust development.
|
||||
|
||||
This policy defines the requirements for accepting a proposed target at a given
|
||||
level of support.
|
||||
|
||||
Each tier builds on all the requirements from the previous tier, unless
|
||||
overridden by a stronger requirement. Targets at tier 2 and tier 1 may also
|
||||
provide *host tools* (such as `rustc` and `cargo`); each of those tiers
|
||||
includes a set of supplementary requirements that must be met if supplying host
|
||||
tools for the target. A target at tier 2 or tier 1 is not required to supply
|
||||
host tools, but if it does, it must meet the corresponding additional
|
||||
requirements for host tools.
|
||||
|
||||
The policy for each tier also documents the Rust governance teams that must
|
||||
approve the addition of any target at that tier. Those teams are responsible
|
||||
for reviewing and evaluating the target, based on these requirements and their
|
||||
own judgment. Those teams may apply additional requirements, including
|
||||
subjective requirements, such as to deal with issues not foreseen by this
|
||||
policy. (Such requirements may subsequently motivate additions to this policy.)
|
||||
|
||||
While these criteria attempt to document the policy, that policy still involves
|
||||
human judgment. Targets must fulfill the spirit of the requirements as well, as
|
||||
determined by the judgment of the approving teams. Reviewers and team members
|
||||
evaluating targets and target-specific patches should always use their own best
|
||||
judgment regarding the quality of work, and the suitability of a target for the
|
||||
Rust project. Neither this policy nor any decisions made regarding targets
|
||||
shall create any binding agreement or estoppel by any party.
|
||||
|
||||
Before filing an issue or pull request (PR) to introduce or promote a target,
|
||||
the target should already meet the corresponding tier requirements. This does
|
||||
not preclude an existing target's maintainers using issues (on the Rust
|
||||
repository or otherwise) to track requirements that have not yet been met, as
|
||||
appropriate; however, before officially proposing the introduction or promotion
|
||||
of a target, it should meet all of the necessary requirements. A target
|
||||
proposal is encouraged to quote the corresponding requirements verbatim as part
|
||||
of explaining how the target meets those requirements.
|
||||
|
||||
For a list of all supported targets and their corresponding tiers ("tier 3",
|
||||
"tier 2", "tier 2 with host tools", "tier 1", or "tier 1 with host tools"), see
|
||||
[platform support](platform-support.md).
|
||||
|
||||
Note that a target must have already received approval for the next lower tier,
|
||||
and spent a reasonable amount of time at that tier, before making a proposal
|
||||
for promotion to the next higher tier; this is true even if a target meets the
|
||||
requirements for several tiers at once. This policy leaves the precise
|
||||
interpretation of "reasonable amount of time" up to the approving teams; those
|
||||
teams may scale the amount of time required based on their confidence in the
|
||||
target and its demonstrated track record at its current tier. At a minimum,
|
||||
multiple stable releases of Rust should typically occur between promotions of a
|
||||
target.
|
||||
|
||||
The availability or tier of a target in stable Rust is not a hard stability
|
||||
guarantee about the future availability or tier of that target. Higher-level
|
||||
target tiers are an increasing commitment to the support of a target, and we
|
||||
will take that commitment and potential disruptions into account when
|
||||
evaluating the potential demotion or removal of a target that has been part of
|
||||
a stable release. The promotion or demotion of a target will not generally
|
||||
affect existing stable releases, only current development and future releases.
|
||||
|
||||
In this policy, the words "must" and "must not" specify absolute requirements
|
||||
that a target must meet to qualify for a tier. The words "should" and "should
|
||||
not" specify requirements that apply in almost all cases, but for which the
|
||||
approving teams may grant an exception for good reason. The word "may"
|
||||
indicates something entirely optional, and does not indicate guidance or
|
||||
recommendations. This language is based on [IETF RFC
|
||||
2119](https://tools.ietf.org/html/rfc2119).
|
||||
|
||||
## Tier 3 target policy
|
||||
|
||||
At this tier, the Rust project provides no official support for a target, so we
|
||||
place minimal requirements on the introduction of targets.
|
||||
|
||||
A proposed new tier 3 target must be reviewed and approved by a member of the
|
||||
compiler team based on these requirements. The reviewer may choose to gauge
|
||||
broader compiler team consensus via a Major Change Proposal (MCP).
|
||||
|
||||
A proposed target or target-specific patch that substantially changes code
|
||||
shared with other targets (not just target-specific code) must be reviewed and
|
||||
approved by the appropriate team for that shared code before acceptance.
|
||||
|
||||
- A tier 3 target must have a designated developer or developers (the "target
|
||||
maintainers") on record to be CCed when issues arise regarding the target.
|
||||
(The mechanism to track and CC such developers may evolve over time.)
|
||||
- Targets must use naming consistent with any existing targets; for instance, a
|
||||
target for the same CPU or OS as an existing Rust target should use the same
|
||||
name for that CPU or OS. Targets should normally use the same names and
|
||||
naming conventions as used elsewhere in the broader ecosystem beyond Rust
|
||||
(such as in other toolchains), unless they have a very good reason to
|
||||
diverge. Changing the name of a target can be highly disruptive, especially
|
||||
once the target reaches a higher tier, so getting the name right is important
|
||||
even for a tier 3 target.
|
||||
- Target names should not introduce undue confusion or ambiguity unless
|
||||
absolutely necessary to maintain ecosystem compatibility. For example, if
|
||||
the name of the target makes people extremely likely to form incorrect
|
||||
beliefs about what it targets, the name should be changed or augmented to
|
||||
disambiguate it.
|
||||
- Tier 3 targets may have unusual requirements to build or use, but must not
|
||||
create legal issues or impose onerous legal terms for the Rust project or for
|
||||
Rust developers or users.
|
||||
- The target must not introduce license incompatibilities.
|
||||
- Anything added to the Rust repository must be under the standard Rust
|
||||
license (`MIT OR Apache-2.0`).
|
||||
- The target must not cause the Rust tools or libraries built for any other
|
||||
host (even when supporting cross-compilation to the target) to depend
|
||||
on any new dependency less permissive than the Rust licensing policy. This
|
||||
applies whether the dependency is a Rust crate that would require adding
|
||||
new license exceptions (as specified by the `tidy` tool in the
|
||||
rust-lang/rust repository), or whether the dependency is a native library
|
||||
or binary. In other words, the introduction of the target must not cause a
|
||||
user installing or running a version of Rust or the Rust tools to be
|
||||
subject to any new license requirements.
|
||||
- If the target supports building host tools (such as `rustc` or `cargo`),
|
||||
those host tools must not depend on proprietary (non-FOSS) libraries, other
|
||||
than ordinary runtime libraries supplied by the platform and commonly used
|
||||
by other binaries built for the target. For instance, `rustc` built for the
|
||||
target may depend on a common proprietary C runtime library or console
|
||||
output library, but must not depend on a proprietary code generation
|
||||
library or code optimization library. Rust's license permits such
|
||||
combinations, but the Rust project has no interest in maintaining such
|
||||
combinations within the scope of Rust itself, even at tier 3.
|
||||
- Targets should not require proprietary (non-FOSS) components to link a
|
||||
functional binary or library.
|
||||
- "onerous" here is an intentionally subjective term. At a minimum, "onerous"
|
||||
legal/licensing terms include but are *not* limited to: non-disclosure
|
||||
requirements, non-compete requirements, contributor license agreements
|
||||
(CLAs) or equivalent, "non-commercial"/"research-only"/etc terms,
|
||||
requirements conditional on the employer or employment of any particular
|
||||
Rust developers, revocable terms, any requirements that create liability
|
||||
for the Rust project or its developers or users, or any requirements that
|
||||
adversely affect the livelihood or prospects of the Rust project or its
|
||||
developers or users.
|
||||
- Neither this policy nor any decisions made regarding targets shall create any
|
||||
binding agreement or estoppel by any party. If any member of an approving
|
||||
Rust team serves as one of the maintainers of a target, or has any legal or
|
||||
employment requirement (explicit or implicit) that might affect their
|
||||
decisions regarding a target, they must recuse themselves from any approval
|
||||
decisions regarding the target's tier status, though they may otherwise
|
||||
participate in discussions.
|
||||
- This requirement does not prevent part or all of this policy from being
|
||||
cited in an explicit contract or work agreement (e.g. to implement or
|
||||
maintain support for a target). This requirement exists to ensure that a
|
||||
developer or team responsible for reviewing and approving a target does not
|
||||
face any legal threats or obligations that would prevent them from freely
|
||||
exercising their judgment in such approval, even if such judgment involves
|
||||
subjective matters or goes beyond the letter of these requirements.
|
||||
- Tier 3 targets should attempt to implement as much of the standard libraries
|
||||
as possible and appropriate (`core` for most targets, `alloc` for targets
|
||||
that can support dynamic memory allocation, `std` for targets with an
|
||||
operating system or equivalent layer of system-provided functionality), but
|
||||
may leave some code unimplemented (either unavailable or stubbed out as
|
||||
appropriate), whether because the target makes it impossible to implement or
|
||||
challenging to implement. The authors of pull requests are not obligated to
|
||||
avoid calling any portions of the standard library on the basis of a tier 3
|
||||
target not implementing those portions.
|
||||
- The target must provide documentation for the Rust community explaining how
|
||||
to build for the target, using cross-compilation if possible. If the target
|
||||
supports running tests (even if they do not pass), the documentation must
|
||||
explain how to run tests for the target, using emulation if possible or
|
||||
dedicated hardware if necessary.
|
||||
- Tier 3 targets must not impose burden on the authors of pull requests, or
|
||||
other developers in the community, to maintain the target. In particular,
|
||||
do not post comments (automated or manual) on a PR that derail or suggest a
|
||||
block on the PR based on a tier 3 target. Do not send automated messages or
|
||||
notifications (via any medium, including via `@`) to a PR author or others
|
||||
involved with a PR regarding a tier 3 target, unless they have opted into
|
||||
such messages.
|
||||
- Backlinks such as those generated by the issue/PR tracker when linking to
|
||||
an issue or PR are not considered a violation of this policy, within
|
||||
reason. However, such messages (even on a separate repository) must not
|
||||
generate notifications to anyone involved with a PR who has not requested
|
||||
such notifications.
|
||||
- Patches adding or updating tier 3 targets must not break any existing tier 2
|
||||
or tier 1 target, and must not knowingly break another tier 3 target without
|
||||
approval of either the compiler team or the maintainers of the other tier 3
|
||||
target.
|
||||
- In particular, this may come up when working on closely related targets,
|
||||
such as variations of the same architecture with different features. Avoid
|
||||
introducing unconditional uses of features that another variation of the
|
||||
target may not have; use conditional compilation or runtime detection, as
|
||||
appropriate, to let each target run code supported by that target.
|
||||
|
||||
If a tier 3 target stops meeting these requirements, or the target maintainers
|
||||
no longer have interest or time, or the target shows no signs of activity and
|
||||
has not built for some time, or removing the target would improve the quality
|
||||
of the Rust codebase, we may post a PR to remove it; any such PR will be CCed
|
||||
to the target maintainers (and potentially other people who have previously
|
||||
worked on the target), to check potential interest in improving the situation.
|
||||
|
||||
## Tier 2 target policy
|
||||
|
||||
At this tier, the Rust project guarantees that a target builds, and will reject
|
||||
patches that fail to build on a target. Thus, we place requirements that ensure
|
||||
the target will not block forward progress of the Rust project.
|
||||
|
||||
A proposed new tier 2 target must be reviewed and approved by the compiler team
|
||||
based on these requirements. Such review and approval may occur via a Major
|
||||
Change Proposal (MCP).
|
||||
|
||||
In addition, the infrastructure team must approve the integration of the target
|
||||
into Continuous Integration (CI), and the tier 2 CI-related requirements. This
|
||||
review and approval may take place in a PR adding the target to CI, or simply
|
||||
by an infrastructure team member reporting the outcome of a team discussion.
|
||||
|
||||
- A tier 2 target must have value to people other than its maintainers. (It may
|
||||
still be a niche target, but it must not be exclusively useful for an
|
||||
inherently closed group.)
|
||||
- A tier 2 target must have a designated team of developers (the "target
|
||||
maintainers") available to consult on target-specific build-breaking issues,
|
||||
or if necessary to develop target-specific language or library implementation
|
||||
details. This team must have at least 2 developers.
|
||||
- The target maintainers should not only fix target-specific issues, but
|
||||
should use any such issue as an opportunity to educate the Rust community
|
||||
about portability to their target, and enhance documentation of the target.
|
||||
- The target must not place undue burden on Rust developers not specifically
|
||||
concerned with that target. Rust developers are expected to not gratuitously
|
||||
break a tier 2 target, but are not expected to become experts in every tier 2
|
||||
target, and are not expected to provide target-specific implementations for
|
||||
every tier 2 target.
|
||||
- The target must provide documentation for the Rust community explaining how
|
||||
to build for the target using cross-compilation, and explaining how to run
|
||||
tests for the target. If at all possible, this documentation should show how
|
||||
to run Rust programs and tests for the target using emulation, to allow
|
||||
anyone to do so. If the target cannot be feasibly emulated, the documentation
|
||||
should explain how to obtain and work with physical hardware, cloud systems,
|
||||
or equivalent.
|
||||
- The target must document its baseline expectations for the features or
|
||||
versions of CPUs, operating systems, libraries, runtime environments, and
|
||||
similar.
|
||||
- If introducing a new tier 2 or higher target that is identical to an existing
|
||||
Rust target except for the baseline expectations for the features or versions
|
||||
of CPUs, operating systems, libraries, runtime environments, and similar,
|
||||
then the proposed target must document to the satisfaction of the approving
|
||||
teams why the specific difference in baseline expectations provides
|
||||
sufficient value to justify a separate target.
|
||||
- Note that in some cases, based on the usage of existing targets within the
|
||||
Rust community, Rust developers or a target's maintainers may wish to
|
||||
modify the baseline expectations of a target, or split an existing target
|
||||
into multiple targets with different baseline expectations. A proposal to
|
||||
do so will be treated similarly to the analogous promotion, demotion, or
|
||||
removal of a target, according to this policy, with the same team approvals
|
||||
required.
|
||||
- For instance, if an OS version has become obsolete and unsupported, a
|
||||
target for that OS may raise its baseline expectations for OS version
|
||||
(treated as though removing a target corresponding to the older
|
||||
versions), or a target for that OS may split out support for older OS
|
||||
versions into a lower-tier target (treated as though demoting a target
|
||||
corresponding to the older versions, and requiring justification for a
|
||||
new target at a lower tier for the older OS versions).
|
||||
- Tier 2 targets must not leave any significant portions of `core` or the
|
||||
standard library unimplemented or stubbed out, unless they cannot possibly be
|
||||
supported on the target.
|
||||
- The right approach to handling a missing feature from a target may depend
|
||||
on whether the target seems likely to develop the feature in the future. In
|
||||
some cases, a target may be co-developed along with Rust support, and Rust
|
||||
may gain new features on the target as that target gains the capabilities
|
||||
to support those features.
|
||||
- As an exception, a target identical to an existing tier 1 target except for
|
||||
lower baseline expectations for the OS, CPU, or similar, may propose to
|
||||
qualify as tier 2 (but not higher) without support for `std` if the target
|
||||
will primarily be used in `no_std` applications, to reduce the support
|
||||
burden for the standard library. In this case, evaluation of the proposed
|
||||
target's value will take this limitation into account.
|
||||
- The code generation backend for the target should not have deficiencies that
|
||||
invalidate Rust safety properties, as evaluated by the Rust compiler team.
|
||||
(This requirement does not apply to arbitrary security enhancements or
|
||||
mitigations provided by code generation backends, only to those properties
|
||||
needed to ensure safe Rust code cannot cause undefined behavior or other
|
||||
unsoundness.) If this requirement does not hold, the target must clearly and
|
||||
prominently document any such limitations as part of the target's entry in
|
||||
the target tier list, and ideally also via a failing test in the testsuite.
|
||||
The Rust compiler team must be satisfied with the balance between these
|
||||
limitations and the difficulty of implementing the necessary features.
|
||||
- For example, if Rust relies on a specific code generation feature to ensure
|
||||
that safe code cannot overflow the stack, the code generation for the
|
||||
target should support that feature.
|
||||
- If the Rust compiler introduces new safety properties (such as via new
|
||||
capabilities of a compiler backend), the Rust compiler team will determine
|
||||
if they consider those new safety properties a best-effort improvement for
|
||||
specific targets, or a required property for all Rust targets. In the
|
||||
latter case, the compiler team may require the maintainers of existing
|
||||
targets to either implement and confirm support for the property or update
|
||||
the target tier list with documentation of the missing property.
|
||||
- If the target supports C code, and the target has an interoperable calling
|
||||
convention for C code, the Rust target must support that C calling convention
|
||||
for the platform via `extern "C"`. The C calling convention does not need to
|
||||
be the default Rust calling convention for the target, however.
|
||||
- The target must build reliably in CI, for all components that Rust's CI
|
||||
considers mandatory.
|
||||
- The approving teams may additionally require that a subset of tests pass in
|
||||
CI, such as enough to build a functional "hello world" program, `./x.py test
|
||||
--no-run`, or equivalent "smoke tests". In particular, this requirement may
|
||||
apply if the target builds host tools, or if the tests in question provide
|
||||
substantial value via early detection of critical problems.
|
||||
- Building the target in CI must not take substantially longer than the current
|
||||
slowest target in CI, and should not substantially raise the maintenance
|
||||
burden of the CI infrastructure. This requirement is subjective, to be
|
||||
evaluated by the infrastructure team, and will take the community importance
|
||||
of the target into account.
|
||||
- Tier 2 targets should, if at all possible, support cross-compiling. Tier 2
|
||||
targets should not require using the target as the host for builds, even if
|
||||
the target supports host tools.
|
||||
- In addition to the legal requirements for all targets (specified in the tier
|
||||
3 requirements), because a tier 2 target typically involves the Rust project
|
||||
building and supplying various compiled binaries, incorporating the target
|
||||
and redistributing any resulting compiled binaries (e.g. built libraries,
|
||||
host tools if any) must not impose any onerous license requirements on any
|
||||
members of the Rust project, including infrastructure team members and those
|
||||
operating CI systems. This is a subjective requirement, to be evaluated by
|
||||
the approving teams.
|
||||
- As an exception to this, if the target's primary purpose is to build
|
||||
components for a Free and Open Source Software (FOSS) project licensed
|
||||
under "copyleft" terms (terms which require licensing other code under
|
||||
compatible FOSS terms), such as kernel modules or plugins, then the
|
||||
standard libraries for the target may potentially be subject to copyleft
|
||||
terms, as long as such terms are satisfied by Rust's existing practices of
|
||||
providing full corresponding source code. Note that anything added to the
|
||||
Rust repository itself must still use Rust's standard license terms.
|
||||
- Tier 2 targets must not impose burden on the authors of pull requests, or
|
||||
other developers in the community, to ensure that tests pass for the target.
|
||||
In particular, do not post comments (automated or manual) on a PR that derail
|
||||
or suggest a block on the PR based on tests failing for the target. Do not
|
||||
send automated messages or notifications (via any medium, including via `@`)
|
||||
to a PR author or others involved with a PR regarding the PR breaking tests
|
||||
on a tier 2 target, unless they have opted into such messages.
|
||||
- Backlinks such as those generated by the issue/PR tracker when linking to
|
||||
an issue or PR are not considered a violation of this policy, within
|
||||
reason. However, such messages (even on a separate repository) must not
|
||||
generate notifications to anyone involved with a PR who has not requested
|
||||
such notifications.
|
||||
- The target maintainers should regularly run the testsuite for the target, and
|
||||
should fix any test failures in a reasonably timely fashion.
|
||||
- All requirements for tier 3 apply.
|
||||
|
||||
A tier 2 target may be demoted or removed if it no longer meets these
|
||||
requirements. Any proposal for demotion or removal will be CCed to the target
|
||||
maintainers, and will be communicated widely to the Rust community before being
|
||||
dropped from a stable release. (The amount of time between such communication
|
||||
and the next stable release may depend on the nature and severity of the failed
|
||||
requirement, the timing of its discovery, whether the target has been part of a
|
||||
stable release yet, and whether the demotion or removal can be a planned and
|
||||
scheduled action.)
|
||||
|
||||
In some circumstances, especially if the target maintainers do not respond in a
|
||||
timely fashion, Rust teams may land pull requests that temporarily disable some
|
||||
targets in the nightly compiler, in order to implement a feature not yet
|
||||
supported by those targets. (As an example, this happened when introducing the
|
||||
128-bit types `u128` and `i128`.) Such a pull request will include notification
|
||||
and coordination with the maintainers of such targets, and will ideally happen
|
||||
towards the beginning of a new development cycle to give maintainers time to
|
||||
update their targets. The maintainers of such targets will then be expected to
|
||||
implement the corresponding target-specific support in order to re-enable the
|
||||
target. If the maintainers of such targets cannot provide such support in time
|
||||
for the next stable release, this may result in demoting or removing the
|
||||
targets.
|
||||
|
||||
### Tier 2 with host tools
|
||||
|
||||
Some tier 2 targets may additionally have binaries built to run on them as a
|
||||
host (such as `rustc` and `cargo`). This allows the target to be used as a
|
||||
development platform, not just a compilation target.
|
||||
|
||||
A proposed new tier 2 target with host tools must be reviewed and approved by
|
||||
the compiler team based on these requirements. Such review and approval may
|
||||
occur via a Major Change Proposal (MCP).
|
||||
|
||||
In addition, the infrastructure team must approve the integration of the
|
||||
target's host tools into Continuous Integration (CI), and the CI-related
|
||||
requirements for host tools. This review and approval may take place in a PR
|
||||
adding the target's host tools to CI, or simply by an infrastructure team
|
||||
member reporting the outcome of a team discussion.
|
||||
|
||||
- Depending on the target, its capabilities, its performance, and the
|
||||
likelihood of use for any given tool, the host tools provided for a tier 2
|
||||
target may include only `rustc` and `cargo`, or may include additional tools
|
||||
such as `clippy` and `rustfmt`.
|
||||
- Approval of host tools will take into account the additional time required to
|
||||
build the host tools, and the substantial additional storage required for the
|
||||
host tools.
|
||||
- The host tools must have direct value to people other than the target's
|
||||
maintainers. (It may still be a niche target, but the host tools must not be
|
||||
exclusively useful for an inherently closed group.) This requirement will be
|
||||
evaluated independently from the corresponding tier 2 requirement.
|
||||
- The requirement to provide "direct value" means that it does not suffice to
|
||||
argue that having host tools will help the target's maintainers more easily
|
||||
provide the target to others. The tools themselves must provide value to
|
||||
others.
|
||||
- There must be a reasonable expectation that the host tools will be used, for
|
||||
purposes other than to prove that they can be used.
|
||||
- The host tools must build and run reliably in CI (for all components that
|
||||
Rust's CI considers mandatory), though they may or may not pass tests.
|
||||
- Building host tools for the target must not take substantially longer than
|
||||
building host tools for other targets, and should not substantially raise the
|
||||
maintenance burden of the CI infrastructure.
|
||||
- The host tools must provide a substantively similar experience as on other
|
||||
targets, subject to reasonable target limitations.
|
||||
- Adding a substantively different interface to an existing tool, or a
|
||||
target-specific interface to the functionality of an existing tool,
|
||||
requires design and implementation approval (e.g. RFC/MCP) from the
|
||||
appropriate approving teams for that tool.
|
||||
- Such an interface should have a design that could potentially work for
|
||||
other targets with similar properties.
|
||||
- This should happen separately from the review and approval of the target,
|
||||
to simplify the target review and approval processes, and to simplify the
|
||||
review and approval processes for the proposed new interface.
|
||||
- By way of example, a target that runs within a sandbox may need to modify
|
||||
the handling of files, tool invocation, and similar to meet the
|
||||
expectations and conventions of the sandbox, but must not introduce a
|
||||
separate "sandboxed compilation" interface separate from the CLI interface
|
||||
without going through the normal approval process for such an interface.
|
||||
Such an interface should take into account potential other targets with
|
||||
similar sandboxes.
|
||||
- If the host tools for the platform would normally be expected to be signed or
|
||||
equivalent (e.g. if running unsigned binaries or similar involves a
|
||||
"developer mode" or an additional prompt), it must be possible for the Rust
|
||||
project's automated builds to apply the appropriate signature process,
|
||||
without any manual intervention by either Rust developers, target
|
||||
maintainers, or a third party. This process must meet the approval of the
|
||||
infrastructure team.
|
||||
- This process may require one-time or semi-regular manual steps by the
|
||||
infrastructure team, such as registration or renewal of a signing key. Any
|
||||
such manual process must meet the approval of the infrastructure team.
|
||||
- This process may require the execution of a legal agreement with the
|
||||
signature provider. Such a legal agreement may be revocable, and may
|
||||
potentially require a nominal fee, but must not be otherwise onerous. Any
|
||||
such legal agreement must meet the approval of the infrastructure team.
|
||||
(The infrastructure team is not expected or required to sign binding legal
|
||||
agreements on behalf of the Rust project; this review and approval exists
|
||||
to ensure no terms are onerous or cause problems for infrastructure,
|
||||
especially if such terms may impose requirements or obligations on people
|
||||
who have access to target-specific infrastructure.)
|
||||
- Changes to this process, or to any legal agreements involved, may
|
||||
cause a target to stop meeting this requirement.
|
||||
- This process involved must be available under substantially similar
|
||||
non-onerous terms to the general public. Making it available exclusively to
|
||||
the Rust project does not suffice.
|
||||
- This requirement exists to ensure that Rust builds, including nightly
|
||||
builds, can meet the necessary requirements to allow users to smoothly run
|
||||
the host tools.
|
||||
- Providing host tools does not exempt a target from requirements to support
|
||||
cross-compilation if at all possible.
|
||||
- All requirements for tier 2 apply.
|
||||
|
||||
A target may be promoted directly from tier 3 to tier 2 with host tools if it
|
||||
meets all the necessary requirements, but doing so may introduce substantial
|
||||
additional complexity. If in doubt, the target should qualify for tier 2
|
||||
without host tools first.
|
||||
|
||||
## Tier 1 target policy
|
||||
|
||||
At this tier, the Rust project guarantees that a target builds and passes all
|
||||
tests, and will reject patches that fail to build or pass the testsuite on a
|
||||
target. We hold tier 1 targets to our highest standard of requirements.
|
||||
|
||||
A proposed new tier 1 target must be reviewed and approved by the compiler team
|
||||
based on these requirements. In addition, the release team must approve the
|
||||
viability and value of supporting the target. For a tier 1 target, this will
|
||||
typically take place via a full RFC proposing the target, to be jointly
|
||||
reviewed and approved by the compiler team and release team.
|
||||
|
||||
In addition, the infrastructure team must approve the integration of the target
|
||||
into Continuous Integration (CI), and the tier 1 CI-related requirements. This
|
||||
review and approval may take place in a PR adding the target to CI, by an
|
||||
infrastructure team member reporting the outcome of a team discussion, or by
|
||||
including the infrastructure team in the RFC proposing the target.
|
||||
|
||||
- Tier 1 targets must have substantial, widespread interest within the
|
||||
developer community, and must serve the ongoing needs of multiple production
|
||||
users of Rust across multiple organizations or projects. These requirements
|
||||
are subjective, and determined by consensus of the approving teams. A tier 1
|
||||
target may be demoted or removed if it becomes obsolete or no longer meets
|
||||
this requirement.
|
||||
- The target maintainer team must include at least 3 developers.
|
||||
- The target must build and pass tests reliably in CI, for all components that
|
||||
Rust's CI considers mandatory.
|
||||
- The target must not disable an excessive number of tests or pieces of tests
|
||||
in the testsuite in order to do so. This is a subjective requirement.
|
||||
- If the target does not have host tools support, or if the target has low
|
||||
performance, the infrastructure team may choose to have CI cross-compile
|
||||
the testsuite from another platform, and then run the compiled tests
|
||||
either natively or via accurate emulation. However, the approving teams may
|
||||
take such performance considerations into account when determining the
|
||||
viability of the target or of its host tools.
|
||||
- The target must provide as much of the Rust standard library as is feasible
|
||||
and appropriate to provide. For instance, if the target can support dynamic
|
||||
memory allocation, it must provide an implementation of `alloc` and the
|
||||
associated data structures.
|
||||
- Building the target and running the testsuite for the target must not take
|
||||
substantially longer than other targets, and should not substantially raise
|
||||
the maintenance burden of the CI infrastructure.
|
||||
- In particular, if building the target takes a reasonable amount of time,
|
||||
but the target cannot run the testsuite in a timely fashion due to low
|
||||
performance of either native code or accurate emulation, that alone may
|
||||
prevent the target from qualifying as tier 1.
|
||||
- If running the testsuite requires additional infrastructure (such as physical
|
||||
systems running the target), the target maintainers must arrange to provide
|
||||
such resources to the Rust project, to the satisfaction and approval of the
|
||||
Rust infrastructure team.
|
||||
- Such resources may be provided via cloud systems, via emulation, or via
|
||||
physical hardware.
|
||||
- If the target requires the use of emulation to meet any of the tier
|
||||
requirements, the approving teams for those requirements must have high
|
||||
confidence in the accuracy of the emulation, such that discrepancies
|
||||
between emulation and native operation that affect test results will
|
||||
constitute a high-priority bug in either the emulation or the
|
||||
implementation of the target.
|
||||
- If it is not possible to run the target via emulation, these resources must
|
||||
additionally be sufficient for the Rust infrastructure team to make them
|
||||
available for access by Rust team members, for the purposes of development
|
||||
and testing. (Note that the responsibility for doing target-specific
|
||||
development to keep the target well maintained remains with the target
|
||||
maintainers. This requirement ensures that it is possible for other
|
||||
Rust developers to test the target, but does not obligate other Rust
|
||||
developers to make target-specific fixes.)
|
||||
- Resources provided for CI and similar infrastructure must be available for
|
||||
continuous exclusive use by the Rust project. Resources provided
|
||||
for access by Rust team members for development and testing must be
|
||||
available on an exclusive basis when in use, but need not be available on a
|
||||
continuous basis when not in use.
|
||||
- Tier 1 targets must not have a hard requirement for signed, verified, or
|
||||
otherwise "approved" binaries. Developers must be able to build, run, and
|
||||
test binaries for the target on systems they control, or provide such
|
||||
binaries for others to run. (Doing so may require enabling some appropriate
|
||||
"developer mode" on such systems, but must not require the payment of any
|
||||
additional fee or other consideration, or agreement to any onerous legal
|
||||
agreements.)
|
||||
- The Rust project may decide to supply appropriately signed binaries if
|
||||
doing so provides a smoother experience for developers using the target,
|
||||
and a tier 2 target with host tools already requires providing appropriate
|
||||
mechanisms that enable our infrastructure to provide such signed binaries.
|
||||
However, this additional tier 1 requirement ensures that Rust developers
|
||||
can develop and test Rust software for the target (including Rust itself),
|
||||
and that development or testing for the target is not limited.
|
||||
- All requirements for tier 2 apply.
|
||||
|
||||
A tier 1 target may be demoted if it no longer meets these requirements but
|
||||
still meets the requirements for a lower tier. Any proposal for demotion of a
|
||||
tier 1 target requires a full RFC process, with approval by the compiler and
|
||||
release teams. Any such proposal will be communicated widely to the Rust
|
||||
community, both when initially proposed and before being dropped from a stable
|
||||
release. A tier 1 target is highly unlikely to be directly removed without
|
||||
first being demoted to tier 2 or tier 3. (The amount of time between such
|
||||
communication and the next stable release may depend on the nature and severity
|
||||
of the failed requirement, the timing of its discovery, whether the target has
|
||||
been part of a stable release yet, and whether the demotion or removal can be a
|
||||
planned and scheduled action.)
|
||||
|
||||
Raising the baseline expectations of a tier 1 target (such as the minimum CPU
|
||||
features or OS version required) requires the approval of the compiler and
|
||||
release teams, and should be widely communicated as well, but does not
|
||||
necessarily require a full RFC.
|
||||
|
||||
### Tier 1 with host tools
|
||||
|
||||
Some tier 1 targets may additionally have binaries built to run on them as a
|
||||
host (such as `rustc` and `cargo`). This allows the target to be used as a
|
||||
development platform, not just a compilation target.
|
||||
|
||||
A proposed new tier 1 target with host tools must be reviewed and approved by
|
||||
the compiler team based on these requirements. In addition, the release team
|
||||
must approve the viability and value of supporting host tools for the target.
|
||||
For a tier 1 target, this will typically take place via a full RFC proposing
|
||||
the target, to be jointly reviewed and approved by the compiler team and
|
||||
release team.
|
||||
|
||||
In addition, the infrastructure team must approve the integration of the
|
||||
target's host tools into Continuous Integration (CI), and the CI-related
|
||||
requirements for host tools. This review and approval may take place in a PR
|
||||
adding the target's host tools to CI, by an infrastructure team member
|
||||
reporting the outcome of a team discussion, or by including the infrastructure
|
||||
team in the RFC proposing the target.
|
||||
|
||||
- Tier 1 targets with host tools should typically include all of the additional
|
||||
tools such as `clippy` and `rustfmt`, unless there is a target-specific
|
||||
reason why a tool cannot possibly make sense for the target.
|
||||
- Unlike with tier 2, for tier 1 we will not exclude specific tools on the
|
||||
sole basis of them being less likely to be used; rather, we'll take that
|
||||
into account when considering whether the target should be at tier 1 with
|
||||
host tools. In general, on any tier 1 target with host tools, people
|
||||
should be able to expect to find and install all the same components that
|
||||
they would for any other tier 1 target with host tools.
|
||||
- Approval of host tools will take into account the additional time required to
|
||||
build the host tools, and the substantial additional storage required for the
|
||||
host tools.
|
||||
- Host tools for the target must have substantial, widespread interest within
|
||||
the developer community, and must serve the ongoing needs of multiple
|
||||
production users of Rust across multiple organizations or projects. These
|
||||
requirements are subjective, and determined by consensus of the approving
|
||||
teams. This requirement will be evaluated independently from the
|
||||
corresponding tier 1 requirement; it is possible for a target to have
|
||||
sufficient interest for cross-compilation, but not have sufficient interest
|
||||
for native compilation. The host tools may be dropped if they no longer meet
|
||||
this requirement, even if the target otherwise qualifies as tier 1.
|
||||
- The host tools must build, run, and pass tests reliably in CI, for all
|
||||
components that Rust's CI considers mandatory.
|
||||
- The target must not disable an excessive number of tests or pieces of tests
|
||||
in the testsuite in order to do so. This is a subjective requirement.
|
||||
- Building the host tools and running the testsuite for the host tools must not
|
||||
take substantially longer than other targets, and should not substantially raise
|
||||
the maintenance burden of the CI infrastructure.
|
||||
- In particular, if building the target's host tools takes a reasonable
|
||||
amount of time, but the target cannot run the testsuite in a timely fashion
|
||||
due to low performance of either native code or accurate emulation, that
|
||||
alone may prevent the target from qualifying as tier 1 with host tools.
|
||||
- Providing host tools does not exempt a target from requirements to support
|
||||
cross-compilation if at all possible.
|
||||
- All requirements for tier 2 targets with host tools apply.
|
||||
- All requirements for tier 1 apply.
|
||||
|
||||
A target seeking promotion to tier 1 with host tools should typically either be
|
||||
tier 2 with host tools or tier 1 without host tools, to reduce the number of
|
||||
requirements to simultaneously review and approve.
|
||||
|
||||
In addition to the general process for demoting a tier 1 target, a tier 1
|
||||
target with host tools may be demoted (including having its host tools dropped,
|
||||
or being demoted to tier 2 with host tools) if it no longer meets these
|
||||
requirements but still meets the requirements for a lower tier. Any proposal
|
||||
for demotion of a tier 1 target (with or without host tools) requires a full
|
||||
RFC process, with approval by the compiler and release teams. Any such proposal
|
||||
will be communicated widely to the Rust community, both when initially proposed
|
||||
and before being dropped from a stable release.
|
Loading…
Reference in New Issue
Block a user