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.
 | |
| 
 |