| .. _api_lifecycle: |
| |
| API Lifecycle |
| ############# |
| |
| Developers using Zephyr's APIs need to know how long they can trust that a |
| given API will not change in future releases. At the same time, developers |
| maintaining and extending Zephyr's APIs need to be able to introduce |
| new APIs that aren't yet fully proven, and to potentially retire old APIs when they're |
| no longer optimal or supported by the underlying platforms. |
| |
| |
| .. figure:: api_lifecycle.png |
| :align: center |
| :alt: API Life Cycle |
| :figclass: align-center |
| |
| API Life Cycle |
| |
| |
| Experimental |
| ************* |
| |
| Experimental APIs denote that a feature was introduced recently, and may change |
| or be removed in future versions. Try it out and provide feedback |
| to the community via the `Developer mailing list <https://lists.zephyrproject.org/g/devel>`_. |
| |
| Peripheral APIs (Hardware Related) |
| ================================== |
| |
| When introducing an API (public header file with documentation) for a new |
| peripheral or driver subsystem, review of the API is enforced and is driven by |
| the API working group consisting of representatives from different vendors. |
| |
| The following requirements apply to new APIs: |
| |
| - Documentation of the API (usage) |
| explaining its design and assumptions, how it is to be used, current |
| implementation limitations, and future potential, if appropriate. |
| - The API introduction should be accompanied by at least one driver |
| implementing this API |
| - At least one sample using the new API |
| |
| The API shall be promoted to ``unstable`` when it has at least two |
| implementations on different hardware platforms. |
| |
| Hardware Agnostic APIs |
| ======================= |
| |
| For hardware agnostic APIs, multiple applications are required to promote an |
| API from ``experimental`` to ``unstable``. |
| |
| |
| Unstable |
| ******** |
| |
| The API is in the process of settling, but has not yet had sufficient real-world |
| testing to be considered stable. The API is considered generic in nature and can |
| be used on different hardware platforms. |
| |
| .. note:: |
| |
| Changes will not be announced. |
| |
| Stable |
| ******* |
| |
| The API has proven satisfactory, but cleanup in the underlying code may cause |
| minor changes. Backwards-compatibility will be maintained if reasonable. |
| |
| An API can be declared ``stable`` after fulfilling the following requirements: |
| |
| - Test cases for the new API with 100% coverage |
| - Complete documentation in code. All public interfaces shall be documented |
| and available in online documentation. |
| - The API has been in-use and was available in at least 2 development releases |
| - Stable APIs can get backward compatible updates, bug fixes and security fixes |
| at any time. |
| |
| .. _stable_api_changes: |
| |
| Introducing incompatible changes |
| ================================ |
| |
| A stable API, as described above strives to remain backwards-compatible through |
| its life-cycle. There are however cases where fulfilling this objective prevents |
| technical progress or is simply unfeasible without unreasonable burden on the |
| maintenance of the API and its implementation(s). |
| |
| An incompatible change is defined as one that forces users to modify their |
| existing code in order to maintain the current behavior of their application. |
| The need for recompilation of applications (without changing the application |
| itself) is not considered an incompatible change. |
| |
| In order to restrict and control the introduction of a change that breaks the |
| promise of backwards compatibility the following steps must be followed whenever |
| such a change is considered necessary in order to accept it in the project: |
| |
| #. An :ref:`RFC issue <rfcs>` must be opened on GitHub with the following |
| content: |
| |
| .. code-block:: none |
| |
| Title: RFC: API Change: <subsystem> |
| Contents: - Problem Description: |
| - Background information on why the change is required |
| - Proposed Change (detailed): |
| - Brief description of the API change |
| - Detailed RFC: |
| - Function call changes |
| - Device Tree changes (source and bindings) |
| - Kconfig option changes |
| - Dependencies: |
| - Impact to users of the API, including the steps required |
| to adapt out-of-tree users of the API to the change |
| |
| Instead of a written description of the changes, the RFC issue may link to a |
| Pull Request containing those changes in code form. |
| #. The RFC issue must be labeled with the GitHub ``Stable API Change`` label |
| #. The RFC issue must be submitted for discussion in the next `Zephyr API meeting`_ |
| #. An email must be sent to the ``devel`` mailing list with a subject identical |
| to the RFC issue title and that links to the RFC issue |
| |
| The RFC will then receive feedback through issue comments and will also be |
| discussed in the Zephyr API meeting, where the stakeholders and the community at |
| large will have a chance to discuss it in detail. |
| |
| Finally, and if not done as part of the first step, a Pull Request must be |
| opened on GitHub. It is left to the person proposing the change to decide |
| whether to introduce both the RFC and the Pull Request at the same time or to |
| wait until the RFC has gathered consensus enough so that the implementation can |
| proceed with confidence that it will be accepted. |
| The Pull Request must include the following: |
| |
| - A title that matches the RFC issue |
| - A link to the RFC issue |
| - The actual changes to the API |
| |
| - Changes to the API header file |
| - Changes to the API implementation(s) |
| - Changes to the relevant API documentation |
| - Changes to Device Tree source and bindings |
| |
| - The changes required to adapt in-tree users of the API to the change. |
| Depending on the scope of this task this might require additional help from |
| the corresponding maintainers |
| - An entry in the "API Changes" section of the release notes for the next |
| upcoming release |
| - The labels ``API``, ``Stable API Change`` and ``Release Notes``, as well as |
| any others that are applicable |
| |
| Once the steps above have been completed, the outcome of the proposal will |
| depend on the approval of the actual Pull Request by the maintainer of the |
| corresponding subystem. As with any other Pull Request, the author can request |
| for it to be discussed and ultimately even voted on in the `Zephyr TSC meeting`_. |
| |
| If the Pull Request is merged then an email must be sent to the ``devel`` and |
| ``user`` mailing lists informing them of the change. |
| |
| .. note:: |
| |
| Incompatible changes will be announced in the "API Changes" section of the |
| release notes. |
| |
| Deprecated |
| *********** |
| |
| .. note:: |
| |
| Unstable APIs can be removed without deprecation at any time. |
| Deprecation and removal of APIs will be announced in the "API Changes" |
| section of the release notes. |
| |
| The following are the requirements for deprecating an existing API: |
| |
| - Deprecation Time (stable APIs): 2 Releases |
| The API needs to be marked as deprecated in at least two full releases. |
| For example, if an API was first deprecated in release 1.14, |
| it will be ready to be removed in 1.16 at the earliest. |
| There may be special circumstances, determined by the API working group, |
| where an API is deprecated sooner. |
| - What is required when deprecating: |
| |
| - Mark as deprecated |
| - Document the deprecation |
| - Include the deprecation in the "API Changes" of the release notes for the |
| next upcoming release |
| - Code using the deprecated API needs to be modified to remove usage of said |
| API |
| - The change needs to be atomic and bisectable |
| - Create a GitHub issue to track the removal of the deprecated API, and |
| add it to the roadmap targeting the appropriate release |
| (in the example above, 1.16). |
| |
| During the deprecation waiting period, the API will be in the ``deprecated`` |
| state. The Zephyr maintainers will track usage of deprecated APIs on |
| ``docs.zephyrproject.org`` and support developers migrating their code. Zephyr |
| will continue to provide warnings: |
| |
| - API documentation will inform users that the API is deprecated. |
| - Attempts to use a deprecated API at build time will log a warning to the |
| console. |
| |
| |
| Retired |
| ******* |
| |
| In this phase, the API is removed. |
| |
| The target removal date is 2 releases after deprecation is announced. |
| The Zephyr maintainers will decide when to actually remove the API: this |
| will depend on how many developers have successfully migrated from the |
| deprecated API, and on how urgently the API needs to be removed. |
| |
| If it's OK to remove the API, it will be removed. The maintainers will remove |
| the corresponding documentation, and communicate the removal in the usual ways: |
| the release notes, mailing lists, Github issues and pull-requests. |
| |
| If it's not OK to remove the API, the maintainers will continue to support |
| migration and update the roadmap with the aim to remove the API in the next |
| release. |
| |
| .. _`Zephyr TSC meeting`: https://github.com/zephyrproject-rtos/zephyr/wiki/Zephyr-Committee-and-Working-Group-Meetings#technical-steering-committee-tsc |
| .. _`Zephyr API meeting`: https://github.com/zephyrproject-rtos/zephyr/wiki/Zephyr-Committee-and-Working-Group-Meetings#zephyr-api-meeting |