243 lines
11 KiB
ReStructuredText
243 lines
11 KiB
ReStructuredText
|
=============================
|
||
|
LLVM Community Support Policy
|
||
|
=============================
|
||
|
|
||
|
As a compilation infrastructure, LLVM has multiple types of users, both
|
||
|
downstream and upstream, of many combinations of its projects, tools and
|
||
|
libraries.
|
||
|
|
||
|
There is a core part of it that encompass the implementation of the compiler
|
||
|
(front/middle/back ends), run-time libraries (RT, C++, OpenMP, etc) and
|
||
|
associated tools (debugger, linker, object file manipulation, etc). These
|
||
|
components are present in the public release on our supported architectures
|
||
|
and operating systems and the whole community must maintain and care about.
|
||
|
|
||
|
There are, however, other components within the main repository that either
|
||
|
cater to a specific sub-community of LLVM (upstream or downstream) or
|
||
|
help parts of the community to integrate LLVM into their own development tools
|
||
|
or external projects. Those parts of the main repository don't always have
|
||
|
rigorous testing like the core parts, nor are they validated and shipped with
|
||
|
our public upstream releases.
|
||
|
|
||
|
Even not being a core part of the project, we have enough sub-communities
|
||
|
needing those changes with enough overlap that having them in the main
|
||
|
repository is beneficial to minimise the repetition of those changes in all
|
||
|
the external repositories that need them.
|
||
|
|
||
|
But the maintenance costs of such diverse ecosystem is non trivial, so we divide
|
||
|
the level of support in two tiers: core and peripheral, with two
|
||
|
different levels of impact and responsibilities. Those tiers refer only to the
|
||
|
main repository (``llvm-project``) and not the other repositories in our git
|
||
|
project, unless explicitly stated.
|
||
|
|
||
|
Regardless of the tier, all code must follow the existing policies on quality,
|
||
|
reviews, style, etc.
|
||
|
|
||
|
Core Tier
|
||
|
=========
|
||
|
|
||
|
The core tier encompasses all of the code in the main repository that is
|
||
|
in production, is actively tested and released in a regular schedule, including
|
||
|
core LLVM APIs and infrastructure, front/middle/back-ends, run-time libraries,
|
||
|
tools, etc.
|
||
|
|
||
|
It is the responsibility of **every** LLVM developer to care for the core tier
|
||
|
regardless of where their work is applied to.
|
||
|
|
||
|
What is covered
|
||
|
---------------
|
||
|
|
||
|
The core tier is composed of:
|
||
|
* Core code (``llvm-project``) present in official releases and buildbots:
|
||
|
compiler, debugger, linker, libraries, etc, including infrastructure code
|
||
|
(table-gen, lit, file-check, unit-tests, etc).
|
||
|
* Build infrastructure that creates releases and buildbots (CMake, scripts).
|
||
|
* `Phabricator <https://github.com/llvm/phabricator>`_ and
|
||
|
`buildbot <https://github.com/llvm/llvm-zorg>`_ infrastructure.
|
||
|
* The `test-suite <https://github.com/llvm/llvm-test-suite>`_.
|
||
|
|
||
|
Requirements
|
||
|
------------
|
||
|
|
||
|
Code in this tier must:
|
||
|
* Keep official buildbots green, with warnings on breakages being emailed to
|
||
|
all affected developers. Those must be fixed as soon as possible or patches
|
||
|
must be reverted, as per review policy.
|
||
|
* Bit-rot of a component in the core tier will result in that component being
|
||
|
downgraded to the peripheral tier or being removed. Sub-communities can
|
||
|
avoid this by fixing all raised issues in a timely manner.
|
||
|
|
||
|
Peripheral Tier
|
||
|
===============
|
||
|
|
||
|
The peripheral tier encompass the parts of LLVM that cater to a specific
|
||
|
sub-community and which don't usually affect the core components directly.
|
||
|
|
||
|
This includes experimental back-ends, disabled-by-default options and
|
||
|
alternative paths (work-in-progress replacements) in the same repository, as
|
||
|
well as separate efforts to integrate LLVM development with local practices.
|
||
|
|
||
|
It is the responsibility of each sub-community to care about their own parts
|
||
|
and the intersection of that with the core tier and other peripheral parts.
|
||
|
|
||
|
There are three main groups of code that fit in this category:
|
||
|
* Code that is making its way into LLVM, via the `experimental <https://llvm.org/docs/DeveloperPolicy.html#introducing-new-components-into-llvm>`_
|
||
|
roadmap or similar efforts.
|
||
|
* Code that is making its way out of LLVM, via deprecation, replacement or
|
||
|
bit-rot, and will be removed if the sub-community that cares about it
|
||
|
cannot maintain it.
|
||
|
* Code that isn't meant to be in LLVM core and can coexist with the code in
|
||
|
the core tier (and others in the peripheral tier) long term, without causing
|
||
|
breakages or disturbances.
|
||
|
|
||
|
What is covered
|
||
|
---------------
|
||
|
|
||
|
The peripheral tier is composed of:
|
||
|
* Experimental targets and options that haven't been enable by default yet.
|
||
|
* Main repository projects that don't get released or regularly tested.
|
||
|
* Legacy tools and scripts that aren't used in upstream validation.
|
||
|
* Alternative build systems (ex. GN, Bazel) and related infrastructure.
|
||
|
* Tools support (ex. gdb scripts, editor configuration, helper scripts).
|
||
|
|
||
|
Requirements
|
||
|
------------
|
||
|
|
||
|
Code in this tier must:
|
||
|
* Have a clear benefit for residing in the main repository, catering to an
|
||
|
active sub-community (upstream or downstream).
|
||
|
* Be actively maintained by such sub-community and have its problems addressed
|
||
|
in a timely manner.
|
||
|
|
||
|
Code in this tier must **not**:
|
||
|
* Break or invalidate core tier code or infrastructure. If that happens
|
||
|
accidentally, reverting functionality and working on the issues offline
|
||
|
is the only acceptable course of action.
|
||
|
* Negatively affect development of core tier code, with the sub-community
|
||
|
involved responsible for making changes to address specific concerns.
|
||
|
* Negatively affect other peripheral tier code, with the sub-communities
|
||
|
involved tasked to resolve the issues, still making sure the solution doesn't
|
||
|
break or invalidate the core tier.
|
||
|
* Impose sub-optimal implementation strategies on core tier components as a
|
||
|
result of idiosyncrasies in the peripheral component.
|
||
|
* Have build infrastructure that spams all developers about their breakages.
|
||
|
* Fall into disrepair. This is a reflection of lack of an active sub-community
|
||
|
and will result in removal.
|
||
|
|
||
|
Code in this tier should:
|
||
|
* Have infrastructure to test, whenever meaningful, with either no warnings or
|
||
|
notification contained within the sub-community.
|
||
|
* Have support and testing that scales with the complexity and resilience of
|
||
|
the component, with the bar for simple and gracefully-degrading components
|
||
|
(such as editor bindings) much lower than for complex components that must
|
||
|
remain fresh with HEAD (such as experimental back-ends or alternative build
|
||
|
systems).
|
||
|
* Have a document making clear the status of implementation, level of support
|
||
|
available, who the sub-community is and, if applicable, roadmap for inclusion
|
||
|
into the core tier.
|
||
|
* Be restricted to a specific directory or have a consistent pattern (ex.
|
||
|
unique file suffix), making it easy to remove when necessary.
|
||
|
|
||
|
Inclusion Policy
|
||
|
================
|
||
|
|
||
|
To add a new peripheral component, send an RFC to the appropriate dev list
|
||
|
proposing its addition and explaining how it will meet the support requirements
|
||
|
listed above. Different types of components could require different levels of
|
||
|
detail. when in doubt, ask the community what's the best approach.
|
||
|
|
||
|
Inclusion must reach consensus in the RFC by the community and the approval of
|
||
|
the corresponding review (by multiple members of the community) is the official
|
||
|
note of acceptance.
|
||
|
|
||
|
After merge, there often is a period of transition, where teething issues on
|
||
|
existing buildbots are discovered and fixed. If those cannot be fixed straight
|
||
|
away, the sub-community is responsible for tracking and reverting all the
|
||
|
pertinent patches and retrying the inclusion review.
|
||
|
|
||
|
Once the component is stable in tree, it must follow this policy and the
|
||
|
deprecation rules below apply.
|
||
|
|
||
|
Due to the uncertain nature of inclusion, it's advisable that new components
|
||
|
are not added too close to a release branch. The time will depend on the size
|
||
|
and complexity of the component, so adding release and testing managers on the
|
||
|
RFC and review is strongly advisable.
|
||
|
|
||
|
Deprecation Policy
|
||
|
==================
|
||
|
|
||
|
The LLVM code base has a number of files that aren't being actively maintained.
|
||
|
But not all of those files are obstructing the development of the project and
|
||
|
so it remains in the repository with the assumption that it could still be
|
||
|
useful for downstream users.
|
||
|
|
||
|
For code to remain in the repository, its presence must not impose an undue
|
||
|
burden on maintaining other components (core or peripheral).
|
||
|
|
||
|
Warnings
|
||
|
--------
|
||
|
|
||
|
There are multiple types of issues that might trigger a request for deprecation,
|
||
|
including (but not limited to):
|
||
|
|
||
|
* Changes in a component consistently break other areas of the project.
|
||
|
* Components go broken for long periods of time (weeks or more).
|
||
|
* Clearly superior alternatives are in use and maintenance is painful.
|
||
|
* Builds and tests are harder / take longer, increasing the cost of
|
||
|
maintenance, overtaking the perceived benefits.
|
||
|
|
||
|
If the maintenance cost is higher than it is acceptable by the majority of
|
||
|
developers, it means that either the sub-community is too small (and the extra
|
||
|
cost should be paid locally), or not active enough (and the problems won't be
|
||
|
fixed any time soon). In either case, removal of such problematic component is
|
||
|
justified.
|
||
|
|
||
|
Steps for removal
|
||
|
-----------------
|
||
|
|
||
|
However clear the needs for removal are, we should take an incremental approach
|
||
|
to deprecating code, especially when there's still a sub-community that cares
|
||
|
about it. In that sense, code will never be removed outright without a series
|
||
|
of steps are taken.
|
||
|
|
||
|
A minimum set of steps should be:
|
||
|
#. A proposal for removal / deactivation should be made to the developers'
|
||
|
mailing lists (``llvm-dev``, ``cfe-dev``, ``lldb-dev``, etc), with a clear
|
||
|
statement of the maintenance costs imposed and the alternatives, if
|
||
|
applicable.
|
||
|
#. There must be enough consensus on the list that removal is warranted, and no
|
||
|
pending proposals to fix the situation from a sub-community.
|
||
|
#. An announcement for removal must be made on the same lists, with ample time
|
||
|
for downstream users to take action on their local infrastructure. The time
|
||
|
will depend on what is being removed.
|
||
|
|
||
|
#. If a script or documents are to be removed, they can always be pulled
|
||
|
from previous revision, and can be removed within days.
|
||
|
#. if a whole target is removed, we need to first announce publicly, and
|
||
|
potentially mark as deprecated in one release, only to remove on the
|
||
|
next release.
|
||
|
#. Everything else will fall in between those two extremes.
|
||
|
#. The removal is made by either the proposer or the sub-community that used to
|
||
|
maintain it, with replacements and arrangements made atomically on the same
|
||
|
commit.
|
||
|
|
||
|
If a proposal for removal is delayed by the promise a sub-community will take
|
||
|
care of the code affected, the sub-community will have a time to fix all the
|
||
|
issues (depending on each case, as above), and if those are not fixed in time, a
|
||
|
subsequent request for removal should be made and the community may elect to
|
||
|
eject the component without further attempts to fix.
|
||
|
|
||
|
Reinstatement
|
||
|
-------------
|
||
|
|
||
|
If a component is removed from LLVM, it may, at a later date, request inclusion
|
||
|
of a modified version, with evidence that all of the issues were fixed and that
|
||
|
there is a clear sub-community that will maintain it.
|
||
|
|
||
|
By consequence, the pressure on such sub-community will be higher to keep
|
||
|
overall maintenance costs to a minimum and will need to show steps to mitigate
|
||
|
all of the issues that were listed as reasons for its original removal.
|
||
|
|
||
|
Failing on those again, will lead to become a candidate for removal yet again.
|
||
|
|