zephyr Documentation

Primary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.

RAW Doc

Technical Documentation: zephyrproject-rtos/zephyr

ℹ️ Provenance: Multi-Tier Ingestion · CodeWiki Reference

Doc 404 (`doc/404.rst`)

:orphan:

.. _page-not-found:

Sorry, Page Not Found
#####################

.. image:: images/Zephyr-Kite-in-tree.png
:align: right

.. raw:: html

Please check the url for misspellings.

It's also possible we've removed or renamed the page you're looking for.

Please try using the navigation links on the left of this page to navigate
the major sections of our site, or use the search box.

If you got this error by following a link, please let us know by creating an
issue on GitHub_.

.. _GitHub: https://github.com/zephyrproject-rtos/zephyr/issues

.. raw:: html


Doc CMakeLists (`doc/CMakeLists.txt`)

SPDX-License-Identifier: Apache-2.0

cmake_minimum_required(VERSION 3.28.0)
project(Zephyr-Kernel-Doc LANGUAGES)

set(MIN_WEST_VERSION 1.0.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE} .. COMPONENTS doc)

file(TO_CMAKE_PATH "${ZEPHYR_BASE}" ZEPHYR_BASE)
message(STATUS "Zephyr base: ${ZEPHYR_BASE}")

#-------------------------------------------------------------------------------

Options

set(SPHINXOPTS "-j auto -W --keep-going -T" CACHE STRING "Default Sphinx Options")
set(SPHINXOPTS_EXTRA "" CACHE STRING "Extra Sphinx Options (added to defaults)")
set(LATEXMKOPTS "-halt-on-error -no-shell-escape" CACHE STRING "Default latexmk options")
set(DT_TURBO_MODE OFF CACHE BOOL "Enable DT turbo mode")
set(HW_FEATURES_TURBO_MODE OFF CACHE BOOL "Enable HW features turbo mode")
set(HW_FEATURES_VENDOR_FILTER "" CACHE STRING "Vendor filter for HW features")
set(NO_EXTERNAL_DEPS OFF CACHE BOOL "Enable serving external CSS/JS libraries locally instead of fetching from the Internet.")
set(DOC_TAG "development" CACHE STRING "Documentation tag")
set(DTS_ROOTS "${ZEPHYR_BASE}" CACHE STRING "DT bindings root folders")
set(DOXYGEN_FORCE_SINGLE_THREAD OFF CACHE BOOL "Enable Doxygen single thread mode")

separate_arguments(SPHINXOPTS)
separate_arguments(SPHINXOPTS_EXTRA)
separate_arguments(LATEXMKOPTS)

#-------------------------------------------------------------------------------

Dependencies

find_package(Doxygen REQUIRED dot)

find_program(SPHINXBUILD sphinx-build)
if(NOT SPHINXBUILD)
message(WARNING "The 'sphinx-build' command was not found; Sphinx-based targets will not be available.")
endif()
find_program(SPHINXAUTOBUILD sphinx-autobuild)

find_package(LATEX COMPONENTS PDFLATEX)
find_program(LATEXMK latexmk)
if(NOT LATEX_PDFLATEX_FOUND OR NOT LATEXMK)
message(WARNING "LaTeX components not found. PDF build will not be available.")
endif()

#-------------------------------------------------------------------------------

Environment & Paths

set(SPHINX_ENV
DOXYGEN_EXECUTABLE=${DOXYGEN_EXECUTABLE}
DOT_EXECUTABLE=${DOXYGEN_DOT_EXECUTABLE}
DOCS_HTML_DIR=${CMAKE_CURRENT_BINARY_DIR}/html
DOXY_REQ_INPUT=${CMAKE_CURRENT_BINARY_DIR}/requirements/dox
)

set(DOXYGEN_CUSTOM_LINES)

if(DEFINED ENV{ZEPHYR_DOXYGEN_OVERLAY})
if(EXISTS $ENV{ZEPHYR_DOXYGEN_OVERLAY})
list(APPEND DOXYGEN_CUSTOM_LINES "@INCLUDE = $ENV{ZEPHYR_DOXYGEN_OVERLAY}")
else()
message(FATAL_ERROR "Zephyr Doxygen overlay $ENV{ZEPHYR_DOXYGEN_OVERLAY} does not exist!")
endif()
endif()

if(DOXYGEN_FORCE_SINGLE_THREAD)
list(APPEND DOXYGEN_CUSTOM_LINES "NUM_PROC_THREADS = 1")
endif()

list(JOIN DOXYGEN_CUSTOM_LINES "\n" INCLUDE_CUSTOM_FILE)

set(DOCS_CFG_DIR ${CMAKE_CURRENT_LIST_DIR})
set(DOCS_DOCTREE_DIR ${CMAKE_CURRENT_BINARY_DIR}/doctrees)
set(DOCS_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR})
set(DOCS_SRC_DIR ${CMAKE_CURRENT_BINARY_DIR}/src)
set(DOCS_HTML_DIR ${CMAKE_CURRENT_BINARY_DIR}/html)
set(DOCS_LINKCHECK_DIR ${CMAKE_CURRENT_BINARY_DIR}/linkcheck)
set(DOCS_LATEX_DIR ${CMAKE_CURRENT_BINARY_DIR}/latex)

if(WIN32)
set(SEP $)
else()
set(SEP :)
endif()

#-------------------------------------------------------------------------------

Requirements (reqmgmt module)

When the 'reqmgmt' module (the StrictDoc requirements repository) is present

in the workspace, its requirements are exported to JSON and converted into

reStructuredText (for Sphinx) and Doxygen (for the API docs) by the

'requirements' target. When the module is absent, only a placeholder is

generated so that the strict Sphinx and Doxygen builds still succeed.

set(GEN_REQUIREMENTS_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/_scripts/gen_requirements.py)
set(REQ_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/requirements)
set(REQ_DOX_DIR ${REQ_BUILD_DIR}/dox)
set(REQ_RST_DIR ${DOCS_SRC_DIR}/build/requirements)

Requirements .dox directory consumed by the Doxygen INPUT (see

zephyr.doxyfile.in). Always points at REQ_DOX_DIR; the directory is populated

(possibly empty) by the 'requirements' target before Doxygen runs.

set(DOXY_REQ_INPUT ${REQ_DOX_DIR})

set(REQMGMT_FOUND FALSE)
if(DEFINED ZEPHYR_REQMGMT_MODULE_DIR AND
EXISTS ${ZEPHYR_REQMGMT_MODULE_DIR}/strictdoc_config.py)
find_program(STRICTDOC strictdoc)
if(STRICTDOC)
set(REQMGMT_FOUND TRUE)
message(STATUS "Requirements management module: ${ZEPHYR_REQMGMT_MODULE_DIR}")
else()
message(WARNING "reqmgmt module found but 'strictdoc' is not installed; "
"requirements will not be included in the documentation.")
endif()
else()
message(STATUS "Requirements management module not found; "
"requirements will not be included in the documentation.")
endif()

if(REQMGMT_FOUND)
add_custom_target(
requirements
COMMAND ${STRICTDOC} export ${ZEPHYR_REQMGMT_MODULE_DIR}
--formats json
--output-dir ${REQ_BUILD_DIR}
COMMAND ${PYTHON_EXECUTABLE} ${GEN_REQUIREMENTS_SCRIPT}
--json ${REQ_BUILD_DIR}/json/index.json
--rst-out ${REQ_RST_DIR}
--dox-out ${REQ_DOX_DIR}
--module-present 1
COMMENT "Exporting and converting requirements from reqmgmt..."
)
else()
add_custom_target(
requirements
COMMAND ${PYTHON_EXECUTABLE} ${GEN_REQUIREMENTS_SCRIPT}
--rst-out ${REQ_RST_DIR}
--dox-out ${REQ_DOX_DIR}
--module-present 0
COMMENT "reqmgmt module not present; generating placeholder requirements..."
)
endif()

set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${GEN_REQUIREMENTS_SCRIPT})

#-------------------------------------------------------------------------------

Functions

Create a custom doc target.

This function has the same signature as `add_custom_target()`

The function will create two targets for the doc build system.

- Target 1 named: ``

- Target 2 named: `-nodeps`

Both targets will produce same result, but target 2 must have no dependencies.

This is useful to, e.g. re-run the Sphinx build without dependencies such as

devicetree generator.

function(add_doc_target name)
add_custom_target(${name} ${ARGN})
add_custom_target(${name}-nodeps ${ARGN})
endfunction()

#-------------------------------------------------------------------------------

Doxygen (standalone)

set(DOXY_OUT ${CMAKE_CURRENT_BINARY_DIR}/doxygen)
set(DOXYFILE_IN ${CMAKE_CURRENT_LIST_DIR}/zephyr.doxyfile.in)
set(DOXYFILE_OUT ${CMAKE_CURRENT_BINARY_DIR}/zephyr.doxyfile)
set(ZEPHYR_VERSION "${Zephyr_VERSION}")

configure_file(${DOXYFILE_IN} ${DOXYFILE_OUT} @ONLY)

add_custom_target(
doxygen
COMMAND
${DOXYGEN_EXECUTABLE} ${DOXYFILE_OUT}
COMMENT "Running Doxygen..."
)

add_dependencies(doxygen requirements)

set_target_properties(
doxygen
PROPERTIES
ADDITIONAL_CLEAN_FILES "${DOXY_OUT}"
)

#-------------------------------------------------------------------------------

Doxygen (XML only)

Same configuration as 'doxygen' -- overlays included, since the generated

Doxyfile is pulled in with @INCLUDE -- with the HTML and the tag file turned

off. Writes to its own directory so that it cannot race with 'doxygen'.

set(DOXY_XML_OUT ${CMAKE_CURRENT_BINARY_DIR}/doxygen-xml)
set(DOXYFILE_XML_OUT ${CMAKE_CURRENT_BINARY_DIR}/zephyr-xml.doxyfile)

file(WRITE ${DOXYFILE_XML_OUT}
"@INCLUDE = ${DOXYFILE_OUT}
OUTPUT_DIRECTORY = ${DOXY_XML_OUT}
GENERATE_HTML = NO
GENERATE_TAGFILE =
")

add_custom_target(
doxygen-xml
COMMAND
${DOXYGEN_EXECUTABLE} ${DOXYFILE_XML_OUT}
COMMENT "Running Doxygen (XML only)..."
)

add_dependencies(doxygen-xml requirements)

set_target_properties(
doxygen-xml
PROPERTIES
ADDITIONAL_CLEAN_FILES "${DOXY_XML_OUT}"
)

#-------------------------------------------------------------------------------

Doxygen Coverage

add_custom_target(
doxygen-coverage
COMMAND ${PYTHON_EXECUTABLE} -m coverxygen
--xml-dir ${DOXY_XML_OUT}/xml/
--src-dir ${ZEPHYR_BASE}/include/
--output ${CMAKE_CURRENT_BINARY_DIR}/doc-coverage.info
COMMAND lcov
--remove ${CMAKE_CURRENT_BINARY_DIR}/doc-coverage.info "*/deprecated"
> ${CMAKE_CURRENT_BINARY_DIR}/new.info
COMMAND genhtml
--no-function-coverage
--no-branch-coverage
${CMAKE_CURRENT_BINARY_DIR}/new.info
-o ${CMAKE_CURRENT_BINARY_DIR}/coverage-report
DEPENDS doxygen-xml
COMMENT "Generating Doxygen coverage info and HTML report..."
)

add_custom_target(
doxygen-coverage-json
COMMAND ${PYTHON_EXECUTABLE} -m coverxygen
--xml-dir ${DOXY_XML_OUT}/xml/
--src-dir ${ZEPHYR_BASE}/include/
--format json-v3
--output ${CMAKE_CURRENT_BINARY_DIR}/doc-coverage.json
DEPENDS doxygen-xml
COMMENT "Generating Doxygen coverage info in JSON format..."
)

#-------------------------------------------------------------------------------

devicetree

set(GEN_DEVICETREE_REST_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/_scripts/gen_devicetree_rest.py)

set(DTS_ARGS)
foreach(root ${DTS_ROOTS})
list(APPEND DTS_ARGS --dts-root ${root})
endforeach()

if(DT_TURBO_MODE)
list(APPEND DTS_ARGS --turbo-mode)
endif()

add_custom_target(
devicetree
COMMAND ${CMAKE_COMMAND} -E env
PYTHONPATH=${ZEPHYR_BASE}/scripts/dts/python-devicetree/src${SEP}$ENV{PYTHONPATH}
ZEPHYR_BASE=${ZEPHYR_BASE}
${PYTHON_EXECUTABLE} ${GEN_DEVICETREE_REST_SCRIPT}
--vendor-prefixes ${ZEPHYR_BASE}/dts/bindings/vendor-prefixes.txt
${DTS_ARGS}
${DOCS_SRC_DIR}/build/dts/api
VERBATIM
USES_TERMINAL
COMMENT "Generating Devicetree bindings documentation..."
)

set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${GEN_DEVICETREE_REST_SCRIPT})

#-------------------------------------------------------------------------------

html

set(SPHINX_TAGS "${DOC_TAG}")
if(HW_FEATURES_TURBO_MODE)
list(APPEND SPHINX_TAGS "hw_features_turbo")
endif()

if(NO_EXTERNAL_DEPS)
list(APPEND SPHINX_TAGS "no-external-deps")
endif()

if(REQMGMT_FOUND)
list(APPEND SPHINX_TAGS "reqmgmt")
endif()

set(SPHINX_TAGS_ARGS "")
foreach(tag ${SPHINX_TAGS})
list(APPEND SPHINX_TAGS_ARGS "-t" "${tag}")
endforeach()

if(HW_FEATURES_VENDOR_FILTER)
list(JOIN HW_FEATURES_VENDOR_FILTER "," vendor_filter)
list(APPEND SPHINXOPTS "-D" "zephyr_hw_features_vendor_filter=${vendor_filter}")
endif()

if(SPHINXBUILD)
add_doc_target(
html
COMMAND ${CMAKE_COMMAND} -E env ${SPHINX_ENV} OUTPUT_DIR=${DOCS_HTML_DIR}
${SPHINXBUILD}
-b html
-c ${DOCS_CFG_DIR}
-d ${DOCS_DOCTREE_DIR}
-w ${DOCS_BUILD_DIR}/html.log
${SPHINX_TAGS_ARGS}
${SPHINXOPTS}
${SPHINXOPTS_EXTRA}
${DOCS_SRC_DIR}
${DOCS_HTML_DIR}
USES_TERMINAL
COMMENT "Running Sphinx HTML build..."
)

set_target_properties(
html html-nodeps
PROPERTIES
ADDITIONAL_CLEAN_FILES "${DOCS_SRC_DIR};${DOCS_HTML_DIR};${DOCS_DOCTREE_DIR}"
)

add_dependencies(html devicetree requirements)
endif()

#-------------------------------------------------------------------------------

html-live

if(SPHINXBUILD)
add_doc_target(
html-live
COMMAND ${CMAKE_COMMAND} -E env ${SPHINX_ENV} OUTPUT_DIR=${DOCS_HTML_DIR}
${SPHINXAUTOBUILD}
--watch ${DOCS_CFG_DIR}
--ignore ${DOCS_BUILD_DIR}
-b html
-c ${DOCS_CFG_DIR}
-d ${DOCS_DOCTREE_DIR}
-w ${DOCS_BUILD_DIR}/html.log
${SPHINX_TAGS_ARGS}
${SPHINXOPTS}
${SPHINXOPTS_EXTRA}
${DOCS_SRC_DIR}
${DOCS_HTML_DIR}
USES_TERMINAL
COMMENT "Running Sphinx HTML autobuild..."
)

set_target_properties(
html-live html-live-nodeps
PROPERTIES
ADDITIONAL_CLEAN_FILES "${DOCS_SRC_DIR};${DOCS_HTML_DIR};${DOCS_DOCTREE_DIR}"
)

add_dependencies(html-live devicetree requirements)
endif()
#-------------------------------------------------------------------------------

pdf

if(SPHINXBUILD)
add_doc_target(
latex
COMMAND ${CMAKE_COMMAND} -E env ${SPHINX_ENV} OUTPUT_DIR=${DOCS_LATEX_DIR}
${SPHINXBUILD}
-b latex
-c ${DOCS_CFG_DIR}
-d ${DOCS_DOCTREE_DIR}
-w ${DOCS_BUILD_DIR}/latex.log
${SPHINX_TAGS_ARGS}
-t convertimages
${SPHINXOPTS}
${SPHINXOPTS_EXTRA}
${DOCS_SRC_DIR}
${DOCS_LATEX_DIR}
USES_TERMINAL
COMMENT "Running Sphinx LaTeX build..."
)

set_target_properties(
latex latex-nodeps
PROPERTIES
ADDITIONAL_CLEAN_FILES "${DOCS_SRC_DIR};${DOCS_LATEX_DIR};${DOCS_DOCTREE_DIR}"
)

add_dependencies(latex devicetree requirements)
endif()

if(SPHINXBUILD AND LATEX_PDFLATEX_FOUND AND LATEXMK)
if(WIN32)
set(PDF_BUILD_COMMAND "make.bat")
else()
find_program(MAKE make)
if(NOT MAKE)
message(FATAL_ERROR "The 'make' command was not found")
endif()
set(PDF_BUILD_COMMAND ${MAKE})
endif()

add_custom_target(
pdf
COMMAND ${CMAKE_COMMAND} -E env LATEXMKOPTS="${LATEXMKOPTS}"
${PDF_BUILD_COMMAND}
WORKING_DIRECTORY ${DOCS_LATEX_DIR}
COMMENT "Building PDF file..."
USES_TERMINAL
)

add_dependencies(pdf latex)
endif()

#-------------------------------------------------------------------------------

linkcheck

if(SPHINXBUILD)
add_doc_target(
linkcheck
COMMAND ${CMAKE_COMMAND} -E env ${SPHINX_ENV} OUTPUT_DIR=${DOCS_LINKCHECK_DIR}
${SPHINXBUILD}
-b linkcheck
-c ${DOCS_CFG_DIR}
-d ${DOCS_DOCTREE_DIR}
-w ${DOCS_BUILD_DIR}/linkcheck.log
${SPHINX_TAGS_ARGS}
${SPHINXOPTS}
${SPHINXOPTS_EXTRA}
${DOCS_SRC_DIR}
${DOCS_LINKCHECK_DIR}
USES_TERMINAL
COMMENT "Running Sphinx link check..."
)

set_target_properties(
linkcheck linkcheck-nodeps
PROPERTIES
ADDITIONAL_CLEAN_FILES "${DOCS_SRC_DIR};${DOCS_LINKCHECK_DIR};${DOCS_DOCTREE_DIR}"
)

add_dependencies(linkcheck devicetree requirements)
endif()

#-------------------------------------------------------------------------------

others

add_custom_target(
pristine
COMMAND ${CMAKE_COMMAND} -P ${ZEPHYR_BASE}/cmake/pristine.cmake
)


Doc LICENSING (`doc/LICENSING.rst`)

:orphan:

.. _zephyr_licensing:

Licensing of Zephyr Project components
######################################

Zephyr as a whole is licensed under the Apache 2.0 License. It does, however,
import or reuse a small number of packages, scripts and other files that are
covered by other licenses. In some cases there is no way to add a license header
to those files, so their licensing is declared centrally, in a machine-readable
form, in the :zephyr_file:REUSE.toml file at the root of the repository
(following the REUSE specification
).

The sections below are generated automatically from that metadata, so they
always reflect the actual state of the tree. To add, update or remove an entry,
edit the corresponding [[annotations]] block in :zephyr_file:REUSE.toml
rather than this page (see :ref:external-contributions).

.. note::

This page lists licensing exceptions only. It does not define the
license of the Zephyr project itself, which is Apache 2.0 as specified in the
:zephyr_file:LICENSE file at the root of the repository.

.. contents:: Documented components
:local:
:depth: 1

.. zephyr-licensing-exceptions::

.. _Apache 2.0 License:
https://github.com/zephyrproject-rtos/zephyr/blob/main/LICENSE

.. _REUSE specification:
https://reuse.software/spec/


Doc Glossary (`doc/glossary.rst`)

:orphan:

.. _glossary:

Glossary of Terms
#################

.. glossary::
:sorted:

API
(Application Program Interface) A defined set of routines and protocols for
building application software.

application
The set of user-supplied files that the Zephyr build system uses
to build an application image for a specified board configuration.
It can contain application-specific code, kernel configuration settings,
and at least one CMakeLists.txt file.
The application's kernel configuration settings direct the build system
to create a custom kernel that makes efficient use of the board's
resources.
An application can sometimes be built for more than one type of board
configuration (including boards with different CPU architectures),
if it does not require any board-specific capabilities.

application image
A binary file that is loaded and executed by the board for which
it was built.
Each application image contains both the application's code and the
Zephyr kernel code needed to support it. They are compiled as a single,
fully-linked binary.
Once an application image is loaded onto a board, the image takes control
of the system, initializes it, and runs as the system's sole application.
Both application code and kernel code execute as privileged code
within a single shared address space.

architecture
An instruction set architecture (ISA) along with a programming model.

board
A target system with a defined set of devices and capabilities,
which can load and execute an application image. It may be an actual
hardware system or a simulated system running under QEMU. A board can
contain one or more :term:SoCs <SoC>.
The Zephyr kernel supports a :ref:variety of boards .

board configuration
A set of kernel configuration options that specify how the devices
present on a board are used by the kernel.
The Zephyr build system defines one or more board configurations
for each board it supports. The kernel configuration settings that are
specified by the build system can be over-ridden by the application,
if desired.

board name
The human-readable name of a :term:board. Uniquely and descriptively
identifies a particular system, but does not include additional
information that may be required to actually build a Zephyr image for it.
See :ref:board_terminology for additional details.

board qualifiers
The set of additional tokens, separated by a forward slash (/) that
follow the :term:board name (and optionally :term:board revision) to
form the :term:board target. The currently accepted qualifiers are
:term:SoC, :term:CPU cluster and :term:variant.
See :ref:board_terminology for additional details.

board revision
An optional version string that identifies a particular revision of a
hardware system. This is useful to avoid duplication of board files
whenever small changes are introduced to a hardware system.
See :ref:porting_board_revisions and :ref:application_board_version
for more information.

board target
The full string that can be provided to any of the Zephyr build tools to
compile and link an image for a particular hardware system. This string
uniquely identifies the combination of :term:board name, :term:board revision and :term:board qualifiers.
See :ref:board_terminology for additional details.

CPU cluster
A group of one or more :term:CPU cores <CPU core>, all executing the same image
within the same address space and in a symmetrical (SMP) configuration.
Only :term:CPU cores <CPU core> of the same :term:architecture can be in a single
cluster. Multiple CPU clusters (each of one or more cores) can coexist in
the same :term:SoC.

CPU core
A single processing unit, with its own Program Counter, executing program
instructions sequentially. CPU cores are part of a :term:CPU cluster,
which can contain one or more cores.

device runtime power management
Device Runtime Power Management (PM) refers the capability of devices to
save energy independently of the system power state. Devices will keep
reference of their usage and will automatically be suspended or resumed.
This feature is enabled via the :kconfig:option:CONFIG_PM_DEVICE_RUNTIME
Kconfig option.

idle thread
A system thread that runs when there are no other threads ready to run.

IDT
(Interrupt Descriptor Table) a data structure used by the x86
architecture to implement an interrupt vector table. The IDT is used
to determine the correct response to interrupts and exceptions.

internal API
Any internal function, structure or macro defined anywhere in the Zephyr
source tree. Internal APIs are intended to "extend" Zephyr, and are to be
used only between certain :term:software components <software component>, usually in-tree but in some cases out-of-tree (e.g. adding an
out-of-tree architecture or driver). Applications must not invoke
internal APIs outside their own scope. The context where the API is
called or implemented is well defined. For example, functions prefixed
with arch_ are intended for use by the Zephyr kernel to invoke
architecture-specific code. Internal APIs are mostly kept stable, but with
fewer guarantees than :term:public APIs .

ISR
(Interrupt Service Routine) Also known as an interrupt handler, an ISR
is a callback function whose execution is triggered by a hardware
interrupt (or software interrupt instructions) and is used to handle
high-priority conditions that require interrupting the current code
executing on the processor.

kernel
The set of Zephyr-supplied files that implement the Zephyr kernel,
including its core services, device drivers, network stack, and so on.

power domain
A power domain is a collection of devices for which power is
applied and removed collectively in a single action. Power
domains are represented by :c:struct:device.

power gating
Power gating reduces power consumption by shutting off areas of an
integrated circuit that are not in use.

private API
Any function, structure or macro defined anywhere in the Zephyr source
tree which are only intended for consumption inside the
:term:software component where they are defined. Private APIs may change
at any time and must not be used by code outside the corresponding
software component.

public API
Any function, structure or macro defined inside the include/zephyr
folder that is not explicitly marked as private. Public APIs are intended
for consumption by any and all in-tree or out-of-tree :term:software components <software component>. Public APIs cannot be modified without
following the provisions described in the :ref:API lifecycle <api_lifecycle> section, which means they provide guarantees that they
will remain stable over time.

SoC
A System on a chip_, that is, an integrated circuit that contains at
least one :term:CPU cluster (in turn with at least one :term:CPU core),
as well as peripherals and memory.

SoC family
One or more :term:SoCs <SoC> or :term:SoC series that share enough
in common to consider them related and under a single family denomination.

SoC series
A number of different :term:SoCs <SoC> that share similar characteristics and
features, and that the vendor typically names and markets together.

software component
A software component is a self-contained, modular, and replaceable part of
the Zephyr source code. A driver, a subsystem or an applications are all
examples of software components present in Zephyr.

subsystem
A subsystem refers to a logically distinct part of the operating system
that handles specific functionality or provides certain services.

system power state
System power states describe the power consumption of the system as a
whole. System power states are represented by :c:enum:pm_state.

variant
In the context of :term:board qualifiers, a variant designates a
particular type or configuration of a build for a combination of :term:SoC
and :term:CPU cluster. Common uses of the variant concept include
introducing both secure and non-secure builds for platforms with Trusted
Execution Environment support, or selecting the type of RAM used in a
build.

west
A multi-repo meta-tool developed for the Zephyr project. See :ref:west.

west installation
An obsolete term for a :term:west workspace used prior to west 0.7.

west manifest
A YAML file, usually named :file:west.yml, which describes projects, or
the Git repositories which make up a :term:west workspace, along with
additional metadata. See :ref:west-basics for general information
and :ref:west-manifests for details.

west manifest repository
The Git repository in a :term:west workspace which contains the
:term:west manifest. Its location is given by the :ref:manifest.path configuration option <west-config-index>. See :ref:west-basics.

west project
Each of the entries in a :term:west manifest, which describe a Git
repository that will be cloned and managed by west when working with the
corresponding :term:west manifest repository. Note that a west project
is different from a :term:zephyr module, although many projects are also
modules. See :ref:west-manifests-projects for additional information.

west workspace
A folder on your system with a :file:.west subdirectory and a
:term:west manifest repository in it. You clone the Zephyr source code,
as well as that of its :term:west projects <west project> onto your
system by creating a west workspace using the west init command. See
:ref:west-basics.

XIP
(eXecute In Place) a method of executing programs directly from long
term storage rather than copying it into RAM, saving writable memory for
dynamic data and not the static program code.

zephyr module
A Git repository containing a :file:zephyr/module.yml file, used by the
Zephyr build system to integrate the source code and configuration files
of the module into a regular Zephyr build. Zephyr modules may be west
projects, but they do not have to. See :ref:modules for additional
details.

.. _System on a chip: https://en.wikipedia.org/wiki/System_on_a_chip


Doc Index Tex (`doc/index-tex.rst`)

:orphan:

..
Zephyr Project documentation main file

.. _zephyr-home-tex:

Zephyr Project Documentation
############################

.. toctree::
:maxdepth: 1
:caption: Contents

introduction/index.rst
develop/index.rst
kernel/index.rst
services/index.rst
build/index.rst
connectivity/index.rst
hardware/index.rst
contribute/index.rst
project/index.rst
security/index.rst
safety/index.rst
glossary.rst


Doc Index (`doc/index.rst`)

..
Zephyr Project documentation main file

.. _zephyr-home:

Zephyr Project Documentation
############################

.. raw:: html

.. only:: release

.. admonition:: Welcome to Zephyr Project Documentation for version |version|.
:class: welcome

text
.. raw:: html

     
       Use the [version selector](#)
       for the documentation of other Zephyr versions.

.. only:: development

.. admonition:: Welcome to Zephyr Project Documentation for the main tree (|version|).
:class: welcome

text
.. raw:: html

     
       Use the [version selector](#)
       for the documentation of previously released versions.

.. raw:: html
:file: index.html

.. toctree::
:maxdepth: 1
:hidden:

introduction/index.rst
develop/index.rst
kernel/index.rst
services/index.rst
build/index.rst
hardware/index.rst
contribute/index.rst
project/index.rst
security/index.rst
safety/index.rst
samples/index.rst
boards/index.rst
releases/index.rst


Doc Kconfig (`doc/kconfig.rst`)

:orphan:

.. _kconfig-search:

.. kconfig:search::


Doc Requirements (`doc/requirements.txt`)

This file was autogenerated by uv via the following command:

uv pip compile --universal --python-version 3.12 --generate-hashes requirements.in --output-file requirements.txt

alabaster==1.0.0
--hash=sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e
--hash=sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b
# via sphinx
annotated-doc==0.0.5
--hash=sha256:117bac03a25ede5df5440e855b32d556049ca169ead221505badf432fed4b101
--hash=sha256:c7e58ce09192557605d8bbd92836d7e1d520ac9580096042c0bfd197efacf1bb
# via fastapi
annotated-types==0.8.0
--hash=sha256:13b2beaad985e05e2d6407ee4c4f35590b11f8d693a258a561055cac8f64cab7
--hash=sha256:f072f4d804ea359e4eaf198b1af7a8b0943881a87f31bb764f8bf219bb9419e0
# via pydantic
anyio==4.15.1
--hash=sha256:6152fdbbf9a77fdec97731721bebf7c4c44f7c29b424b0065826173efc7ed101
--hash=sha256:9f28306018cbd6d329e64a36d58256edff76dd996fe423bc957326e578b82a94
# via
# starlette
# watchfiles
anytree==2.13.0
--hash=sha256:4cbcf10df36b1f1cba131b7e487ff3edafc9d6e932a3c70071b5b768bab901ff
--hash=sha256:c9d3aa6825fdd06af7ebb05b4ef291d2db63e62bb1f9b7d9b71354be9d362714
# via -r requirements.in
arpeggio==2.0.3
--hash=sha256:9374d9c531b62018b787635f37fd81c9a6ee69ef2d28c5db3cd18791b1f7db2f
--hash=sha256:9e85ad35cfc6c938676817c7ae9a1000a7c72a34c71db0c687136c460d12b85e
# via textx
attrs==26.1.0
--hash=sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309
--hash=sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32
# via
# outcome
# reuse
# trio
babel==2.18.0
--hash=sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d
--hash=sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35
# via sphinx
beartype==0.22.9
--hash=sha256:8f82b54aa723a2848a56008d18875f91c1db02c32ef6a62319a002e3e25a975f
--hash=sha256:d16c9bbc61ea14637596c5f6fbff2ee99cbe3573e46a716401734ef50c3060c2
# via spdx-tools
beautifulsoup4==4.15.0
--hash=sha256:288e3ca7d54b06f2ac191970bc275c1939cb46d450b255bf6718b04aa37ab4f7
--hash=sha256:d6f88de62e1d4e38ecb1077eb9724cd0eff29d2a08ca16a401e9b9e93f117cf9
# via strictdoc
boolean-py==5.0
--hash=sha256:60cbc4bad079753721d32649545505362c754e121570ada4658b852a3a318d95
--hash=sha256:ef28a70bd43115208441b53a045d1549e2f0ec6e3d08a9d142cbc41c1938e8d9
# via license-expression
certifi==2026.7.22
--hash=sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775
--hash=sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55
# via
# requests
# selenium
cffi==2.1.1 ; implementation_name != 'pypy' and os_name == 'nt'
--hash=sha256:046bfc24911b37851ee1b51aab8bffe713d89c68c6a057b09484ce9fd5f69b4e
--hash=sha256:06c72bb76605a4b0cd0aad6930b69d4baf7dd5d806cfc409b824191099700e66
--hash=sha256:0beceaabe56af686895136a2de78db54ecd8e4046b236b8fd6d6cb61389e9bf2
--hash=sha256:154852545011f779917b11c78db2358d095da62a9a172b78ad0a583ee5adc0d0
--hash=sha256:194cffa889098ced9976c3fc6340305e43f6303657d298da55366907c05c22d6
--hash=sha256:19ee6127ee34de7d83ce3d371ebc5ed91addbdcc39f9ab15ce4eb35a4e534971
--hash=sha256:1a18a57b58cfb21fc28d72e876acf10eaed67a1ed96226f92af4df681d571c4c
--hash=sha256:1aa5645c30469b09530c4ebca77ebf8f17618293c58f8549cb1a543a50236e7d
--hash=sha256:1dea0e4d7d4f11f619fe8c1d76caf49e24405b4b5743c0e3be16a500ecd930c9
--hash=sha256:208f941bb9d18e768138677f0a6d2ce01f590df56043dda1df1535ac57c88517
--hash=sha256:210019b6c7cf07f081b4c54635c8cf744377001350e29cc0f81c4377b4797735
--hash=sha256:246fa40ce8645a614ff682e0b70f37134e460eaf93a775e0cbe3cca585a67a80
--hash=sha256:25792eac27877609e7bb06d42ff88278a6624fff2ba9bbb523c09616b117e80f
--hash=sha256:27350daa11d4f10c540e6e89dada4c54feb7256ad03e9a4dc075ebad7ba360d1
--hash=sha256:28907ab9bfb6aa13184cfc17c6b8e1023c5ab6fd7076d8c20a35e59fe04f8f29
--hash=sha256:2ae64be792b8966f2c69538199728b290e34726562896df1e5dc8ffd8d8188e8
--hash=sha256:31348097ff5bbe827ccc41795d4dd099d9f0625e7def00ee653c137a490c2a6c
--hash=sha256:3143d81e29e1e20a9ce10901ec369012947876596f75a222235965f2b7ae832e
--hash=sha256:3222ba5d678f80a030e6afbcc33dc1ae5cb45facabb61cee2c7016b8432fde48
--hash=sha256:3311ed60d36f83378794e1009ac6258bafbf81f7888b4caa7b35a521e3f95813
--hash=sha256:334644fbac4eff73d985a17a91226df55d0f394160c4cfb880e084c8f7161cac
--hash=sha256:34e261f78cb6ceaaa36f42f2613f4380d94d9c759a9c73c769ee6e0247364632
--hash=sha256:363e05fa78e15116c3c32c210ee36884fd6b9afa6d440e47112c3bd511d64cb6
--hash=sha256:398aff33cee2767e3e781d2554c54bd0dff386bb437581e0d8011fde1a942ec1
--hash=sha256:3d22a20b1fb1632cc72c22f95f7b0d2961c3e1c235f245ba4c606c4771035659
--hash=sha256:42a494cee34437f05546455144f2b5d9ac09b1face62bcfce597d2e521066688
--hash=sha256:42e2f76b9455f5a9a844f770bf3e200ed3da0e15f5df3db9c31fe80b04b3d004
--hash=sha256:42f6930c31dc7f50732c9ae793c2786c7b6b044195967bbdde40bb9be81c4cc0
--hash=sha256:456a61fa52d579ebf9df2e9552ead5129855dbaff6c1e5a9b1bc408809bdc062
--hash=sha256:471cee653ae88de62096552e6d24ccb4a5adb8c8c9f10b5054d0122c15bf2779
--hash=sha256:49cbc70e6542d4ccccb936558d1064a8012541e78f821f955cff24e357776c94
--hash=sha256:4a7c934f7360e8cd64fe9efadcbd10c7c6364f531e432b9a4bf5ccbc9e0e8b50
--hash=sha256:4be96343e422f2dfcd12ab5c9f5aebe03f82f737c6bffeca6830b3875cb44aab
--hash=sha256:4f42141fc14250de6dde5ee7ea4432be017252d91f19c5ad043c084cea629cac
--hash=sha256:507a24c282e0f42f8ed737cf048572cbf580468da5555764a8331735e9c736b6
--hash=sha256:51b31d1c98274844cfd7838ce00bfc27c7423a4dc00fc0772fc3331c2cc90676
--hash=sha256:58acb8ab8e295e6c5ea12f888cbb13cf21511ef2a3303a23f4325c29d17fe5c1
--hash=sha256:5a59cc1c4442bc3d5c703bf720b51138d0bfc173618807c9ee2490a7541dd3d9
--hash=sha256:5bb4e7ea95dcd6a014a6fef62e62467d67d8e582326443f3d68e71d6320a9fcf
--hash=sha256:5c58fe613dc5e5336357eff555824a314d8e43282600435c8d1cb6a7a2fedd13
--hash=sha256:5e7cecbaadb83884793e05828cee59b210b24583b9c7425d0ba6a754fe22eb4e
--hash=sha256:616f097f2fe415bc92a247f02e11f634e1f9e9a83d327e3c915c15089c87869e
--hash=sha256:63bbfd5ded17c4840ac07cd8f1c21ba9d9708141f840b324f422f41b207e3973
--hash=sha256:64faea20f4e2613363a1a9b9c7dd73058f3ecd00133a511e72ad7c511658f527
--hash=sha256:661c298b4821edebead0c91edd2b00374d67ad7c5a1f7a91d4442633b79d6a72
--hash=sha256:68e62fe11f30d5ca8289242866f0a5291402d8529ca2178ab8afc5c9694ae890
--hash=sha256:6a8dddef476fab96d066d578fc88526767b836ab5ab21754e1d5bf3879c31c7c
--hash=sha256:6e192623c49c94421616a5778fba35cf0d5a8d000650c1967ef4448ee5cdd990
--hash=sha256:7225e4514edb64eb6740324353e0da0711954fd8d7da4576755b1c6e09b697cd
--hash=sha256:75f80557d1389eddbd0de2681f6a390a0c5338c31ddaa821381c203fc3fd50d9
--hash=sha256:770de9db11e84213beec501cfcaa013b019820ca881e03344dea5844f7876d94
--hash=sha256:7750c6449dff7864bb9bb27ddfb0267756189201a3afc911d82b3caacd70dfc3
--hash=sha256:7bde5e4cc5c10140859842b9d383af292b22639a4dffb725314baf45968cef80
--hash=sha256:7ce713ace7c0e4520535b42b77eaa742c16dab813978064913e5a3cf82973b41
--hash=sha256:7da0c5eff80f0197f3b3d1232ec5a682a9325f4ae9016a78f5f5ca35f9ced1f5
--hash=sha256:7dbb61fe3a7699468030f71bbe5f8a0e326a151daa91beb11a6fc1f980c55e1c
--hash=sha256:811bd1e21d32de12efca32393a0ab3f5133b54fce9bd44b8bd77ab07da14bf6a
--hash=sha256:8ef53b2de9bcb9197d31854256575d59dbac0cba72ac627bb291ef5eceb74be4
--hash=sha256:937c0052c05a31ca1daf18de3158eed4dbfcb9cc107adbea227728d647be701e
--hash=sha256:9d2055050ea716bd38b7f7f1579c275386646b4894c155a3e2f3cd62ed41b7c6
--hash=sha256:9f8d177621de5cb38ee3e731eda45d421db093ec0739f46a5594babda7987a98
--hash=sha256:a2d7755bef5a12ed488f4ef1f1b69ee9191d7396083b755a5d2295f6edb4768b
--hash=sha256:a48d62ab9d6f4f98c983223a547af44be6ca3691074c31cecced6facd3ba2dc1
--hash=sha256:a4f00aa42f75d6e4595e8866e748cc1705adc0cddfeb2ca86d0d03993d63ba03
--hash=sha256:a6e721d4b0e45d5b65e87534470e67b18dcd092c83f68fba09f152b9cbc061af
--hash=sha256:a730a083190634c65cca36ba5f489531576ebd79bcd5c8e172130f6453127231
--hash=sha256:a931079504ecc49efed7744c476a5c343a92fabf66dec2db95edb1b2fdc770e2
--hash=sha256:aa9511c62d14da7aacc9b4bf51f3f697a621e83b2d6919008243c3aad168eea3
--hash=sha256:ab36d55f9ed2d067327667c2fea18dda018eb628dd6347aa01dda6cf1f5d3836
--hash=sha256:ad2c86c495b899d862ea0f4b42891b8713a3bd45dd4105c7fd51c2a72f39f3a5
--hash=sha256:aeae0e330c9f6acd681f647d46cefd30c29f93e3392882e792e82080c9691399
--hash=sha256:b0431303acaea1089ad4b3e9ce4e6518193def1118d4073ca848635ee4ea2e96
--hash=sha256:b5bdfd1c873d4e093aabc0ca84c4ca6dbc4f752afb5c86f146d9742580c9da2e
--hash=sha256:baed1e86cc735622097354b9d1281406caf42ff42a886d29faa8e8d1630333be
--hash=sha256:c1453022f490d2459a11819d83ad1d586e9ff65a12ac3e705ffebd46d3685dcf
--hash=sha256:c26608d2222fb1e94487e4a387d85f13eb55d5ed725cb25a0c589ac4ee60e7bc
--hash=sha256:c7659f22557c5a0bc4855cd635f55edec690cc008a40768527762cb9fb263455
--hash=sha256:c8c69575568085ba0b1b10c0249d779a214aea6f6522e949a0fc9fb0fcb449d0
--hash=sha256:c8d2c9fd1f2d16f780d15127abb050d13d1a76c03a4bd87d7e4980e45e511e12
--hash=sha256:ca82be1a1d406ecfe1d25dc16cb33488e5a16bf4438c9fb590484ea29d92478b
--hash=sha256:cc572dace3f60ef98d7b12ff411d20f5362feb31a0439eab0085bbfd349982d7
--hash=sha256:d18e5ac0f2f03f4f518d3e23db0f0cad7faa1da8620e9c09461d443bbf6e6692
--hash=sha256:d28630f5854ab07ab1fd4aba756de52326c82e6be15d414b12793f1975048b54
--hash=sha256:d9c275eaacd24aa73f94ffd6de08fc3f932424d8b6c376f4bed7cde376fe7bc3
--hash=sha256:da0e573f9f97159390c89d9f1a9e41908b66d408cc5b58d08cf3847d844c531b
--hash=sha256:dd31f52ea1086513bb9df30f8fcee9b8918323ae067a3d5b78bc826a000712be
--hash=sha256:dddad92b554513a31f272570678ba307fb9f618f05e3d4a5eacafff9eae03e1d
--hash=sha256:df423d40ee8654634421812bc3b196da3f9bd7d32929da813f8394c4348a5358
--hash=sha256:df913725b79db7bcf03448f36b7bf8815363417d5b58deecf9305e3e30f0f21a
--hash=sha256:e0bcb7e0f677f543555d2adff3bf19c05f66cdb4796e5ff602442ab2fe3c4ef7
--hash=sha256:e2d65b31f36619cda3999b78b2aa9632e76b78448e7a56fc4240824200e7c4fc
--hash=sha256:e6e8cff14d6fb0be70a09c0bdc58096f501952d04624ebf867e0e56da2df8960
--hash=sha256:f16c709686a78c727bbbf059f92b0bf41c6fc60deec706d2dc19f529175a6125
--hash=sha256:f24fb43132a4c6b4cb4eb029492919b2db645be6808d738f244fd146c03c32cb
--hash=sha256:f53e442b08449d42821fa4a4fba000095af9f62742a500f978a9f557ec44339a
--hash=sha256:f5cfbc5fe74540d335175b656c725d74d90e3730c626d92575eea35029d9afaa
--hash=sha256:f81b3b8f3d4e343550fa4baa0e479bba9f2d29ce9c2e9b51d1ce1718d7442fcf
--hash=sha256:f8ec5e643a9a937f64e1999eb9f75d072263751912dc5cd06d3c85f8f44be7c3
--hash=sha256:fb92203a88b3d3053034db775110081c49d28be6551923805e039924093761e4
--hash=sha256:fcd22650c908d7b7da162bbfaab594a1227a15d1643a98c68b122ac642fa2264
# via trio
charset-normalizer==3.5.2
--hash=sha256:01077390b03f7988f11d700a2194e69b119741a86b1a638b1db88891e3eced8e
--hash=sha256:01b0c0d2262a9e28e8484a278c7e1b5d650e3ac8cf2683d2967e25899f208bdf
--hash=sha256:04851f73ae72b8413dddadb16a49dfee95263553741fd42d546f7d66907e6be5
--hash=sha256:0521c5665880b33d603717defa76c094048900010897909952397feb3039da56
--hash=sha256:0774bf9bf620249fee3e0b8b9fd3065de213be30f3aa94ce2494b3b638949e26
--hash=sha256:0891b9d3903c5571c03771ca669a4b0ec5618ca722a5c957d3d29cd4e5062848
--hash=sha256:0c951d5e6dd9c2ff60609476752bee49da4206adde960ebc247766937f72e718
--hash=sha256:0fed1d06615f022ee3b13caf5e8b180cfea32bb2c5aded8a9d44277afc040f93
--hash=sha256:114e4d0c92d618409ed82a99e22b5c5e768fe995f2973f78265f4524f49d4640
--hash=sha256:11912e4bb14baae7c5d8791aa55ba0a3a03ec6729073307b0f57270abaa713d3
--hash=sha256:11a4d68a6ecda3292cb1e50239e111543ba5d709bb62a6b4ea1afcfa729d8875
--hash=sha256:124fbf1a8ff966d87ae05bb8bd45a71f966055ed8bba320d0c7cf450bc5f4d0e
--hash=sha256:1461ac396c4fdb983a675f20aa555624f0ee18ac83d832b9244ffff3d8055275
--hash=sha256:1503bccbeb36d5527790c3930327704c39af22de3112f1b1666a9f3ce15ee204
--hash=sha256:15bb4005af6320d259dc7593ca84a38d7fe06a421dbcf7b910ae23979101e787
--hash=sha256:15c44f7edfd477b06f517a5cc317fc1707edb9de2c865f43d4b6513907473234
--hash=sha256:16fa0eccf81304b79c5cd87f9271c3b85dd9dd99245e4422ae9c0dd45e0f99d3
--hash=sha256:183b88127acdb4fabe59d951ab424faf1af7b63cdbb5f776186c1ea2ffcaed98
--hash=sha256:195c26fb65950f8fce54e26349852b7bdd7c5f120aeefbcc440b8a20faaed4a3
--hash=sha256:1afb975bd5d68d5ce9f6b6d44fdf2f7e34b895a35e95708a7a91b20a3b51d187
--hash=sha256:1b4cbc7c3491ccb4aa17fcd8165649d01cf39f76de1696da8631b5f71b85401d
--hash=sha256:1bc0baf5ef96b6ede57d47f4b8fe4d9d84019c3bfcbeb20a41edc6a6ee341f1f
--hash=sha256:1c50fe28bbc2ced33386f298650d91218076c05420e6cbd790b913adc41659e7
--hash=sha256:1db38f4c5496827c1a501846d64d14c3b80c7e6714e406cd7dc36a9899fa1011
--hash=sha256:211d5a3eb6af8f513b8d4ca19a8c1b7accab1b5f0d3175f9826b03c1a920dc1f
--hash=sha256:23851fb4e1b85ed3f6c2a27b777cdfe2e19fb5b38429a8faf38c7542b7665869
--hash=sha256:254eb48b9fa5ee9898a3c445825a1f340fe53712a098904b39b0bddba8ea3cb1
--hash=sha256:2625388c6c754520c37abaf3b41eb34d1cc4a373f457898f08606c8e362b891d
--hash=sha256:281cb91036248400f4cc957495cccd44c275c2e0c5854f7e45ac5cf7dc193847
--hash=sha256:28a15fdad492a99b6eccfaaed66ef3f74050680545ea61ec8b2f4c538f1f1320
--hash=sha256:28b4f0d66fb834ff90f28209ac7bce77868c45d8c93e26f906709d9b7c2e1af9
--hash=sha256:2a925889534b3748302dae5dead07cc13480de1dac3aea80a941b729b471ef93
--hash=sha256:2b7b3bbfb4fe8ef40600792d762fbaa9057559f9d3fad209525b7a22b99e91fd
--hash=sha256:2c9ad19a6cfcd5ea5c0d41161d22f9df1dcc277e9bef2751391334546a314c00
--hash=sha256:2cc961b171b3f3440f410489ab3573e86aea8736134ebbb40ea1338b7f0831bc
--hash=sha256:2ce45c6627b22c47e390bc91a41c3d13032192e699fa0bea96e9671b373d69b0
--hash=sha256:2e06a3a98f916dd41d27f3105e02e7a40181c98c94b9158733d03a6f80506c09
--hash=sha256:304d5463e65a35d7bb0850550e0780395395f6fcf452f04db7d5ca7cecc425ac
--hash=sha256:304d8e4d493af723536393eee0c689eb7813f4a474c8b479dee63f1fdd98f621
--hash=sha256:30fcd120b732aa79317f08dee04d7de0847822e4cf7ee0e9f445bb958832252c
--hash=sha256:31f3930700408d211f13378ccbe1c40845d8da54bd0681fac3a9b5aae81c7aa8
--hash=sha256:34276fd796040bf0993ab33a369aa572e6979c7aab225a88893667ad8eac8f7a
--hash=sha256:355ad8011081dec5412240c087a9a0c9d4d5039f3ed11a3f13e18c2b29b56c51
--hash=sha256:38a873987f3be698494da8b2e3085e29da02da7b633dce73e79c699a113d7bf0
--hash=sha256:39de2a259fc954455c57274dc94c79d5842774e1247a016aff30bc0efed0f4ef
--hash=sha256:3d14b50de6bf4d0edf857a9386836846f982b8f524e188e2e68b96d702bcf4aa
--hash=sha256:3d21b8b13c7592db2ac5e544a6d83187b995257472b0c9e8351b6d507ae37ed6
--hash=sha256:3d31298449090ab8d47b7b1b2a555ff73cac7ed438a08b7ac160980c7ebed649
--hash=sha256:3ddacd27458c45bdacd6bd6db644bfb730efbf9e830310186e3045c9c5be8fb2
--hash=sha256:3df041de8887954562c9b261cba85ca0e9ded74048daf125f45edcfaa4832229
--hash=sha256:40ab6bffa02ae10a0581e6c198be7d2d8ca5c2a0c64e4ed3465d766df457573e
--hash=sha256:4275811936e2f06feff5e598fb42a1b7ae852da8e39605211892b56b81a34efd
--hash=sha256:443eae2bf318abeaf6f15d785138f71fd6de770e99a92158b8b814265e079115
--hash=sha256:447441e76ec720b15e64418d32e092297340387053047c7c694f579efb0ee1d9
--hash=sha256:4495c5002a7b28557e7e222e77e0b661183e432b7d6d2e788101e3f240e05b8c
--hash=sha256:44bd4fbb29dfbeba60e7d2bd000c59e4b21ddb3cc53912b14048d37092706d7c
--hash=sha256:4685902cf26edf013ed7a3da0f426ebba7a00ebb9541386d835afbf002c11cab
--hash=sha256:498dc3188ca05a68231ac3fdbfc7f57eb67e1343c30e0fea17f8218c1599b253
--hash=sha256:4c2b5031f63e331e3839b40aed2dd6f191e9c07edbde303e7876846ea1946995
--hash=sha256:4d48f2d08b9de5864e2c8744d4461b862fb149a18274abc8b698c45975573438
--hash=sha256:4f87960d57feabfb618e4e0af6e7371645fa26a277860739d6e5d6e0012c92f0
--hash=sha256:50e3adfb96fc189eb27b1cf62d3b598b89b4bb0420d93a3d3e42e137409011be
--hash=sha256:51cf45226a9b588d0d2b4880c62d686934b63ab0bd79ca23ab0e9762eb27441b
--hash=sha256:52aa6992700996af31f375de0c6bacd402b0097fe40b53c426b9f51a90ebabc7
--hash=sha256:55ea99acb17b9325618de155a0cd6a2e8f5d10be008113e1d433bbb58db543b2
--hash=sha256:56bc200a365efb37383b7852e4cc5898d3b2da5987289b543956cf8cad71018a
--hash=sha256:588461c2e8384d309bd63e5826019b6977bc66d629b99ac8737bb795d7b2cb5a
--hash=sha256:58ca3755ee7ff7f59b57789ec9833c9de9ea275405cdd240eda1f193112e398a
--hash=sha256:58f361dcbab699cf8f42db3f47c8e7fd1036f138c23a5d08de9fde5f425a730c
--hash=sha256:598a11a2c7ebaa5334bf698bf29568c9c390abac6a154d8170fedecd1cea38c5
--hash=sha256:59f63901b0031c3136cf64704dcb21de0bbae62ce2c9529bc39d27665463de37
--hash=sha256:5cde776b7cc66e4f6c99612cea4aa7269aa65863f7a15841b2c264f103822f4e
--hash=sha256:5e2b6b57e9733d39f0c9fd3185efa6b8e29652c4cd8fe94180272cf6ed9a78c4
--hash=sha256:5fb29fb8cd1a46c27a1bf9613ad5ec2599310d46b4025d9556404a6b6a292800
--hash=sha256:6045373d5a89a5ec71afde535db987ca28e76dfa276c2d4c818265b375d4b055
--hash=sha256:619799369eeef6366ed3e8755a5670f4f2f0fb6b30a0fd7264dc0fdc2357058e
--hash=sha256:62588a277bfb59def052abd940703fa35107152bf479781a878617d60faf8fb5
--hash=sha256:62603db9a7caa0802eaa28c1c46fecd7b3a263a774069c24c3c28c302448721c
--hash=sha256:65cd72beeeca9d3aaea1201e5923859f308f952f9c71de93f06063c79f0f7a3b
--hash=sha256:68eb192d85ab8e5f6ec69c2bc6ac0179fbf04a5ac1569d12fbef74883fe102d0
--hash=sha256:6bd128f206a7752ae1f2ab6c61bf8a24ba28913a10df8b14c2637b973ff97a80
--hash=sha256:6be488a102b8cf28d0391d8c4ba7748938ae28b78ad901f8585520fca33ead1a
--hash=sha256:7218e8f32b0956cfcd048fd42d9d5779809745ca1d86113ca56f66e7ae1549c4
--hash=sha256:7441d755b7ab94f8d4eb3e43ec05482d760842fd263d003a99102d742cd835e2
--hash=sha256:749e97e1b32313717a565abbe321bc2190bc8b35f1a67e4cdbc7c56c8d8ffe58
--hash=sha256:75a3ceed0724d625d64b86ca20aba182e4df462e04c2414fc941c0f523f06aac
--hash=sha256:780fbe7cab297b81dad9fb8dc5eb003c0468ffb0d9e5f65068c53a34661a96bc
--hash=sha256:78456a747de8dc58360ffa581f30a002baf5aa28cb262536545e91f113ed7639
--hash=sha256:7967d08cf06dee78443b874f98c98036f624f3a4e73e11f9f64f5be4d25393cf
--hash=sha256:7a881931aa470808df94a8c380eed2bbbc76cd9dc622310f99665658c821eb6d
--hash=sha256:7dcd882da75ef9adf94903b1e3b9419e8aa8fb4c7396822b834b9ef7fb96954f
--hash=sha256:7e841fb9010836c992c9f12fcbd43a831de93a5f726fc1ccd8ca1d0268c5014c
--hash=sha256:7fdde2c9fd9e3eca40631e024664cf2584272cc8f96308cbe5fdfc930f51d8bc
--hash=sha256:8024d00c3faf3fc0c16e07a69f4405e8eac7cc0ab15f65fe6cf43827c4cf72b4
--hash=sha256:80d02b6f04e92601a081dd97b23d3128033098bff5d35d392ddcc0476ea11253
--hash=sha256:838dcc90063569a0448120554591a1d6c4a4ffe11babf048908793154ab86ade
--hash=sha256:849df64e889b2e17230d58410a03dba311a65b163508fd33679b2b737d4b7858
--hash=sha256:87475fabc8d9996fd9c27debb395e642e8c838d78a00b6e932227a0e06b81e26
--hash=sha256:87e50a3e7cb90af586b6c5faf23e302a970415ac73bd7bd90a515a04b427ef96
--hash=sha256:89b53f3cda69831909888e0494f4fa0bcd3537e3e138dabeb620bd6ad946bae8
--hash=sha256:8a893cc101149f80a653f82062ebc95b34525a2614382e1da5458fe7c6997249
--hash=sha256:8b2bfab86aa71ae13aa41a6a26aab338e0db2b8bc75434b05aea89e011ff35a4
--hash=sha256:8d86d6fc60743dc916eb79e2eb1ec4818e21e427731543af40a3021851174a13
--hash=sha256:915563965d418f986e7e145accc592eae9e1a1be3566ff98a05d7a9ec42a76e1
--hash=sha256:92888bb3187c5ba50500b00b3b310c9f2c651709d28036077680cb5255450a03
--hash=sha256:93223adc95033dd47133a46ccfc316a0139176fd79085762e27202ec56018f03
--hash=sha256:9373ad13ef0d2c0fb761e04e55bfdee5a08b52cef2c882c8fbe9935b1517152e
--hash=sha256:9409a8bf35cf78353942504b24a57de3d75b708997a1e4bd8db71ac8633ce364
--hash=sha256:9b7f416ff0978e2f2249330527f0ad6fa02f4932e6199692d3b52da2048c19e4
--hash=sha256:9bde855991b7e362c146535e3136a50bfaffc0487d38b33ca7e5edefc6e23849
--hash=sha256:9cae88599c7219005d879f98e5ed53341e9a122af585e1091200358a3003d2a0
--hash=sha256:9cf9b1a857e25c4baceeb3624e92a56df3668f398c4acba74e174d81fb4d1d3a
--hash=sha256:9f56f72050826f63dcee7a7f55b0a77168cb3bfc553fd405e7f8f9ece75a4036
--hash=sha256:a090bb2c68df85450502e3e20d665e3a5af9c65a84d6508ed477badd49166fd3
--hash=sha256:a192e2c40070d92c3ccf777e3a5c4ff515573cd2bb7ed0c537fdadbbec5bbf21
--hash=sha256:a19a731138fc27d5682277d3b9df22855cea1239bce7fcec5f78f42ef2d1f3c3
--hash=sha256:a66c3bc5ab1f0ff2164fc9965ddd611ff0802173f4b9d24554c563f6ab7e1d6e
--hash=sha256:a815775b6c38d4e0ff7bcffbeba67feded90202bb6a226b8dd35f1c855217413
--hash=sha256:a89012d6d5476ee112d20d998570ed58df2260a852afb1758809cd6900411d21
--hash=sha256:ae4f5fea5b8b8ccff88238cc8569303e5ee95efae67fa62922a311397a71f346
--hash=sha256:b6856554c4f44d79fc2307d5768854310a8f0096e501c75637542c82292b0429
--hash=sha256:b6b751274acb69d77b3323d6b7dbaa3c7fdfc1eb829b7eb61d262f32e1af9685
--hash=sha256:b736353c0a625bbd5fcec108576e2385db3496f4f771f785ff32e108d3c3bc45
--hash=sha256:b7fd005a73d9e657273b7a10dc71a9e03c8fb9ee6999798d6918ce095b81ac7f
--hash=sha256:b91363207bd9dc966a691e959bb47f64b30f7ac4b072be9968b366982f7db77c
--hash=sha256:ba0b1d2620edf869789c3879223f52bf2afc5d31b3cb47cc57b3a12c05e2aa9d
--hash=sha256:bbbfc8e28816f19d7c0f1816664980c0a9875d01b27cdf8eedddb639d9e108ad
--hash=sha256:bd16aabe4a02a297c23417aa17ac6299dbd8c49f673bcd645b4929b11f5a4400
--hash=sha256:c0afc6800ba57ccc350374c5bd6150419915d95ce93cdbab2d783d75eaf30ecb
--hash=sha256:c6708715abcf3c73b99508253e961a9967f02fe536532834149574eda6de0d1c
--hash=sha256:c7c9ab723cde841fefb34efbad91e87f00a674b1fe1cd0784fde742bf2c154dc
--hash=sha256:c8f3d67aeaf55f017982b73683f0e7342ba2f6635a78f69ce89ebb26aa411e5c
--hash=sha256:c9790464842f85f437dbbb54417eda1e0e6bfc52dd8d22d6fd1c994b73b2dc74
--hash=sha256:ca403d7e4798f525fdfc78e258820419cbbd0f0ecbab9de7840e3c017cf6b8cf
--hash=sha256:d008d90a7f2471519aef0c90dfbe73b3e6e4d5e66ac48e19154c17e89e98b604
--hash=sha256:d19fbd981a488e22cd04883659ca6b08f50b5974f9fd7c95655ef6a043e5893f
--hash=sha256:d1befeed746d247c81127bb14de9dc3d30edb6e5976d34f83f86ed262b1d9105
--hash=sha256:d2374b62878abb00cd8309b32af6c0b715cd02dec0ca74ef12e5069bdc64144a
--hash=sha256:d376bbd28b3a8999db1a103b3b388aee6f1ddeb3e51bc2172993efdcd86e064d
--hash=sha256:d4a7319f304a774bed22115bc891618e45f85065ab44ea6acd07d274e750519a
--hash=sha256:d6734d2ef8a50fbf8445c139477da401f50d62a0606bf00e20ec6d87773fefb1
--hash=sha256:d760fe2a4d7c3b226cb9026d6a842868d52a7901bd98420e1baf14e80da85cf5
--hash=sha256:d913de495d90407cd859d263bee2e5d1a4ed3eb6573c04e70d9ec619a7cbed7f
--hash=sha256:db19d07e2e0129e974a0e65d0064fc222a446cd5122c2fd4184d2af9fc734a9e
--hash=sha256:dca9ab98072a5a54ebacebdc45f53e645336b320c667410b061be1ca588ae709
--hash=sha256:ddc7dacc8ece3a182e7f15cb862d1fd616b46d076cb1ae9dd232b2c38b655874
--hash=sha256:ddf19c062bea7a0cc80f519243d2c01dd091be0cf952a0750d4ad576709559f5
--hash=sha256:def79fa35ef0cef8d2accec024f4fdc7ead3012ff02f5215c783f39f03ef8cfc
--hash=sha256:df29a0a7107f7011e77f4eebdddec4c7331e24d787a0b21a46d63bdf7445da95
--hash=sha256:e09a3942ecbdee5cce73ea9d42da82b81b72ac1bf031ce069b93b5adf4eac8cd
--hash=sha256:e242bb1c5e76e97dfa9e7f209a71e93a01d7f19ffdd5cfbb2e2d55b4f08f8ab0
--hash=sha256:e243bd13217235fc7290c621941c3f5cc8b66e4872495be821d7436ba2fb838d
--hash=sha256:e2af3aad578aa6bd1384bcf4750fc285e5a9de53f40b7d41e5a0bf748edeb2b3
--hash=sha256:e4e81e09c1578b8df602e3db08b0b3ea0a6947ad612f52bf8dc5ea8d47691f0c
--hash=sha256:e54da4baf05720032d527874d40b65fa4d7e5c6c6a43d0c3adbeffcaf275a2b3
--hash=sha256:e80e6c2f55656b4824d72065abb4ddd6a525c74bd78a0aab5d9fc2cf4fb5af50
--hash=sha256:ed2a239c0ea213acc1908150a3037257083c7c083128f1a4cec2ec4b97dca491
--hash=sha256:ed905975ab14056a2e5eb1c376cb2e1ebc5396baf84163939c518556fccde9f5
--hash=sha256:ee21e28f0430bd6dc9086c6e525d5e818a44a5ad19720c8a0ef766792f3eb5e5
--hash=sha256:ee43c17b173d46a3212baa6ead3ae258eeabdae48c263a01ccf0218c366dd655
--hash=sha256:ef4fcbf3327382cd4c9f540babd61248208af7b93eec4de397b4d5f58a09e288
--hash=sha256:eff0ac9dbe711a4aee69bf04a83896aa9b85f19641264053a9f6d48573abb7dd
--hash=sha256:f0aa869112ef88429ae17820d99c3dd9504c9e9c671d3c246f3d7442cb051084
--hash=sha256:f3c96f633825733f735c5a9cf21d21a257d8e1edf0b1cee0a064b9c424ca0f7d
--hash=sha256:f5833ad231be5eb6553de524a70f48d71b2c8563101750531e0b80184e175cd4
--hash=sha256:f5ec61164adcec446f8969a3358ec3f9b26bbda3b9213e5586d219afa8df2915
--hash=sha256:f7d486c83842422badd511868fd8a9a20e9407ace71564b6af47ce7e60a336c1
--hash=sha256:fb9e68df06293761f9fe66ade60a9bc6d0f5e42b8acf2939a9158af86ab0e5bd
--hash=sha256:fc14a032f813bf5fe624d991960ea83e9715adc27e4c1830a2361eb1d02ac341
--hash=sha256:fcff63213e8e6e47770541a4607175404f47cbb3ebea7b6058cc82d524a0e424
--hash=sha256:fd1fbe0f116b6e55da77aca2c6ddcddcfac2186cbf78bdebf40fc156efca389d
--hash=sha256:fe9753dfee015c570d73df76f899f18444d41388bffcde097deba51c4fadbb9f
# via requests
click==8.5.0
--hash=sha256:255bc9599cf7748b4b1a446ccc735421bd08a2ae529a8b88597d3de5664ee360
--hash=sha256:ba0d2089de75ea0310e2dde03160e6ca10009947fb95a182f9b54021bb272e34
# via
# reuse
# spdx-tools
# uvicorn
colorama==0.4.6
--hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44
--hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6
# via
# pytest
# sphinx
# sphinx-autobuild
coverxygen==1.8.1
--hash=sha256:d1c2f6569e8df8823ae313b1f7876e88ff20b4372c6d02f04c51fb5dc424576f
# via -r requirements.in
docopt==0.6.2
--hash=sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491
# via pykwalify
docutils==0.22.4
--hash=sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968
--hash=sha256:d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de
# via
# sphinx
# sphinx-rtd-theme
# sphinx-tabs
# sphinx-togglebutton
# sphinxcontrib-programoutput
# strictdoc
doxmlparser==1.18.0
--hash=sha256:ade561ed7153a53b6f4f7c20d4d66d774e40a3a14170b4d3b700b191e5248865
# via -r requirements.in
elementpath==5.1.4
--hash=sha256:3c912a9c41311ac5244c038867670d7c0b0fec0e444813608e5b846dbb3428ac
--hash=sha256:5ec8d7bb44b16c98414a6a95e20cb150f3cbfc3cac65edc14773288c7a937376
# via xmlschema
et-xmlfile==2.0.0
--hash=sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa
--hash=sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54
# via openpyxl
fastapi==0.142.2
--hash=sha256:06366626f2e70576367714d9ab2fe8472e6c8456dba69b399f9f797ab5e92570
--hash=sha256:bd5f4d81f1e93a88bcd77caf4dfe3c2dbffc3805407a0007e9a114c18b3a670b
# via strictdoc
h11==0.16.0
--hash=sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1
--hash=sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86
# via
# uvicorn
# wsproto
html2pdf4doc==0.0.35
--hash=sha256:747cbc228295049405288801416b46558a7bed50664b12d9fd1635221864c56c
--hash=sha256:8b35b58da83b300bc6ab1eb556ef5ec703e27bc79ec2c1ffeebccbd56683544b
# via strictdoc
html5lib==1.1
--hash=sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d
--hash=sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f
# via strictdoc
httptools==0.8.0
--hash=sha256:0770728beb05094c809b98e814edff5fef69d26ad7d21185f2f6d5884a0ba683
--hash=sha256:0ea897f0c729581ebf72131a438a7932d9b14efef72d75ada966700cac3caaeb
--hash=sha256:159e9ab5f701ccd42e555a12f1ad8ff69702910fc1c996cf2bb66e5fcb7a231b
--hash=sha256:19d1ee275bb59ba2643ba9a3a1e51cc0c788caf2b8df506368e03f56fdd08527
--hash=sha256:20b4aac66ff65f7db06a375808b78f42a94970aa22e826b3cb2b43eb09174124
--hash=sha256:2a021c3a8e65cc125390d72f59b968afca3bdcaff25bd67965e0a055a14946ca
--hash=sha256:2c032fa028f46871ec7e1fc59fc15e8023eab3e6bbe6ece786a1611719a5d081
--hash=sha256:2d689918c15a013c65ef52d9fd495d766893ab831a2c8d89f2ac5940a5df847c
--hash=sha256:384c17174464c8e873398b7af24f0b1f44d992c820328413951a625323155d77
--hash=sha256:425f83884fd6343828d8c565f046cb72b6d19063f6924093e11bcd8e1548cd09
--hash=sha256:48774d39cbb70e2b1f71f88852a3087ae1d3a1eb80482bb48c13067ab080c14f
--hash=sha256:52dd695b865fe96d9d2b16b64a895f3f57bf3cb064e8383cd3b5713a069e8085
--hash=sha256:57278e6fa0424c42a8a3e454828ab4f0aff27b40cddf9679579b98c6dce6a376
--hash=sha256:5931891fb7b441b8a3853cf1b85c82c903defce084dd5f6771ca46e31bf862c5
--hash=sha256:5d7fa4ba7292c1139c0526f0b5aad507c6263c948206ea1b1cbca015c8af1b62
--hash=sha256:5eb911c515b96ee44bbd861e42cbefc488681d450545b1d02127f6136e3a86f5
--hash=sha256:614ceea8ea606848bece2338ac03b3ce5324bcb4be8dc7d377ed708012fa4db8
--hash=sha256:6a43c9dd399758ccc0531acb0a3c4a6c299ee893ee9400e9c893b7bdcfae0681
--hash=sha256:6b2a32f18d97e16e90827d7a819ffa8dbd8cc245fc4e1fa9d1095b54ef4bd999
--hash=sha256:7685df791fad561384bfb139e77fde27a1ffd93134e016f95a0db424ffbf77b1
--hash=sha256:7b71e7d7031928c650e1006e6c03e911bf967f7c69c011d37d541c3e7bf55005
--hash=sha256:880490234c10f70a9830743097e8958d6e4b9f5a0ffc24515023afeef984054d
--hash=sha256:88bdd940f2b5d487b4d032c6afa5489a7dc4694410d43de3c38c4fb3af0dc45d
--hash=sha256:88eead8ec8680a9f146c655bc88445a325bd7921cfd8194c7337e9467282427d
--hash=sha256:9518c406d7b310f05adb1a37f80acabac40504a575d7c0da6d3e365c695ac20d
--hash=sha256:9878eb2785ba5eb70631ad269b37976f73d647955e26c91d490eb8a4edfda4ba
--hash=sha256:9fc1644f415372cec4f8a5be3a64183737398f10dbb1263602a036427fe75247
--hash=sha256:a1afd7c9fbff0d9f5d489c4ce2768bd09c84a46ddefc7161e6aa82ae35c85745
--hash=sha256:a1b4c8e7a489a0d750d91894e9a8cdc295838f1924c0ca903ae993456fddec07
--hash=sha256:a3b7387147361c3fd47a0bde763c5c91b5b4cd4dc9989b8ece84ff436c99843b
--hash=sha256:a6f21e2a3b0067bbe7f67e34cfd16276af556e5e52f4c7503be0cb5f90e905e4
--hash=sha256:b15fc622b0f869d19207c4089a501d9bcc63ca5e071ffdd2f03f922df882dcb2
--hash=sha256:b205e5f5523fa039679da0dfe5a10132b2a4abeae6a86fdd1ddc035f7f836557
--hash=sha256:bbb8caadb2b742d293169d2b458b5c001ef70e3158704aa3d3ef9597624c5d1d
--hash=sha256:bf3b6f807c8541503cecfbb8a8dffb385640d0d96102f3d112aa8740f9b7c826
--hash=sha256:c08ffe3e79756e0963cbc8fe410139f38a5884874b6f2e17761bef6563fdcd9b
--hash=sha256:c0d726cc107fceb7d45f978483b4b70dd8caa836f5914d3434bb18628eb73813
--hash=sha256:c4a9f1707e4823d54dfec6c33fa3697d302aed536ed352a7ebb5a061ddb869d0
--hash=sha256:cd96f29b4bab1d42fa6e3d008711c75e0f79e94e06827330160e3a304227f150
--hash=sha256:d76ad7b951387e3632c8716a9bb03ac5b45c5f16119aa409db0459520887944e
--hash=sha256:da684f2e1aa2ee9bdcb083f3f3a68c5956750b375bc5df864d3a5f0c42a40b77
--hash=sha256:de1ed58a974e75d56560acc7e7fed01a454994429456f65209789992e41f2568
--hash=sha256:de242a49b5d18e0a8776e654e9f6bf6d89f3875a5c35b425a0e7ce940feb3fd6
--hash=sha256:df31ef5494f406ab6cf827b7e64a22841c6e2d654100e6a116ea15b46d02d5e8
--hash=sha256:e93c227b595c6926c1acee96891dd9da4be338cfbe82e5cd3bb9d8dd7dc4ac0b
--hash=sha256:eb3028cca2fc0a6d720e52ef61d8ebb62fcbfeb1de56874546d858d3f25a26b7
--hash=sha256:ed377e64805bdba4943c82717333f8f8603a13b09aff9cead2717c6c817fb168
--hash=sha256:ef7c3c97f4311c7be57e2986629df89d49cb434dbff78eafcd48c2bff986b15a
--hash=sha256:f256d6ce930c52ca1cb2a960b7da03548c454e7d28b06059ad41bfe789036ce0
--hash=sha256:fe2a4c95aeba2209434e7b31172da572846cae8ca0bf1e7013e61b99fbbf5e72
# via uvicorn
idna==3.20
--hash=sha256:a7db850025b95ded1eae8a46181a1a6c56c92c96f0e2b005d9ff8dc0210cab44
--hash=sha256:ab7ae7122974553370f0bdb919e1a960b2cd1bc1ef0276416d896db81c14582c
# via
# anyio
# requests
# trio
imagesize==2.0.1
--hash=sha256:b2ba6a4dea487a7ebcd53248d3476aca449d30db12a2dde5e0c5ca9624fd77e5
--hash=sha256:ea0c9a0384df69ed86a943a15cde37d0360b82491b3910dc2215e202e62b5b02
# via sphinx
iniconfig==2.3.0
--hash=sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730
--hash=sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12
# via pytest
jinja2==3.1.6
--hash=sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d
--hash=sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67
# via
# reqif
# reuse
# sphinx
# sphinxcontrib-mermaid
# strictdoc
lark==1.3.1
--hash=sha256:b426a7a6d6d53189d318f2b6236ab5d6429eaf09259f1ca33eb716eed10d2905
--hash=sha256:c629b661023a014c37da873b4ff58a817398d12635d3bbb2c5a03be7fe5d1e12
# via strictdoc
license-expression==30.4.4
--hash=sha256:421788fdcadb41f049d2dc934ce666626265aeccefddd25e162a26f23bcbf8a4
--hash=sha256:73448f0aacd8d0808895bdc4b2c8e01a8d67646e4188f887375398c761f340fd
# via
# reuse
# spdx-tools
lxml==6.1.3
--hash=sha256:032a0a97eed428bd143c75a11118238546424ceb2fa311cca5f073aa44658dc4
--hash=sha256:05f5bce9af14fd1506997594bd81cee6d9c6b58ea80a39c058327aa6371ed9e9
--hash=sha256:0794e04ba343852c6d78e996c58ef4b8e579b4ecc72f8df0d4058bf843b4c96e
--hash=sha256:0ab2467e405e748d93495fb5568e74044802b8d3ff2b2a1607c3f78c6e982de5
--hash=sha256:0bf5a3e397df2ec4258eb5eea4c1ac6cf013ca1abd04a176903bff20a70021fe
--hash=sha256:0c0710ac085a157b593c38fbcacd950f15c4afa8e2057527185875ab302752bc
--hash=sha256:0dee106e9aa97fb00541b1ed7827070564d0549c3d3fba8920e6b20fd980f748
--hash=sha256:0f17d83c48ee9dfd96abae3ac3e2108c76d2fc86ce96355e37b8da9f7f4ecc08
--hash=sha256:0feebef8d0521188d0157f758356072e840173aa61ca45b8b3f87959ac283dd5
--hash=sha256:13a620a3fcc20023f9e6ed5c383e00e826f1c2d5db554df2f67240760f9118e8
--hash=sha256:13d22c0d57355366b393936acf6b98a5e0edeadddd3fccbc6a846c50a76b8741
--hash=sha256:160fcf381f76c3aeac28a756bec44f48942a8f7245a87aa28e3a523b4d90cd87
--hash=sha256:16148acd77ed1d8836a56db883af2f5eed720f9723088110b16a0d08582130a6
--hash=sha256:170773d8a3cdc76259065523ddd978c44f9806e28605f08812e8f86783e44ac6
--hash=sha256:18293f8a8d8b6a8e71ef37706b659e3846a4261232158167b1ddf35f6994f633
--hash=sha256:18a4db52b5a7b53a3540b0b0f4123319334621ee8083d496de314d0bf06ff59a
--hash=sha256:1a635e837b50a1819bebfedaac5916498ea024120969da8790500148fb0a894d
--hash=sha256:1aeca87830c4fe649dcf93fe2b059525b71c72587f21be4ae4af7103082a79fa
--hash=sha256:1b7c37339d7e75cab9a123a04248e243cefefb302ad6db566ea0c77cbcde421e
--hash=sha256:1beb0f9909b26cee938df9ba56b15252a84429b1fc30ce6fca161390b9789a70
--hash=sha256:20384c2bbcbf87180c8c61eb60869699c1ec0cd09b62cfd13804022d860b0867
--hash=sha256:20428910dae17a1a93152a3ff2c0441d2f4932992c0797d65651dd0561f1792f
--hash=sha256:207dfc3d47cf0e575e643bbc140dacc8863b39abaa1e5307cd64c7f2365b8a12
--hash=sha256:209c3ccbfe35a04ac6d24f0611f9d1cbf8025d49991b14acd935236234d6c156
--hash=sha256:2123e5aa075ac20d23c7af489255efd129cbfe190dbe88fd42598cc9df3199b6
--hash=sha256:21402998e4b78e7cce237d2788841aaa21ac9a4d1574d04dc2d12ee41ae807b5
--hash=sha256:2221e88679d1351e9a40aaee54bc65679b9795bbd0160bc3d5e36b163344eb75
--hash=sha256:22eec57e26c418cde02c051ce9914a365e52a7f135a565c6f0480242aeebab48
--hash=sha256:23c366231259cd75ad06495174701afb3fcb36a92917fa47de2d1f1bd9d95739
--hash=sha256:25f4118c438f96bb466e83108506d03d5c31b1bd2387e83e5b070bda6ded9c37
--hash=sha256:28a23fefdb345b2d4d0ff2860571b5ff9a89a28b6a120f720e8fb0324d346626
--hash=sha256:290f66b97ede0e552e1cb44a0fd8a74f9753ee635b50830a0b122fb72788d015
--hash=sha256:2b9b1325ca1c2a9a2dbb6eb913ae563313f2082ae60b03210f7e83ee80712274
--hash=sha256:2bec13085dc8ef48a3fe62f7dfcacfeda2c785cdf19cc8eeda2bb9ed081da165
--hash=sha256:2cae5d5c90a62d9139c512a0cb1aad1d182b022b5740daea2617eb5bf7fc658e
--hash=sha256:2e01125896585139453cab8cb235893644d8815d7509520da95ae3ee8d1c1f79
--hash=sha256:2e62c569ec7531b679b184cbfe335c501c1d13c4b363560013019962eb630e6d
--hash=sha256:2f5b2a2b9811b853b39bfa41367c6d78747b8e3e80e07fc5a24aae295c1a4d7d
--hash=sha256:302f72413251c03f671e063c9414bed5dc8c927069e5abb69245521e51a4e81b
--hash=sha256:32a409be3190b088f960ac92bfedfbef2f86c49ff940765e1548177592d20026
--hash=sha256:33cadd956b667997e4de1635fce9541f2e8ede2038fcde8cf55aa14d571d1bad
--hash=sha256:379f8a75cf6eb7eef0af074b55f49ab73b868388a98de14646abcdfa4564bb11
--hash=sha256:3847e71a78cbbc1aff955dbbbaf2fff12153f611d3162c5beaa3395636cbc2f9
--hash=sha256:38fc4e4e4e084e0bd491949482527d406788045c546d4f8789e93fc527b91385
--hash=sha256:3a27ac6c780c8b8a1cd231b58407634cafc1c4cc28cd6c7141362df0f36351e7
--hash=sha256:3a48093cdb058a93af842ede9703520e810b05dcd0fc6d7190a06376c3bfb6bd
--hash=sha256:3e42265103fb385d8642a78672edf376c6f7e1d3598a7a4f9cb1278f2f6b5f6f
--hash=sha256:3e9a00d1c2c30936f7add097c41afc5da6556c580909104aafd382cac92a855c
--hash=sha256:40983eabefd13da003e68170928c7acc011f0d095eefce5871a3c71c9385fb9a
--hash=sha256:40bcbd9f94166ffe925811e730607385cec959f42fb1bb7dad83748680465221
--hash=sha256:41096ec0740a58dad03d3ae0c7486d306d20becefb13ceb1649835ab3eb64167
--hash=sha256:415e3a115c0d510e329020012834d1c0aa1c581ee53a218603e38abbc1dea70a
--hash=sha256:41e2d428110b408e963b6fb18f9bbf1f5c027b56bd4b498d54556476c0aeb1c3
--hash=sha256:424aa5657141d306ba9ad1baab4b2c0a0719040075ee6c66aee9bb2dea2b5054
--hash=sha256:42632b4024ab24a6b488f559ac851312509888b6b80ae2aa11cf29a646a0d245
--hash=sha256:45222d94ddd511536f3b2f7d9deae3b2339b4ce0f075f1ca25703b07cad9dd21
--hash=sha256:4736e6c87e603146d8949d8501da621ad20c31015060d3fcf95ace2859f3e3e6
--hash=sha256:48542c9acba9ff9450bd18d871d2c2c8787fdb283572b623d206f1b927cd7d9e
--hash=sha256:49fbc2682a9306135b7ec49e93f97f9c26689b9b7f96ed2742d8d6497e994d13
--hash=sha256:4a579dfb9c835f8ab47f4b8ed33440cbc75b806b73297208e6ec2a33e903740b
--hash=sha256:4b061064b4a2fe8598a466d723d43dbcd5a610a5d5cfe02fb6226f5c17349f75
--hash=sha256:4e11e885e0704be185867fcf71b904d8f65d7d6877bc121f69870b0d0479ba7b
--hash=sha256:4f4db7c7e954d289d71878938348b3d91b904a3e8210a11939359fb758a58e7d
--hash=sha256:527195c188d7d0af748cd48d220ab8cdc5cb99be3d49ac4d9be7324d8abf9bc0
--hash=sha256:53258656846f5c48996b882fb4b135885e088a3ad3d96b4bc0530f95124d1f69
--hash=sha256:545ccc14fb05485f48b4439ec35beb16d5b5280eb6c81c658bd4707a2a119414
--hash=sha256:5609efdb0d3c95499c00046bc53648b3482ec2175b5503d6e611b3f0555dc71d
--hash=sha256:5929d9df5e7e3379183be0e21f7d559618a5b61cb63280df6164019242e337ed
--hash=sha256:5a143e6207579de8baeded4eaac9134413200359f1969d636f0bfb98ee8c3c8f
--hash=sha256:5a721a98c649855963811b59b55755b30566e7f7fc40bdc9803d66dee9f811cf
--hash=sha256:5cffe18571ccc51d742cd08cbb3f8b756de9311d18c7ea98f5d92f37b8fb60c2
--hash=sha256:5d12669a2c419b0e8dc423d23dea24bb82f6f9cb829f32e04674b0ba40322a7c
--hash=sha256:5d582042c69857c364e8153de6e18e0da9b7b515a6a8113caf69a6ec8e0520f2
--hash=sha256:61116cec57ed69aebc70f37a545eec095339bb829efbdabcfb97c51e9536e158
--hash=sha256:611a51e61c92f62345a50b0035df6fc0d678f9299f33728826d831598862f59d
--hash=sha256:623c8799c17128753c65699f1c3aa32402657393a9ad6db09ed8b98ddf76611d
--hash=sha256:6374e9e382e5a98c9c5e66d41b357b470da1c54bce30f17f9dc4bcc58436cc1c
--hash=sha256:66299564c046bc7e0cc5de5106601eae907e9fa5904cd68a323380a8502f7861
--hash=sha256:69cafd61aea04ebb3502c93c2aaa568b12931ca0802231e0b5de76bf8b6e74bd
--hash=sha256:6a406d0b3cb207b0fa460ed4dc93e866f44f105da0169361cb18ff998a44c7f0
--hash=sha256:6ba4fe5bfbef6811a8e49b3719cde373ad399006c0c1ac184b7297116ecbba5d
--hash=sha256:6cd11e7550d89e551a87dcec30f04b1fca32e86b68708aa01a4daa455d8605e5
--hash=sha256:6e1eb8a4cbffd5553680ad96be6680e364710656eced73d1dc90ec489df599a3
--hash=sha256:6ea2f13dce778ca072ccee598bca46a092ce192e8fd907b6c1f0e52c800529a0
--hash=sha256:71532ebf30be0048a45559b4fab15333fbaaf9042f658e878d918ecd0cf09805
--hash=sha256:73fc05988ed20809450474ba760a87c8ad4e455fc09783c02195e56ec634b41a
--hash=sha256:75cc6569e86be5785b6188ef1642670c6adbc984e81ec35e224842ecd9eefcc8
--hash=sha256:773062aec2f2e56b2b22d37054123f0de8a22a4688a0c3376c3fe42685f975cf
--hash=sha256:7ae4949f212a53b007dbc355884fda122545c5764a54256c9217e419a62a6559
--hash=sha256:7b2bb7d703bed7ac893bf7f40d97b5d9279d35d2ce460624ca28929eab0d5a3d
--hash=sha256:7d0f5976aa2701996f759b30172925829867547bb073af0ae67d1307a0f0262c
--hash=sha256:7d5a748d12dd9b535e0a130f60dae9ddf0adafbabe61e7864f55c7436c84547a
--hash=sha256:7dd624c1eaa629ad44b59a1a0145fdf2d67895592dce94c9358b938b3d075e65
--hash=sha256:7f75b9b9fec2a9c6b18095c81865580e795b1441c429e42d22fcc82a77f40039
--hash=sha256:83e3a51e7933db700a0da0db31849db3a24022d9970da9bb73001e1d0326fd92
--hash=sha256:8499d464de86fab0f102313cce32a9bed9ab1f06ec813cf025cb790964fbb765
--hash=sha256:869dfcd4d381cb0ea87085cc4f011b9171b494ef21e76ad8665f6d5e2d1dc8a1
--hash=sha256:8753b8d51dbc86fd335ee31fcf7f3658e9f5c016d4edfb23f76ad295f4b8c9d0
--hash=sha256:887c021d9a977cff89cb273047c1352997b772a8908a25c21836861f69b92be1
--hash=sha256:88e719b9437f148f7e1465df845c758dd1598618cbea3a2fd1e61a715542f2b2
--hash=sha256:8a330c0ee5fa318c7b5cbbaad882baeca3f570357e7eb25ab34bf31008150758
--hash=sha256:8db38ff3fb7aee7d6a82ae4da2eef1178656fe1216841fbd24870062a9d60473
--hash=sha256:8e49a646acfab83c68974f4aa1d0a2acca9e88d7d627ae0fc13201b14b76d310
--hash=sha256:909f4e927bb051f7740d6367285fc60cdcfdaf0258c2dba4ff5ba7eadadc250c
--hash=sha256:90f709b9accab6b2e4d14f5c8718203877a0486bcb3afd74d8b539ecd1e961d4
--hash=sha256:92d96586376fb79a33474797186bf993250152ee5c32650b67db78d54b92e6f3
--hash=sha256:93476b6514b373fc6ca67d26c442784f7807c86f00635bfe79f935c3eab2af17
--hash=sha256:97acecb11cbc411473f15b8d780df06d7a9f3a2aad9aca78364f56640c8fb70e
--hash=sha256:97ce49699d87ebf8aad631b55d65b33219a4f1bfefbbf5bff19dc9af160aeaf9
--hash=sha256:9bde9ae026a55b9a192078dfa6e27dd0ca4a050171ab6272e92f97b757dfdf48
--hash=sha256:9e67324961ac9bbe616cce5100514d2e34d88665aeb07071e8b16eac55d06d94
--hash=sha256:9efe56a68179f3adc4de41861c9358931db03837c48dd5e1c78077b84dd07f3a
--hash=sha256:a1932d7ce78a561367512c594fe66eac2b2ec9b9264cfd9b5f950622f4a116e2
--hash=sha256:a1cec0f99b9b914d39176347a93b7610dc09324491aee1cbc57cd291a41a1d55
--hash=sha256:a2e3f70673a1d5b82f38255f777d26cd855bf2092b1436c4867464a7892f9238
--hash=sha256:a43b3bdf11e477dc7770609d3477316f974354dfc8425d596f64f471cc8daf6e
--hash=sha256:a5c18810318303ce9afb3f95e2ddb54834f96fa699a8600433fd5a93dcf44c56
--hash=sha256:a7eb78ba28b187e1e9203a55c60fcf70df2d22cb205fe6d51b9383d6097419f0
--hash=sha256:aa633613ff907ea91b9b0489a1f0da1b8725d8c6ccec6b77e8a1c9c235044bb0
--hash=sha256:aa9fd1ee2a5dacfc41039ed49ffeeacfa75bafbd255b69f3b578e11897a0e623
--hash=sha256:ace1d2c83b2bd24db5940600541140e87a325e119cb32d5fa9ad720d7e76648e
--hash=sha256:b1cc980905221a5d8b3c476330730b3adb40ff80add71ffbdb6215ba055656f1
--hash=sha256:b37772102d44bb6628186accca3a121b1fa3a6b3d97518a8c29a5229ca4c0d0a
--hash=sha256:b3ff39654f0ce6ebd4db154211136dbe7e8157bcc3bed2344c87f32c7c6ecb6c
--hash=sha256:b477912f42c5c33405a10c759d22f80cf5af043ae02d95b9d8e5e5bc555739ed
--hash=sha256:b49638355ea3bebba70da783ccbc630fd72afa16bc46c54474bfa1f9a915bbc6
--hash=sha256:b4fc6b03b9d9d90557274f571ab30e7fbbfc527955536935d96f98b6817a86e4
--hash=sha256:b50343241eb69fd85f7791cf8bcc7b1c4729826b7d59ba2f6b27db29638fa745
--hash=sha256:bc8dd3d9c93e70c3df974a201ac2958b6d77b465d813c51d1f15fa8e645763ae
--hash=sha256:be5346653c0b0e34be96869ff9dbeba23860156f89a2896a64c64fb419260cb6
--hash=sha256:c00e26288784460885fe76e4d4b293573e0f791f52e6d60e27b42edf005922eb
--hash=sha256:c1b50797ac246bb2942a04b6c0f69af0667aba7cf7535f39bbb1b3208fd5d128
--hash=sha256:c34ca1dc41bd86d9ff830d5bdf4e4a752bba6c54f7d2707027ce0eabd36084c9
--hash=sha256:c55e71a9b1db1f107efb60da49c093689b74c5c31a708e5379e2fd9439d4fbb5
--hash=sha256:c581b1d68b3845fb86c6b2983e755b29bf001461c59fa411d2c26a911b6559a9
--hash=sha256:c59e4265608da6a041f54646ecc0c9ecdbb19aaf14c4c684bb6c2114998cc415
--hash=sha256:c5e7ce578aa8a80910a72a8ca0bbea3baae10100827249001999726a788456d8
--hash=sha256:c66f858b82497173f73366795fc6ee8171620e75a338506d6b2e7bc16f5fca11
--hash=sha256:c6c0c13128a32eb04a51357e56a094e13aa8e6d3d1884de2e9ae923f6915e1a8
--hash=sha256:c9389b3784b56c58d933b5e0aecdf28f901b073ff385358d8a7d40907f6e14b2
--hash=sha256:ca0ec532ad2f5ba1e5ec120ac157769c57f01855b3d8bf37213f5d88abd9ba0a
--hash=sha256:cad7617727a96d189bd6f979d0fadf765198c7934e85f4edaba9bf3ad919a300
--hash=sha256:cae82b5ca24b0c2beedb269f6e2a96f466acd926879ab00ae19f1a65cbf9ffb0
--hash=sha256:cc669256d28736f7f3a149df5c380c50ace2692ba3e62203d10656fade4a2145
--hash=sha256:ce1f220114959941170e22b8ad44279f6dee2dcef7591814d01ae805dc058889
--hash=sha256:cfb398886a7eb4c719161c3efcff2a1248febc53a4d8e5072d2d8a87fed84ac9
--hash=sha256:d077f21f4b16f0471353883748f126f62038760397c107bb9fad2ca94dc0dfb7
--hash=sha256:d0c5c362bc94f1929dc7e96e715bbe7bd17037f802e6d8f0d1545df9133c0559
--hash=sha256:d2765c18ce303149ee804b1f3dad11232726dd0a702d73a15cf19179ac8cc962
--hash=sha256:d44442effeb8781f392340c5dc8c6716fba41dbeacb82fd4c0f09026fb5ff682
--hash=sha256:d85dfab42dd672f87a7f76e9de7172962aee69fa12044f0d6e1a23cbd53fb80e
--hash=sha256:d97c5227621af74b111882a290b10f371780a38eef9d9e730408fba2259b52fb
--hash=sha256:d9a0d12846d6ce434fb3857918eef4315ec9b4769deb020c75828798614bfcfd
--hash=sha256:d9b3e7d71bf6acff341233417abbdface29c647e3113892d9aaedc02eb4aa2bc
--hash=sha256:da707f14ea3c35ee463d50acd596d6488e4b2b4ae7cf77a5bf93f55c023d63e8
--hash=sha256:da85db328e507da922d586c3c7416ec360ec22e9cd9e0700691afacde0c81f53
--hash=sha256:dc205732d593118cf701d986f40e9de7801bb2e371cb189ddbda9b7348f4d97e
--hash=sha256:dc3a44689eea43eab836e5c98a8ab015dc2419987d1ea6eafc7c590cdff86bed
--hash=sha256:dd5e90f34cffcfed97f36cf066325773d2b6021c60c29942e53a18b028501b1d
--hash=sha256:ddcf547bea2aee967d6a77779376a45e77e610e8465147a1f3d7e20d539d6e32
--hash=sha256:e477aca0bc0d19f3b4ae9e4f2a1cfd687c31bf772d78734910658186b40b2477
--hash=sha256:e8b17e23df3e827a69d25af70990ca2420e92668aaffaeeb3cd2351d7916a023
--hash=sha256:e99e09ab7741f1281e2677f4c0058c7f5267d182530b09c87e4f6aa26adf3887
--hash=sha256:ea2c01cdb16dc12156e455007c406dfaaece0c89aa4ba0e3b47586779f951d41
--hash=sha256:ea6b1e9105b4b24a34c722432d9fb578f9ed83af21fa1abda639011e0f22bbb6
--hash=sha256:ebd054ad1737a68fb7c5c073d405cef2b88bb824e294de3b4a4e995b47f0e376
--hash=sha256:ec295280f4b37769256da025acf5890370355ac589c27e89caae0b5e9eedc702
--hash=sha256:f6449672f9c93316deb5e2839e18931f468670e44d5bd9b1301a5a9655d45c07
--hash=sha256:f683dc6300317700025e41d89a43e0276692ded16113a3c43eab704d605c58e5
--hash=sha256:f6b9d2aad499c769ee8287609ab0e6de99d8bcea99c6e6c2e64945259fd52fb2
--hash=sha256:f8b9c8ceebae6387d0dc77f7f4dbbfbfc962dba2efbfe6877486075a480726b4
--hash=sha256:fad67b12ffe0f71e02b4932b04883cbc76a9072bbd30731409d3523cf058b011
--hash=sha256:fbfb70ba01355251faf6b293171df49f73a88a1b6494db109ffea85442574458
--hash=sha256:fe91993149523aa59941b9e3c90e2eb45f57ad014697aef6c8b13339a59c019e
--hash=sha256:febd35ef45f603c2d74b74655efdbf45e14f55fc0aef4ac82b663ca829b283e0
--hash=sha256:ff88a92cafde90888511242d1c54afcc1a8adbb6dc0a88fa7f87e29e92400d4a
# via
# doxmlparser
# reqif
markdown-it-py==4.2.0
--hash=sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49
--hash=sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a
# via strictdoc
markupsafe==3.0.3
--hash=sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f
--hash=sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a
--hash=sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf
--hash=sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19
--hash=sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf
--hash=sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c
--hash=sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175
--hash=sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219
--hash=sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb
--hash=sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6
--hash=sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab
--hash=sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26
--hash=sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1
--hash=sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce
--hash=sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218
--hash=sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634
--hash=sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695
--hash=sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad
--hash=sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73
--hash=sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c
--hash=sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe
--hash=sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa
--hash=sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559
--hash=sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa
--hash=sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37
--hash=sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758
--hash=sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f
--hash=sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8
--hash=sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d
--hash=sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c
--hash=sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97
--hash=sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a
--hash=sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19
--hash=sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9
--hash=sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9
--hash=sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc
--hash=sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2
--hash=sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4
--hash=sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354
--hash=sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50
--hash=sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698
--hash=sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9
--hash=sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b
--hash=sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc
--hash=sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115
--hash=sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e
--hash=sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485
--hash=sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f
--hash=sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12
--hash=sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025
--hash=sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009
--hash=sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d
--hash=sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b
--hash=sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a
--hash=sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5
--hash=sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f
--hash=sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d
--hash=sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1
--hash=sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287
--hash=sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6
--hash=sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f
--hash=sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581
--hash=sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed
--hash=sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b
--hash=sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c
--hash=sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026
--hash=sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8
--hash=sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676
--hash=sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6
--hash=sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e
--hash=sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d
--hash=sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d
--hash=sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01
--hash=sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7
--hash=sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419
--hash=sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795
--hash=sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1
--hash=sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5
--hash=sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d
--hash=sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42
--hash=sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe
--hash=sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda
--hash=sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e
--hash=sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737
--hash=sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523
--hash=sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591
--hash=sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc
--hash=sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a
--hash=sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50
# via jinja2
mdurl==0.1.2
--hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8
--hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba
# via markdown-it-py
narwhals==2.26.0
--hash=sha256:29326d74f107c347fd1009bd58e38d9f7c7c5b51e6de97bc93dbc325d9038b54
--hash=sha256:6b9cadca82f375c7e4cf584fdc86ca25da54827307a9c58f94547ee6104b82dd
# via plotly
numpy==2.5.3
--hash=sha256:012e66aca395d795496446e52aeeb5866312a5d4d3f27da270e5a0b43f70dc5c
--hash=sha256:09d5a423c71ad5feb5625844ad58050e35df43871004b52ac9c0ad44a56775be
--hash=sha256:09ffa5d903faeaa5c4dd05009cf81c8bab9f2cb37c548b8d39b65b4cfa7c97f7
--hash=sha256:0a59a421a32580a009e8a1751345bf829631b990dc1794b80514ab722b435def
--hash=sha256:116f96cadd935c6122e9228d676fe7ede19e741f5c8bb1c3cddbe0c51ccebea2
--hash=sha256:1302b90c0e52281681b2975adfe8a860cb7b12216a27b4b0b4207c44bf7bccf0
--hash=sha256:15aa985ac73a8db02db7663381aa109510449d3819d37206caed27b33a65a8a6
--hash=sha256:1aad64d99730d013cfc6debafed22783b4fc5a7f4b8bc744d2d8cf7dcc880551
--hash=sha256:1c80eabb4035ecf4ca9cd49cde8a9fdd69a729e63e6474887d1523ade7aa277f
--hash=sha256:1f3ed25271581281f2fccb1adcedfcde4c07362eec69189b50baf6f90e3ae159
--hash=sha256:1fb6f8fb9ff0b3a69f52c66ce397b0246583e9f28616231b0e32ca49259a5fa6
--hash=sha256:214045a5bf00113a146ab9ee9730c44501af6723cdf1f6830932f7b5ef2e7af0
--hash=sha256:26e15e4aecd8617dfbaecb37d223e365d7b39411fba20454be2670a96aa74cb5
--hash=sha256:2c25dfa72943e4336ddb6b0ee4277b47a0c85bede0807530ec68103bf58e2c10
--hash=sha256:2d8240cb4c16fd831074aa2b2cf9fc54664d826341d61c372245b96a74a49a9a
--hash=sha256:350ba9783ce969cf9f7ce6e6a9a58e1a6e2a19ca025b7ee448c4db727706212a
--hash=sha256:4c8a6d2ebce6305fd82fbefca827775437147052a976ee7c94b36a0c1b52ac6c
--hash=sha256:4f8929ee6c96bfbd7b4ed2032e0c03af86fe1826740ab61ddabf9072d06e57ff
--hash=sha256:536f963710a4e63934d80ac0dc4f478804a83e9a84b6828018f25d09953ada33
--hash=sha256:54a115e5a73b8fc44f0cebef486365a1894b5c9760685d4558b72b7c3eb846e0
--hash=sha256:595d020938c84e320bcf40ad71089e108eac0d377cd018e14a8c094f39e98d85
--hash=sha256:66a78fe4556c60aceda5916f9eacd638b18e9e681016ec302dcb4682d6d4d034
--hash=sha256:6b05c171afb3aa07adbd20abc00aea86fe375beb0fdb9ef780ec5b7f63bab1c0
--hash=sha256:6cef4bb1706dfec49243c05d921eefb4e190d41e2528b30d8035ea1f36b4c24a
--hash=sha256:6f24021b9f22bc6301c37b196974a92c1c18dccedb6fef3dd252e95f2d6adbe4
--hash=sha256:71b39d9f935b6ec0f8753e3e2afb51e3efba6f2e05b68b32a40754d24bcd4a3c
--hash=sha256:71cad2b2a7451ab79d8f5e71b453485b6775963d5cf794179144a7463fe6e8ec
--hash=sha256:76c2c1e6bfa5c84adc6434dfbf013aa92096a7985221762c8f11fedfd20fff58
--hash=sha256:8617bbfae4486cf99c9f899966699428d19da931d06ca94ad3da986c76e15997
--hash=sha256:86bff898a431c0fb71f7610b75726e75a54d47b37edc9d537f48de63bb3c0b90
--hash=sha256:8e4dd766076855b5ff7ea52fa5f07ce26286726e0f8bff446b7739d02e6ea204
--hash=sha256:92f30e89b8ee0ecf363033576c422b2f58fed6a80bed0aa48dff6d14c654663e
--hash=sha256:93e1f5447e2b1e479d7bd74701e84746b86450cff1fc368b132d195e2b8f8211
--hash=sha256:9a37475425b431b4d060f23b4f52cd2f3aef6bc7c654bd760adf0040eec9d435
--hash=sha256:9deb49575e5b0b94ed72c8a64ec4d033381adc27e9060ae842971f697ba96104
--hash=sha256:a5fa86b80fd24bcd1aff83ad23be44ea323de3f787be8f8b15d4a65621e25321
--hash=sha256:a6391fafaba97500887132cd582abc6e19452b1ac775a47caa7b24490e152058
--hash=sha256:a72f874bc9e10e4b8f80426fb49716d5141f64442a0c8418065093ec8017fbb0
--hash=sha256:ac7bb1c52d445bd4f8f7f97fefe6abc3a084dc4d63df50d79b17fa2b78e89297
--hash=sha256:adc1ada2662f8a5f960b8a10d9986897e7499ef07e06d4cfe7197f8cce923c07
--hash=sha256:b00eefbcf0f292945c4b4dec2ae845389ef5bcdcd596e6e4328051db5b5ba694
--hash=sha256:b0521d0f4aebb6e06189451025fa17a913287b13c03d5fe05c017333b654ea5b
--hash=sha256:b5d93cf48f687479941d12b69c873ad2cc76bbd487f0091c2200636497f34034
--hash=sha256:b7e18c623bb5c95acb3b3328861272816ba199fb531921c5d6d0b675f1fde9e3
--hash=sha256:bd4cb9ad3c7889b9b3fe0a9a9fb5d2ed26f9879bff2608d9f01aed147a20d231
--hash=sha256:be5a8381859b6da607c84f4f7d6847725f1cf1853ef8a2c9e115b7d58bef47dc
--hash=sha256:befa1ae5bd6030b3f512b43ff3fa5290bbed6b84411a44244b14adf835f5b89d
--hash=sha256:bf63afbe037eb5d2fe87fbcc7778e61da53ebaf21d938a4515aa73b62532a5d4
--hash=sha256:c00abe94c1a69d75d827dcf1c025b25c8a45d230b3bcd77a9020883a1b047653
--hash=sha256:c2381f82999704f818e2c987a865050e285ec3621262c66d40f5a96c8f899f8e
--hash=sha256:c76d5dde9f445058f83d0c02af00557a4db91de9a9a57c0df87d1535001d654b
--hash=sha256:cb189f09db39283b26bfd061ec16189e14f71c6755207f72a0f7540867afe5b9
--hash=sha256:ccb32e0525d29e8b0572eb84c9a57af0e7a4e615726927506f55063c62414034
--hash=sha256:ccbc4665079665c3cf3bab4db9f6b095370cd6437d66be549b6c2a1fd19e1958
--hash=sha256:d1c89973648c85069c5046ad460f7b8a00218b29a2e42359ac8cc63e9ab94832
--hash=sha256:df2d5874ff183595a4ba404edd04f6bd9b5505c1d7708573f6a6c17489a67563
--hash=sha256:e01c918ac3d48e18a927cf7b14a26a3e29ff2bdf2eacb976da0aecd6a43ed034
--hash=sha256:e6ab667ba76450084eb64013762c438ea76d9d29cc676dcd6c2e9892ba37f841
--hash=sha256:e931e4f499e0dc7ef29d269a8e5b35dd722e5d14be07df6240166ea7c6532fae
--hash=sha256:f54660b0eb6b0b9f36e7fe1cdfdff472028dd0d14acd9b9b65098efbad059469
--hash=sha256:f59a878c33d6b88122d80d239bb3b845d58708750b0cb06a09aebb9b18ec696c
--hash=sha256:f7fabeb6cea87d65f3b926de33d03fb016cfdc29314c90974383b5582ae72891
--hash=sha256:f9579f383d1bf9df80081e72760e84960a7fd4f88cf0c9e535a8597c9bb646f5
--hash=sha256:f9a2353b37a1a9e78fd82b27ad7e2a32a2d036604d18f02b05e3136c62ca3b09
--hash=sha256:fc36dc566135b5eceec4cf89758fcb719266a019ef07dae1754ae7c9f617ef3e
--hash=sha256:ffdc76bfcae6b255dff75202c5e7feaf95b40246bc0a17944facc1fecf9f79ab
# via pandas
openpyxl==3.1.5
--hash=sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2
--hash=sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050
# via
# reqif
# strictdoc
opentelemetry-api==1.45.0
--hash=sha256:711ede81773c8025c2c03dac0450bc89f3d30aea6eabcc815c570d4e35a963f7
--hash=sha256:80e068aba7cd56c8b58512d6a36f8d25cb1dfaa0c0a4cc1c938ccf9f362d9cb3
# via fastapi
orjson==3.12.0
--hash=sha256:010811c1b69773450a01cef97727a67b223242f350b77d4ca000e59a9ef2155a
--hash=sha256:01efac2074fffb4cb1ea3fab7861e9d0f2a26913854a972f5ac760525dbdaf6e
--hash=sha256:03091c8a64db4be38746597ceea68f33c238e27acd9bfe99fb59420224ae7a55
--hash=sha256:08231552159be266a7269555bd9f7c016aee7d9ad6dab06eb58796c5ccb7101c
--hash=sha256:0b1ac5bf6609b2716c7954011c5fef6254922df029f45d032ee4ebf5d363cbed
--hash=sha256:103b5db66aa53c1f9e88c2524be4f383e831ba7dfd5f9f5af6336a177c622f11
--hash=sha256:1192a7021b6d071aaf909864f6e924d6a2675ca360485b972b8401749311750b
--hash=sha256:11edb4660a6680abee9788a3a9072208a2c96538cc1322bd79542065229d8e54
--hash=sha256:18a87929f31d94a77f7dc93cf527e91f39ce7fe7813d588a4de2507efd32a387
--hash=sha256:1c680706fc8396d95e7c4c1f9482563f552137aef91b57237a3ad5aaf64629df
--hash=sha256:2b7bcefb9f40fa242fa6b06377232c048e655747790829609168c01162f60578
--hash=sha256:2bb3ce43203936072dd8b4917b01d3aecfc02329bfb42510cb7cfb24708adc9c
--hash=sha256:2d3a9da945a4d96ae758fdaaca56742e6b73b6fd554c5d8876f252a6dad70b83
--hash=sha256:2eb5c56e534127b2b8fa38d2363c8b1b8190367ee0d1d16c041517d880843b94
--hash=sha256:31ed278a36304390adc3eec5d7f6fd593a7c3e99e5a06cd07866396c4b1b4710
--hash=sha256:33efefcf5d88eaf400b47e2eba02f91f319bb9951be61ca500b7d536d3f2079d
--hash=sha256:3bb17a06f9bd15237b3216c044209fe92597379124018cfc196fbb846cde64df
--hash=sha256:3dbce9b6b3074b31a5d5dd322a9c4e5b16f206091ece4194c2e36952847a105e
--hash=sha256:40f92192227505acca4e2533ce565f8e6b9535f7d0d09b0968452f18b7376b38
--hash=sha256:477ecaf6b9f88f873341b91fcc736119ca81b5e002a9f7f308ff5b4f2ce2a70e
--hash=sha256:50fae885cb073eac7556353ff3df93312b0d5137b0a5056b2bb63f97ed9a93c7
--hash=sha256:532ff8cd4bd59a327a953a7dcde922c7fc25b85e29721bb8633265430d3a3873
--hash=sha256:53c0c474a9d9aff9aebfc0c88de1f28f843d940e6e3a80729abdf6a20274356f
--hash=sha256:58c58e1de0006ffb580368d6793c36c7b0b021db066479cf281bf5061e732328
--hash=sha256:5a0fdbc216388f653d3752ff310e710f59253bd4ed6a2bfb3f4f06b84714bbd8
--hash=sha256:61318b6de893c7a9d9f3e5ecbadccbfc26a7eb417ccc7bbf0771de3b4d72f868
--hash=sha256:644d005bc82f917337a95ce270c9f6f92f9834c2bed7b1477572f8db00784222
--hash=sha256:6a2a79c89984dc719817d388c8709e0efc2a2795a934eaa746b4882eb6045adc
--hash=sha256:6a31348d7dfa64cd9c78bd1f510ff44c48fe64d71094e6b90e364dba3b55949e
--hash=sha256:747843254519dd43b93eee3153a19e5a509334320c4d2f823ec879232db5c796
--hash=sha256:784106539f4b9d4b930e0b4eb8d45168507dae001945e71b4675a367f1e5e806
--hash=sha256:7c2ad193c8004254f34b499f3bd2c80f043d10754aff2b38f93da574f4883f98
--hash=sha256:83445adc40cba26d6d621185a45128ce455b766af368cad2ab64b970603a7978
--hash=sha256:859fc4196855890150bb08e649b30d2c93b249b3e3edd0d3bb2231abf8aa8adc
--hash=sha256:8c3bb86dd10f39b3fbf434b7d5dc7cac77d6fc8ac572ae30a10731ede2c4b647
--hash=sha256:8e29957429c35bbb5a185a119c523aa2428b7bbf1a293724c7b9375ed8f892a3
--hash=sha256:8e386b0bc0ddd7cd2056f884b5a0af33592bd01ac66a7ca4b42a65a7e7774a13
--hash=sha256:92ffc09e07233a6ab6d4e067f7841edcbcc134cb4812155cf171ea5255a421d7
--hash=sha256:9a36ec60f1796f9a3f13e3b98390295e17a1c7c10155b448d264098bf9ee5900
--hash=sha256:9caf3d09f47c3c70c4451ada20ef9bc4a4cdffa26f49862cf0a253b329aae2d5
--hash=sha256:9e6fee342a48760e854d743e7a81534d8e2925a6f46e09f750cf56b50fd1de5d
--hash=sha256:a15f9a891bce5f5cc5d210e3ad8614d4d1b489a56448c099d6d2a7168b2d954a
--hash=sha256:a696529ec96a90d9a5f9570207efe403c8b08f8e4aa2783ee3403511e2fdfa10
--hash=sha256:a6cf4b18e7de173f209f2084ffbd736dd72389a396326ee80a7022168be232e5
--hash=sha256:a791f793b287bbc135b8e87c34e35c8bfc693e2a8a620fab1ae682b925f9a32e
--hash=sha256:a94f0f0c6fcbb2b5bd9734c57a489c7584a732bbdf04a39e8c83b861e9d03e92
--hash=sha256:aa3e43a6846e91d7bde3d5a9c66090fcd8744f569a9b6cffc5e1ca38f6a461c0
--hash=sha256:ad0422b92d5195443a39f80c3bcf731cc2e00f153bd32063a47b73b057bd0f03
--hash=sha256:ad29eece0c601737f2a60edc2752a84e7a0785df3efb62e3012834700a5afe0d
--hash=sha256:b85931be5b6763c31283805c9bdaae1ca03ad9f6f12a15f1cbf6745b907932c2
--hash=sha256:b9dca132b1fda5565088e65a6b6e742285e0aeceb6fae549fa8863e16c7d3998
--hash=sha256:bc7a872f03522d90e0429e6c0c5cd23084f767bedcb4c58048eec19294613344
--hash=sha256:bd57d79aefa3f84eec851d6de7a366795b9345cfaf17f82b4820430a7a5fa241
--hash=sha256:bf44e374aadde77b1f6109f1030be51433eb61984379852766b6f4e187db7b1e
--hash=sha256:c6b11be792c3d2c6a4be2af4ebf97a68d0bf5f580aca6e86a418a354f6cc846a
--hash=sha256:d14203fb1aae2ad9b3d52f8a0e82aeb10197ef1c9bc61da7f358bd70b00123d5
--hash=sha256:d39f3f5c3927e2dc0913fe5bbc1a2f6b1b9d1bba1de6358340d0ad0d0c00ca92
--hash=sha256:d8e78d3d93705e3d27cc17cdb209e44d7a8ea203010cac6ce9c7ffc1ae1996f1
--hash=sha256:dce0166feb0a737ab84f598c9a338cbc0b764a036617aa686194f53c7eba0c3e
--hash=sha256:e4ac5059baab4b3acbd99485de019ff8cda0fdf34b61fa74f7197a53db78bfe8
--hash=sha256:e9683ee9ea0659da64f36574ef675b8a86330c34c19ea75db1fb93c3ff99e0ef
--hash=sha256:ed4ca42bd55955aa34deedcfdfd0e0c31abf51143aae158ae2bc3520b626e517
--hash=sha256:f06dd838d1e07d9b1de0932ec0485ec92c4d5f5d1ad4817a656268c3e88be1e1
--hash=sha256:f3c0683136acdc29afdf88a5bc2f7d3d0e34087788d1d63c0144b805a87a196f
--hash=sha256:fb2539159dfe8d371914f354360fa50e4a577cc89222a3828b9650a5e5040252
# via strictdoc
outcome==1.3.0.post0
--hash=sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8
--hash=sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b
# via
# trio
# trio-websocket
packaging==26.3
--hash=sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79
--hash=sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c
# via
# plotly
# pytest
# sphinx
# webdriver-manager
# wheel
pandas==3.0.6
--hash=sha256:0704044b676496b8350e023b09f174a26772456c974a2b11c36bebb558c9490d
--hash=sha256:085e3786ae6b2e82b406266bce36690f72b9dc1421903ba9296b2981a9fcf586
--hash=sha256:097090508a1dd335013d39106fc10b20f4fd4a171638e47b77d55798ed9dab6c
--hash=sha256:1bcb3e9ed29e74a7439cedff9e2aefd3ea65de84d7de9ccb6c194192541bd60e
--hash=sha256:1e7c0afdcaf6661d795fcefc2f647ddd1136f62cdc153fba177c685d97a87808
--hash=sha256:1e92d9fa834c7d877130027cddc0cad8dcff97c1f6cca26bd6310f847228b658
--hash=sha256:22172a92e7ee678ec0140c7af4fc9366b55413834a1cd86af78b3caa0b0574de
--hash=sha256:253e12cb9081b0afbac607920f6142975966bc315135e09de275fdbaa415d2de
--hash=sha256:265f562fdd1079f69f3de96dd425c3405224038c0af4f920c54bd240ee2c4640
--hash=sha256:2a8fc94be2ee5f1d86f97aacd8cc566f81680b6498e76f3007421bb5d98151bf
--hash=sha256:2e5fa32ff162dfdbc280157d664f44d23049ae414725af9676df339c501d82cd
--hash=sha256:3ef908d28590b3f42d7070e7ad8f9b34b442b260b7f3c1afb57e0040c58cdb1b
--hash=sha256:429d9df32731ab01383ed98f2baa7a60368090d1a94fc06019a12062510e8630
--hash=sha256:47121f9571503f724c9b93e297ab6254ac99c77adf5e9ed085ea419fd585c258
--hash=sha256:4e25e2e1adee99ddfada6f7206a79ae8e9c8a8861b0e3eaaba165006d3eef18e
--hash=sha256:4ff44b2cb51cbd691c91f92c4ea6c71e34003f239ebd67c2e857dc898466b49c
--hash=sha256:50c44cbf5820b6b91a5f74aae04972472aefadd3cd9fbd1010409d85528bd570
--hash=sha256:569e114072b24fc4970c12e2b4bab252671668a40b324318903380cab0254c0c
--hash=sha256:583be68728a31d0d750d5b8d9e00f02b153df0d4655f858bde93cb84cfc4227c
--hash=sha256:5e75072773c1b2f7cb63faa3a6f562aede11f3976f68ed34cb538bc091a28171
--hash=sha256:5edd0a7abb0986ecce1ac81f56d99b6763f86aa6946dceb6c661224f90af5a19
--hash=sha256:60d81f9e1799b36f3739e7fff44d1fbb2e8fd5a271b3863e03de9715fccda0fa
--hash=sha256:62f51d7f651c8054c5e82a69265c98082e795d1442df7ca6edc3a545d61214b1
--hash=sha256:654aae059295dbba6ecd2328ca12712a2cf1676214c8699f1c29213f7ccf9c34
--hash=sha256:66b07ef7315a31bfe1089cd3d71a7de781c9dca986762d0b4fe7c0ef17465d10
--hash=sha256:6ff482fa91fa2bafd92e8fe66ce3645c851824310f295c1f0a2f96e928fc4541
--hash=sha256:77ccbe5057aece6fc172b9b77f19c04335af6882bc2e10c8f3ee4e6bfb3da553
--hash=sha256:7dac2d65e9087e8e7b5a45fe15c4920911a221df061ab629943ce016489145c7
--hash=sha256:83e91d15738d7783c050197cef2f2cf82fc6353dae9865aa87ed1fa16aa4d55a
--hash=sha256:86fa853a12e0b70927e2b1ee00d56d2224ec9cbb4b9d58348b5ad52d2f21150e
--hash=sha256:8fe77b408d82e2615674dfed62533b95e18a03610573877422aada4f625d4947
--hash=sha256:963ca21199097a84c7827c4678b04e30833084fbf8ef44fde3fa7180a29f8fa0
--hash=sha256:97274c9adf6255bb48c620cd6959805efa7f09ea2167f0e0ae006a448cd2fca7
--hash=sha256:994a79608263fe1c14cc48ffa7300e2b834b7d1cb406ffe96a08828cb0cdd79b
--hash=sha256:9ae8073aed8e21d1a7fe263dcdc6840743549722a6738198a0a46000fa9476f2
--hash=sha256:9dab635a549e58a053c7b0fa054dc0bd7be22f0ed9a720f4a85d5fb993276172
--hash=sha256:9e492cd4bdba6778de4fe0df7f4590c012161ebcf9902dce01b01dc683105514
--hash=sha256:a3a22e07fe75347eaacc75b0e85297947af4fba6b4aae23916bd8b6828d0bba3
--hash=sha256:a4dbd4dc65cbe645b92b8785d0f96dd7311010dc6606cf620e51b07b8788a12a
--hash=sha256:a77a1a44e4d88f1c6a2a64d3eb12efec8420875722e14279800b173a7c7c2804
--hash=sha256:b27c8d890e4aa2171437ae2a39de1d215e674158e4865c4023a8b31c932513b2
--hash=sha256:bd75ed0c840f709fc2ae26ddd9534ac77ca1a48ac0cce521a74acaa85f3340a7
--hash=sha256:c6e4aae3e9bea26c6c9a20d88d96c86ec4a99b4db5fd516bcb4e829ab2c0ee36
--hash=sha256:c826e9babb7790142c399f58599d8de679bea059d7b39c5b6efa2096fac37266
--hash=sha256:cc39303913e2ea129915670de5d1c9fbd647f543bb72e5543bac8baa94e9e42f
--hash=sha256:d7564d86a94c2eb8ab290b07f63ddaae5c032fa53897c29a2ff2197d43aee8af
--hash=sha256:d7dcd21238cbb4828ff148481ba01cac8946dc5121457b5aeba28636f8f99a60
--hash=sha256:db7ec631f26223beee8e5c9e0b8f23c24d8197bbd1d982421d4e3188bea51965
--hash=sha256:e3dccb584123b399c07562ac4d62543e90ede49ddf8ce3c13ffc64cbe828c281
--hash=sha256:e7c1905ef02c3d6d43d9dbd5b6ccb4da4870a0b0c821bbc103fbdb6f3ad2707b
--hash=sha256:eb6900de08ac85f93ac4948aa6b80842eba555875337b8359035ac9c43e92d34
--hash=sha256:ee913a91669056c1de1a6b733fbfeab711de9e54e3bee2dfa5fe79d9457247d1
--hash=sha256:ef738d71d1059245b6bb03e312be06d8b3821326a83486c1ad03b9aba3710e44
--hash=sha256:f3ce8a6968045481e91a3990e797e348ce13db45ee164a7095bbc824e26c09dd
--hash=sha256:f4e7c52eb108d752e7592268108fd3e98efd76d83a3125cdd06c621c2e44359b
--hash=sha256:f8029ec0f1f89e4f985929ce1f6626dabf3140d61a4e9c1215afdab34eaf9a5d
--hash=sha256:fb625f426b375bcc96e3a04c5d5d266cd7be6ae5d6866e0e703382ab5164068c
--hash=sha256:ff51a4459ed036e93d1eb1bb5e6e7b28685d3cb6b7c12b91c05b31024e234729
# via strictdoc
plotly==7.1.0
--hash=sha256:dbb7fa18afce40d0a8e80d1bf162eceb3faa0ce5a77fe741ad09a74cf78f53f3
--hash=sha256:f860166a4a3d78c69cb1f4a15f28a5c8283eade98a282a698f3bb853a449ace5
# via strictdoc
pluggy==1.6.0
--hash=sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3
--hash=sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746
# via pytest
ply==3.11
--hash=sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3
--hash=sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce
# via spdx-tools
pycparser==3.0 ; implementation_name != 'PyPy' and implementation_name != 'pypy' and os_name == 'nt'
--hash=sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29
--hash=sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992
# via cffi
pydantic==2.13.5
--hash=sha256:346a034f080da3755d8e9cb5e00e8b07de1d39e4f6e2c87d8ab7cafa0b269a73
--hash=sha256:51a9c5f7b2f8e636f04c6cada605d9b6a3bf1348fdf945a3d8869b19bba0ee08
# via fastapi
pydantic-core==2.46.5
--hash=sha256:013d6f3483d81e02e7c328831808f336c8596ee33b4bd4026b9ffb1e960b8942
--hash=sha256:03b9666e41e35d8909852ba191a0607520f81b74eaf12ccf8737005dbb313821
--hash=sha256:045ab3b6d308439e32b81cc173bba5b9018bc6ed896afd0c65b3b009b1699af5
--hash=sha256:0bddb4020d8f04175865ccd17eff3040874fc11fb593f424edb452653b4b947c
--hash=sha256:0cdbada856a1c69a7624a64d3d9aefe79300bd6ef827b43a4f265010b9b55184
--hash=sha256:0fc5be0abd4a407e200d844b404e33639a554e7bd0d448e7b9ae181be4789ac2
--hash=sha256:10416c15b8839ecc4ef4d0885da76da6fd0f67333a0eb8aff6d93c4b8f2910fc
--hash=sha256:15f4a94963c95accac15b7b657bb177d3ad82bb90b0d0526d9a9b85079925db5
--hash=sha256:18a09e1e1011b462f2e32774f25859ef1223d5c2b0546a633cf56654710721e0
--hash=sha256:193375f3548919d3f0b60936ca113ada3e38f264f91b9b8e0508efaad57be931
--hash=sha256:1a353f84de772f423b5ffb11d7ae352fbbef0f446f3c0b0af0f8236d7233606e
--hash=sha256:1e449def1945a462c464331254e5a44fca7c3b4f9aedf59ec2f50f8066dd8e25
--hash=sha256:1e5aad1220a1192c42341c8fd4a8686657e73ab2a920c970bdc4de334fe3193d
--hash=sha256:200aa3dc9f8d54f0754f43247c0bad0999fdcfbfd2488384dd44f37279271fe6
--hash=sha256:2471fd51c61c610e1dcf7de44d7299283661654d11264ab4802b303368d69c47
--hash=sha256:24922243639cbdac66c75fcb6fd6495a9cb52b213d62f9a0d16f0310b1ff8038
--hash=sha256:28a6a556cd3b6066bea827857f9d9cce027c96f776e512f544a581f9e42161f8
--hash=sha256:2bc9419666990c06d7397831f2126a1ecc3594aaa3ff7de5bf2d066802f4e07b
--hash=sha256:2cbd9a5eff05e51c447c34dfa4632145b26b09120cf04bd0c871e44c1a5e1c9a
--hash=sha256:2d330aaba8621b1edcec8ae2c4050f63b84ccf6d98723a8f212e9684713abf0e
--hash=sha256:2d5d76654becf5efd62c9e51c3756c67b49498b0c9a40884934c40807adbd074
--hash=sha256:337639ba62a11acde6ef3aeb08c8ea755f8ef1fe5e513356c0f36a2b0d7568b0
--hash=sha256:347ec774390c87326a2e4929d58d3f7e8763a104d5d35f4cd595a4c952366433
--hash=sha256:356c8368cbc321050b169595683a2e1d63413b1e0e2868b330af9fc14c616d3f
--hash=sha256:37ae34309d7bd8c0d61ab839668058f2a7962ea1fc51d105d2db228fe0618034
--hash=sha256:37ea7b83c935e5b0d68c9449b82651accf78a10828b2c02b2f2d9e9496446c21
--hash=sha256:3a3e26b6a8274211bddee2d0e4d0d42778f17a34510f49d2ec44b58abfc41736
--hash=sha256:3aa166e99c4f2985407fb8714aebede877ecb5455cf321b606adca926d30d5a0
--hash=sha256:3d2652072b2d774947ba5cf78a9e59644ac62ee572daf6dd2e1dfe905e15b2b7
--hash=sha256:40375c2d05acec10323e45dfe2077ac44bc74659008614af5069034e2cfc781c
--hash=sha256:413a717a410d0c817ef5b786a059415550b3794e1d0c2abffd9efb93a3d9f7b4
--hash=sha256:46c25dda9d092a06c08db76ffe0a197107904d0dfac653f7d5306bbcd6d6119c
--hash=sha256:49776eab08766a08dfff7012f8b422dcd7e25e43b316eedf0477c24fcfa84b7c
--hash=sha256:4d44cf99ddebf875f9b68cc267aa684c99b7b44fe63ee1cac4ec163807290069
--hash=sha256:4dedce55295becb61921e386b99d4f2706045306e7fa52249a33004c837379fb
--hash=sha256:4f8507560a9284e1370bb048ed4282012fbef4e8d109875b95e884d228552061
--hash=sha256:4fdc8b93a41521988916eeaa271173fcca7fa0803d62f87675aac8dcec1c8e29
--hash=sha256:5086029a57366b8cf81b130a43908738095c270c21a8d7f0e8bdfdb89718e2f3
--hash=sha256:52e24eacdb536cade636aa90fb851835222becff8484b7001fdc78cb0290f2aa
--hash=sha256:53feb344243bb9510a9dec7bf3cf1b64d88a98af5dc7872a5160465f8b198c8e
--hash=sha256:545f26c504b27c3758439a5e6d9349931f0a04f855668d5fe323c89e82300a38
--hash=sha256:54d510bac3ee52247af28ed4bb18a1e799f040ac60fd2bf5ccd4c92f1fbe786f
--hash=sha256:5cb482e9e84c851f4e623fe4acc1ced89168cf1fe18f7089db4548c8f5bbb65b
--hash=sha256:5e81740c09e310f5aa5cbd3e434a01c154d4bef93241c7877b39f211d2b78ba8
--hash=sha256:5ee239d575f80b08eca11f6e20f90c4c695de7825c67eefe6091fbf20dda648e
--hash=sha256:5f194189415698233dd1114a093a9b56e61e2c57e11b469be3b0506f46f0771c
--hash=sha256:5f93c5fe914d75fbec9a49209b00da5f08e9e467d69da2b1510c81940cfd10be
--hash=sha256:657b40d6240c0a7b6a64b30f22d1e3aa631c7e846c621b0c0f6d1d75e2e15ea6
--hash=sha256:6d30e1a4f138b8951063e9a394752a9179b51da288ffa507b1e659222f4c1793
--hash=sha256:6f7b393a8b3da82f5c1fc0751e6d01ac6c55b93c18226a60bdfba4a724efafd1
--hash=sha256:701b2e04b560eeb4bddf7a25ab8ca476176e34fdbd9a0e18196f0d12d4685f0b
--hash=sha256:771cf63ae0b1b50dd22e5f3e3549fab5f3f4ff1635d352a9e1a97fe01c7b2e64
--hash=sha256:79bdfa52f843137045b2d081cc05c120ba6665d29b7559c2c47690906f39279f
--hash=sha256:7ac031912d54f3d83ef3b3eb98dfabc1608802e2202263d25957eeed40b94761
--hash=sha256:7b0fc826b16c55e561e5d2a0c5c77b051ba1d92808118c4e4b5390f5e0cf191d
--hash=sha256:7c6be839a5a8312626b32029a415644a0846b420bc8b52b95b28cd92da162168
--hash=sha256:816ff0a6550ffc06c098ccd2e0698600f9aa7da192a79eaa6f9af504a35db869
--hash=sha256:82a36973cf8a2ef5406f4fe2edbf8ed0c99629535d959e0b100c76a32535a111
--hash=sha256:837b396ca3d7b74091ca623f6cbd8351bd42d670a79c2683e79fb089f06a2de5
--hash=sha256:850a08d167dde16db8702c274f320c7be9d7da6f6dff2b58b18f9e815bd94f5b
--hash=sha256:8816f3d218beb4b787de5c9759c259b8fa61f9dec42dc7811f320a33771778b7
--hash=sha256:892a881d5f68c2b9ea304b7a6c2c60d9343df578a311b0f86b94bc8f1ffe8129
--hash=sha256:895395f8918627b04efb1ad2a4cf605387143300ba03304cd1dfa6d03f5e095e
--hash=sha256:8b10e3e8fd7ddc2bd915848a2768e44c15b22936f1cc54c462ad1164deb02655
--hash=sha256:8e24d8f05fa2d28513d94e877e9c75ad66175376209b3977f916e240e623193c
--hash=sha256:8feeac04b5794e513e710af2f9c87d49f31a6dc47967bb264a1fed61a8989bec
--hash=sha256:9432f3598db432cb51c5b37fdbf29a60fcccc79e30d37a05022776a6bc4ab689
--hash=sha256:976e1128455aa595ea04c79ccfedff1aaeab96ee013fcc916bed120c4f0ad94f
--hash=sha256:978e7b97d4824b5be09c69fb70507cbde3b0323fc147332ca40a94d9a6a0ebbf
--hash=sha256:97bf8de4d541598c94a59344eeb988a94c08ff76b5723c41f6567ec18c7892ea
--hash=sha256:97cf3eb53a8cccacf9d46686a0926186c9bfb5574f2ed66d3639d5fe117cd3a9
--hash=sha256:9b68938dd5b0c783d88ff8e2dcc69451b5eb936fe212d516b21b9d5567f6d464
--hash=sha256:9c4b71f10dd532fb7a5cbc8f58707779e64f03a258c2bf8bfbaecfcd9970b519
--hash=sha256:9f47b8a949e60f027f0aa0a6f6c7b7e9c55cbf4380d10b344e282fa4e7ab1e1b
--hash=sha256:a1dee1b804ff4d11c663636cf15d2ea47e9f79cd56c033fb1cbf08924842a48f
--hash=sha256:a2468d93d181667a7abd66e1b64bb9f76f361b0fef8faddf687456453576f5ee
--hash=sha256:a2a5e1d0ff29adddc9f6d6821a66302e4493f8ca898b715b6b1182c2c201ea0a
--hash=sha256:a39ac25a9a2fa4072efdb429833c4a4c8009a51ff9eea3eeae131713cd27991e
--hash=sha256:a445486499897b88a7d6c310c88ed64dd37b1b59bfd7ae9107490bbb362f47d6
--hash=sha256:a91c17edf6eea2402cb5457b4c89e99bc5ed1004aa34c4adf1d4258c1a5c22c2
--hash=sha256:ab4b66edffb32d9e951efb3814bd104b8367a7501b81b955cacb5726d897389f
--hash=sha256:aca6c767f552b21b10f774aeac128e828eafb796adfa1b666a18bf6321453c3a
--hash=sha256:acf8a67ba51f4ca9ddbd0e6b3000a65ac51ab734661778b3e7ba64d99a710f2f
--hash=sha256:b10ec717381bdbfafef34607824db4c91de69ff085e4fca3b2af91b4fa17e68a
--hash=sha256:b49924c73a235e969511bf2aabdff3beebf9820931f646c80274d5d780010c47
--hash=sha256:b6acfb46a814762367fb7ba0828b0a17d441b92ce249a0e007474c9072662dda
--hash=sha256:b7ca9034437b6022f941f4857459562ee00a560b97e7cce8a0ec5a74fc6766e0
--hash=sha256:b98134087d9de723658d17a42c7d0da8d6e2ef08015dee7dc93889047315f5e4
--hash=sha256:b9fe6fb92520e3fd61f2e49000b6911b188824f089b75973ea06d6267f0b476d
--hash=sha256:bce57638e08ac148e5778cce7feb968307a727d66f8e2274a543d0cf0c9ad6a3
--hash=sha256:c14ad3bdc85ee7f318742c457ca3968a92126d144b15721c759033bfb06296c2
--hash=sha256:c1c43ad4339643d70ebb8124e1305a7dab423001eff58bb41a0f731adbc98355
--hash=sha256:c3471e5c4a949c26ec00a77f01df59096aa9495877de76fd60a980f8ee6be461
--hash=sha256:c583b927a8838dab890706a6fa7573fbb8b70e24000ef9f7238e2d6f6435a5ed
--hash=sha256:c76fe65e607be28c7fd4d56fc3c42b1583aa058ce3408b7ad0fd540171d31f9f
--hash=sha256:c7ea57fc63aa7da93a1bd2d644e6577befae10c52c4e36377635eea1056a74f5
--hash=sha256:cd5214352ae68f3b5e9af7768bdc5253695ee069675db3480518420b3be881f2
--hash=sha256:cdbb78909f52b981d3b2d56b97328d71eb0b974c36bd77c920123a7ebb192829
--hash=sha256:cdc8b74ecc48c0cb1e9607a05ec4e9e88db60a19ffcc9a1d5f9088ede40c8dc0
--hash=sha256:d0a24b40877af2de4950252be9d21eaf7fb07660f3c2cae1f56c6b599ada5266
--hash=sha256:d22a945598fb91236b4dd793a6e42e4f3dd7740bb5aace5ebd7d4c08d13bb575
--hash=sha256:d2f9fc07a8042a8f95925b35c4f04f469707c981fc33245b6ca187cf5d2dd290
--hash=sha256:d625a186a65201c23a9e3b8ed9c47e90a026e03256608cc91851c6709096844f
--hash=sha256:d925f3d9afd05a8c0fb3a1031463a8d59ebe5e2afad297e29c78be19e13b4e62
--hash=sha256:e64e88d5585bea9ce95861079de72006c7fa6d3df4e3a3b65ba31eb979c15c9f
--hash=sha256:e652ab17569c94bff5475520f907b7148b8c24036a8ebbe5cf7cf7493d28579a
--hash=sha256:e7b891faeedeafba41b2983e5001a81b6a915b69544c7e7570d1989ce1c36ac7
--hash=sha256:e80675d75ae2cd14372cb65cad5400d9347a3d3f6c13000183f22dfd027283ed
--hash=sha256:e9c134bb666dd54b778b9fc0d2b50cbb7f979b9e3716f26a88c9ab3b6fc1dd0f
--hash=sha256:eb7d8d0e5886a89a55d2eef490e272fa965a9d57c6b29a5b5088a7997ec2cad1
--hash=sha256:ecb42011e12ee19cafbc312887cbf3546959fe02fbad44f272d4be5baa997615
--hash=sha256:ef3fbbf161dc9351a2fe0422e51b129f9e97e42385bd0320b309c15f7d287dd8
--hash=sha256:efd62a42486f1bda5d24cb4f63d15a3c7768375fe83d36f9417b4ad7a2fb20b3
--hash=sha256:f077d0b97ab11fa7dcc633fca53515f290bca8a8a633e966d5b6d1879d9ed01a
--hash=sha256:f332f0e72a5a0400141f830744e141bf9f97917878dbe968669e8a7fefea78ff
--hash=sha256:f7b0ec93a2893de856652154d73b7ba622f26fa97726487dcac373de5f4c6084
--hash=sha256:fa10ef4112775900e7a0661068635eb67b2ab824fbde764de6e0e21982a93db0
--hash=sha256:fc5d783bd4a2387e97b8a2d5ec781cfb92b3d893bf82370548e99db5915935d3
--hash=sha256:fc8515076c11f3cfdf4fb142dcca0fe384b1230a3b5415458ac84f3e0903ec13
--hash=sha256:ff218293c9c806138dca139765e3b067621be52bcd93cdc14c7711be7ddc90a9
# via pydantic
pygments==2.21.0
--hash=sha256:2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9
--hash=sha256:610ca751c9bc2492b38eb9a38a7fbc93edbbb2d7182edaf34e66ae493dee5c8c
# via
# -r requirements.in
# pytest
# sphinx
# sphinx-tabs
# strictdoc
pykwalify==1.8.0
--hash=sha256:731dfa87338cca9f559d1fca2bdea37299116e3139b73f78ca90a543722d6651
--hash=sha256:796b2ad3ed4cb99b88308b533fb2f559c30fa6efb4fa9fda11347f483d245884
# via -r requirements.in
pyparsing==3.3.3
--hash=sha256:928ae7e20211f3b6f3915a72f06a0cfd29ab9d24279dd6346b6b1a7146397d36
--hash=sha256:ece8c00a69cf01b45d0b1dedabb469c90d8caf996d4fda40f147627a122849a4
# via rdflib
pypdf==6.19.0
--hash=sha256:7e5d6e730e7dae87d560a2cee218b852f6498c8be61966f3cd02ead971e48d14
--hash=sha256:bbc43aca292369ccc6cbc8a921991ecf2538a3587ab5a116eff06c321d647155
# via
# html2pdf4doc
# strictdoc
pyserial==3.5
--hash=sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb
--hash=sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0
# via -r requirements.in
pysocks==1.7.1
--hash=sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299
--hash=sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5
--hash=sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0
# via urllib3
pytest==9.1.1
--hash=sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313
--hash=sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c
# via -r requirements.in
python-datauri==2.2.0
--hash=sha256:8fa58222975fee541ce39e6b0b9d5653cefcc2481ad2629efc0378d48b13f43b
--hash=sha256:8fdbd6fc544a936eb492aa609ac457b08bbd7b9a77819c555805372cc76d7118
# via strictdoc
python-dateutil==2.9.0.post0
--hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3
--hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427
# via
# pandas
# pykwalify
python-debian==1.1.1
--hash=sha256:f98ae013e8e5310e49041cc3860a7105df73af73d4ff1d8afb474770d328a6ad
--hash=sha256:fe4fc3dc798dbf1f0ef5865e2b1b4f7cc0352b6a511b25ab7594906c64a73629
# via reuse
python-dotenv==1.2.3
--hash=sha256:904552145e8bfed22162c09dab1c2b9b54fefa7b23ba780f4f26ca0316b0f0d9
--hash=sha256:a20a594dabeaa385725aa239d5244871c143ecb356add8a20fcf23773a6c3a35
# via
# -r requirements.in
# uvicorn
# webdriver-manager
python-magic==0.4.27
--hash=sha256:c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b
--hash=sha256:c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3
# via reuse
python-multipart==0.0.32
--hash=sha256:be54b7f3fa167bb83e4fcd936b887b708f4e57fe75911c02aebf53efaf8d938e
--hash=sha256:ff6d3f776f16878c894e52e107296ffc890e913c611b1a4ec6c44e2821fe2e23
# via strictdoc
pyyaml==6.0.3
--hash=sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c
--hash=sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a
--hash=sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3
--hash=sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956
--hash=sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6
--hash=sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c
--hash=sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65
--hash=sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a
--hash=sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0
--hash=sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b
--hash=sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1
--hash=sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6
--hash=sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7
--hash=sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e
--hash=sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007
--hash=sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310
--hash=sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4
--hash=sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9
--hash=sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295
--hash=sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea
--hash=sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0
--hash=sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e
--hash=sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac
--hash=sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9
--hash=sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7
--hash=sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35
--hash=sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb
--hash=sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b
--hash=sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69
--hash=sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5
--hash=sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b
--hash=sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c
--hash=sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369
--hash=sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd
--hash=sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824
--hash=sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198
--hash=sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065
--hash=sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c
--hash=sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c
--hash=sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764
--hash=sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196
--hash=sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b
--hash=sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00
--hash=sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac
--hash=sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8
--hash=sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e
--hash=sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28
--hash=sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3
--hash=sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5
--hash=sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4
--hash=sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b
--hash=sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf
--hash=sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5
--hash=sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702
--hash=sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8
--hash=sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788
--hash=sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da
--hash=sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d
--hash=sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc
--hash=sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c
--hash=sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba
--hash=sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f
--hash=sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917
--hash=sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5
--hash=sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26
--hash=sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f
--hash=sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b
--hash=sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be
--hash=sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c
--hash=sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3
--hash=sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6
--hash=sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926
--hash=sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0
# via
# -r requirements.in
# spdx-tools
# sphinxcontrib-mermaid
# uvicorn
rdflib==7.6.0
--hash=sha256:30c0a3ebf4c0e09215f066be7246794b6492e054e782d7ac2a34c9f70a15e0dd
--hash=sha256:6c831288d5e4a5a7ece85d0ccde9877d512a3d0f02d7c06455d00d6d0ea379df
# via spdx-tools
reqif==0.1.0
--hash=sha256:419e8fb838fdb1c0cd6b79ae8c0fb06c9c01dca78690e7e6bae80bf8878d3ca5
--hash=sha256:c3af000d745e107c3d409535acc54274f469522385e6bb3923f5d3918219a189
# via strictdoc
requests==2.34.2
--hash=sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0
--hash=sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed
# via
# html2pdf4doc
# sphinx
# webdriver-manager
reuse @ https://codeberg.org/fsfe/reuse-tool/archive/f94ae0b1bb1d4d2ea91f49df88f3184c5d781a1d.tar.gz
--hash=sha256:33014f72d8bd184974ec1d61d9f81a6bfff3ba8f582a58d6ee6881a49e6819cd
# via -r requirements.in
robotframework==7.5
--hash=sha256:5a194db36524604fafa1da89adebc837db9a95adf15ffd746e09ce98251e6c68
--hash=sha256:ff6233ff752a200ece4d0a6c59f6f9f7d0e96dcff0a7a3458296b997b812482e
# via strictdoc
roman-numerals==4.1.0
--hash=sha256:1af8b147eb1405d5839e78aeb93131690495fe9da5c91856cb33ad55a7f1e5b2
--hash=sha256:647ba99caddc2cc1e55a51e4360689115551bf4476d90e8162cf8c345fe233c7
# via sphinx
ruamel-yaml==0.19.1
--hash=sha256:27592957fedf6e0b62f281e96effd28043345e0e66001f97683aa9a40c667c93
--hash=sha256:53eb66cd27849eff968ebf8f0bf61f46cdac2da1d1f3576dd4ccee9b25c31993
# via pykwalify
selenium==4.49.0
--hash=sha256:0d1de9ec6977aa2d5f766d923d5076fdffa91681a8d4ffc9e3381a36839a20f2
--hash=sha256:c9d91274e5f55835e12b524adf1f231739ea811a8866d810e5bb42ba87cd8eda
# via html2pdf4doc
semantic-version==2.10.0
--hash=sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c
--hash=sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177
# via spdx-tools
setuptools==84.0.0
--hash=sha256:51a52592b3b99e102b609654876bd65f19f999935166d1352678931132b0c670
--hash=sha256:f4695c21257f0d9b537ec2692c941d02ee143b7cc1276941349a546573b2ef73
# via sphinx-togglebutton
six==1.17.0
--hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274
--hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81
# via
# doxmlparser
# html5lib
# python-dateutil
sniffio==1.3.1
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
# via trio
snowballstemmer==3.1.1
--hash=sha256:7e207fa178741da09cdee59d3ecec3827ad5f92b1fc5c9ff3755b639f71f5752
--hash=sha256:e07bbc54a0d798fe6010a12398422e62a8bfbba95c394fd0956ef58cb4d3e260
# via sphinx
sortedcontainers==2.4.0
--hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88
--hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0
# via trio
soupsieve==2.10
--hash=sha256:49e9380d7d2905463583bafe285e818c7366a9ed7b3aee221c1ac79c905d8bc0
--hash=sha256:8596eb8967d744174820280fa62b4542a2e955bfaccca73ed8a13c6eb8e9b502
# via beautifulsoup4
spdx-tools==0.8.5
--hash=sha256:7c2d5865941be9d2e898f5b084e8d5422dd298dc5a29320ddb198fec304f59c4
--hash=sha256:be600beb2f762f0116025e05490d399e724f668bef84025a7c421bb266688bdb
# via strictdoc
sphinx==9.1.0
--hash=sha256:7741722357dd75f8190766926071fed3bdc211c74dd2d7d4df5404da95930ddb
--hash=sha256:c84fdd4e782504495fe4f2c0b3413d6c2bf388589bb352d439b2a3bb99991978
# via
# -r requirements.in
# sphinx-autobuild
# sphinx-copybutton
# sphinx-design
# sphinx-last-updated-by-git
# sphinx-notfound-page
# sphinx-rtd-theme
# sphinx-tabs
# sphinx-togglebutton
# sphinxcontrib-jquery
# sphinxcontrib-mermaid
# sphinxcontrib-programoutput
# sphinxcontrib-svg2pdfconverter
sphinx-autobuild==2025.8.25
--hash=sha256:9cf5aab32853c8c31af572e4fecdc09c997e2b8be5a07daf2a389e270e85b213
--hash=sha256:b750ac7d5a18603e4665294323fd20f6dcc0a984117026d1986704fa68f0379a
# via -r requirements.in
sphinx-copybutton==0.5.2
--hash=sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd
--hash=sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e
# via -r requirements.in
sphinx-design==0.7.0
--hash=sha256:d2a3f5b19c24b916adb52f97c5f00efab4009ca337812001109084a740ec9b7a
--hash=sha256:f82bf179951d58f55dca78ab3706aeafa496b741a91b1911d371441127d64282
# via -r requirements.in
sphinx-last-updated-by-git==0.3.8
--hash=sha256:6382c8285ac1f222483a58569b78c0371af5e55f7fbf9c01e5e8a72d6fdfa499
--hash=sha256:c145011f4609d841805b69a9300099fc02fed8f5bb9e5bcef77d97aea97b7761
# via sphinx-sitemap
sphinx-notfound-page==1.1.0
--hash=sha256:835dc76ff7914577a1f58d80a2c8418fb6138c0932c8da8adce4d9096fbcd389
--hash=sha256:913e1754370bb3db201d9300d458a8b8b5fb22e9246a816643a819a9ea2b8067
# via -r requirements.in
sphinx-rtd-theme==3.1.0
--hash=sha256:1785824ae8e6632060490f67cf3a72d404a85d2d9fc26bce3619944de5682b89
--hash=sha256:b44276f2c276e909239a4f6c955aa667aaafeb78597923b1c60babc76db78e4c
# via -r requirements.in
sphinx-sitemap==2.9.0
--hash=sha256:70f97bcdf444e3d68e118355cf82a1f54c4d3c03d651cd17fe87398b26e25e21
--hash=sha256:f1f1d3a9ad012ba17a7ef0b560d303bff2d0db26647567d6e810bcc754466664
# via -r requirements.in
sphinx-tabs==3.5.0
--hash=sha256:154be49de4d5c8249ea08c5d9bf88ca8f9c31e00a178305a93cbc33e000339e5
--hash=sha256:91dba1187e4c35fd37380a56ac228bbd54c6c649b2351829f3bf033718277537
# via -r requirements.in
sphinx-togglebutton==0.4.5
--hash=sha256:74eac6d2426110c3e1e6f989a98e07d7823141a335df1ad8a9d637bdf6a7af62
--hash=sha256:c870dfbd3bc6e119b50ff9a37a64f8991902269e856728931c7d89877e8d4b3d
# via -r requirements.in
sphinxcontrib-applehelp==2.0.0
--hash=sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1
--hash=sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5
# via sphinx
sphinxcontrib-devhelp==2.0.0
--hash=sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad
--hash=sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2
# via sphinx
sphinxcontrib-htmlhelp==2.1.0
--hash=sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8
--hash=sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9
# via sphinx
sphinxcontrib-jquery==4.1
--hash=sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a
--hash=sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae
# via sphinx-rtd-theme
sphinxcontrib-jsmath==1.0.1
--hash=sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178
--hash=sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8
# via sphinx
sphinxcontrib-mermaid==2.1.1
--hash=sha256:3b9ac1a8e0b5154dec3c0acf9b5c54dd9ba58540e416f20858c300814c25648f
--hash=sha256:f8d7f1b2f0ad69b7ebdd5cbf532fb4ee107893b5373bc2d0e9634089c0b2cfee
# via -r requirements.in
sphinxcontrib-programoutput==0.20
--hash=sha256:5c4282c1c7fc9b5a23febe16ae038b6392d7ce068d186ad4870ba22e74db0711
--hash=sha256:f473f9e7992879358efdeb9962fbec2103f6ba1cb6a738eb7f81dae554bc5ec7
# via -r requirements.in
sphinxcontrib-qthelp==2.0.0
--hash=sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab
--hash=sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb
# via sphinx
sphinxcontrib-serializinghtml==2.0.0
--hash=sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331
--hash=sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d
# via sphinx
sphinxcontrib-svg2pdfconverter==2.1.0
--hash=sha256:805635ac274583e1606b0ec7fb21f16b69ca8ff223dd7e237d91127015628b0c
--hash=sha256:9756e82d5f3bf11629ffcbafb1f8a1092d3bb4789e33494032cdce9a9c8459d3
# via -r requirements.in
starlette==1.7.0
--hash=sha256:67f8e99895493dd2911a03f11314af6ceebeae4e704bb9f43dfc6a9db151c93e
--hash=sha256:c79f74ea63cff761804fbbfb182f1e0b440c2d07b164d24700c5a1bab5d6ff5d
# via
# fastapi
# sphinx-autobuild
strictdoc==0.30.1
--hash=sha256:1e9c3fa9afaaf254a97b4a2d626db47b655f093912579c99bf731aeee0dc9759
--hash=sha256:28885881371f246ed53eecf131e1f222fe60dc276aabe47902ad7b41e349d4e9
# via -r requirements.in
textx==4.4.0
--hash=sha256:a7b15a4698b503edde631d5227c0d0f6024898a86a7924b5fc741973305f9286
--hash=sha256:f08071316d662d8dbecb0e8322510eeba71e89fa91c69a5278cbebfd1debde42
# via strictdoc
toml==0.10.2
--hash=sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b
--hash=sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f
# via strictdoc
tomlkit==0.15.1
--hash=sha256:177a05aece5a8ca5266fd3c448abb47b8d352f09d477d3ca8332db4d89b24304
--hash=sha256:e25bbf38843005246210a12982776f27f99cb9be67160e14434d0c0d21ee1e97
# via reuse
tree-sitter==0.25.2
--hash=sha256:0628671f0de69bb279558ef6b640bcfc97864fe0026d840f872728a86cd6b6cd
--hash=sha256:0c8b6682cac77e37cfe5cf7ec388844957f48b7bd8d6321d0ca2d852994e10d5
--hash=sha256:1799609636c0193e16c38f366bda5af15b1ce476df79ddaae7dd274df9e44266
--hash=sha256:20b570690f87f1da424cd690e51cc56728d21d63f4abd4b326d382a30353acc7
--hash=sha256:260586381b23be33b6191a07cea3d44ecbd6c01aa4c6b027a0439145fcbc3358
--hash=sha256:3e65ae456ad0d210ee71a89ee112ac7e72e6c2e5aac1b95846ecc7afa68a194c
--hash=sha256:44488e0e78146f87baaa009736886516779253d6d6bac3ef636ede72bc6a8234
--hash=sha256:463c032bd02052d934daa5f45d183e0521ceb783c2548501cf034b0beba92c9b
--hash=sha256:4973b718fcadfb04e59e746abfbb0288694159c6aeecd2add59320c03368c721
--hash=sha256:49ee3c348caa459244ec437ccc7ff3831f35977d143f65311572b8ba0a5f265f
--hash=sha256:56ac6602c7d09c2c507c55e58dc7026b8988e0475bd0002f8a386cce5e8e8adc
--hash=sha256:65d3c931013ea798b502782acab986bbf47ba2c452610ab0776cf4a8ef150fc0
--hash=sha256:6d0302550bbe4620a5dc7649517c4409d74ef18558276ce758419cf09e578897
--hash=sha256:72a510931c3c25f134aac2daf4eb4feca99ffe37a35896d7150e50ac3eee06c7
--hash=sha256:7712335855b2307a21ae86efe949c76be36c6068d76df34faa27ce9ee40ff444
--hash=sha256:7d2ee1acbacebe50ba0f85fff1bc05e65d877958f00880f49f9b2af38dce1af0
--hash=sha256:a0ec41b895da717bc218a42a3a7a0bfcfe9a213d7afaa4255353901e0e21f696
--hash=sha256:a925364eb7fbb9cdce55a9868f7525a1905af512a559303bd54ef468fd88cb37
--hash=sha256:b3d11a3a3ac89bb8a2543d75597f905a9926f9c806f40fcca8242922d1cc6ad5
--hash=sha256:b3f63a1796886249bd22c559a5944d64d05d43f2be72961624278eff0dcc5cb8
--hash=sha256:b43a9e4c89d4d0839de27cd4d6902d33396de700e9ff4c5ab7631f277a85ead9
--hash=sha256:b878e296e63661c8e124177cc3084b041ba3f5936b43076d57c487822426f614
--hash=sha256:b8ca72d841215b6573ed0655b3a5cd1133f9b69a6fa561aecad40dca9029d75b
--hash=sha256:b8d4429954a3beb3e844e2872610d2a4800ba4eb42bb1990c6a4b1949b18459f
--hash=sha256:bd88fbb0f6c3a0f28f0a68d72df88e9755cf5215bae146f5a1bdc8362b772053
--hash=sha256:bda059af9d621918efb813b22fb06b3fe00c3e94079c6143fcb2c565eb44cb87
--hash=sha256:c0c0ab5f94938a23fe81928a21cc0fac44143133ccc4eb7eeb1b92f84748331c
--hash=sha256:c2f8e7d6b2f8489d4a9885e3adcaef4bc5ff0a275acd990f120e29c4ab3395c5
--hash=sha256:cc0351cfe5022cec5a77645f647f92a936b38850346ed3f6d6babfbeeeca4d26
--hash=sha256:d77605e0d353ba3fe5627e5490f0fbfe44141bafa4478d88ef7954a61a848dae
--hash=sha256:dd12d80d91d4114ca097626eb82714618dcdfacd6a5e0955216c6485c350ef99
--hash=sha256:ddabfff809ffc983fc9963455ba1cecc90295803e06e140a4c83e94c1fa3d960
--hash=sha256:eac4e8e4c7060c75f395feec46421eb61212cb73998dbe004b7384724f3682ab
--hash=sha256:f5ddcd3e291a749b62521f71fc953f66f5fd9743973fd6dd962b092773569601
--hash=sha256:fbb1706407c0e451c4f8cc016fec27d72d4b211fdd3173320b1ada7a6c74c3ac
--hash=sha256:fe43c158555da46723b28b52e058ad444195afd1db3ca7720c59a254544e9c20
# via strictdoc
tree-sitter-c==0.24.2
--hash=sha256:1628584df0299b5a340aa63f8e67b6c97c91517f52fa7e7a4c557e40adb330a9
--hash=sha256:4a2f4371cd816cc3153458f69062135ebb2ea5f275ddd90494e5c823d778204a
--hash=sha256:4d4579a8b54f0a442f903d88d3304cab77cd5c2031d4015baa4f2f8e15d6dcb7
--hash=sha256:5041ef67eb68ce6bc8bb0b1f8ef3a5585ce523dae0c7eec109ab0627dd75aede
--hash=sha256:82842c5a5f2acd93f4de10038c33ac179c8979defc39376f990348d6289e933b
--hash=sha256:97bc80a224d48215d4e6e6376bf30d114f4c317b8145ff1b02afe785d4ba7bdd
--hash=sha256:abb549225091f7b25df2dd3a0143ece6e208f7055d8bcb4700b41ee79b9ef1e1
--hash=sha256:c098bedcd5ac86ff93fa734d51d1dd86aed40fd5ed7d634c7af11380a0469969
--hash=sha256:e2b42e8e22202c251f8629306f9321233542e07a6e01611b5fe83489272143eb
# via strictdoc
tree-sitter-cpp==0.23.4
--hash=sha256:247d127f0eb6574b0f6b30c0151e0bd0774e2e7acf9c558bdf9fbb8adc2e80c0
--hash=sha256:68606a45bea92669d155399e1239f771a7767d8683cd8f8e30e7d813107030ca
--hash=sha256:6a59c4cebb1ad1dc2e8d586cf8a72b39d21b8108b7b139d089719e81a339e41d
--hash=sha256:712f84f18be94cbe2a148fa4fdf40fcf4a8c25a8f7670efb9f8a47ddec2fc281
--hash=sha256:773d2cafc08bbc0f998687fa33f42f378c1a371cdb582870c4d13abb06092706
--hash=sha256:aacb1759f0efd9dbc25bd8ee88184a340483018869f75412d9c3bc32c039a520
--hash=sha256:bc3c404d9f0cbd87951213a85440afbf4c31e718f8d907fa9ee12bea4b8d276f
--hash=sha256:ccc43ddf1279d5d5a4ef190373f4cb16522801bec4492bcd4754edf2aeba2b7b
# via strictdoc
tree-sitter-python==0.25.0
--hash=sha256:0fbf6a3774ad7e89ee891851204c2e2c47e12b63a5edbe2e9156997731c128bb
--hash=sha256:14a79a47ddef72f987d5a2c122d148a812169d7484ff5c75a3db9609d419f361
--hash=sha256:480c21dbd995b7fe44813e741d71fed10ba695e7caab627fb034e3828469d762
--hash=sha256:71959832fc5d9642e52c11f2f7d79ae520b461e63334927e93ca46cd61cd9683
--hash=sha256:86f118e5eecad616ecdb81d171a36dde9bef5a0b21ed71ea9c3e390813c3baf5
--hash=sha256:9bcde33f18792de54ee579b00e1b4fe186b7926825444766f849bf7181793a76
--hash=sha256:b13e090f725f5b9c86aa455a268553c65cadf325471ad5b65cd29cac8a1a68ac
--hash=sha256:be71650ca2b93b6e9649e5d65c6811aad87a7614c8c1003246b303f6b150f61b
--hash=sha256:e6d5b5799628cc0f24691ab2a172a8e676f668fe90dc60468bee14084a35c16d
# via strictdoc
tree-sitter-rust==0.24.2
--hash=sha256:01a46622735498493f29f3e628a90de95c96a07bfbeb88996243eb986b1cee36
--hash=sha256:3620cfd12340efa43082d45df76349ff511893a9c361da2f8d6d51e307020a59
--hash=sha256:4529c125d928882ddfb879fdc6bc0704913261ecc078b6fa7902559e0daf200d
--hash=sha256:54fb02a5911e345308b405174465112479f56dc39e3f1e7744d7568595f00db9
--hash=sha256:66ba90f61bd54f4c4f5d30434957daf64507c16b0313df76becb37d63f70a227
--hash=sha256:87930163a462408c49ab62c667e74029bc26b4cc7123dd1bdc7352215786c64a
--hash=sha256:9d76d1208c3638b871236090759dfc13d478921320653a6c9da5336e7c58f65a
--hash=sha256:da2b86099028fd42c6cd32878b7b16b01f8aac0f7b0e98742b7fa6bc3cf09b89
--hash=sha256:e033c5a93b57c88e0a835880de39fc802909ff69f57aaff6000211c196ea5190
# via strictdoc
trio==0.34.0
--hash=sha256:63b9485408bdfdde544fced107045a8c0086cdc4bd0ef2f797b9e0dd111b964b
--hash=sha256:6c7c9f49917694dcdcd5f67abd168df5599eca480d61f29854d17a61a75c2f05
# via
# selenium
# trio-websocket
trio-websocket==0.12.2
--hash=sha256:22c72c436f3d1e264d0910a3951934798dcc5b00ae56fc4ee079d46c7cf20fae
--hash=sha256:df605665f1db533f4a386c94525870851096a223adcb97f72a07e8b4beba45b6
# via selenium
typing-extensions==4.16.0
--hash=sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8
--hash=sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5
# via
# anyio
# beautifulsoup4
# fastapi
# opentelemetry-api
# pydantic
# pydantic-core
# python-datauri
# selenium
# starlette
# strictdoc
# typing-inspection
typing-inspection==0.4.4
--hash=sha256:547274fa6b0a561ccf549cc9524b999a578e737d015d8709d021f9d0d13bea47
--hash=sha256:65b8397ba37ccbce054456aaccddfc91e6e3083c92824df348d96ca832f3f147
# via
# fastapi
# pydantic
tzdata==2026.4 ; sys_platform == 'emscripten' or sys_platform == 'win32'
--hash=sha256:c2169a8b0a7a5e9674da5a135ccdfb2b3e671b333ed9fed17b41f73c34476e81
--hash=sha256:f1b8bd365d8d210c55353f4d7f8d6d8561c0ba50d704b700d195a9424bba0d79
# via pandas
uritools==6.1.3
--hash=sha256:136f113e76e53f85bf2d9cce0c3d40ceec775d0409e7d6de9b28f046a7d42838
--hash=sha256:3a498e7e85ef3249343d5710618d641a414da0fbae6d23053ada7976ee83ea5f
# via spdx-tools
urllib3==2.8.0
--hash=sha256:0cf3cae568d36aa9576b28dfb35f11328f1cb974ca7647d9475ebb86c75ac6e3
--hash=sha256:63bf2ead4c879426ebf22ef2a781eeb4aa3b4ae798a0435506f8687fd5bb9b63
# via
# requests
# selenium
uvicorn==0.54.0
--hash=sha256:505bdb0f318731d45f1f712071fc781a8981f6847a31c902c9f5e652d4f67faf
--hash=sha256:a2e33cbfaa0306f8e6b0c13e0cb89d7d7a2da3e62b90c66e18c33d9807b28620
# via
# sphinx-autobuild
# strictdoc
uvloop==0.22.1 ; platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'
--hash=sha256:017bd46f9e7b78e81606329d07141d3da446f8798c6baeec124260e22c262772
--hash=sha256:0530a5fbad9c9e4ee3f2b33b148c6a64d47bbad8000ea63704fa8260f4cf728e
--hash=sha256:05e4b5f86e621cf3927631789999e697e58f0d2d32675b67d9ca9eb0bca55743
--hash=sha256:0ae676de143db2b2f60a9696d7eca5bb9d0dd6cc3ac3dad59a8ae7e95f9e1b54
--hash=sha256:1489cf791aa7b6e8c8be1c5a080bae3a672791fcb4e9e12249b05862a2ca9cec
--hash=sha256:17d4e97258b0172dfa107b89aa1eeba3016f4b1974ce85ca3ef6a66b35cbf659
--hash=sha256:1cdf5192ab3e674ca26da2eada35b288d2fa49fdd0f357a19f0e7c4e7d5077c8
--hash=sha256:1f38ec5e3f18c8a10ded09742f7fb8de0108796eb673f30ce7762ce1b8550cad
--hash=sha256:286322a90bea1f9422a470d5d2ad82d38080be0a29c4dd9b3e6384320a4d11e7
--hash=sha256:297c27d8003520596236bdb2335e6b3f649480bd09e00d1e3a99144b691d2a35
--hash=sha256:37554f70528f60cad66945b885eb01f1bb514f132d92b6eeed1c90fd54ed6289
--hash=sha256:3879b88423ec7e97cd4eba2a443aa26ed4e59b45e6b76aabf13fe2f27023a142
--hash=sha256:3b7f102bf3cb1995cfeaee9321105e8f5da76fdb104cdad8986f85461a1b7b77
--hash=sha256:40631b049d5972c6755b06d0bfe8233b1bd9a8a6392d9d1c45c10b6f9e9b2733
--hash=sha256:481c990a7abe2c6f4fc3d98781cc9426ebd7f03a9aaa7eb03d3bfc68ac2a46bd
--hash=sha256:4a968a72422a097b09042d5fa2c5c590251ad484acf910a651b4b620acd7f193
--hash=sha256:4baa86acedf1d62115c1dc6ad1e17134476688f08c6efd8a2ab076e815665c74
--hash=sha256:512fec6815e2dd45161054592441ef76c830eddaad55c8aa30952e6fe1ed07c0
--hash=sha256:51eb9bd88391483410daad430813d982010f9c9c89512321f5b60e2cddbdddd6
--hash=sha256:535cc37b3a04f6cd2c1ef65fa1d370c9a35b6695df735fcff5427323f2cd5473
--hash=sha256:53c85520781d84a4b8b230e24a5af5b0778efdb39142b424990ff1ef7c48ba21
--hash=sha256:55502bc2c653ed2e9692e8c55cb95b397d33f9f2911e929dc97c4d6b26d04242
--hash=sha256:561577354eb94200d75aca23fbde86ee11be36b00e52a4eaf8f50fb0c86b7705
--hash=sha256:56a2d1fae65fd82197cb8c53c367310b3eabe1bbb9fb5a04d28e3e3520e4f702
--hash=sha256:57df59d8b48feb0e613d9b1f5e57b7532e97cbaf0d61f7aa9aa32221e84bc4b6
--hash=sha256:6c84bae345b9147082b17371e3dd5d42775bddce91f885499017f4607fdaf39f
--hash=sha256:6cde23eeda1a25c75b2e07d39970f3374105d5eafbaab2a4482be82f272d5a5e
--hash=sha256:6e2ea3d6190a2968f4a14a23019d3b16870dd2190cd69c8180f7c632d21de68d
--hash=sha256:700e674a166ca5778255e0e1dc4e9d79ab2acc57b9171b79e65feba7184b3370
--hash=sha256:7b5b1ac819a3f946d3b2ee07f09149578ae76066d70b44df3fa990add49a82e4
--hash=sha256:7cd375a12b71d33d46af85a3343b35d98e8116134ba404bd657b3b1d15988792
--hash=sha256:80eee091fe128e425177fbd82f8635769e2f32ec9daf6468286ec57ec0313efa
--hash=sha256:93f617675b2d03af4e72a5333ef89450dfaa5321303ede6e67ba9c9d26878079
--hash=sha256:a592b043a47ad17911add5fbd087c76716d7c9ccc1d64ec9249ceafd735f03c2
--hash=sha256:ac33ed96229b7790eb729702751c0e93ac5bc3bcf52ae9eccbff30da09194b86
--hash=sha256:b31dc2fccbd42adc73bc4e7cdbae4fc5086cf378979e53ca5d0301838c5682c6
--hash=sha256:b45649628d816c030dba3c80f8e2689bab1c89518ed10d426036cdc47874dfc4
--hash=sha256:b76324e2dc033a0b2f435f33eb88ff9913c156ef78e153fb210e03c13da746b3
--hash=sha256:b91328c72635f6f9e0282e4a57da7470c7350ab1c9f48546c0f2866205349d21
--hash=sha256:badb4d8e58ee08dad957002027830d5c3b06aea446a6a3744483c2b3b745345c
--hash=sha256:bc5ef13bbc10b5335792360623cc378d52d7e62c2de64660616478c32cd0598e
--hash=sha256:c1955d5a1dd43198244d47664a5858082a3239766a839b2102a269aaff7a4e25
--hash=sha256:c3e5c6727a57cb6558592a95019e504f605d1c54eb86463ee9f7a2dbd411c820
--hash=sha256:c60ebcd36f7b240b30788554b6f0782454826a0ed765d8430652621b5de674b9
--hash=sha256:daf620c2995d193449393d6c62131b3fbd40a63bf7b307a1527856ace637fe88
--hash=sha256:e047cc068570bac9866237739607d1313b9253c3051ad84738cbb095be0537b2
--hash=sha256:ea721dd3203b809039fcc2983f14608dae82b212288b346e0bfe46ec2fab0b7c
--hash=sha256:ef6f0d4cc8a9fa1f6a910230cd53545d9a14479311e87e3cb225495952eb672c
--hash=sha256:fe94b4564e865d968414598eea1a6de60adba0c040ba4ed05ac1300de402cd42
# via uvicorn
watchdog==6.0.0
--hash=sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a
--hash=sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2
--hash=sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f
--hash=sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c
--hash=sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c
--hash=sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c
--hash=sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0
--hash=sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13
--hash=sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134
--hash=sha256:7a0e56874cfbc4b9b05c60c8a1926fedf56324bb08cfbc188969777940aef3aa
--hash=sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e
--hash=sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379
--hash=sha256:90c8e78f3b94014f7aaae121e6b909674df5b46ec24d6bebc45c44c56729af2a
--hash=sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11
--hash=sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282
--hash=sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b
--hash=sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f
--hash=sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c
--hash=sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112
--hash=sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948
--hash=sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881
--hash=sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860
--hash=sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3
--hash=sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680
--hash=sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26
--hash=sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26
--hash=sha256:e6439e374fc012255b4ec786ae3c4bc838cd7309a540e5fe0952d03687d8804e
--hash=sha256:e6f0e77c9417e7cd62af82529b10563db3423625c5fce018430b249bf977f9e8
--hash=sha256:e7631a77ffb1f7d2eefa4445ebbee491c720a5661ddf6df3498ebecae5ed375c
--hash=sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2
# via strictdoc
watchfiles==1.3.0
--hash=sha256:000b9688fc8133037a8b075c8ebf98f32844ff8964dda61e85c1db547dafc441
--hash=sha256:025b108f2d5cc2799cb941f79380df3e8b22bfb589c218e801767fe78d598c95
--hash=sha256:04c5500faa725d69a99b0f63750e80795e455bb951849e9c98a811b4324997c4
--hash=sha256:1acabde19b67e673274e89a04d613b7fb1f122e2c4b8ec9a581e59c149264b61
--hash=sha256:26b81bc515a0f03f66a69a6fea86eea54c8eca4173c46dd7222569f79dd2f977
--hash=sha256:380f513d26cc2e598266b88d66456e07d67ef4be8f0f435a1154d9c44b43d509
--hash=sha256:45726c6b5a8d67c8087eb2933c4398948546d04206ef40f629dc4881d65d23d1
--hash=sha256:4af9c464d410e8c44b58ddf1cbec7c3a02c1cb2c6c80df9c74659ba2fbda0ab5
--hash=sha256:509d9f74d2bec5c1f4cd868ddcfe0c9601f7ea53066dfcb19d8ede742c4de661
--hash=sha256:591de392458bca26f6130fea4e667c06b657e873ad334ea06fad5a79f5086cef
--hash=sha256:5ec46a1ff4c1d81405a5fc645abdbff5e4e9388f7c9a6cdb392316a7c29b884f
--hash=sha256:6398d250994baff581147ccba846223076fe6492ca93c0d1b3588fcf5355eb5c
--hash=sha256:7398930a2b76b9dc67a4e6b8bfc7baf30946892a86f417a3920c07bdd6febc30
--hash=sha256:7c1125e99f84934a92996ae343501285617373acd66f16b59fd5654b27ad8d80
--hash=sha256:81c989d7267bfb7b676cd32c83bec97914e396870983cbf493e29415037bff5e
--hash=sha256:99aee4a07847c06820765fd7b1b49ceac4f3f711ccb7d104655a33231de1c207
--hash=sha256:a5b631db08fd3032db57ec6a92d1777cd60f88803287e4e941a4858c53aab1e0
--hash=sha256:a85e243c87109d9f48a2e0d10d6abdee8768cc114848b32281ec83d7f81d86ef
--hash=sha256:b5768b49e426fd5b550b012c866db347cdf15c398ef98dc557b6e6b72fa74cd1
--hash=sha256:bbc1198edfdc90fda0600f825aa94150f428dfcbf8138746f55998e0e660d64c
--hash=sha256:be9ef3cd403d756a304a0a08a112163c63da7ec72c8c9d083c98818291ff8f29
--hash=sha256:ca39661934749df580d89f3dde266f2af7c6968f4c21c72ce2dc387d299e6aa7
--hash=sha256:d36c72fcdc08f143d87316a4c4c3b064e340da2c7383d39803950740ed418935
--hash=sha256:d4593392e87669836670f87d62fc754059eaeb0e6157af44060a46558cebe5a3
--hash=sha256:d754e049006e81a9be49dc78ba7802081cee426e968cbc63ee19e164fa2d0e39
--hash=sha256:d978cc1dd7ba44f5590d7de74f7a9c8be7262d9e469c2c0efb8bbfc2574321dc
--hash=sha256:da213822ec9082b62cadf3008e07a8c690ec7a3c89f6dc5e55a8cf07b56a1b26
--hash=sha256:dd538c71766c59c732e2c5cedc39323c99c11897b99f93eac773438e54af206a
--hash=sha256:e0204f90677b7fb8d3a824279a71a01166bea9f6e53923b8056592d87b33b0b6
--hash=sha256:e5871d4a7f788a9f64fb06f5793389d29d171e5c32d37c3ebfd520b017cc7694
--hash=sha256:eb94e40b9a0db19636b5e3fed0a9803452ecc7381df13b385272abb779ee83ca
--hash=sha256:ec3cd4bb181a7b6329134204c2277c7144ab5f62cce9c5335d6f901ee7ce8d6a
--hash=sha256:f0c9865240e065a2247f4b5248528ae3d01e0e8ae071462c250c884dc16e3ee3
# via
# sphinx-autobuild
# uvicorn
webdriver-manager==4.1.2
--hash=sha256:230515ff4dc4c2feff1add25306ca262421b31016d77ded305e8dd921266445f
--hash=sha256:552bbb4e6f95e6e8b772565d2023e7c0ec5ff1736db0b186922d0466fc78c3de
# via html2pdf4doc
webencodings==0.6.1
--hash=sha256:565f9ad031c702dae404e27a099e3e09186a3ab1b9520f06d215502b651fd910
--hash=sha256:7fab6269c8bf237c657876b52058ccb182e861518d1c695c1a9aaa8c1c105d5b
# via html5lib
websocket-client==1.9.2
--hash=sha256:0fcb57545848be86992e128218fd96dd87a6769ffdb1a968dff79632b85604d0
--hash=sha256:e1a673830a9c7bfa47b1cd3d5e4178f4c9651d80a4eab02c9c23a1c3ec6250ce
# via selenium
websockets==17.1
--hash=sha256:0014eaff8ad5b3b43feda2279f9d34bf2eaae040720b9fbbb55944b10f40b14d
--hash=sha256:00679b7468b4c2b12b0757118174e8eabac56bb2f579a928a104d9554a56e098
--hash=sha256:00bf34b64501e3477e81fc281532ff3cbf4da26633c10b63979d5085d46602d3
--hash=sha256:01dcb47deebc40b38fd4a493b9b9f4d0a704b7bec6f35e4d34085b329abce71a
--hash=sha256:020e271205f8ab3406d7a59cd00de6dec722315924411c421bd00642f18bad86
--hash=sha256:0340bbef6bfbe16da888b3983d666a4db4954ac3253c38f13bc7aba0c7db5a2f
--hash=sha256:054c28db2dcec0e857e3b705d8c28012613e555b38c765d6a4f75340a4fc06a0
--hash=sha256:073c5c3f7e127041fa9d34a9e29ceefee8c3cafbd267ed2927318f425144380d
--hash=sha256:07fa3e7c30e2c577928d359b56bf872a3e0cbcc15553eaa0907c1ee86344b56f
--hash=sha256:0c84bdef916556cbe1d5a43b423398be4dd3cba6522b463e53d848578b920695
--hash=sha256:0c863507ada5805517ca6dff1c524dcd42942efe6304dacf06700878398d21a6
--hash=sha256:0c9982938980e086da59f70d05f9418cd143401a601a0faac10fa48f7bb1cd3e
--hash=sha256:0de501b7f2db11e83739ac20e2d33d46da4604b829f506c24be80e7def069391
--hash=sha256:0f4f50dfe2cc810fc4e2de979b35e83bf8bb4bccdc6fe472d93762ea7b1d5927
--hash=sha256:1036189bd34b0bc1b10a4679321e2c7968af317efe6e8e4c1c5141c4254fb5bb
--hash=sha256:10ecb38ffc05e1841b619d99c725307a223ef9ad58e7b1ed33311d472dc43918
--hash=sha256:12c8e2b25df59755954a04dfa09c990b96691025aaf7eafd19ed6da24b09c18d
--hash=sha256:12fe8984a32dbfd084e0603f1a8d740c0180cb85b3174585c54a80d2455a8394
--hash=sha256:17aa424ab61620aad21b36b2240efc87b500cc496e7d0e999a5c2ae99395e886
--hash=sha256:1a20136d61f9ca3a31493732762661fafc2c20e8861930214e21afc6a8a692a2
--hash=sha256:1a5cf4e7bbe3ca499e6a289206cb4fcb7444b09919e129bd517f57d5fa192c13
--hash=sha256:1c7ac77401227212dc6e849182feee50d57cf456ec6329ffd6979c94bb136c5c
--hash=sha256:1fce0f43e0d41422e0b2cad6561e1970df22f212f4c7e884967df7cf591b031c
--hash=sha256:259f45358c76d3b18489e3e80636cdbe807e05ecf1b10fdf1a779106d23d0c8e
--hash=sha256:2786cbd273ab69c22612db8a41229ddf2c158060b17b5928884bf388d07887f3
--hash=sha256:29176d8b429cfa0fa443c473878d37a5c06cfd0cb36b71ba4314accc71e05906
--hash=sha256:2a0162a6372110a5601cb5c9fd826635cedf69f3e110c545dd19774e040b970e
--hash=sha256:2a4dc6ef83f4559e0d05f313a375cb38f63c986096a9da99fe94fdd779d313e5
--hash=sha256:2afb58c7ba48b329d56769f8dfd89f394efe587b65ef806bae810a484d6d3608
--hash=sha256:2cce251f3e2469b99b6802b55435bcdd07123b41870f54c87b336183af9d7e68
--hash=sha256:2d72879819f5145a342d0030c418702496c65a4b913ef81f5ae944dd91dd50f6
--hash=sha256:32a2a68d989d6e5b74a9d5095415c51189ebae29fceb7cf2b64a1c0318a81256
--hash=sha256:33e45c7ea38428e740a7f233555d71df0b875cef7fc080acebc9654475e35335
--hash=sha256:34879e19bb0a3c44f9317679435aea5327fac993933a704cbf353bf1234b10c7
--hash=sha256:3546ef55b3a074494106508bc6505c73825970d2d9505f7bf53882b3e88b0d1e
--hash=sha256:3709a1ab30b4b922027d22f68d2b61a0656a91680ac894a537624e6be7dd7f7c
--hash=sha256:4031152769179ab8dcdeafc7b0e58052a49117560a28671700b47b2c7b717aad
--hash=sha256:406b8107943a43ef4649b1e0cb0cdc052bbf08fe1c8905a623c4af9586e5cebb
--hash=sha256:416b4bc8789a1865a3ff643ec4ee073a5f52402d0dbeafd27b1798d5dd6b6a51
--hash=sha256:43bd0c1ceb924d67f5c1a5254d8361dd9d94246e6331a726064dfa2917880780
--hash=sha256:455ffeea0879d313205df1e745e5883e1feb7f31ecd26be882f5f0babd3db04f
--hash=sha256:469355ab1af100b9380f1afb09985019f4a4b94fa1dd0e9396db4361626d7ab8
--hash=sha256:46c0331c9eaaf73a559f3a9e388466be0df96eb83d40f06f1ca6ab6613b35c82
--hash=sha256:46e7a10bf04318c7b0c0273791925ae5e1cbe4a11e34aa934d2ef27862058a80
--hash=sha256:47a62d6045c6eaa0d8f97bc2fb68b8cf90077a0cbfd4e83d6f2d2145611ee134
--hash=sha256:4af784f3e436f65b355c117c6497320f2b5cf6a559295cb1c4c7338e335d45cc
--hash=sha256:4e8ffcb486c8490a34a4cef5e4409d8da5a1cb1681e5bf7d786ce5e84aa8540d
--hash=sha256:50903d335bfda026c2fa11dd9aed09d8cbee0c451e3a85122a9acb041b7dc69b
--hash=sha256:57b39dc8541cf7ed3f639da82bf7451060483967f9e733da1f8173e4095f0642
--hash=sha256:581fa678ef46f4277cc8491312468e582f8ad609dbab907ba6096a08c6a0ff98
--hash=sha256:5a74531ce81af587f906ab42f194032388fcff8fc7938402e5917c9147a39441
--hash=sha256:5aefe78e6a3077fe22b5e64b04666a85a3eb8b934d40e8595a693adcbceb6f11
--hash=sha256:5c27336b1a0ac56569493e858497870347854372395f50483725f8cdacc5a45c
--hash=sha256:5d4724255fb8398acd9e583b97eb2279cec20e0bd0f9a94bf75f6056ef9f13da
--hash=sha256:5f051f8030a51815dc00e24bd2e5f1435af095c1cc111d747ac6e2a3620d7641
--hash=sha256:615746b12b26a3fd4077bc6fbeb277a1c192a45dd57b531d07ad9ed5c52a9a7a
--hash=sha256:617243e19a0992095956f406ee9cd3bc4ba92862d83cb1d83bb59ce574412bec
--hash=sha256:655a8e28010f09fd6fa317e857afab3af7647f33e41dee88fa421e92086d1090
--hash=sha256:65be6bda2b537fefa4b3a5ccd6ab386533ce39dd8fe62433ec90901fdc81752d
--hash=sha256:67258b00302a5aaf0b267771c7014b13429abd7ea17eebc4c55bd935ff101555
--hash=sha256:677014a073bcb1fbaa7e21144786864f16c08f856d66834f611eceb9006cbab8
--hash=sha256:6a8e768a048c2220697477ce2e67e4345dc9f693d0ee6af53945b5e30227c6a7
--hash=sha256:6da17fc94bd270f5987b10bee113461ac36a36a98b0481ddcc98056e5a90001a
--hash=sha256:6de9acef07e3a78e9567fcd26c29011a4da8f050b13004bbf880a0fd82a6eea5
--hash=sha256:6e63c01803be425ff062b7f7fc201a74def1d49fc94a2410dd17375df75936e9
--hash=sha256:6f42912fa9eb4cb7c7ec9fde9b3332ba339eb8a8811981043d4029599f3d950b
--hash=sha256:722ec21717eec6477bce582147a28acdfe034e604239466a6a95daedb863e774
--hash=sha256:764cf7bfa149365f32b7a0fd9fed32debdac29dd06295d5635cde1745b446cd8
--hash=sha256:76dd004f59115087c7b700474cb18f01325e37250032e19396c08ae41448e4b3
--hash=sha256:77b37cceca17291897c3c73bd30a7c7c7909593554b5da574ec852af83c1742a
--hash=sha256:7a72efa3bf4fa3a6669a54420a472ad056da3973d827f10e3a536da463f926c2
--hash=sha256:7e724f843fa6a0614aece65a7c73e51d0f4412ca41dccac13c3caf98e69536bb
--hash=sha256:8196d217eeca52b9235ee1f8a684a09885a5f953d5a31e80ef915bf2c5c94f9d
--hash=sha256:829dba1bc049779de9b332088c1a6a9858e96bd67e50b6b644a95e02b67836bc
--hash=sha256:84f25e099fdfe3b09f953d84698f729a1f7d1e99101b2787d7a28ed77b323750
--hash=sha256:87f0d5e77548b0c40c8464cdb6108792e7e53f487c6400028a4ec28a8afbe5ab
--hash=sha256:880069d21cc33a558dcf180924a546d1ecf8ada5be3e4e70acee87019d706a24
--hash=sha256:882af300d2c6a092b93767d5de03c7bb56dfb06314140c8e872d3f48e09f7b74
--hash=sha256:88381602e379165b66244b2ebc29f9b23ea0851fbe63ae157f91ca324f072d6f
--hash=sha256:88b882764ef65147a7a5ae13168dedbe225a04e2ff4858fe543f2c402f093e9c
--hash=sha256:88bc5138e53903a85c354e59df7ba73ce306f7b09724cef74dba121e60a88ce2
--hash=sha256:8d1b108bd8f5f6a8b90801f6db3b3858d5deca889acfdb8ac497bbb24e4b0edf
--hash=sha256:8f6c38cdcaf98a911d7acc25577f2f9e710f3a2fc2bde1563556784320196b51
--hash=sha256:8fbf28e639544503b7d1c96452a5e5e043e4108d89b1f3fa02910603622d19db
--hash=sha256:96abdecbaae746851b87c3a36cb4a661df93ca3d92f114270f79228bf1d00de6
--hash=sha256:98a5b2589a56a4b4f098b0a958099a4356ab904a7844f1da3841efca469af7e9
--hash=sha256:9ae55d24241fc055f22aea3ac924559069848bd0ad4ea065fdd72d2194685fe8
--hash=sha256:9f4a08ff7cb68c27b18e09223cc6304e01d0f82d5a240d251266dfd2e6e44729
--hash=sha256:9f4c0377a83e163a303514fdfab501dbe379bdc13e5b9312a91d112658b29dce
--hash=sha256:9fa1ffa08c81a4f809cdab6129f8e55bee4650b9d6d3461019dda73aacd146b6
--hash=sha256:a06f3b5085176763182449559e20391d7ce616a8972a9f7a33deda87ea6d4f3c
--hash=sha256:a62d8c424383c9dc769ff3672018df822603117e32686e567d452ed035b6fb2e
--hash=sha256:a7b35181a14cbfcae163b4de545d22abfd07d06c2c41ca69cfcd99251d6888ab
--hash=sha256:a9fe648abd1d9b89aebfa30407bfdd08a0271ec5dc7d44a4c6ccd1ce22cf562a
--hash=sha256:acfea4c20bf54384883ea33b1240fc1db4f52e190823a4e2b334bc3e8bfca96a
--hash=sha256:ad68c28a27246fed109a4409393d677b7e1388345cbbd2f5aee5c182d8506110
--hash=sha256:aec00f018d34c67500ff0438dc314b40277be4a1b983cbacbf53ccf7db63e257
--hash=sha256:b1bc819c6db90e8f91a38250a1ab4c058261871aa52d2fe36382eddedf146dee
--hash=sha256:b1c323fc3be1dc3f87f6c59458cb7d9e13dcbbf971d6c3f3e2bbaf58d3bfcdfe
--hash=sha256:b3b451fd2723ad3191a209afe6f3f4bc86c83e9a85bdc255353b91803ee6aa66
--hash=sha256:b65d5fe48219dc2d5e158de9e6514e75600f379cc7e37108d35f31764c155566
--hash=sha256:bb0efe019480a1c93e168ce96479273aaebd672fc8c350d5eed1e507ababb1b8
--hash=sha256:be3f0129c5654517b2abf07dcb75bb1d9479759a4ccfb569e8293579e9fc029a
--hash=sha256:c3241d684a76eaaef8b2dc789afde4343cd3aad55ea81e4e8ab3605b529bae51
--hash=sha256:c65da239a5ad553619804c1f9d65c1a0b3005381c6158ee14da2c7444cbd0c78
--hash=sha256:c89406fa3dcd4aa8662c6406cc5c0de1790e9614d2c3aaf03ca53a8a8ccf3405
--hash=sha256:ccbf3f4a9890d50b3a08ee04029fde30a03bfdeffaa19977628bf17251764e60
--hash=sha256:ce0305b702b20d1e1d60a9aaace6bc89970e1753565543f310d549eab22c2435
--hash=sha256:ce13c7d233239e739600a57d4a73c1192ad8259e655a4d55aa1a454242bc809d
--hash=sha256:cec1bb8f22abccc8d20f8ca63df9be41600c26c190f4b97ee86c675fd4a863a6
--hash=sha256:d1e2f5fa2b6d01f0d85b4f223fea7ed1d504be282a02a81bd2be4817ef7a2f03
--hash=sha256:d334d11398086bb5559606cb42d51c013ea7c061c7db701521392373d3c087f5
--hash=sha256:d411ea5ca18ac1b12c0c94be88b60c18ca641ac43bcdfdf1c9f79d46cdbe1603
--hash=sha256:d41ef69d5416fbc1d98cf96c37be6192d10fd101c3e0f8b3ddc36e09432b3c08
--hash=sha256:d58159af7835fde09c462394293c0d7aaf8fb4557d8f8e5699f5e722ccae013d
--hash=sha256:d7b349265fad6244013eecd99df8d83c12bf3013943e431f4fadd5bffc37db42
--hash=sha256:d8e83333385cac6030a5167fd18bf96cc6c58b914c308e683f05b0cf94bc8dd0
--hash=sha256:d9d01e8ede41fea4f5a847dad9d628355f74905f437a5b6856d67aa66d193800
--hash=sha256:d9fc873e239c5abeb150bc24dbd1a7af23a9254526383ce0a077f5e20adbeb19
--hash=sha256:db9d7ee47f3ba531e278be539af39e2c7c7d28fb94897b6cd1120d63b0ef5922
--hash=sha256:dc053f9e95a76213c5eb7ed95779f7daf0d2bf0e4e03073629ebfa43a033f151
--hash=sha256:dc2b79afc074d2f3e64b26539350f697fe1b85ea1c49ea24eb588f247b053ce1
--hash=sha256:dc5789e5ea182b77a38881383ada5347202a6c66f4857d054e075290e80b604b
--hash=sha256:dcb8d5f7edef7a399d322cf28d4c4e6f98dab64d301c8f50581a1080e5198142
--hash=sha256:e4bd7eacb87d8cf3ed70d6392c770a0d92441f05d7d2a3efafb5bc171d5e3067
--hash=sha256:e552e0037230ac16e5f568de7012041344d1b18c9feed30ec2891b8eba55af81
--hash=sha256:e5f5c7a893507d0e83a80b88aefd6522f7e882cd53f9722c6f23f5a020c9557c
--hash=sha256:e74e41f0ad12ff1e8983e349daef79d37cc8280c743ce9d134d6c74c18dab5d6
--hash=sha256:e78fd4b7b2c5086a38671c9c882c1e643385eccea360b5b1fda4a105e590087e
--hash=sha256:e8dc3fa6d6b7ead3f9de57895f41b116a28787548e066365d9d90f7356bcaad2
--hash=sha256:ea0ed9373b880115911d9d39634bccc95b8ce590c9c42e8589f5cacc3ef3cee2
--hash=sha256:edadce7a22052056fd4384543019856b34850363c9d387929f677ae01d79709c
--hash=sha256:eec113a5b41d124ef42ff56b0d74a6da3fd986400038eab9e58ee42a4024e837
--hash=sha256:f221081107b8c48184d99f7019604486376e7ef826037e70aad6b02540732c23
--hash=sha256:f3a1d577e081667dda7f8e5b4796e6e32f9713c93e2a3d930669519840a3c623
--hash=sha256:f47aafd92aa28b941180e6da8a42b0f711851b14b81a5b6bb28dbbb1fa35152c
--hash=sha256:f4c45ee2512d3757b5e6c67c5a34e435143f2ecb7df3324f9fd888688c45c0f4
--hash=sha256:f58f58b4b29bbea2a3635e2c56eff4a3adab011fe383802a9e542e31b97085fc
--hash=sha256:f612dc57f00c07cf4aa2673f7cbceabd654ad2457b7e639f061b794d6e11f9fd
--hash=sha256:f62114a54117e4948a1e414e89521f7fe1e3c2f83f2a571a06a4fc6718b0900a
--hash=sha256:f64e001bb7fa89b9f32cfa600bf8e9ac8ca26759d9b92ae01453ee303d9cd7b4
--hash=sha256:f7233eaf441a345a5943a929fd4b5ea3278f11aed35a9ed0f3106b8cb3ca846a
--hash=sha256:f78a3ffb1994304db2c0c4588e4d1a518079b557054fa3bb985a6f5e50ff49a3
--hash=sha256:f8e822efd54137d8cc8310eb64635ab827a4a6c72ff08691f38aa624776d8ecb
--hash=sha256:f98bf378d7a5be047a044a1a27c987a8f355e10e3b5754617dbe756248cbc5ce
--hash=sha256:fb88076df585b69c5761c387c0081aa87d7b9eb1b205a6535ca4777e25650d81
--hash=sha256:fd8f47dbf2e8adb15c847215f83436de3fdb120b51fdae0fbbdf69fd97a3ad80
--hash=sha256:ff3e2ba7a9f0a110b0555452e9b5a03a34e11662544e01beea15f144b48ba7b7
# via
# sphinx-autobuild
# strictdoc
# uvicorn
wheel==0.48.0
--hash=sha256:3217dcc807155e45db462d7ef2431f5ddda0d7273b700d05a67b271ceb1287ab
--hash=sha256:94800765601e9171bf5d58d066e640662842bcedcbab982b2c90787a2c987322
# via sphinx-togglebutton
wsproto==1.3.2
--hash=sha256:61eea322cdf56e8cc904bd3ad7573359a242ba65688716b0710a5eb12beab584
--hash=sha256:b86885dcf294e15204919950f666e06ffc6c7c114ca900b060d6e16293528294
# via trio-websocket
xlrd==2.0.2
--hash=sha256:08b5e25de58f21ce71dc7db3b3b8106c1fa776f3024c54e45b45b374e89234c9
--hash=sha256:ea762c3d29f4cca48d82df517b6d89fbce4db3107f9d78713e48cd321d5c9aa9
# via strictdoc
xlsxwriter==3.2.9
--hash=sha256:254b1c37a368c444eac6e2f867405cc9e461b0ed97a3233b2ac1e574efb4140c
--hash=sha256:9a5db42bc5dff014806c58a20b9eae7322a134abb6fce3c92c181bfb275ec5b3
# via strictdoc
xmlschema==4.3.2
--hash=sha256:cf5c970a30f6ebcb3da35260e694704cc0b6794d8ace46125bb2a95e38ed9307
--hash=sha256:f3b33a21a2b2cdc404ddc3fb599d8bc1dee90b155d547370672e6e684746b8d6
# via reqif
xmltodict==1.0.4
--hash=sha256:6d94c9f834dd9e44514162799d344d815a3a4faec913717a9ecbfa5be1bb8e61
--hash=sha256:a4a00d300b0e1c59fc2bfccb53d7b2e88c32f200df138a0dd2229f842497026a
# via spdx-tools


Doc Substitutions (`doc/substitutions.txt`)

.. |br| raw:: html .. force a line break in HTML output (blank lines needed here)

.. |p| raw:: html .. force a blank line in HTML output (blank lines needed here)


Doc Doxygen Mainpage (`doc/_doxygen/mainpage.md`)

Zephyr API Reference

This is the reference documentation for the Zephyr RTOS C API: all the
functions, macros, and data structures available to Zephyr applications and subsystems, generated
directly from the source code.

Browse the API by topic

The API is organized as a hierarchy of Topics covering the main areas of the OS.
Start with one of the main categories below, or browse the full topic list.

Kernel
text
Threads, scheduling, synchronization, timers, and other core RTOS primitives.
Device Drivers
text
Hardware-agnostic interfaces for peripherals: GPIO, I2C, SPI, sensors, and more.
Operating System Services
text
Networking, Bluetooth, storage, logging, and other services built on the kernel.
Devicetree
text
Macros for reading the hardware description of the system at build time.
Device Model
text
The abstraction that binds drivers to the hardware instances they manage.
Memory Management Heaps, memory slabs, and memory-mapping interfaces. Utilities General-purpose helpers, including the data structure APIs. Testing The Ztest framework and related testing helpers.

Other ways to explore

  • Data Structures: an index of all documented structs and unions.
  • Files: browse the API header by header.
  • Deprecated List: APIs scheduled for removal, and what to use instead.
  • Use the search box to find any documented symbol by name.

Looking for something else?

This site only covers the C API. For guides, samples, supported boards, and everything else, head
over to the main Zephyr Project documentation.


Doc Doxygen Toplevel Groups (`doc/_doxygen/toplevel_groups.txt`)

SPDX-FileCopyrightText: The Zephyr Project Contributors

SPDX-License-Identifier: Apache-2.0

Groups allowed at the top level of the API documentation index.

A Doxygen group ends up here when no other group pulls it in with @ingroup or

@addtogroup. These are the coarse categories of the API index, so the list is

meant to stay short: nest a new group under an existing category instead of

adding a line below. Enforced by scripts/ci/doxygen_toplevel_groups.py.

Blank lines are ignored and '#' starts a comment.

zephyr-keep-sorted-start

device_model
devicetree
internal_api
io_interfaces
kernel_apis
mem_mgmt
os_services
system_errno
testing
third_party
toolchain
utilities

zephyr-keep-sorted-stop

Doxygen's EXCLUDE_SYMBOLS drops leading-underscore names, so these three never

appear on the homepage but they are still top level in the Doxygen XML. list

them here to avoid having to maintain duplicated logic in

`doxygen_toplevel_groups` for groups that are going to be deleted soon anyway

as they are for the deprecated legacy USB device stack.

_usb_device_core_api
_usb_device_controller_api
_usbc_device_api


Doc Build Index (`doc/build/index.rst`)

.. _build_overview:

Build and Configuration Systems
###############################

.. toctree::
:maxdepth: 1

cmake/index.rst
cmake-ref/index.rst
dts/index
kconfig/index.rst
snippets/index.rst
zephyr_cmake_package.rst
sysbuild/index.rst
version/index.rst
flashing/index.rst
signing/index.rst


Doc Build Zephyr Cmake Package (`doc/build/zephyr_cmake_package.rst`)

.. _cmake_pkg:

Zephyr CMake Package
####################

The Zephyr CMake package_ is a convenient way to create a Zephyr-based application.

.. note::
The :ref:zephyr-app-types section introduces the application types
used in this page.

The Zephyr CMake package ensures that CMake can automatically select a Zephyr installation to use for building
the application, whether it is a :ref:Zephyr repository application <zephyr-repo-app>,
a :ref:Zephyr workspace application <zephyr-workspace-app>, or a
:ref:Zephyr freestanding application <zephyr-freestanding-app>.

When developing a Zephyr-based application, then a developer simply needs to write
find_package(Zephyr) in the beginning of the application :file:CMakeLists.txt file.

To use the Zephyr CMake package it must first be exported to the CMake user package registry_.
This means creating a reference to the current Zephyr installation inside the
CMake user package registry.

.. tabs::

.. group-tab:: Ubuntu

text
In Linux, the CMake user package registry is found in:

  ``~/.cmake/packages/Zephyr``

.. group-tab:: macOS

text
In macOS, the CMake user package registry is found in:

  ``~/.cmake/packages/Zephyr``

.. group-tab:: Windows

text
In Windows, the CMake user package registry is found in:

  ``HKEY_CURRENT_USER\Software\Kitware\CMake\Packages\Zephyr``

The Zephyr CMake package allows CMake to automatically find a Zephyr base.
One or more Zephyr installations must be exported.
Exporting multiple Zephyr installations may be useful when developing or testing
Zephyr freestanding applications, Zephyr workspace application with vendor forks, etc..

Zephyr CMake package export (west)


When installing Zephyr using :ref:west <get_the_code> then it is recommended
to export Zephyr using west zephyr-export.

.. _zephyr_cmake_package_export:

Zephyr CMake package export (without west)


Zephyr CMake package is exported to the CMake user package registry using the following commands:

.. code-block:: bash

cmake -P /share/zephyr-package/cmake/zephyr_export.cmake

This will export the current Zephyr to the CMake user package registry.

.. _zephyr_cmake_package_zephyr_base:

Zephyr Base Environment Setting


The Zephyr CMake package search functionality allows for explicitly specifying
a Zephyr base using an environment variable.

To do this, use the following find_package() syntax:

.. code-block:: cmake

find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})

This syntax instructs CMake to first search for Zephyr using the Zephyr base environment setting
:envvar:ZEPHYR_BASE and then use the normal search paths.

.. _zephyr_cmake_search_order:

Zephyr CMake Package Search Order


When Zephyr base environment setting is not used for searching, the Zephyr installation matching
the following criteria will be used:

  • A Zephyr repository application will use the Zephyr in which it is located.
    For example:

    .. code-block:: none

    text
    /zephyr-workspace/zephyr
      └── samples
          └── hello_world

    in this example, hello_world will use /zephyr-workspace/zephyr.

  • Zephyr workspace application will use the Zephyr that share the same workspace.
    For example:

    .. code-block:: none

    /zephyr-workspace
    ├── zephyr
    ├── ...
    └── my_applications
    └── my_first_app

    in this example, my_first_app will use /zephyr-workspace/zephyr as this Zephyr
    is located in the same workspace as the Zephyr workspace application.

.. note::
The root of a Zephyr workspace is identical to west topdir if the workspace was
installed using west

  • Zephyr freestanding application will use the Zephyr registered in the CMake user package registry.
    For example:

    .. code-block:: none

    /zephyr-workspace-1
    └── zephyr (Not exported to CMake)

    /zephyr-workspace-2
    └── zephyr (Exported to CMake)

    /app
    ├── CMakeLists.txt
    ├── prj.conf
    └── src
    └── main.c

    in this example, only /zephyr-workspace-2/zephyr is exported to the CMake package
    registry and therefore this Zephyr will be used by the Zephyr freestanding application
    <home>/app.

    If user wants to test the application with /zephyr-workspace-1/zephyr, this can be
    done by using the Zephyr Base environment setting, meaning set
    ZEPHYR_BASE=/zephyr-workspace-1/zephyr, before
    running CMake.

    .. note::

    The Zephyr package selected on the first CMake invocation will be used for all subsequent
    builds. To change the Zephyr package, for example to test the application using Zephyr base
    environment setting, then it is necessary to do a pristine build first
    (See :ref:application_rebuild).

Zephyr CMake Package Version


When writing an application then it is possible to specify a Zephyr version number x.y.z that
must be used in order to build the application.

Specifying a version is especially useful for a Zephyr freestanding application as it ensures the
application is built with a minimal Zephyr version.

It also helps CMake to select the correct Zephyr to use for building, when there are multiple
Zephyr installations in the system.

For example:

.. code-block:: cmake

text
find_package(Zephyr 2.2.0)
 project(app)

will require app to be built with Zephyr 2.2.0 as minimum.
CMake will search all exported candidates to find a Zephyr installation which matches this version
criteria.

Thus it is possible to have multiple Zephyr installations and have CMake automatically select
between them based on the version number provided, see CMake package version_ for details.

For example:

.. code-block:: none

/zephyr-workspace-2.a
└── zephyr (Exported to CMake)

/zephyr-workspace-2.b
└── zephyr (Exported to CMake)

/app
├── CMakeLists.txt
├── prj.conf
└── src
└── main.c

in this case, there are two released versions of Zephyr installed at their own workspaces.
Workspace 2.a and 2.b, corresponding to the Zephyr version.

To ensure app is built with minimum version 2.a the following find_package
syntax may be used:

.. code-block:: cmake

find_package(Zephyr 2.a)
project(app)

Note that both 2.a and 2.b fulfill this requirement.

CMake also supports the keyword EXACT, to ensure an exact version is used, if that is required.
In this case, the application CMakeLists.txt could be written as:

.. code-block:: cmake

find_package(Zephyr 2.a EXACT)
project(app)

In case no Zephyr is found which satisfies the version required, as example, the application specifies

.. code-block:: cmake

find_package(Zephyr 2.z)
project(app)

then an error similar to below will be printed:

.. code-block:: none

Could not find a configuration file for package "Zephyr" that is compatible
with requested version "2.z".

The following configuration files were considered but not accepted:

text
/zephyr-workspace-2.a/zephyr/share/zephyr-package/cmake/ZephyrConfig.cmake, version: 2.a.0
 /zephyr-workspace-2.b/zephyr/share/zephyr-package/cmake/ZephyrConfig.cmake, version: 2.b.0

.. note:: It can also be beneficial to specify a version number for Zephyr repository applications
and Zephyr workspace applications. Specifying a version in those cases ensures the
application will only build if the Zephyr repository or workspace is matching.
This can be useful to avoid accidental builds when only part of a workspace has been
updated.

Multiple Zephyr Installations (Zephyr workspace)


Testing out a new Zephyr version, while at the same time keeping the existing Zephyr in the
workspace untouched is sometimes beneficial.

Or having both an upstream Zephyr, Vendor specific, and a custom Zephyr in same workspace.

For example:

.. code-block:: none

/zephyr-workspace
├── zephyr
├── zephyr-vendor
├── zephyr-custom
├── ...
└── my_applications
└── my_first_app

in this setup, find_package(Zephyr) has the following order of precedence for selecting
which Zephyr to use:

  • Project name: zephyr

  • First project, when Zephyr projects are ordered lexicographical, in this case.

    • zephyr-custom
    • zephyr-vendor

This means that my_first_app will use /zephyr-workspace/zephyr.

It is possible to specify a Zephyr preference list in the application.

A Zephyr preference list can be specified as:

.. code-block:: cmake

set(ZEPHYR_PREFER "zephyr-custom" "zephyr-vendor")
find_package(Zephyr)

project(my_first_app)

the ZEPHYR_PREFER is a list, allowing for multiple Zephyrs.
If a Zephyr is specified in the list, but not found in the system, it is simply ignored and
find_package(Zephyr) will continue to the next candidate.

This allows for temporary creation of a new Zephyr release to be tested, without touching current
Zephyr. When testing is done, the zephyr-test folder can simply be removed.
Such a CMakeLists.txt could look as:

.. code-block:: cmake

set(ZEPHYR_PREFER "zephyr-test")
find_package(Zephyr)

project(my_first_app)

.. _cmake_build_config_package:

Zephyr Build Configuration CMake packages


There are two Zephyr Build configuration packages which provide control over the build
settings in Zephyr in a more generic way. These packages are:

  • ZephyrBuildConfiguration: Applies to all Zephyr applications in the workspace
  • ZephyrAppConfiguration: Applies only to the application you are currently building

They are similar to the per-user :file:.zephyrrc file that can be used to set :ref:env_vars,
but they set CMake variables instead. They also allow you to automatically share the build
configuration among all users through the project repository. They also allow more advanced use
cases, such as loading of additional CMake boilerplate code.

The Zephyr Build Configuration CMake packages will be loaded in the Zephyr boilerplate code after
initial properties and ZEPHYR_BASE has been defined, but before CMake code execution. The
ZephyrBuildConfiguration is included first and ZephyrAppConfiguration afterwards. That means the
application-specific package could override the workspace settings, if needed.
This allows the Zephyr Build Configuration CMake packages to setup or extend properties such as:
DTS_ROOT, BOARD_ROOT, TOOLCHAIN_ROOT / other toolchain setup, fixed overlays, and any
other property that can be controlled. It also allows inclusion of additional boilerplate code.

To provide a ZephyrBuildConfiguration or ZephyrAppConfiguration, create
:file:ZephyrBuildConfig.cmake and/or :file:ZephyrAppConfig.cmake respectively and place them
in the appropriate location. The CMake find_package mechanism will search for these files with
the steps below. Other default CMake package search paths and hints are disabled and there is no
version checking implemented for these packages. This also means that these packages cannot be
installed in the CMake package registry. The search steps are:

  1. If ZephyrBuildConfiguration_ROOT, or ZephyrAppConfiguration_ROOT respectively, is set,
    search within this prefix path. If a matching file is found, execute this file. If no matching
    file is found, go to step 2.
  2. Search within ${ZEPHYR_BASE}/../*, or ${APPLICATION_SOURCE_DIR} respectively. If a
    matching file is found, execute this file. If no matching file is found, abort the search.

It is recommended to place the files in the default paths from step 2, but with the
_ROOT variables you have the flexibility to place them anywhere. This is
especially necessary for freestanding applications, for which the default path to
ZephyrBuildConfiguration usually does not work. In this case the _ROOT variables
can be set on the CMake command line, before find_package(Zephyr ...), as environment
variable or from a CMake cache initialization file with the -C command line option.

.. note:: The _ROOT variables, as well as the default paths, are just the prefixes
to the search path. These prefixes get combined with additional path suffixes, which together
form the actual search path. Any combination that honors the
CMake package search procedure_ is valid and will work.

If you want to completely disable the search for these packages, you can use the special CMake
CMAKE_DISABLE_FIND_PACKAGE_ variable for that. Just set
CMAKE_DISABLE_FIND_PACKAGE_ZephyrBuildConfiguration or
CMAKE_DISABLE_FIND_PACKAGE_ZephyrAppConfiguration to TRUE to disable the package.

An example folder structure could look like this:

.. code-block:: none

/zephyr-workspace
├── zephyr
├── ...
├── manifest repo (can be named anything)
│ └── cmake/ZephyrBuildConfig.cmake
├── ...
└── zephyr application
└── share/zephyrapp-package/cmake/ZephyrAppConfig.cmake

A sample :file:ZephyrBuildConfig.cmake can be seen below.

.. code-block:: cmake

ZephyrBuildConfig.cmake sample code

To ensure final path is absolute and does not contain ../.. in variable.

get_filename_component(APPLICATION_PROJECT_DIR
${CMAKE_CURRENT_LIST_DIR}/../../..
ABSOLUTE
)

Add this project to list of board roots

list(APPEND BOARD_ROOT ${APPLICATION_PROJECT_DIR})

Default to GNU Arm Embedded toolchain if no toolchain is set

if(NOT ENV{ZEPHYR_TOOLCHAIN_VARIANT})
set(ZEPHYR_TOOLCHAIN_VARIANT gnuarmemb)
find_program(GNU_ARM_GCC arm-none-eabi-gcc)
if(NOT ${GNU_ARM_GCC} STREQUAL GNU_ARM_GCC-NOTFOUND)
# The toolchain root is located above the path to the compiler.
get_filename_component(GNUARMEMB_TOOLCHAIN_PATH ${GNU_ARM_GCC}/../.. ABSOLUTE)
endif()
endif()

Zephyr CMake package source code


The Zephyr CMake package source code in
:zephyr_file:share/zephyr-package/cmake contains the CMake config
package which is used by the CMake find_package function.

It also contains code for exporting Zephyr as a CMake config package.

The following is an overview of the files in this directory:

:file:ZephyrConfigVersion.cmake
The Zephyr package version file. This file is called by CMake to determine
if this installation fulfils the requirements specified by user when calling
find_package(Zephyr ...). It is also responsible for detection of Zephyr
repository or workspace only installations.

:file:ZephyrConfig.cmake
The Zephyr package file. This file is called by CMake to for the package
meeting which fulfils the requirements specified by user when calling
find_package(Zephyr ...). This file is responsible for sourcing of
boilerplate code.

:file:zephyr_package_search.cmake
Common file used for detection of Zephyr repository and workspace candidates.
Used by ZephyrConfigVersion.cmake and ZephyrConfig.cmake for common code.

:file:zephyr_export.cmake
See :ref:zephyr_cmake_package_export.

.. _CMake package: https://cmake.org/cmake/help/latest/manual/cmake-packages.7.html
.. _CMake user package registry: https://cmake.org/cmake/help/latest/manual/cmake-packages.7.html#user-package-registry
.. _CMake package version: https://cmake.org/cmake/help/latest/command/find_package.html#version-selection
.. _CMake package search procedure: https://cmake.org/cmake/help/latest/command/find_package.html#search-procedure


Doc Contribute Bin Blobs (`doc/contribute/bin_blobs.rst`)

.. _bin-blobs:

Binary Blobs
############

In the context of an operating system that supports multiple architectures and
many different IC families, some functionality may be unavailable without the
help of executable code distributed in binary form. Binary blobs (or blobs for
short) are files containing proprietary machine code or data in a binary format,
e.g. without corresponding source code released under an OSI approved license.

Zephyr supports downloading and using third-party binary blobs via its built-in
mechanisms, with some important caveats, described in the following sections. It
is important to note that all the information in this section applies only to
upstream (vanilla) Zephyr <https://github.com/zephyrproject-rtos/zephyr>_.

There are no limitations whatsoever (except perhaps license compatibility) in
the support for binary blobs in forks or third-party distributions of Zephyr. In
fact, Zephyr’s build system supports arbitrary use cases related to blobs. This
includes linking against libraries, flashing images to targets, etc. Users are
therefore free to create Zephyr-based downstream software which uses binary
blobs if they cannot meet the requirements described in this page.

Software license


Most binary blobs are distributed under proprietary licenses which vary
significantly in nature and conditions. It is up to the vendor to specify the
license as part of the blob submission process. Blob vendors may impose a
click-through or other EULA-like workflow when users fetch and install blobs.

Hosting


Blobs must be hosted on the Internet and managed by third-party infrastructure.
Two potential examples are Git repositories and web servers managed by
individual hardware vendors.

The Zephyr Project does not host binary blobs in its Git repositories or
anywhere else.

Fetching blobs


Blobs are fetched from official third-party sources by the :ref:west blobs <west-blobs> command.

The blobs themselves must be specified in the :ref:module.yml <modules-bin-blobs> files included in separate Zephyr :ref:module repositories <modules> maintained by their respective vendors. This means that in order to
include a reference to a binary blob to the upstream Zephyr distribution, a
module repository must exist first or be created as part of the submission
process.

Each blob which may be fetched must be individually identified in the
corresponding :file:module.yml file. A specification for a blob must contain:

  • An abstract description of the blob itself
  • Version information
  • A reference to vendor-provided documentation
  • The blob’s :ref:type , which must be one of the allowed types
  • A checksum for the blob, which west blobs checks after downloading.
    This is required for reproducibility and to allow bisecting issues as blobs
    change using Git and west
  • License text applicable to the blob or a reference to such text, in SPDX
    format

See the :ref:corresponding section <modules-bin-blobs> for a more formal
definition of the fields.

The :ref:west blobs <west-blobs> command can be used to list metadata of
available blobs and to fetch blobs from user-selected modules.

The west blobs command only fetches and stores the binary blobs themselves.
Any accompanying code, including interface header files for the blobs, must be
present in the corresponding module repository.

Tainting


Inclusion of binary blobs will taint the Zephyr build. The definition of
tainting originates in the Linux kernel <https://www.kernel.org/doc/html/latest/admin-guide/tainted-kernels.html>_ and,
in the context of Zephyr, a tainted image will be one that includes binary blobs
in it.

Tainting will be communicated to the user in the following manners:

  • One or more Kconfig options TAINT_BLOBS_* will be set to y
  • The Zephyr build system, during its configuration phase, will issue a warning.
    It will be possible to disable the warning using Kconfig
  • The west spdx command will include the tainted status in its output
  • The kernel's default fatal error handler will also explicitly print out the
    kernel's tainted status
  • The boot banner prints the kernel's tainted status

.. _bin-blobs-types:

Allowed types


The following binary blob types are acceptable in Zephyr:

  • Precompiled libraries: Hardware enablement libraries, distributed in
    precompiled binary form, typically for SoC peripherals. An example could be an
    enablement library for a wireless peripheral
  • Firmware images: An image containing the executable code for a secondary
    processor or CPU. This can be full or partial (typically delta or patch data)
    and is generally copied into RAM or flash memory by the main CPU. An example
    could be the firmware for the core running a Bluetooth LE Controller
  • Miscellaneous binary data files. An example could be pre-trained neural
    network model data

Hardware agnostic features provided via a proprietary library are not
acceptable. For example, a proprietary and hardware agnostic TCP/IP stack
distributed as a static archive would be rejected.

Note that just because a blob has an acceptable type does not imply that it will
be unconditionally accepted by the project; any blob may be rejected for other
reasons on a case by case basis (see library-specific requirements below).
In case of disagreement, the TSC is the arbiter of whether a particular blob
fits in one of the above types.

Precompiled library-specific requirements


This section contains additional requirements specific to precompiled library
blobs.

Any person who wishes to submit a precompiled library must represent that it
meets these requirements. The project may remove a blob from the upstream
distribution if it is discovered that the blob fails to meet these requirements
later on.

Interface header files

The precompiled library must be accompanied by one or more header files,
distributed under a non-copyleft OSI approved license, that define the interface
to the library.

Allowed dependencies

This section defines requirements related to external symbols that a library
blob requires the build system to provide.

  • The blob must not depend on Zephyr APIs directly. In other words, it must have
    been possible to build the binary without any Zephyr source code present at
    all. This is required for loose coupling and maintainability, since Zephyr
    APIs may change and such blobs cannot be modified by all project maintainers
  • Instead, if the code in the precompiled library requires functionality
    provided by Zephyr (or an RTOS in general), an implementation of an OS
    abstraction layer (aka porting layer) can be provided alongside the library.
    The implementation of this OS abstraction layer must be in source code form,
    released under an OSI approved license and documented using Doxygen.

Toolchain requirements

Precompiled library blobs must be in a data format which is compatible with and
can be linked by a toolchain supported by the Zephyr Project. This is required
for maintainability and usability. Use of such libraries may require special
compiler and/or linker flags, however. For example, a porting layer may require
special flags, or a static archive may require use of specific linker flags.

Limited scope

Allowing arbitrary library blobs carries a risk of degrading the degree to
which the upstream Zephyr software distribution is open source. As an extreme
example, a target with a zephyr kernel clock driver that is just a porting layer
around a library blob would not be bootable with open source software.

To mitigate this risk, the scope of upstream library blobs is limited. The
project maintainers define an open source test suite that an upstream
target must be able to pass using only open source software included in the
mainline distribution and its modules. The open source test suite currently
consists of:

  • :file:samples/philosophers
  • :file:tests/kernel

The scope of this test suite may grow over time. The goal is to specify
tests for a minimal feature set which must be supported via open source software
for any target with upstream Zephyr support.

At the discretion of the release team, the project may remove support for a
hardware target if it cannot pass this test suite.

Support and maintenance


The Zephyr Project is not expected to be responsible for the maintenance and
support of contributed binary blobs. As a consequence, at the discretion of the
Zephyr Project release team, and on a case-by-case basis:

  • GitHub issues reported on the zephyr repository tracker that require use of
    blobs to reproduce may not be treated as bugs
  • Such issues may be closed as out of scope of the Zephyr project

This does not imply that issues which require blobs to reproduce will be closed
without investigation. For example, the issue may be exposing a bug in a Zephyr
code path that is difficult or impossible to trigger without a blob. Project
maintainers may accept and attempt to resolve such issues.

However, some flexibility is required because project maintainers may not be
able to determine if a given issue is due to a bug in Zephyr or the blob itself,
may be unable to reproduce the bug due to lack of hardware, etc.

Blobs must have designated maintainers that must be responsive to issue reports
from users and provide updates to the blobs to address issues. At the discretion
of the Zephyr Project release team, module revisions referencing blobs may be
removed from :file:zephyr/west.yml at any time due to lack of responsiveness or
support from their maintainers. This is required to maintain project control
over bit-rot, security issues, etc.

The submitter of the proposal to integrate a binary blob must commit to maintain
the integration of such blob for the foreseeable future.

Regarding Continuous Integration, binary blobs will not be fetched in the
project's CI infrastructure that builds and optionally executes tests and samples
to prevent regressions and issues from entering the codebase. This includes
both CI ran when a new GitHub Pull Request is opened as well as any other
regularly scheduled execution of the CI infrastructure.

.. _blobs-process:

Submission and review process


For references to binary blobs to be included in the project, they shall be submitted
through the standard pull request (PR) workflow and do not require Technical
Steering Committee (TSC) approval. Maintainers and reviewers are responsible for
ensuring that all blob-related submissions conform to the documented criteria as
defined in :ref:bin-blobs.

The PR for initial integration with binary blobs shall include details about the blobs
and the functionality they provide. The PR shall have the following information to
support the review:

  • Binary blob origin.
  • Type of blob (precompiled library, firmware image).
  • Zephyr module that the blob(s) will be referenced from.
  • Brief description of what the blob(s) do.
  • What other components do the blob(s) depend on, if any?
  • License the blob(s) are distributed under.

If the initial integration PR receives the appropriate approvals the binary blob(s)
can be integrated. The standard :ref:PR escalation procedures
shall apply for any technical disagreements.

Subsequent updates to binary blobs follow the :ref:module update procedure <modules_changes>.


Doc Contribute Contributor Expectations (`doc/contribute/contributor_expectations.rst`)

.. _contributor-expectations:

Contributor Expectations
########################

The Zephyr project encourages :ref:contributors <contributor> to submit
changes as smaller pull requests. Smaller pull requests (PRs) have the following
benefits:

  • Reviewed more quickly and reviewed more thoroughly. It's easier for reviewers
    to set aside a few minutes to review smaller changes several times than it is
    to allocate large blocks of time to review a large PR.

  • Less wasted work if reviewers or maintainers reject the direction of the
    change.

  • Easier to rebase and merge. Smaller PRs are less likely to conflict with other
    changes in the tree.

  • Easier to revert if the PR breaks functionality.

.. note::
This page does not apply to draft PRs which can have any size, any number of
commits and any combination of smaller PRs for testing and preview purposes.
Draft PRs have no review expectation and PRs created as drafts from the start
do not notify anyone by default.

Defining Smaller PRs


  • Smaller PRs should encompass one self-contained logical change.

  • When adding a new large feature or API, the PR should address only one part of
    the feature. In this case create an :ref:RFC proposal <rfcs> to describe the
    additional parts of the feature for reviewers.

  • PRs should include tests or samples under the following conditions:

    • Adding new features or functionality.

    • Modifying a feature, especially for API behavior contract changes.

    • Fixing a hardware agnostic bug. The test should fail without the bug fixed
      and pass with the fix applied.

  • PRs must update any documentation affected by a functional code change.

  • If introducing a new API, the PR must include an example usage of the API.
    This provides context to the reviewer and prevents submitting PRs with unused
    APIs.

Multiple Commits on a Single PR


Contributors are further encouraged to break up PRs into multiple commits. Keep
in mind each commit in the PR must still build cleanly and pass all the CI
tests.

For example, when introducing an extension to an API, contributors can break up
the PR into multiple commits targeting these specific changes:

#. Introduce the new APIs, including shared devicetree bindings
#. Update driver implementation X, with driver specific devicetree bindings
#. Update driver implementation Y
#. Add tests for the new API
#. Add a sample using the API
#. Update the documentation

Large Changes


Large changes to the Zephyr project must submit an :ref:RFC proposal <rfcs>
describing the full scope of change and future work. The RFC proposal provides
the required context to reviewers, but allows for smaller, incremental, PRs to
get reviewed and merged into the project. The RFC should also define the minimum
viable implementation.

Changes which require an RFC proposal include:

  • Submitting a new feature.
  • Submitting a new API.
  • :ref:treewide-changes.
  • Other large changes that can benefit from the RFC proposal process.

Maintainers have the discretion to request that contributors create an RFC for
PRs that are too large or complicated.

.. _pr_requirements:

PR Requirements


.. important::

Pull requests that do not meet the quality expectations outlined below are less likely to receive
reviewer engagement, and reviewers may request changes on such pull requests without detailed
feedback.

Contributors are expected to self-review their changes and ensure all requirements are met before
requesting a review.

  • Each commit in the PR must provide a commit message following the
    :ref:commit-guidelines.

  • No fixup or merge commits are allowed, see :ref:Contribution workflow for
    more information.

  • The PR description must include a summary of the changes and their rationales.

  • All files in the PR must comply with :ref:Licensing Requirements<licensing_requirements>.

  • The code must follow the Zephyr :ref:coding_style and :ref:coding_guidelines.

  • The PR must pass all CI checks, as described in :ref:merge_criteria.
    Contributors may mark a PR as draft and explicitly request reviewers to
    provide early feedback, even with failing CI checks.

  • Commits in a pull request should represent clear, logical units of change that are easy to review
    and maintain bisectability. The following guidelines expand on this principle:

    1. Distinct, Logical Units of Change

      Each commit should correspond to a self-contained, meaningful change. For example, adding a
      feature, fixing a bug, or refactoring existing code should be separate commits. Avoid mixing
      different types of changes (e.g., feature implementation and unrelated refactoring) in the same
      commit.

    2. Retain Bisectability

      Every commit in the pull request must build successfully and pass all relevant tests. This
      ensures that git bisect can be used effectively to identify the specific commit that introduced
      a bug or issue.

    3. Squash Intermediary or Non-Final Development History

      During development, commits may include intermediary changes (e.g., partial implementations,
      temporary files, or debugging code). These should be squashed or rewritten before submitting the
      pull request. Remove non-final artifacts, such as:

      • Temporary renaming of files that are later renamed again.
      • Code that was rewritten or significantly changed in later commits.
    4. Ensure Clean History Before Submission

      Use interactive rebasing (git rebase -i) to clean up the commit history before submitting the
      pull request. This helps in:

      • Squashing small, incomplete commits into a single cohesive commit.
      • Ensuring that each commit remains bisectable.
      • Maintaining proper attribution of authorship while improving clarity.
    5. Renaming and Code Rewrites

      If files or code are renamed or rewritten in later commits during development, squash or rewrite
      earlier commits to reflect the final structure. This ensures that:

      • The history remains clean and easy to follow.
      • Bisectability is preserved by eliminating redundant renaming or partial rewrites.
    6. Attribution of Authorship

      While cleaning up the commit history, ensure that authorship attribution remains accurate.

    7. Readable and Reviewable History

      The final commit history should be easy to understand for future maintainers. Logical units of
      change should be grouped into commits that tell a clear, coherent story of the work done.

  • When major new functionality is added, tests for the new functionality shall
    be added to the automated test suite. All API functions should have test cases
    and there should be tests for the behavior contracts of the API. Maintainers
    and reviewers have the discretion to determine if the provided tests are
    sufficient. The examples below demonstrate best practices on how to test APIs
    effectively.

    • :zephyr_file:Kernel timer tests <tests/kernel/timer/timer_behavior>
      provide around 85% test coverage for the
      :zephyr_file:kernel timer <kernel/timer.c>, measured by lines of code.
    • Emulators for off-chip peripherals are an effective way to test driver
      APIs. The :zephyr_file:fuel gauge tests <tests/drivers/fuel_gauge/sbs_gauge>
      use the :zephyr_file:smart battery emulator <drivers/fuel_gauge/sbs_gauge/emul_sbs_gauge.c>,
      providing test coverage for the
      :zephyr_file:fuel gauge API
      and the :zephyr_file:smart battery driver <drivers/fuel_gauge/sbs_gauge/sbs_gauge.c>.
    • Code coverage reports for the Zephyr project are available on Codecov_.
  • Incompatible changes to APIs must also update the release notes for the
    next release detailing the change. APIs marked as experimental are excluded
    from this requirement.

  • Changes to APIs must increment the API version number according to the API
    version rules.

  • Documentation must be added and/or updated to reflect the changes in the code
    introduced by the PR. The documentation changes must use the proper
    terminology as present in the existing pages, and must be written in American
    English. If you include images as part of the documentation, those must follow
    the rules in :ref:doc_images. Please refer to :ref:doc_guidelines for
    additional information.

  • PRs must also satisfy all :ref:merge_criteria before a member of the release
    engineering team merges the PR into the zephyr tree.

Maintainers may request that contributors break up a PR into smaller PRs and may
request that they create an :ref:RFC proposal <rfcs>.

.. _Codecov: https://app.codecov.io/gh/zephyrproject-rtos/zephyr

Workflow Suggestions That Help Reviewers

  • Unless they applied the reviewer's recommendation exactly, authors must not
    resolve and hide comments, they must let the initial reviewer do it. The
    Zephyr project does not require all comments to be resolved before merge.
    Leaving some completed discussions open can sometimes be useful to understand
    the greater picture.

  • Respond to comments using the "Start Review" and "Add Review" green buttons in
    the "Files changed" view. This allows responding to multiple comments and
    publishing the responses in bulk. This reduces the number of emails sent to
    reviewers.

  • As GitHub does not implement |git range-diff|_, try to minimize rebases in the
    middle of a review. If a rebase is required, push this as a separate update
    with no other changes since the last push of the PR. When pushing a rebase
    only, add a comment to the PR indicating which commit is the rebase.

.. |git range-diff| replace:: git range-diff
.. _git range-diff: https://git-scm.com/docs/git-range-diff

Getting PRs Reviewed

The Zephyr community is a diverse group of individuals, with different levels of
commitment and priorities. As such, reviewers and maintainers may not get to a
PR right away.

  • After 1 week of inactivity, ping the Assignee or reviewers on the PR by adding
    a comment to the PR.

  • After 2 weeks of inactivity, post a message on the #pr-help_ channel on
    Discord linking to the PR.

.. _pr_technical_escalation:

PR Technical Escalation

In cases where a contributor objects to change requests from reviewers, Zephyr
defines the following escalation process for resolving technical disagreements.

Before escalation of technical disagreements, follow the steps below:

  • Resolve in the PR among assignee, maintainers and reviewer.

    • Assignee to act as moderator if applicable.
  • If no progress is made, the assignee (maintainer) has the right to dismiss
    stale, unrelated or irrelevant change requests by reviewers giving the
    reviewers a minimum of 1 business day to respond and revisit their initial
    change requests or start the escalation process.

    The assignee has the responsibility to document the reasoning for dismissing
    any reviews in the PR and should notify the reviewer about their review being
    dismissed.

    To give the reviewers time to respond and escalate, the assignee is
    expected to block the PR from being merged either by not
    approving the PR or by setting the DNM label.

Escalation can be triggered by any party participating in the review
process (assignee, reviewers or the original author of the change) following
the steps below:

  • Escalate to the Architecture Working Group_ by adding the Architecture Review label on the PR. Beside the weekly meeting where such escalations are
    processed, the Architecture Working Group_ shall facilitate an offline
    review of the escalation if requested, especially if any of the parties can't
    attend the meeting.

  • If all avenues of resolution and escalation have failed, assignees can escalate
    to the TSC and get a binding resolution in the TSC by adding the TSC label
    on the PR.

  • The Assignee is expected to ensure the resolution of the escalation and the
    outcome is documented in the related pull request or issues on Github.

.. _#pr-help: https://discord.com/channels/720317445772017664/997527108844798012

.. _Architecture Project: https://github.com/zephyrproject-rtos/zephyr/projects/18

.. _Architecture Working Group: https://github.com/zephyrproject-rtos/zephyr/wiki/Architecture-Working-Group


Doc Contribute External (`doc/contribute/external.rst`)

.. _external-contributions:

Contributing External Components
################################

In some cases it is desirable to leverage existing, external source code in
order to avoid re-implementing basic functionality or features that are readily
available in other open source projects.

This section describes the circumstances under which external source code can be
imported into Zephyr, and the process that governs the inclusion.

There are three main factors that will be considered during the inclusion
process in order to determine whether it will be accepted. These will be
described in the following sections.

Note that most of this page deals with external components that end up being
compiled and linked into the final image, and programmed into the target
hardware. For external tooling that is only used during compilation,
code analysis, testing or simulation please refer to the
:ref:external-tooling section at the end of the page.

Software License


.. note::

External source code licensed under the Apache-2.0 license is not subject to
this section.

Integrating code into the Zephyr Project from other projects that use a license
other than the Apache 2.0 license needs to be fully understood in
context and approved by the Zephyr governing board, as described in the
Zephyr project charter
. The board will automatically reject licenses that
have not been approved by the Open Source Initiative (OSI)_. See the
:ref:external-src-process section for more details.

.. _Zephyr governing board:
https://www.zephyrproject.org/governance/

.. _Zephyr project charter:
https://www.zephyrproject.org/wp-content/uploads/2023/08/LF-Zephyr-Charter-2023.08.21.pdf

.. _Open Source Initiative (OSI):
https://opensource.org/licenses/alphabetical

By carefully reviewing potential contributions and also enforcing a :ref:DCO
for contributed code, we ensure that the Zephyr community can develop products
with the Zephyr Project without concerns over patent or copyright issues.

Merit


Just like with any other regular contribution, one that contains external code
needs to be evaluated for merit. However, in the particular case of code that
comes from an existing project, there are additional questions that must be
answered in order to accept the contribution.
More specifically, the following will be considered by the Technical Steering
Committee and evaluated carefully before the external source code is accepted
into the project:

  • Is this the most optimal way to introduce the functionality to the project?
    Both the cost of implementing this internally and the one incurred in
    maintaining an externally developed codebase need to be evaluated.
  • Is the external project being actively maintained? This is particularly
    important for source code that deals with security or cryptography.
  • Have alternatives to the particular implementation proposed been considered?
    Are there other open source project that implement the same functionality?

Mode of integration


There are two ways of integrating external source code into the Zephyr Project,
and careful consideration must be taken to choose the appropriate one for each
particular case.

Integration in the main tree

The first way to integrate external source code into the project is to simply
import the source code files into the main zephyr repository. This
automatically implies that the imported source code becomes part of the
"mainline" codebase, which in turn requires that:

  • The code is formatted according to the Zephyr :ref:coding_style
  • The code adheres to the project's :ref:coding_guidelines
  • The code is subject to the same checks and verification requirements as the
    rest of the code in the main tree, including static analysis
  • All files contain an SPDX tag if not already present
  • If the source is not Apache 2.0 licensed, an [[annotations]] entry
    describing the component is added to the :zephyr_file:REUSE.toml file at the
    root of the repository. This is what the :ref:licensing page <zephyr_licensing> is generated from.

This mode of integration can be applicable to both small and large external
codebases, but it is typically used more commonly with the former.

Integration as a module

The second way of integrating external source code into the project is to import
the whole or parts of the third-party open source project into a separate
repository, and then include it under the form of a :ref:module <modules>.
With this approach the code is considered as being developed externally, and
thus it is not automatically subject to the requirements of the previous
section.

Integration in main manifest file (west.yaml)

Integrating external code into the main :file:west.yml manifest file is
limited to code that is used by a Zephyr subsystem (libraries), by a platform,
drivers (HAL) or tooling needed to test or build Zephyr components.

The integration of modules in this group is validated by the Zephyr project CI,
and verified to be working with each Zephyr release.

Integrated modules will not be removed from the tree without a detailed
migration plan.

Integration as optional modules

Standalone or loose integration of modules/projects without any incoming
dependencies shall be made optional and shall be kept standalone. Optional
projects that provide value to users directly and through a Zephyr subsystem or
platform shall be added to an optional manifest file that is filtered by
default. (:file:submanifests/optional.yml).

Such optional projects might include samples and tests in their own repositories.

There shall not be any direct dependency added in the Zephyr code tree (Git
repository) and all sample or test code shall be maintained as part of the module.

.. note::

This is valid for all new optional modules. Existing optional modules with
samples and test code in the Zephyr Git repository will be transitioned out
over time.

Integration as external modules

Similar to optional modules, but added to the Zephyr project as an entry in the
documentation using a pre-defined template. This type of modules exists outside the
Zephyr project manifest with documentation instructing users and developers how
to integrate the functionality.

Ongoing maintenance


Regardless of the mode of integration, external source code that is integrated
in Zephyr requires regular ongoing maintenance. The submitter of the proposal to
integrate external source code must therefore commit to maintain the integration
of such code for the foreseeable future.
This may require adding an entry in the :file:MAINTAINERS.yml as part of the
process.

.. _external-src-process:

Submission and review process


Before external source code can be included in the project, it must be reviewed
and accepted by the Technical Steering Committee (TSC) and, in some cases, by
the Zephyr governing board.

A request for external source code integration must be made by creating a new
issue in the Zephyr project issue tracking system on GitHub with details
about the source code and how it integrates into the project.

Follow the steps below to begin the submission process:

#. Make sure to read through the :ref:external-contributions section in
detail, so that you are informed of the criteria used by the TSC and board in
order to approve or reject a request
#. Use the :github:New External Source Code Issue <new?assignees=&labels=RFC&template=007_ext-source.yml> to open an issue
#. Fill out all required sections, making sure you provide enough detail for the
TSC to assess the merit of the request. Optionally you can also create a Pull
Request that demonstrates the integration of the external source code and
link to it from the issue
#. Wait for feedback from the TSC, respond to any additional questions added as
GitHub issue comments

If, after consideration by the TSC, the conclusion is that integrating external
source code is the best solution, and the external source code is licensed under
the Apache-2.0 license, the submission process is complete and the external
source code can be integrated.

If, however, the external source code uses a license other than Apache-2.0,
then these additional steps must be followed:

#. The TSC chair will forward the link to the GitHub issue created during the
early submission process to the Zephyr governing board for further review

#. The Zephyr governing board has two weeks to review and ask questions:

  • If there are no objections, the matter is closed. Approval can be
    accelerated by unanimous approval of the board before the two
    weeks are up

  • If a governing board member raises an objection that cannot be resolved
    via email, the board will meet to discuss whether to override the
    TSC approval or identify other approaches that can resolve the
    objections

#. On approval of the Zephyr TSC and governing board the submission process is
complete

The flowchart below shows an overview of the process:

.. figure:: media/ext-src-flowchart.svg
:align: center

Submission process

.. _external-tooling:

Contributing External Tooling


This section deals exclusively with the inclusion of external tooling in the
Zephyr project, where tooling is defined as software that assists the
compilation, testing or simulation processes but in no case ends up being part
of the code compiled and linked into the final image. "Inclusion" in this
context means becoming part of the Zephyr default distribution either in the
main tree directly under the :file:scripts/ folder or indirectly as a west
project in the main :file:west.yml manifest. Therefore, this section does not
apply to 3rd-party tooling such as toolchains, simulators or others, which may
still be referenced by the Zephyr build system or docs without being included in
Zephyr.

Tooling components must be released under a license approved by the
Open Source Initiative (OSI)_.

Just like with regular external components, tooling that is imported from
another project can be integrated either in the main tree or as a :ref:west project <west-workspace>. Note that in this case the corresponding west project
will not be a :ref:module <modules>, because tooling does not make use of the
Zephyr build system and does not need to be processed by it. Please see
:ref:modules-vs-projects for additional information on the differences.

If the tool is integrated in the main tree it should be placed under the
:file:scripts/ folder.
If the tool is integrated as a west project, then the project repository can be
hosted outside the zephyrproject-rtos GitHub organization, provided that the
project is made optional via the group-filter: field in the main
:file:west.yml manifest. More info on optional projects can be found in
:ref:this section <west-manifest-groups>.

The TSC must approve every Pull Request that introduces a new external tooling
component. This will be done on a case-by-case, individual analysis of the
proposed addition by the TSC representatives.

Additional considerations about the main manifest


In general, any additions or removals whatsoever to the projects: section of
the main manifest file_ requires TSC approval. This includes, but is not
limited to:

  • Adding and removing groups and group filters
  • Adding and removing projects
  • Adding and removing import statements

.. _main manifest file:
https://github.com/zephyrproject-rtos/zephyr/blob/main/west.yml


Doc Contribute Guidelines (`doc/contribute/guidelines.rst`)

.. _contribute_guidelines:

Contribution Guidelines
#######################

As an open-source project, we welcome and encourage the community to submit
patches directly to the project. In our collaborative open source environment,
standards and methods for submitting changes help reduce the chaos that can result
from an active development community.

This document explains how to participate in project conversations, log bugs
and enhancement requests, and submit patches to the project so your patch will
be accepted quickly in the codebase.

Prerequisites


.. _Zephyr Project website: https://zephyrproject.org

As a contributor, you'll want to be familiar with the Zephyr project, how to
configure, install, and use it as explained in the Zephyr Project website_
and how to set up your development environment as introduced in the Zephyr
:ref:getting_started.

You should be familiar with common developer tools such as Git and CMake, and
platforms such as GitHub.

If you haven't already done so, you'll need to create a (free) GitHub account
on https://github.com and have Git tools available on your development system.

.. note::
The Zephyr development workflow supports all 3 major operating systems
(Linux, macOS, and Windows) but some of the tools used in the sections below
are only available on Linux and macOS. On Windows, instead of running these
tools yourself, you will need to rely on the Continuous Integration (CI)
service using Github Actions, which runs automatically on GitHub when you submit
your Pull Request (PR). You can see any failure results in the workflow
details link near the end of the PR conversation list. See
Continuous Integration_ for more information

.. _licensing_requirements:

Licensing


Licensing is very important to open source projects. It helps ensure the
software continues to be available under the terms that the author desired.

.. _Apache 2.0 license:
https://github.com/zephyrproject-rtos/zephyr/blob/main/LICENSE

.. _GitHub repo: https://github.com/zephyrproject-rtos/zephyr

Zephyr uses the Apache 2.0 license_ (as found in the LICENSE file in
the project's GitHub repo) to strike a balance between open
contribution and allowing you to use the software however you would like
to. The Apache 2.0 license is a permissive open source license that
allows you to freely use, modify, distribute and sell your own products
that include Apache 2.0 licensed software. (For more information about
this, check out articles such as Why choose Apache 2.0 licensing
and
Top 10 Apache License Questions Answered_).

.. _Why choose Apache 2.0 licensing:
https://www.zephyrproject.org/faqs/#1571346989065-9216c551-f523

.. _Top 10 Apache License Questions Answered:
https://www.whitesourcesoftware.com/whitesource-blog/top-10-apache-license-questions-answered/

A license tells you what rights you have as a developer, as provided by the
copyright holder. It is important that the contributor fully understands the
licensing rights and agrees to them. Sometimes the copyright holder isn't the
contributor, such as when the contributor is doing work on behalf of a
company.

Components using other Licenses

There are some imported or reused components of the Zephyr project that
use other licensing, as described in :ref:Zephyr_Licensing.

Importing code into the Zephyr OS from other projects that use a license
other than the Apache 2.0 license needs to be fully understood in
context and approved by the Zephyr governing board.

By carefully reviewing potential contributions and also enforcing a
:ref:DCO for contributed code, we can ensure that
the Zephyr community can develop products with the Zephyr Project
without concerns over patent or copyright issues.

See :ref:external-contributions for more information about
this contributing and review process for imported components.

.. only:: latex

.. toctree::
:maxdepth: 1

text
../LICENSING.rst

.. _copyrights:

Zephyr follows SPDX/REUSE-style file headers. Add a machine-readable copyright notice and a license
identifier at the top of each file so tooling can detect them (for example
:ref:west spdx <west-spdx>, which uses the REUSE tool_).

The Zephyr Project follows the Community Best Practice_ for copyright notices from the Linux
Foundation, therefore we recommend using the following copyright notice:

.. code-block:: none

SPDX-FileCopyrightText: Copyright The Zephyr Project Contributors

Include the license identifier alongside it:

.. code-block:: none

SPDX-License-Identifier: Apache-2.0

Practical guidance:

  • Place both lines at the very top of the file using the file's native comment syntax.
  • If you authored substantial, original content, you may add an additional line for yourself or
    your organization.

.. _Community Best Practice:
https://www.linuxfoundation.org/blog/copyright-notices-in-open-source-software-projects/

.. _REUSE tool:
https://github.com/fsfe/reuse-tool

.. _DCO:

Developer Certification of Origin (DCO)


To make a good faith effort to ensure licensing criteria are met, the Zephyr
project requires the Developer Certificate of Origin (DCO) process to be
followed.

The DCO is an attestation attached to every contribution made by every
developer. In the commit message of the contribution, (described more fully
later in this document), the developer simply adds a Signed-off-by
statement and thereby agrees to the DCO.

When a developer submits a patch, it is a commitment that the contributor has
the right to submit the patch per the license. The DCO agreement is shown
below and at https://developercertificate.org/.

.. code-block:: none

text
Developer's Certificate of Origin 1.1

By making a contribution to this project, I certify that:

(a) The contribution was created in whole or in part by me and I
    have the right to submit it under the open source license
    indicated in the file; or

(b) The contribution is based upon previous work that, to the
    best of my knowledge, is covered under an appropriate open
    source license and I have the right under that license to
    submit that work with modifications, whether created in whole
    or in part by me, under the same open source license (unless
    I am permitted to submit under a different license), as
    Indicated in the file; or

(c) The contribution was provided directly to me by some other
    person who certified (a), (b) or (c) and I have not modified
    it.

(d) I understand and agree that this project and the contribution
    are public and that a record of the contribution (including
    all personal information I submit with it, including my
    sign-off) is maintained indefinitely and may be redistributed
    consistent with this project or the open source license(s)
    involved.

DCO Sign-Off

The "sign-off" in the DCO is a "Signed-off-by:" line in each commit's log
message. The Signed-off-by: line must be in the following format::

Signed-off-by: Your Name [email protected]

For your commits, replace:

  • Your Name with your legal name (pseudonyms, hacker handles, and the
    names of groups are not allowed)

  • [email protected] with the real email address you are using to
    author the commit. Pseudo or anonymized emails such as
    [email protected] are not allowed. The
    email must match the one you use to author the commit (CI will fail if
    there is no match).

You can automatically add the Signed-off-by: line to your commit body using
git commit -s. Use other commits in the zephyr git history as examples.
See :ref:git_setup for instructions on configuring user and email settings
in Git.

Additional requirements:

  • If you are altering an existing commit created by someone else, you must add
    your Signed-off-by: line without removing the existing one.

.. _ai_coding_assistants:

AI Coding Assistants


This section provides guidance for contributors using AI tools and assistants when contributing to
the Zephyr project.

All contributions must comply with the licensing requirements of the project and be compatible with
Zephyr's licensing (e.g. Apache-2.0, see :ref:licensing_requirements for more details).

Signed-off-by and Developer Certificate of Origin

AI agents must not add Signed-off-by tags. Only humans can legally certify the :ref:DCO.
The human submitter is responsible for:

  • Reviewing all AI-generated code.
  • Ensuring compliance with licensing requirements.
  • Adding their own Signed-off-by tag to certify the DCO.
  • Taking full responsibility for the contribution.

Usage disclosure and attribution

When AI tools are being used to help write a contribution, proper attribution helps track the
evolving role of AI in the development process. Contributions should include an Assisted-by: tag
in the following format:

.. code-block:: none

Assisted-by: [Agent Name]:[Model Version] [Tool1] [Tool2]

Where:

  • [Agent Name] is the name of the AI tool or framework.
  • [Model Version] is the specific model version used.
  • [Tool1] [Tool2] are optional specialized analysis tools used.

Basic development tools (git, gcc, make, editors) should not be listed.

Example:

.. code-block:: none

Assisted-by: Claude:claude-opus-4.6 coccinelle

.. _source_tree_v2:

Source Tree Structure


To clone the main Zephyr Project repository use the instructions in
:ref:get_the_code.

This section describes the main repository's source tree. In addition to the
Zephyr kernel itself, you'll also find the sources for technical documentation,
sample code, supported board configurations, and a collection of subsystem
tests. All of these are available for developers to contribute to and enhance.

Understanding the Zephyr source tree can help locate the code
associated with a particular Zephyr feature.

At the top of the tree, several files are of importance:

:file:CMakeLists.txt
The top-level file for the CMake build system, containing a lot of the
logic required to build Zephyr.

:file:Kconfig
The top-level Kconfig file, which refers to the file :file:Kconfig.zephyr
also found in the top-level directory.

text
See :ref:`the Kconfig section of the manual <kconfig>` for detailed Kconfig
documentation.

:file:west.yml
The :ref:west manifest, listing the external repositories managed by
the west command-line tool.

The Zephyr source tree also contains the following top-level
directories, each of which may have one or more additional levels of
subdirectories not described here.

:file:arch
Architecture-specific kernel and system-on-chip (SoC) code.
Each supported architecture (for example, x86 and ARM)
has its own subdirectory,
which contains additional subdirectories for the following areas:

text
* architecture-specific kernel source files
* architecture-specific kernel include files for private APIs

:file:soc
SoC related code and configuration files.

:file:boards
Board related code and configuration files.

:file:doc
Zephyr technical documentation source files and tools used to
generate the https://docs.zephyrproject.org web content.

:file:drivers
Device driver code.

:file:dts
:ref:devicetree <dt-guide> source files used to describe non-discoverable
board-specific hardware details.

:file:include
Include files for all public APIs, except those defined under :file:lib.

:file:kernel
Architecture-independent kernel code.

:file:lib
Library code, including the minimal standard C library.

:file:misc
Miscellaneous code that doesn't belong to any of the other top-level
directories.

:file:samples
Sample applications that demonstrate the use of Zephyr features.

:file:scripts
Various programs and other files used to build and test Zephyr
applications.

:file:cmake
Additional build scripts needed to build Zephyr.

:file:subsys
Subsystems of Zephyr, including:

text
* USB device stack code
* Networking code, including the Bluetooth stack and networking stacks
* File system code
* Bluetooth host and controller

:file:tests
Test code and benchmarks for Zephyr features.

:file:share
Additional architecture independent data. It currently contains Zephyr's CMake
package.

Pull Requests and Issues


.. _Zephyr Project Issues: https://github.com/zephyrproject-rtos/zephyr/issues

.. _open pull requests: https://github.com/zephyrproject-rtos/zephyr/pulls

.. _Zephyr devel mailing list: https://lists.zephyrproject.org/g/devel

.. _Zephyr Discord Server: https://chat.zephyrproject.org

Before starting on a patch, first check in our issues Zephyr Project Issues_
system to see what's been reported on the issue you'd like to address. Have a
conversation on the Zephyr devel mailing list_ (or the Zephyr Discord Server) to see what others think of your issue (and proposed solution). You
may find others that have encountered the issue you're finding, or that have
similar ideas for changes or additions. Send a message to the Zephyr devel mailing list
to introduce and discuss your idea with the development
community.

It's always a good practice to search for existing or related issues before
submitting your own. When you submit an issue (bug or feature request), the
triage team will review and comment on the submission, typically within a few
business days.

You can find all open pull requests_ on GitHub and open Zephyr Project Issues_ in Github issues.

.. _git_setup:

Git Setup


We need to know who you are, and how to contact you. To add this
information to your Git installation, set the Git configuration
variables user.name to your full name, and user.email to your
email address.

For example, if your name is Zephyr Developer and your email
address is [email protected]:

.. code-block:: console

git config --global user.name "Zephyr Developer"
git config --global user.email "[email protected]"

.. note::
user.name must be your full name (first and last at minimum), not a
pseudonym or hacker handle. The email address that you use in your Git configuration must match the email
address you use to sign your commits. If they don't match, the CI system will
fail your pull request.

If you intend to edit commits using the Github.com UI, ensure that your github profile
email address and profile name also match those used in your git configuration
(user.name & user.email).

Pull Request Guidelines


When opening a new Pull Request, adhere to the following guidelines to ensure
compliance with Zephyr standards and facilitate the review process.

If in doubt, it's advisable to explore existing Pull Requests within the Zephyr
repository. Use the search filters and labels to locate PRs related to changes
similar to the ones you are proposing.

.. note::
GitHub's default code UI uses 4-character tabs. However, Zephyr follows the
Linux kernel coding style_, which uses 8-character tabs.

To ensure your view of the code is consistent with other developers, please
go to your user preferences on GitHub_ and change the tab width to 8 spaces.

.. _Linux kernel coding style:
https://kernel.org/doc/html/latest/process/coding-style.html#indentation

.. _user preferences on GitHub:
https://github.com/settings/appearance

.. _commit-guidelines:

Commit Message Guidelines

Changes are submitted as Git commits. Each commit has a commit
message
describing the change. Acceptable commit messages look like
this:

.. code-block:: none

[area]: [summary of change]

[Commit message body (must be non-empty)]

Signed-off-by: [Your Full Name] <[your.email@address]>

You need to change text in square brackets ([like this]) above to
fit your commit.

Here is an example of a good commit message.

.. code-block:: none

drivers: sensor: abcd1234: fix bus I/O error handling

The abcd1234 sensor driver is failing to check the flags field in
the response packet from the device which signals that an error
occurred. This can lead to reading invalid data from the response
buffer. Fix it by checking the flag and adding an error path.

Signed-off-by: Zephyr Developer [email protected]

[area]: [summary of change]

This line is called the commit's title. Titles must be:

  • one line
  • less than 72 characters long
  • followed by a completely blank line

[area]
The [area] prefix usually identifies the area of code
being changed. It can also identify the change's wider
context if multiple areas are affected.

Here are some examples:

  • doc: ... for documentation changes
  • drivers: foo: for foo driver changes
  • Bluetooth: Shell: for changes to the Bluetooth shell
  • net: ethernet: for Ethernet-related networking changes
  • dts: for treewide devicetree changes
  • style: for code style changes

If you're not sure what to use, try running git log FILE, where
FILE is a file you are changing, and using previous commits that
changed the same file as inspiration.

[summary of change]
The [summary of change] part should be a quick description of
what you've done. Here are some examples:

  • doc: update wiki references to new site
  • drivers: sensor: sensor_shell: fix channel name collision

Commit Message Body

.. warning::

An empty commit message body is not permitted. Even for trivial
changes, please include a descriptive commit message body. Your
pull request will fail CI checks if you do not.

This part of the commit should explain what your change does, and why
it's needed. Be specific. A body that says "Fixes stuff" will be
rejected. Be sure to include the following as relevant:

  • what the change does,
  • why you chose that approach,
  • what assumptions were made, and
  • how you know it works -- for example, which tests you ran.

Each line in your commit message should usually be 75 characters or
less. Use newlines to wrap longer lines. Exceptions include lines
with long URLs, email addresses, etc.

For examples of accepted commit messages, you can refer to the Zephyr GitHub
changelog <https://github.com/zephyrproject-rtos/zephyr/commits/main>__.

Signed-off-by: ...

.. tip::

You should have set your :ref:git_setup
already. Create your commit with git commit -s to add the
Signed-off-by: line automatically using this information.

For open source licensing reasons, your commit must include a
Signed-off-by: line that looks like this:

.. code-block:: none

Signed-off-by: [Your Full Name] <[your.email@address]>

For example, if your full name is Zephyr Developer and your email
address is [email protected]:

.. code-block:: none

Signed-off-by: Zephyr Developer [email protected]

This means that you have personally made sure your change complies
with the :ref:DCO. For this reason, you must use your legal name.
Pseudonyms or "hacker aliases" are not permitted.

Your name and the email address you use must match the name and email
in the Git commit's Author: field.

See the :ref:contributor-expectations for a more complete discussion of
contributor and reviewer expectations.

.. _GitHub references:
https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/autolinked-references-and-urls

If your change addresses a specific GitHub issue, include a reference in the
pull request description using the following format:

.. code-block:: none

Fixes zephyrproject-rtos/zephyr#[issue number]

For pull requests to the Zephyr project only, the short form can also be used,
for example:

.. code-block:: none

Fixes #[issue number]

Replace [issue number] with the relevant GitHub issue number. For example:

.. code-block:: none

Fixes zephyrproject-rtos/zephyr#1234

This syntax ensures that the issue is automatically closed when the pull
request is merged. Always specify the full repository path
(zephyrproject-rtos/zephyr) to avoid ambiguity, especially when working across
multiple repositories.

The same format can also be used in commit messages.

For linking to additional external resources—such as related issues,
datasheets, or technical reference manuals—use the Link: tag:

.. code-block:: none

Link: https://github.com/zephyrproject-rtos/zephyr/issues/

.. _Continuous Integration:

Continuous Integration (CI)

The Zephyr Project operates a Continuous Integration (CI) system that runs on
every Pull Request (PR) in order to verify several aspects of the PR:

  • Git commit formatting
  • Coding Style
  • Twister builds for multiple architectures and boards
  • Documentation build to verify any doc changes

CI is run on Github Actions and it uses the same tools described in the
CI Tests_ section. The CI results must be green indicating "All
checks have passed" before the Pull Request can be merged. CI is run when the
PR is created, and again every time the PR is modified with a commit.

The current status of the CI run can always be found at the bottom of the
GitHub PR page, below the review status. Depending on the success or failure
of the run you will see:

  • "All checks have passed"
  • "All checks have failed"

In case of failure you can click on the "Details" link presented below the
failure message in order to navigate to Github Actions and inspect the
results.
Once you click on the link you will be taken to the Github actions summary
results page where a table with all the different builds will be shown. To see
what build or test failed click on the row that contains the failed (i.e.
non-green) build.

.. _CI Tests:

Running CI Tests Locally

.. _check_compliance_py:

check_compliance.py

The :zephyr_file:scripts/ci/check_compliance.py script serves as a valuable
tool for assessing code compliance with Zephyr's established guidelines and
best practices. The script acts as wrapper for a suite of tools that performs
various checks, including linters and formatters.

Developers are encouraged to run the script locally to validate their changes
before opening a new Pull Request:

.. code-block:: bash

./scripts/ci/check_compliance.py -c

The checks run in parallel, using one worker process per CPU. Pass -p N to
limit the number of worker processes to N, or -p 1 to run the checks
sequentially.

.. code-block:: bash

./scripts/ci/check_compliance.py -p 1 -c

.. note::
On Windows if the .pl extension has not yet been associated with an
application, then the first time a .pl file is run without specifying an
interpreter, Windows will ask what application will open Perl files.
Set the default app to Strawberry Perl. By default the executable is
installed at C:\Strawberry\perl\bin\perl.exe.

KeepSorted Check
^^^^^^^^^^^^^^^^

The KeepSorted check ensures that specified blocks of code, configuration, or
documentation remain in sorted order.

To use the KeepSorted check, wrap your sorted content between dedicated lines
containing start and stop markers, typically using comments:

.. code-block:: c

// zephyr-keep-sorted-start
option_a
option_b
option_c
// zephyr-keep-sorted-stop

KeepSorted Marker Options
"""""""""""""""""""""""""

The sorting behavior of each block can be customized in several ways.
To do this, one or more of the following parameters can be added on
the same line as the start marker itself:

re(regex_pattern)
Enables regex mode where only lines matching the specified regular expression
are checked for sorting. Other lines are ignored.

Example checking sorted properties in a yaml file:

.. code-block:: yaml

text
# zephyr-keep-sorted-start re(^\s+\- name:)
  projects:
    - name: application
      revision: main
    - name: library1
      revision: feature-branch
    - name: library2
      revision: main
  # zephyr-keep-sorted-stop

strip(characters)
Strips the specified characters from lines before performing the sort comparison.
This is useful when lines have optional prefixes or suffixes that should be
ignored during sorting.

Example stripping quotes from yaml dictionary keys:

.. code-block:: yaml

text
# zephyr-keep-sorted-start strip(":)
  ACPI:
    status: odd fixes
  "West project: acpica":
    status: odd fixes
  # zephyr-keep-sorted-stop

nofold
Disables line folding. By default, indented lines following a main line are
concatenated (folded) together for sorting comparison. The nofold option
disables this behavior and ignores indented lines.

ignorecase
Enables case-insensitive sorting using Python's str.casefold_. This allows
mixing uppercase and lowercase items in sorted blocks without causing sort
order violations. Defaults to Python's string ordering if omitted.

.. _str.casefold: https://docs.python.org/3/library/stdtypes.html#str.casefold

Multiple options can be combined on the same marker line:

.. code-block:: rst

.. zephyr-keep-sorted-start re(^* \w) ignorecase

  • Shell
    Some important message about the shell.

  • STM32
    Updates for this vendor.
    .. zephyr-keep-sorted-stop

twister

.. note::
twister is only fully supported on Linux; on Windows and MacOS the execution
of tests is not supported on all target devices.

If you think your change may break some test, you can submit your PR as a draft
and let the project CI automatically run the :ref:twister_script for you.

If a test fails, you can check from the CI run logs how to rerun it locally,
for example:

.. code-block:: bash

west twister -p native_sim -s tests/drivers/build_all/sensor/drivers.sensor.generic_test

.. _static_analysis:

Static Code Analysis


Coverity Scan is a free service for static code analysis of Open Source
projects. It is based on Coverity's commercial product and is able to analyze
C, C++ and Java code.

Coverity's static code analysis doesn't run the code. Instead of that it uses
abstract interpretation to gain information about the code's control flow and
data flow. It's able to follow all possible code paths that a program may take.
For example the analyzer understands that malloc() returns a memory that must
be freed with free() later. It follows all branches and function calls to see
if all possible combinations free the memory. The analyzer is able to detect
all sorts of issues like resource leaks (memory, file descriptors), NULL
dereferencing, use after free, unchecked return values, dead code, buffer
overflows, integer overflows, uninitialized variables, and many more.

The results are available on the Coverity Scan <https://scan.coverity.com/projects/zephyr>_ website. In order to access the
results you have to create an account yourself. From the Zephyr project page,
you may select "Add me to project" to be added to the project. New members must
be approved by an admin.

Static analysis of the Zephyr codebase is conducted on a bi-weekly basis. GitHub
issues are automatically created for any issues detected by static analysis
tools. These issues will have the same (or equivalent) priority initially
defined by the tool.

To ensure accountability and efficient issue resolution, they are assigned to
the respective maintainer who is responsible for the affected code.

A dedicated team comprising members with expertise in static analysis, code
quality, and software security ensures the effectiveness of the static
analysis process and verifies that identified issues are properly
triaged and resolved in a timely manner.

Workflow

If after analyzing the Coverity report it is concluded that it is a false
positive please set the classification to either "False positive" or
"Intentional", the action to "Ignore", owner to your own account and add a
comment why the issue is considered false positive or intentional.

Update the related Github issue in the zephyr project with the details, and only close
it after completing the steps above on scan service website. Any issues
closed without a fix or without ignoring the entry in the scan service will be
automatically reopened if the issue continues to be present in the code.

.. _Contribution workflow:

Contribution Workflow


One general practice we encourage, is to make small,
controlled changes. This practice simplifies review, makes merging and
rebasing easier, and keeps the change history clear and clean.

When contributing to the Zephyr Project, it is also important you provide as much
information as you can about your change, update appropriate documentation,
and test your changes thoroughly before submitting.

The general GitHub workflow used by Zephyr developers uses a combination of
command line Git commands and browser interaction with GitHub. As it is with
Git, there are multiple ways of getting a task done. We'll describe a typical
workflow here:

.. _Create a Fork of Zephyr:
https://github.com/zephyrproject-rtos/zephyr#fork-destination-box

#. Create a Fork of Zephyr_
to your personal account on GitHub. (Click on the fork button in the top
right corner of the Zephyr project repo page in GitHub.)

#. On your development computer, change into the :file:zephyr folder that was
created when you :ref:obtained the code <get_the_code>::

text
cd zephyrproject/zephyr

Rename the default remote pointing to the upstream repository <https://github.com/zephyrproject-rtos/zephyr>_ from origin to
upstream::

text
git remote rename origin upstream

Let Git know about the fork you just created, naming it origin::

text
git remote add origin https://github.com/<your github id>/zephyr

and verify the remote repos::

text
git remote -v

The output should look similar to::

text
origin   https://github.com/<your github id>/zephyr (fetch)
 origin   https://github.com/<your github id>/zephyr (push)
 upstream https://github.com/zephyrproject-rtos/zephyr (fetch)
 upstream https://github.com/zephyrproject-rtos/zephyr (push)

#. Create a topic branch (off of main) for your work (if you're addressing
an issue, we suggest including the issue number in the branch name)::

text
git switch main
 git switch -c fix_comment_typo

Some Zephyr subsystems do development work on a separate branch from
main so you may need to indicate this in your checkout::

text
git switch -c fix_out_of_date_patch origin/net

#. Make changes, test locally, change, test, test again, ... (Check out the
prior chapter on twister_ as well).

#. When things look good, start the pull request process by adding your changed
files::

text
git add [file(s) that changed, add -p if you want to be more specific]

You can see files that are not yet staged using::

text
git status

#. Verify changes to be committed look as you expected::

text
git diff --cached

#. Commit your changes to your local repo::

text
git commit -s

The -s option automatically adds your Signed-off-by: to your commit
message. Your commit will be rejected without this line that indicates your
agreement with the :ref:DCO. See the :ref:commit-guidelines section for
specific guidelines for writing your commit messages.

#. Push your topic branch with your changes to your fork in your personal
GitHub account::

text
git push origin fix_comment_typo

#. In your web browser, go to your forked repo and click on the
Compare & pull request button for the branch you just worked on and
you want to open a pull request with.

#. Review the pull request changes, and verify that you are opening a pull
request for the main branch. The title and message from your commit
message should appear as well.

#. A bot will assign one or more suggested reviewers (based on the
MAINTAINERS file in the repo). If you are a project member, you can
select additional reviewers now too.

#. Click on the submit button and your pull request is sent and awaits
review. Email will be sent as review comments are made, or you can check
on your pull request at https://github.com/zephyrproject-rtos/zephyr/pulls.

#. While you're waiting for your pull request to be accepted and merged, you
can create another branch to work on another issue. (Be sure to make your
new branch off of main and not the previous branch.)::

text
git switch main
 git switch -c fix_another_issue

and use the same process described above to work on this new topic branch.

#. If reviewers do request changes to your patch, you can interactively rebase
commit(s) to fix review issues. In your development repo::

text
git rebase -i <offending-commit-id>^

In the interactive rebase editor, replace pick with edit to select
a specific commit (if there's more than one in your pull request), or
remove the line to delete a commit entirely. Then edit files to fix the
issues in the review.

As before, inspect and test your changes. When ready, continue the
patch submission::

text
git add [file(s)]
 git rebase --continue

Update commit comment if needed, and continue::

text
git push --force origin fix_comment_typo

By force pushing your update, your original pull request will be updated
with your changes so you won't need to resubmit the pull request.

#. After pushing the requested change, check on the PR page if there is a
merge conflict. If so, rebase your local branch::

text
git fetch --all
  git rebase --ignore-whitespace upstream/main

The --ignore-whitespace option stops git apply (called by rebase)
from changing any whitespace. Resolve the conflicts and push again::

text
git push --force origin fix_comment_typo

.. note:: While amending commits and force pushing is a common review model
outside GitHub, and the one recommended by Zephyr, it's not the main
model supported by GitHub. Forced pushes can cause unexpected behavior,
such as not being able to use "View Changes" buttons except for the last
one - GitHub complains it can't find older commits. You're also not
always able to compare the latest reviewed version with the latest
submitted version. When rewriting history GitHub only guarantees access
to the latest version.

#. If the CI run fails, you will need to make changes to your code in order
to fix the issues and amend your commits by rebasing as described above.
Additional information about the CI system can be found in
Continuous Integration_.

.. _contribution_tips:

Contribution Tips

The following is a list of tips to improve and accelerate the review process of
Pull Requests. If you follow them, chances are your pull request will get the
attention needed and it will be ready for merge sooner than later:

.. _git-rebase:
https://git-scm.com/docs/git-rebase#Documentation/git-rebase.txt---keep-base

#. When pushing follow-up changes, use the --keep-base option of
git-rebase_

#. On the PR page, check if the change can still be merged with no merge
conflicts

#. Make sure title of PR explains what is being fixed or added

#. Make sure your PR has a body with more details about the content of your
submission

#. Make sure you reference the issue you are fixing in the body of the PR

#. Watch early CI results immediately after submissions and fix issues as they
are discovered

#. Revisit PR after 1-2 hours to see the status of all CI checks, make sure all
is green

#. If you get request for changes and submit a change to address them, make
sure you click the "Re-request review" button on the GitHub UI to notify
those who asked for the changes

Identifying Contribution Origin

When adding a new file to the tree, it is important to detail the source of
origin on the file, provide attributions, and detail the intended usage. In
cases where the file is an original to Zephyr, the commit message should
include the following ("Original" is the assumption if no Origin tag is
present)::

text
Origin: Original

In cases where the file is :ref:imported from an external project <external-contributions>, the commit message shall contain details regarding
the original project, the location of the project, the SHA-id of the origin
commit for the file and the intended purpose.

For example, a copy of a locally maintained import::

text
Origin: Contiki OS
  License: BSD 3-Clause
  URL: https://www.contiki-os.org/
  commit: 853207acfdc6549b10eb3e44504b1a75ae1ad63a
  Purpose: Introduction of networking stack.

For example, a copy of an externally maintained import in a module repository::

text
Origin: Tiny Crypt
  License: BSD 3-Clause
  URL: https://github.com/01org/tinycrypt
  commit: 08ded7f21529c39e5133688ffb93a9d0c94e5c6e
  Purpose: Introduction of TinyCrypt

Contributions to External Modules


Follow the guidelines in the :ref:modules section for contributing
:ref:new modules <submitting_new_modules> and
submitting changes to :ref:existing modules <changes_to_existing_module>.

.. _treewide-changes:

Treewide Changes


This section describes contributions that are treewide changes and some
additional associated requirements that apply to them. These requirements exist
to try to give such changes increased review and user visibility due to their
large impact.

Definition and Decision Making

A treewide change is defined as any change to Zephyr APIs, coding practices,
or other development requirements that either implies required changes
throughout the zephyr source code repository or can reasonably be expected to
do so for a wide class of external Zephyr-based source code.

This definition is informal by necessity. This is because the decision on
whether any particular change is treewide can be subjective and may depend on
additional context.

Project maintainers should use good judgement and prioritize the Zephyr
developer experience when deciding when a proposed change is treewide.
Protracted disagreements can be resolved by the Zephyr Project's Technical
Steering Committee (TSC), but please avoid premature escalation to the TSC.

Requirements for Treewide Changes

  • The zephyr repository must apply the 'treewide' GitHub label to any issues or
    pull requests that are treewide changes

  • The person proposing a treewide change must create an RFC issue <https://github.com/zephyrproject-rtos/zephyr/issues/new?assignees=&labels=RFC&template=003_rfc-proposal.yml>_
    describing the change, its rationale and impact, etc. before any pull
    requests related to the change can be merged

  • The project's Architecture Working Group (WG) <https://github.com/zephyrproject-rtos/zephyr/wiki/Architecture-Working-Group>_
    must include the issue on the agenda and discuss whether the project will
    accept or reject the change before any pull requests related to the change
    can be merged (with escalation to the TSC if consensus is not reached at the
    WG)

  • The Architecture WG must specify the procedure for merging any PRs associated
    with each individual treewide change, including any required approvals for
    pull requests affecting specific subsystems or extra review time requirements

  • The person proposing a treewide change must email
    [email protected] about the RFC if it is accepted by the
    Architecture WG before any pull requests related to the change can be merged

Examples

Some example past treewide changes are:

  • the deprecation of version 1 of the :ref:Logging API <logging_api> in favor
    of version 2 (see commit 262cc55609 <https://github.com/zephyrproject-rtos/zephyr/commit/262cc55609b73ea61b5f999c6c6daaba20bc5240>_)
  • the removal of support for a legacy :ref:dt-bindings syntax
    (6bf761fc0a <https://github.com/zephyrproject-rtos/zephyr/commit/6bf761fc0a2811b037abec0c963d60b00c452acb>_)

Note that adding a new version of a widely used API while maintaining
support for the old one is not a treewide change. Deprecation and removal of
such APIs, however, are treewide changes.

Specialized driver requirements


Drivers for standalone devices should use the Zephyr bus APIs (SPI, I2C...)
whenever possible so that the device can be used with any SoC from any vendor
implementing a compatible bus.

If it is not technically possible to achieve full performance using the Zephyr
APIs due to specialized accelerators in a particular SoC family, one could
extend the support for an external device by providing a specialized path for
that SoC family. However, the driver must still provide a regular path (via
Zephyr APIs) for all other SoCs. Every exception must be approved by the
Architecture WG in order to be validated and potentially to be learned/improved
from.


Doc Contribute Index (`doc/contribute/index.rst`)

.. _contribute_to_zephyr:

Contributing to Zephyr
######################

Contributions from the community are the backbone of the project. Whether it is by submitting code,
improving documentation, or proposing new features, your efforts are highly appreciated. This page
lists useful resources and guidelines to help you in your contribution journey.

General Guidelines

.. toctree::
:maxdepth: 1
:hidden:

guidelines.rst
contributor_expectations.rst
reviewer_expectations.rst
coding_guidelines/index.rst
style/index.rst
proposals_and_rfcs.rst
modifying_contributions.rst
pr_lifecycle_policy.rst

:ref:contribute_guidelines
Learn about the overall process and guidelines for contributing to the Zephyr project.

This page is a mandatory read for first-time contributors as it contains important information on
how to ensure your contribution can be considered for inclusion in the project and potentially
merged.

:ref:contributor-expectations
This document is another mandatory read that describes the expected behavior of all
contributors to the project.

:ref:reviewer-expectations
This document is another mandatory read that describes the expected behavior when revieweing
contributions to the project.

:ref:coding_guidelines
Code contributions are expected to follow a set of coding guidelines to ensure consistency and
readability across the code base.

:ref:coding_style
Code contributions are expected to follow a set of style guidelines to ensure consistency and
readability across the code base.

:ref:rfcs
Learn when and how to submit RFCs (Request for Comments) for new features and changes to the
project.

:ref:modifying_contributions
Guidelines for modifying contributions made by other developers and how to deal with stale pull
requests.

:ref:pr_lifecycle_policy
Policy for keeping open pull requests focused on work that is actively progressing and likely to
merge.

Documentation

The Zephyr project thrives on good documentation. Whether it is as part of a code contribution or
as a standalone effort, contributing documentation is particularly valuable to the project.

.. toctree::
:maxdepth: 1
:hidden:

documentation/guidelines.rst
documentation/generation.rst

:ref:doc_guidelines
This page provides some simple guidelines for writing documentation using the reSTructuredText
(reST) markup language and Sphinx documentation generator.

:ref:zephyr_doc
As you write documentation, it can be helpful to see how it will look when rendered.

This page describes how to build the Zephyr documentation locally.

Dealing with external components

.. toctree::
:maxdepth: 1
:hidden:

external.rst
bin_blobs.rst

:ref:external-contributions
Basic functionality or features that would make useful addition to Zephyr might be readily
available in other open source projects, and it is recommended and encouraged to reuse such code.
This page describes in more details when and how to import external source code into Zephyr.

:ref:external-tooling
Similarly, external tooling used during compilation, code analysis, testing or simulation, can be
beneficial and is covered in this section.

:ref:bin-blobs
As some functionality might only be made available with the help of executable code distributed
in binary form, this page describes the process and guidelines for :ref:contributing binary blobs to the project.

Need help along the way?

If you have questions related to the contribution process, the Zephyr community is here to help.
You may join our Discord_ channel or use the Developer Mailing List_.

.. _Discord: https://chat.zephyrproject.org
.. _Developer Mailing List: https://lists.zephyrproject.org/g/devel


Doc Contribute Modifying Contributions (`doc/contribute/modifying_contributions.rst`)

.. _modifying_contributions:

Modifying Contributions made by other developers


Scenarios
#########

Zephyr contributors and collaborators are encouraged to assist
as reviewers in pull requests, so that patches may be approved and merged
to Zephyr's main branch as part of the original pull requests. The authors
of the pull requests are responsible for amending their original commits
following the review process.

There are occasions, however, when a contributor might need to modify patches
included in pull requests that are submitted by other Zephyr contributors.
For instance, this is the case when:

  • a developer cherry-picks commits submitted by other contributors into their
    own pull requests in order to:

    • integrate useful content which is part of a stale pull request, or
    • get content merged to the project's main branch as part of a larger
      patch
  • a developer pushes to a branch or pull request opened by another
    contributor in order to:

    • assist in updating pull requests in order to get the patches merged
      to the project's main branch
    • drive stale pull requests to completion so they can be merged

Accepted policies
#################

A developer who intends to cherry-pick and potentially modify patches sent by
another contributor shall:

  • clarify in their pull request the reason for cherry-picking the patches,
    instead of assisting in getting the patches merged in their original
    pull request, and
  • invite the original author of the patches to their pull request review.

A developer who intends to force-push to a branch or pull request of
another Zephyr contributor shall clarify in the pull request the reason
for pushing and for modifying the existing patches (e.g. stating that it
is done to drive the pull request review to completion, when the pull
request author is not able to do so).

.. note::
Developers should try to limit the above practice to pull requests identified
as stale. Read about how to identify pull requests as stale in
:ref:development processes and tools <dev-environment-and-tools>

If the original patches are substantially modified, the developer can either:

  • (preferably) reach out to the original author and request them to
    acknowledge that the modified patches may be merged while having
    the original sign-off line and author identity, or
  • submit the modified patches as their own work (i.e. with their
    own sign-off line and author identity). In this case, the developer
    shall identify in the commit message(s) the original source the
    submitted work is based on (mentioning, for example, the original PR
    number).

.. note::
Contributors should uncheck the box “Allow Edits By Maintainers"
to indicate that they do not wish their patches to be amended,
inside their original branch or pull request, by other Zephyr developers.


Doc Contribute Pr Lifecycle Policy (`doc/contribute/pr_lifecycle_policy.rst`)

.. _pr_lifecycle_policy:

Pull Request Lifecycle Policy
#############################

This policy keeps the open pull request list focused on contributions that are actively
progressing and have a realistic path to merge.

Goals


  • Keep open pull requests manageable for contributors and maintainers.
  • Prioritize review bandwidth for changes that are moving forward.
  • Provide clear expectations for draft pull requests and inactive pull requests.

Scope


This policy applies to all pull requests in the repository, including draft pull requests.

Definitions


Active pull request
A pull request with meaningful progress such as commits, review responses, or updates
addressing requested changes.

Draft pull request
A pull request opened for work in progress and early feedback.

Stalled pull request
A pull request without meaningful activity inside the inactivity window.

Closed inactive pull request
A pull request closed due to inactivity, supersession, or no clear merge path.

Draft Pull Request Expectations


  • Draft pull requests should include a clear problem statement, current status, and known gaps.
  • Draft pull requests should move to ready-for-review within 30 days.
  • If a draft pull request is inactive for 30 days, it may be marked stale and a reminder is posted.
  • If there is no meaningful progress for 7 additional days after stale notice, the pull request
    may be closed.

Ready-for-Review Pull Request Expectations


  • Authors should respond to review feedback within 21 days.
  • If a ready pull request has no meaningful activity for 30 days, it may be marked stale.
  • If no meaningful update is made within 7 days after stale notice, the pull request
    may be closed.
  • Pull requests with unresolved blocking feedback for more than 45 days may be closed if no
    concrete plan is provided.

What Counts as Meaningful Activity


Examples of meaningful activity include:

  • New commits that address review feedback.
  • Concrete technical responses and follow-up updates.
  • Significant revision updates that materially change the pull request.

Examples that typically do not count as meaningful activity include:

  • Ping-only comments with no technical update.
  • Trivial rebases with no substantive change.

Exceptions


The following pull requests may be exempt from automatic inactive closure:

  • Security-critical fixes.
  • Release blockers.
  • Pull requests explicitly waiting on an external dependency with a linked tracking item.

Exempt pull requests still need a status update at least every 30 days.

Superseded Pull Requests


When work is replaced by another pull request:

  • Close the old pull request as superseded.
  • Link the replacement pull request.
  • Add a short summary comment preserving context.

Reopening Closed Inactive Pull Requests


Closing a pull request due to inactivity is an administrative step to keep the open list
manageable. It is not a rejection of the contribution.

Closed inactive pull requests may be reopened when:

  • The author posts an updated plan.
  • Prior blocking feedback is addressed.
  • Maintainers confirm that review can continue.

Contributors are encouraged to reopen at any time when they can provide meaningful updates.

Responsibilities


Contributors are expected to:

  • Keep pull request descriptions up to date.
  • Respond to review comments in a timely manner.
  • Move draft pull requests to ready-for-review once they are reviewable.

Consult with the :ref:contributor expectations <contributor-expectations> document
for additional guidance.

Maintainers are expected to:

  • Apply stale and closure decisions consistently.
  • Provide clear blocking feedback.
  • Close with explicit rationale and a reopen path.

Consult with the :ref:maintainer responsibilities <maintainer> document for
additional guidance.


Doc Contribute Proposals And Rfcs (`doc/contribute/proposals_and_rfcs.rst`)

.. _rfcs:

Proposals and RFCs
##################

Many changes, including bug fixes and documentation improvements can be
implemented and reviewed via the normal GitHub pull request workflow.

Many changes however are "substantial" and need to go through a
design process and produce a consensus among the project stakeholders.

The "RFC" (request for comments) process is intended to provide a consistent and
controlled path for new features to enter the project.

Contributors and project stakeholders should consider using this process if
they intend to make "substantial" changes to Zephyr or its documentation. Some
examples that would benefit from an RFC are:

  • A new feature that creates new API surface area, and would require a feature
    flag if introduced.
  • The modification of an existing stable API.
  • The removal of features that already shipped as part of Zephyr.
  • The introduction of new idiomatic usage or conventions, even if they do not
    include code changes to Zephyr itself.

The RFC process is a great opportunity to get more eyeballs on proposals coming
from contributors before it becomes a part of Zephyr. Quite often, even
proposals that seem "obvious" can be significantly improved once a wider group
of interested people have a chance to weigh in.

The RFC process can also be helpful to encourage discussions about a proposed
feature as it is being designed, and incorporate important constraints into the
design while it's easier to change, before the design has been fully
implemented.

For a Major Feature, first open an issue and outline your proposal so that it
can be discussed. This will also allow us to better coordinate our efforts,
prevent duplication of work, and help you to craft the change so that it is
successfully accepted into the project. Providing the following information
will increase the chances of your issue being dealt with quickly:

  • Overview of the Proposal
  • Motivation for or Use Case
  • Design Details
  • Alternatives
  • Test Strategy

Some changes or contributions do not require an RFC, the rationale and details
of the changes should however be part of the pull-request:

  • Small enhancements and modifications to existing and established subsystems.
  • Rephrasing, reorganizing or refactoring
  • Addition or removal of warnings
  • Addition of new boards, SoCs or drivers to existing subsystems
  • ...

The process in itself consists in creating a GitHub issue with the :ref:RFC label <gh_labels> that documents the proposal thoroughly. You are encouraged
to use the RFC form_ to make sure the proposal follows a template which
project participants are already familiar with.

As with Pull Requests, RFCs might require discussion in the context of one of
the Zephyr meetings_ in order to move it forward in cases where there is
either disagreement or not enough voiced opinions in order to proceed. Make sure
to either label it appropriately or include it in the corresponding GitHub
project in order for it to be examined during the next meeting.

.. _RFC form: https://github.com/zephyrproject-rtos/zephyr/issues/new?template=003_rfc-proposal.yml
.. _Zephyr meetings: https://github.com/zephyrproject-rtos/zephyr/wiki/Zephyr-Committee-and-Working-Groups


Doc Contribute Reviewer Expectations (`doc/contribute/reviewer_expectations.rst`)

.. _reviewer-expectations:

Reviewer Expectations
#####################

  • Be respectful when commenting on PRs. Refer to the Zephyr Code of Conduct_
    for more details.

  • The Zephyr Project recognizes that reviewers and maintainers have limited
    bandwidth. As a reviewer, prioritize review requests in the following order:

    #. PRs related to items in the Zephyr Release Plan_ or those targeting
    the next release during the stabilization period (after RC1).

    #. PRs where the reviewer has requested blocking changes.
    #. PRs assigned to the reviewer as the area maintainer.
    #. All other PRs.

  • Reviewers shall strive to advance the PR to a mergeable state with their
    feedback and engagement with the PR author.

  • Try to provide feedback on the entire PR in one shot. This provides the
    contributor an opportunity to address all comments in the next PR update.

  • Partial reviews are permitted, but the reviewer must add a comment indicating
    what portion of the PR they reviewed. Examples of useful partial reviews
    include:

    • Domain specific reviews (e.g. Devicetree).
    • Code style changes that impact the readability of the PR.
    • Reviewing commits separately when the requested changes cascade into the
      later commits.
  • Avoid increasing scope of the PR by requesting new features, especially when
    there is a corresponding :ref:RFC <rfcs> associated with the PR. Instead,
    reviewers should add suggestions as a comment to the :ref:RFC <rfcs>. This
    also encourages more collaboration as it is easier for multiple contributors
    to work on a feature once the minimum implementation has merged.

  • When using the "Request Changes" option, mark trivial, non-functional,
    requests as "Non-blocking" in the comment. Reviewers should approve PRs once
    only non-blocking changes remain. The PR author has discretion as to whether
    they address all non-blocking comments. PR authors should acknowledge every
    review comment in some way, even if it's just with an emoticon.

  • Style changes that the reviewer disagrees with but that are not documented as
    part of the project can be pointed out as non-blocking, but cannot constitute
    a reason for a request for changes. The reviewer can optionally correct any
    potential inconsistencies in the tree, document the new guidelines or rules,
    and then enforce them as part of the review.

  • Whenever requesting style related changes, reviewers should be able to point
    out the corresponding guideline, rule or rationale in the project's
    documentation. This does not apply to certain types of requests for changes,
    notably those specific to the changes being submitted (e.g. the use of a
    particular data structure or the choice of locking primitives).

  • Reviewers shall be clear about what changes they are requesting when the
    "Request Changes" option is used. Requested changes shall be in the scope of
    the PR in question and following the contribution and style guidelines of the
    project. Furthermore, reviewers must be able to point back to the exact issues
    in the PR that triggered a request for changes.

  • Reviewers should not request changes for issues which are automatically
    caught by CI, as this causes the pull request to remain blocked even after CI
    failures have been addressed and may unnecessarily delay it from being merged.

  • Reviewers shall not close a PR due to technical or structural disagreement.
    If requested changes cannot be resolved within the review process, the
    :ref:pr_technical_escalation path shall be used for any potential resolution
    path, which may include closing the PR.

  • When using AI tools to assist in reviewing code or drafting responses:

    • Reviewers are responsible for following up on comments generated by the AI
      tools they may be using (e.g. GitHub Copilot).
    • Reviewers must never paste raw, unverified LLM output as a PR comment.
    • In general: all AI-generated feedback must be vetted, verified, and
      contextualized by a human reviewer who assumes full accountability for the
      accuracy and tone of the comment or review.

.. _Code of Conduct: https://github.com/zephyrproject-rtos/zephyr/blob/main/CODE_OF_CONDUCT.md

.. _Zephyr Release Plan: https://github.com/orgs/zephyrproject-rtos/projects/13


Doc Develop Beyond GSG (`doc/develop/beyond-GSG.rst`)

.. _beyond-gsg:

Beyond the Getting Started Guide
################################

The :ref:getting_started gives a straight-forward path to set up
your Linux, macOS, or Windows environment for Zephyr development. In
this document, we delve deeper into Zephyr development setup
issues and alternatives.

.. _python-pip:

Python and pip


Python 3 and its package manager, pip\ [#pip]_, are used extensively by Zephyr
to install and run scripts required to compile and run Zephyr
applications, set up and maintain the Zephyr development environment,
and build project documentation.

Depending on your operating system, you may need to provide the
--user flag to the pip3 command when installing new packages. This is
documented throughout the instructions.
See Installing Packages_ in the Python Packaging User Guide for more
information about pip\ [#pip], including information on -\\-user.

  • On Linux, make sure ~/.local/bin is at the front of your :envvar:PATH
    :ref:environment variable <env_vars>, or programs installed with --user
    won't be found. Installing with --user avoids conflicts between pip
    and the system package manager, and is the default on Debian-based
    distributions.

  • On macOS, Homebrew disables -\\-user_.

  • On Windows, see the Installing Packages_ information on --user if you
    require using this option.

On all operating systems, pip's -U flag installs or updates the package if the
package is already installed locally but a more recent version is available. It
is good practice to use this flag if the latest version of a package is
required. (Check the :zephyr_file:scripts/requirements.txt file to
see if a specific Python package version is expected.)

Advanced Platform Setup


Here are some alternative instructions for more advanced platform setup
configurations for supported development platforms:

.. toctree::
:maxdepth: 1

Linux setup alternatives <getting_started/installation_linux.rst>
macOS setup alternatives <getting_started/installation_mac.rst>
Windows setup alternatives <getting_started/installation_win.rst>

.. _gs_toolchain:

Install a Toolchain


Zephyr binaries are compiled and linked by a toolchain comprised of
a cross-compiler and related tools which are different from the compiler
and tools used for developing software that runs natively on your host
operating system.

You can install the :ref:Zephyr SDK <toolchain_zephyr_sdk> to get toolchains for all
supported architectures, or install an :ref:alternate toolchain <toolchains>
recommended by the SoC vendor or a specific board (check your specific
:ref:board-level documentation ).

You can configure the Zephyr build system to use a specific toolchain by
setting :ref:environment variables <env_vars> such as
:envvar:ZEPHYR_TOOLCHAIN_VARIANT <{TOOLCHAIN}_TOOLCHAIN_PATH> to a supported
value, along with additional variable(s) specific to the toolchain variant.

.. _gs_toolchain_update:

Updating the Zephyr SDK toolchain


When updating Zephyr SDK, check whether the :envvar:ZEPHYR_TOOLCHAIN_VARIANT
or :envvar:ZEPHYR_SDK_INSTALL_DIR environment variables are already set.

  • If the variables are not set, the latest compatible version of Zephyr SDK will be selected
    by default. Proceed to next step without making any changes.

  • If :envvar:ZEPHYR_TOOLCHAIN_VARIANT is set, the corresponding toolchain will be selected
    at build time. Zephyr SDK is identified by the value zephyr.
    If the :envvar:ZEPHYR_TOOLCHAIN_VARIANT environment variable is not zephyr, then either
    unset it or change its value to zephyr to make sure Zephyr SDK is selected.

  • If the :envvar:ZEPHYR_SDK_INSTALL_DIR environment variable is set, it will override
    the default lookup location for Zephyr SDK. If you install Zephyr SDK to one
    of the :ref:recommended locations <toolchain_zephyr_sdk_bundle_variables>,
    you can unset this variable. Otherwise, set it to your chosen install location.

For more information about these environment variables in Zephyr, see :ref:env_vars_important.

Cloning the Zephyr Repositories


The Zephyr project source is maintained in the GitHub zephyr repo <https://github.com/zephyrproject-rtos/zephyr>. External modules used
by Zephyr are found in the parent GitHub Zephyr project <https://github.com/zephyrproject-rtos/>
. Because of these
dependencies, it's convenient to use the Zephyr-created :ref:west <west> tool to fetch and manage the Zephyr and external module source
code. See :ref:west-basics for more details.

Once your development tools are installed, use :ref:west to create,
initialize, and download sources from the zephyr and external module
repos. We'll use the name zephyrproject, but you can choose any
name that does not contain a space anywhere in the path.

.. code-block:: console

west init zephyrproject
cd zephyrproject
west update

The west update command fetches and keeps :ref:modules in the
:file:zephyrproject folder in sync with the code in the local zephyr
repo.

.. warning::

You must run west update any time the :file:zephyr/west.yml
changes, caused, for example, when you pull the :file:zephyr
repository, switch branches in it, or perform a git bisect inside of
it.

Keeping Zephyr updated

To update the Zephyr project source code, you need to get the latest
changes via git. Afterwards, run west update as mentioned in
the previous paragraph.
Additionally, check for updated or added Python dependencies.

.. tabs::

.. group-tab:: Linux/macOS

text
.. code-block:: console

     # replace zephyrproject with the path you gave west init
     cd zephyrproject/zephyr
     git pull
     west update
     west packages pip --install

.. group-tab:: Windows

text
.. tabs::

     .. code-tab:: bat

        :: replace zephyrproject with the path you gave west init
        cd zephyrproject\zephyr
        git pull
        west update
        cmd /c scripts\utils\west-packages-pip-install.cmd

     .. code-tab:: powershell

        # replace zephyrproject with the path you gave west init
        cd zephyrproject\zephyr
        git pull
        west update
        python -m pip install @((west packages pip) -split ' ')

Export Zephyr CMake package


The :ref:cmake_pkg can be exported to CMake's user package registry if it has
not already been done as part of :ref:getting_started.

.. _gs-board-aliases:

Board Aliases


Developers who work with multiple boards may find explicit board names
cumbersome and want to use aliases for common targets. This is
supported by a CMake file with content like this:

.. code-block:: cmake

Variable foo_BOARD_ALIAS=bar replaces BOARD=foo with BOARD=bar and

sets BOARD_ALIAS=foo in the CMake cache.

set(pca10028_BOARD_ALIAS nrf51dk/nrf51822)
set(pca10056_BOARD_ALIAS nrf52840dk/nrf52840)
set(k64f_BOARD_ALIAS frdm_k64f)
set(sltb004a_BOARD_ALIAS efr32mg_sltb004a)

and specifying its location in :envvar:ZEPHYR_BOARD_ALIASES. This
enables use of aliases pca10028 in contexts like
cmake -DBOARD=pca10028 and west -b pca10028.

Build and Run an Application


You can build, flash, and run Zephyr applications on real
hardware using a supported host system. Depending on your operating system,
you can also run it in emulation with QEMU, or as a native application with
:zephyr:board:native_sim <native_sim>.
Additional information about building applications can be found in the
:ref:build_an_application section.

Build Blinky

Let's build the :zephyr:code-sample:blinky sample application.

Zephyr applications are built to run on specific hardware, called a
"board"\ [#board_misnomer]_. We'll use the Phytec
:zephyr:board:reel_board<reel_board> here, but you can change the
reel_board build target to another value if you have a different
board. See :ref:boards or run west boards from anywhere inside
the zephyrproject directory for a list of supported boards.

#. Go to the zephyr repository:

.. code-block:: console

text
cd zephyrproject/zephyr

#. Build the blinky sample for the reel_board:

.. zephyr-app-commands::
:zephyr-app: samples/basic/blinky
:board: reel_board
:goals: build

The main build products will be in :file:build/zephyr;
:file:build/zephyr/zephyr.elf is the blinky application binary in ELF
format. Other binary formats, disassembly, and map files may be present
depending on your board.

The other sample applications in the :zephyr_file:samples folder are
documented in :zephyr:code-sample-category:samples.

.. note:: If you want to reuse an
existing build directory for another board or application, you need to
add the parameter -p=auto to west build to clean out settings
and artifacts from the previous build.

Run the Application by Flashing to a Board

Most hardware boards supported by Zephyr can be flashed by running
west flash. This may require board-specific tool installation and
configuration to work properly.

See :ref:application_run and your specific board's documentation in
:ref:boards for additional details.

.. _setting-udev-rules:

Setting udev rules

Flashing a board requires permission to directly access the board
hardware, usually managed by installation of the flashing tools. On
Linux systems, if the west flash command fails, you likely need to
define udev rules to grant the needed access permission.

Udev is a device manager for the Linux kernel and the udev daemon
handles all user space events raised when a hardware device is added (or
removed) from the system. We can add a rules file to grant access
permission by non-root users to certain USB-connected devices.

The OpenOCD (On-Chip Debugger) project conveniently provides a rules
file that defined board-specific rules for most Zephyr-supported
arm-based boards, so we recommend installing this rules
file by downloading it from their sourceforge repo, or if you've
installed the Zephyr SDK there is a copy of this rules file in the SDK
folder:

  • Either download the OpenOCD rules file and copy it to the right
    location::

    wget -O 60-openocd.rules https://sf.net/p/openocd/code/ci/master/tree/contrib/60-openocd.rules?format=raw
    sudo cp 60-openocd.rules /etc/udev/rules.d

  • or copy the rules file from the Zephyr SDK folder::

    sudo cp ${ZEPHYR_SDK_INSTALL_DIR}/sysroots/x86_64-pokysdk-linux/usr/share/openocd/contrib/60-openocd.rules /etc/udev/rules.d

Then, in either case, ask the udev daemon to reload these rules::

sudo udevadm control --reload

Unplug and plug in the USB connection to your board, and you should have
permission to access the board hardware for flashing. Check your
board-specific documentation (:ref:boards) for further information if
needed.

Run the Application in QEMU

You can run Zephyr applications via emulation on your host system using
QEMU <https://www.qemu.org/>_ when targeting either the x86 or ARM
Cortex-M3 architectures. QEMU is included with the Zephyr SDK.

If using a manual QEMU installation, ensure it is available in the system
PATH environment variable.

QEMU_BIN_PATH can be used as an optional override to specify the
location of QEMU binaries used by Twister. When provided, Twister
validates that the specified path exists. Otherwise, Twister relies on
SDK or other QEMU discovery mechanisms.

For example, you can build and run the :zephyr:code-sample:hello_world sample using
the x86 emulation board configuration (qemu_x86), with:

.. zephyr-app-commands::
:zephyr-app: samples/hello_world
:host-os: unix
:board: qemu_x86
:goals: build run

To exit QEMU, type :kbd:Ctrl-a, then :kbd:x.

Use qemu_cortex_m3 to target an emulated Arm Cortex-M3 sample.

.. _gs_native:

Run a Sample Application natively (Linux)

You can compile some samples to run as host programs
on Linux. See :zephyr:board:native_sim for more information. On 64-bit host operating systems, you
need to install a 32-bit C library, or build targeting :ref:native_sim/native/64<native_sim32_64>.

First, build Hello World for native_sim.

.. zephyr-app-commands::
:zephyr-app: samples/hello_world
:host-os: unix
:board: native_sim
:goals: build

Next, run the application.

.. code-block:: console

west build -t run

or just run zephyr.exe directly:

./build/zephyr/zephyr.exe

Press :kbd:Ctrl-C to exit.

You can run ./build/zephyr/zephyr.exe --help to get a list of available
options.

This executable can be instrumented using standard tools, such as gdb or
valgrind.

.. rubric:: Footnotes

.. [#pip]

pip is Python's package installer. Its install command first tries to
reuse packages and package dependencies already installed on your computer.
If that is not possible, pip install downloads them from the Python
Package Index (PyPI) on the Internet.

The package versions requested by Zephyr's :file:requirements.txt may
conflict with other requirements on your system, in which case you may
want to set up a virtualenv for Zephyr development.

.. [#board_misnomer]

This has become something of a misnomer over time. While the target can be,
and often is, a microprocessor running on its own dedicated hardware
board, Zephyr also supports using QEMU to run targets built for other
architectures in emulation, targets which produce native host system
binaries that implement Zephyr's driver interfaces with POSIX APIs, and even
running different Zephyr-based binaries on CPU cores of differing
architectures on the same physical chip. Each of these hardware
configurations is called a "board," even though that doesn't always make
perfect sense in context.

.. _information on -\-user:
https://packaging.python.org/tutorials/installing-packages/#installing-to-the-user-site
.. _Homebrew disables -\-user:
https://docs.brew.sh/Homebrew-and-Python#note-on-pip-install---user
.. _Installing Packages:
https://packaging.python.org/tutorials/installing-packages/


Doc Develop Env Vars (`doc/develop/env_vars.rst`)

.. _env_vars:

Environment Variables

Various pages in this documentation refer to setting Zephyr-specific
environment variables. This page describes how.

Setting Variables


Option 1: Just Once

To set the environment variable MY_VARIABLE to foo for the
lifetime of your current terminal window:

.. tabs::

.. group-tab:: Linux/macOS

text
.. code-block:: console

     export MY_VARIABLE=foo

.. group-tab:: Windows

text
.. code-block:: console

     set MY_VARIABLE=foo

.. warning::

This is best for experimentation. If you close your terminal window, use
another terminal window or tab, restart your computer, etc., this setting
will be lost forever.

Using options 2 or 3 is recommended if you want to keep using the setting.

Option 2: In all Terminals

.. tabs::

.. group-tab:: Linux/macOS

text
Add the ``export MY_VARIABLE=foo`` line to your shell's startup script in
  your home directory. For Bash, this is usually :file:`~/.bashrc` on Linux
  or :file:`~/.bash_profile` on macOS.  Changes in these startup scripts
  don't affect shell instances already started; try opening a new terminal
  window to get the new settings.

.. group-tab:: Windows

text
You can use the ``setx`` program in ``cmd.exe`` or the third-party RapidEE
  program.

  To use ``setx``, type this command, then close the terminal window. Any
  new ``cmd.exe`` windows will have ``MY_VARIABLE`` set to ``foo``.

  .. code-block:: console

     setx MY_VARIABLE foo

  To install RapidEE, a freeware graphical environment variable editor,
  `using Chocolatey`_ in an Administrator command prompt:

  .. code-block:: console

     choco install rapidee

  You can then run ``rapidee`` from your terminal to launch the program and set
  environment variables. Make sure to use the "User" environment variables area
  -- otherwise, you have to run RapidEE as administrator. Also make sure to save
  your changes by clicking the Save button at top left before exiting. Settings
  you make in RapidEE will be available whenever you open a new terminal window.

.. _env_vars_zephyrrc:

Option 3: Using ``zephyrrc`` files

Choose this option if you don't want to make the variable's setting available
to all of your terminals, but still want to save the value for loading into
your environment when you are using Zephyr.

.. tabs::

.. group-tab:: Linux/macOS

text
Zephyr supports multiple locations for your :file:`zephyrrc` file,
  following the XDG Base Directory Specification when possible. Create a
  zephyrrc file in one of the following locations (they will be checked in
  order):

  #. :file:`$XDG_CONFIG_HOME/zephyr/zephyrrc`
  #. :file:`$HOME/.config/zephyr/zephyrrc`
  #. :file:`$HOME/.zephyrrc`

  Add this line to the file in your preferred location:

  .. code-block:: console

     export MY_VARIABLE=foo

  To get this value back into your current terminal environment, **you must
  run** ``source zephyr-env.sh`` from the main ``zephyr`` repository. Among
  other things, this script sources your :file:`zephyrrc` (the first one it
  finds from the list of locations above).

  The value will be lost if you close the window, etc.; run ``source
  zephyr-env.sh`` again to get it back.

.. group-tab:: Windows

text
Add the line ``set MY_VARIABLE=foo`` to the file
  :file:`%userprofile%\\zephyrrc.cmd` using a text editor such as Notepad to
  save the value.

  To get this value back into your current terminal environment, **you must
  run** ``zephyr-env.cmd`` in a ``cmd.exe`` window after changing directory
  to the main ``zephyr`` repository.  Among other things, this script runs
  :file:`%userprofile%\\zephyrrc.cmd`.

  The value will be lost if you close the window, etc.; run
  ``zephyr-env.cmd`` again to get it back.

  These scripts:

  - set :envvar:`ZEPHYR_BASE` to the location of the zephyr repository
  - adds some Zephyr-specific locations (such as zephyr's :file:`scripts`
    directory) to your :envvar:`PATH` environment variable
  - loads any settings from the ``zephyrrc`` files described above in
    :ref:`env_vars_zephyrrc`.

  You can thus use them any time you need any of these settings.

.. _zephyr-env:

Zephyr Environment Scripts


You can use the zephyr repository scripts zephyr-env.sh (for macOS and
Linux) and zephyr-env.cmd (for Windows) to load Zephyr-specific settings
into your current terminal's environment. To do so, run this command from the
zephyr repository:

.. tabs::

.. group-tab:: Linux/macOS

text
.. code-block:: console

     source zephyr-env.sh

.. group-tab:: Windows

text
.. code-block:: console

     zephyr-env.cmd

These scripts:

  • set :envvar:ZEPHYR_BASE to the location of the zephyr repository
  • adds some Zephyr-specific locations (such as zephyr's :file:scripts
    directory) to your PATH environment variable
  • loads any settings from the zephyrrc files described above in
    :ref:env_vars_zephyrrc.

You can thus use them any time you need any of these settings.

.. _env_vars_important:

Important Environment Variables


Some :ref:important-build-vars can also be set in the environment. Here
is a description of some of these important environment variables. This is not
a comprehensive list.

.. envvar:: BOARD

See :ref:important-build-vars.

.. envvar:: CONF_FILE

See :ref:important-build-vars.

.. envvar:: SHIELD

See :ref:shields.

.. envvar:: ZEPHYR_BASE

See :ref:important-build-vars.

.. envvar:: EXTRA_ZEPHYR_MODULES

See :ref:important-build-vars.

.. envvar:: ZEPHYR_MODULES

See :ref:important-build-vars.

.. envvar:: ZEPHYR_BOARD_ALIASES

See :ref:gs-board-aliases

The following additional environment variables are significant when configuring
the :ref:toolchain <gs_toolchain> used to build Zephyr applications.

.. envvar:: ZEPHYR_SDK_INSTALL_DIR

Path where Zephyr SDK is installed.

.. envvar:: ZEPHYR_TOOLCHAIN_VARIANT

The name of the toolchain to use.

.. envvar:: {TOOLCHAIN}_TOOLCHAIN_PATH

Path to the toolchain specified by :envvar:ZEPHYR_TOOLCHAIN_VARIANT. For
example, if ZEPHYR_TOOLCHAIN_VARIANT=host/llvm, use
LLVM_TOOLCHAIN_PATH. (Note the capitalization when forming the
environment variable name.)

You might need to update some of these variables when you
:ref:update the Zephyr SDK toolchain <gs_toolchain_update>.

Emulators and boards may also depend on additional programs. The build system
will try to locate those programs automatically, but may rely on additional
CMake or environment variables to do so. Please consult your emulator's or
board's documentation for more information. The following environment variables
may be useful in such situations:

.. envvar:: PATH

PATH is an environment variable used on Unix-like or Microsoft Windows
operating systems to specify a set of directories where executable programs
are located.

.. _using Chocolatey: https://chocolatey.org/packages/RapidEE


Doc Develop Index (`doc/develop/index.rst`)

.. _developing_with_zephyr:

Developing with Zephyr
######################

.. toctree::
:maxdepth: 1

getting_started/index.rst
beyond-GSG.rst
env_vars.rst
application/index.rst
debug/index.rst
api/index.rst
languages/index.rst
optimizations/index
flash_debug/index
modules.rst
west/index
twister/index
test/index
sca/index
toolchains/index
tools/index


Doc Develop Modules (`doc/develop/modules.rst`)

.. _modules:

Modules (External projects)
############################

Zephyr relies on the source code of several externally maintained projects in
order to avoid reinventing the wheel and to reuse as much well-established,
mature code as possible when it makes sense. In the context of Zephyr's build
system those are called modules. These modules must be integrated with the
Zephyr build system, as described in more detail in other sections on
this page.

To be classified as a candidate for being included in the default list of
modules, an external project is required to have its own life-cycle outside
the Zephyr Project, that is, reside in its own repository, and have its own
contribution and maintenance workflow and release process. Zephyr modules
should not contain code that is written exclusively for Zephyr. Instead,
such code should be contributed to the main zephyr tree.

Modules to be included in the default manifest of the Zephyr project need to
provide functionality or features endorsed and approved by the project Technical
Steering Committee and should comply with the
:ref:module licensing requirements<modules_licensing> and
:ref:contribution guidelines<modules_contributing>. They should also have a
Zephyr developer that is committed to maintain the module codebase.

Zephyr depends on several categories of modules, including but not limited to:

  • Debugger integration
  • Silicon vendor Hardware Abstraction Layers (HALs)
  • Cryptography libraries
  • File Systems
  • Inter-Process Communication (IPC) libraries

Additionally, in some cases modules (particularly vendor HALs) can contain
references to optional :ref:binary blobs .

This page summarizes a list of policies and best practices which aim at
better organizing the workflow in Zephyr modules.

.. _modules-vs-projects:

Modules vs west projects


Zephyr modules, described in this page, are not the same as :ref:west projects <west-workspace>. In fact, modules :ref:do not require west <modules_without_west> at all. However, when using modules :ref:with west <modules_using_west>, then the build system uses west in order to find modules.

In summary:

Modules are repositories that contain a :file:zephyr/module.yml file, so that
the Zephyr build system can pull in the source code from the repository.
:ref:West projects <west-manifests-projects> are entries in the projects:
section in the :file:west.yml manifest file.
West projects are often also modules, but not always. There are west projects
that are not included in the final firmware image (eg. tools) and thus do not
need to be modules.
Modules are found by the Zephyr build system either via :ref:west itself <modules_using_west>, or via the :ref:ZEPHYR_MODULES CMake variable <modules_without_west>.

The contents of this page only apply to modules, and not to west projects in
general (unless they are a module themselves).

Module Repositories


  • All modules included in the default manifest shall be hosted in repositories
    under the zephyrproject-rtos GitHub organization.

  • The module repository codebase shall include a module.yml file in a
    :file:zephyr/ folder at the root of the repository.

  • Module repository names should follow the convention of using lowercase
    letters and dashes instead of underscores. This rule will apply to all
    new module repositories, except for repositories that are directly
    tracking external projects (hosted in Git repositories); such modules
    may be named as their external project counterparts.

    .. note::

    Existing module repositories that do not conform to the above convention
    do not need to be renamed to comply with the above convention.

  • Module repositories names should be explicitly set in the :file:zephyr/module.yml file.

  • Modules should use "zephyr" as the default name for the repository main
    branch. Branches for specific purposes, for example, a module branch for
    an LTS Zephyr version, shall have names starting with the 'zephyr_' prefix.

  • If the module has an external (upstream) project repository, the module
    repository should preserve the upstream repository folder structure.

    .. note::

    It is not required in module repositories to maintain a 'master'
    branch mirroring the master branch of the external repository. It
    is not recommended as this may generate confusion around the module's
    main branch, which should be 'zephyr'.

  • Modules should expose all provided header files with an include pathname
    beginning with the module-name. (E.g., mcuboot should expose its
    bootutil/bootutil.h as "mcuboot/bootutil/bootutil.h".)

.. _modules_synchronization:

Synchronizing with upstream

It is preferred to synchronize a module repository with the latest stable
release of the corresponding external project. It is permitted, however, to
update a Zephyr module repository with the latest development branch tip,
if this is required to get important updates in the module codebase. When
synchronizing a module with upstream it is mandatory to document the
rationale for performing the particular update.

Requirements for allowed practices

Changes to the main branch of a module repository, including synchronization
with upstream code base, may only be applied via pull requests. These pull
requests shall be verifiable by Zephyr CI and mergeable (e.g. with the
Rebase and merge, or Create a merge commit option using Github UI). This
ensures that the incoming changes are always reviewable, and the
downstream module repository history is incremental (that is, existing
commits, tags, etc. are always preserved). This policy also allows to run
Zephyr CI, git lint, identity, and license checks directly on the set of
changes that are to be brought into the module repository.

.. note::

text
Force-pushing to a module's main branch is not allowed.

Allowed practices

The following practices conform to the above requirements and should be
followed in all modules repositories. It is up to the module code owner
to select the preferred synchronization practice, however, it is required
that the selected practice is consistently followed in the respective
module repository.

Updating modules with a diff from upstream:
Upstream changes brought as a single snapshot commit (manual diff) in a
pull request against the module's main branch, which may be merged using
the Rebase & merge operation. This approach is simple and
should be applicable to all modules with the downside of suppressing the
upstream history in the module repository.

.. note::

text
The above practice is the only allowed practice in modules where
 the external project is not hosted in an upstream Git repository.

The commit message is expected to identify the upstream project URL, the
version to which the module is updated (upstream version, tag, commit SHA,
if applicable, etc.), and the reason for the doing the update.

Updating modules by merging the upstream branch:
Upstream changes brought in by performing a Git merge of the intended upstream
branch (e.g. main branch, latest release branch, etc.) submitting the result in
pull request against the module main branch, and merging the pull request using
the Create a merge commit operation.
This approach is applicable to modules with an upstream project Git repository.
The main advantages of this approach is that the upstream repository history
(that is, the original commit SHAs) is preserved in the module repository. The
downside of this approach is that two additional merge commits are generated in
the downstream main branch.

Contributing to Zephyr modules


.. _modules_contributing:

Individual Roles & Responsibilities

To facilitate management of Zephyr module repositories, the following
individual roles are defined.

Administrator: Each Zephyr module shall have an administrator
who is responsible for managing access to the module repository,
for example, for adding individuals as Collaborators in the repository
at the request of the module owner. Module administrators are
members of the Administrators team, that is a group of project
members with admin rights to module GitHub repositories.

Module owner: Each module shall have a module code owner. Module
owners will have the overall responsibility of the contents of a
Zephyr module repository. In particular, a module owner will:

  • coordinate code reviewing in the module repository

  • be the default assignee in pull-requests against the repository's
    main branch

  • request additional collaborators to be added to the repository, as
    they see fit

  • regularly synchronize the module repository with its upstream
    counterpart following the policies described in
    :ref:modules_synchronization

  • be aware of security vulnerability issues in the external project
    and update the module repository to include security fixes, as
    soon as the fixes are available in the upstream code base

  • list any known security vulnerability issues, present in the
    module codebase, in Zephyr release notes.

    .. note::

    Module owners are not required to be Zephyr
    :ref:Maintainers .

Merger: The Zephyr Release Engineering team has the right and the
responsibility to merge approved pull requests in the main branch of a
module repository.

Maintaining the module codebase

Updates in the zephyr main tree, for example, in public Zephyr APIs,
may require patching a module's codebase. The responsibility for keeping
the module codebase up to date is shared between the contributor of
such updates in Zephyr and the module owner. In particular:

  • the contributor of the original changes in Zephyr is required to submit
    the corresponding changes that are required in module repositories, to
    ensure that Zephyr CI on the pull request with the original changes, as
    well as the module integration testing are successful.

  • the module owner has the overall responsibility for synchronizing
    and testing the module codebase with the zephyr main tree.
    This includes occasional advanced testing of the module's codebase
    in addition to the testing performed by Zephyr's CI.
    The module owner is required to fix issues in the module's codebase that
    have not been caught by Zephyr pull request CI runs.

.. _modules_changes:

Contributing changes to modules

Submitting and merging changes directly to a module's codebase, that is,
before they have been merged in the corresponding external project
repository, should be limited to:

  • changes required due to updates in the zephyr main tree
  • urgent changes that should not wait to be merged in the external project
    first, such as fixes to security vulnerabilities.

Non-trivial changes to a module's codebase, including changes in the module
design or functionality should be discouraged, if the module has an upstream
project repository. In that case, such changes shall be submitted to the
upstream project, directly.

:ref:Submitting changes to modules <submitting_new_modules> describes in
detail the process of contributing changes to module repositories.

Contribution guidelines

Contributing to Zephyr modules shall follow the generic project
:ref:Contribution guidelines <contribute_guidelines>.

Pull Requests: may be merged with minimum of 2 approvals, including
an approval by the PR assignee. In addition to this, pull requests in module
repositories may only be merged if the introduced changes are verified
with Zephyr CI tools, as described in more detail in other sections on
this page.

The merging of pull requests in the main branch of a module
repository must be coupled with the corresponding manifest
file update in the zephyr main tree.

Issue Reporting: GitHub issues_ are intentionally disabled in module
repositories, in
favor of a centralized policy for issue reporting. Tickets concerning, for
example, bugs or enhancements in modules shall be opened in the main
zephyr repository. Issues should be appropriately labeled using GitHub
labels corresponding to each module, where applicable.

.. note::

text
It is allowed to file bug reports for zephyr modules to track
 the corresponding upstream project bugs in Zephyr. These bug reports
 shall not affect the
 :ref:`Release Quality Criteria<release_quality_criteria>`.

.. _modules_licensing:

Licensing requirements and policies


All source files in a module's codebase shall include a license header,
unless the module repository has main license file that covers source
files that do not include license headers.

Main license files shall be added in the module's codebase by Zephyr
developers, only if they exist as part of the external project,
and they contain a permissive OSI-compliant license. Main license files
should preferably contain the full license text instead of including an
SPDX license identifier. If multiple main license files are present it
shall be made clear which license applies to each source file in a module's
codebase.

Individual license headers in module source files supersede the main license.

Any new content to be added in a module repository will require to have
license coverage.

.. note::

text
Zephyr recommends conveying module licensing via individual license
 headers and main license files. This not a hard requirement; should
 an external project have its own practice of conveying how licensing
 applies in the module's codebase (for example, by having a single or
 multiple main license files), this practice may be accepted by and
 be referred to in the Zephyr module, as long as licensing requirements,
 for example OSI compliance, are satisfied.

License policies

When creating a module repository a developer shall:

  • import the main license files, if they exist in the external project, and
  • document (for example in the module README or .yml file) the default license
    that covers the module's codebase.

License checks

License checks (via CI tools) shall be enabled on every pull request that
adds new content in module repositories.

Documentation requirements


All Zephyr module repositories shall include an .rst file documenting:

  • the scope and the purpose of the module
  • how the module integrates with Zephyr
  • the owner of the module repository
  • synchronization information with the external project (commit, SHA, version etc.)
  • licensing information as described in :ref:modules_licensing.

The file shall be required for the inclusion of the module and the contained
information should be kept up to date.

Testing requirements


All Zephyr modules should provide some level of integration testing,
ensuring that the integration with Zephyr works correctly.
Integration tests:

  • may be in the form of a minimal set of samples and tests that reside
    in the zephyr main tree

  • should verify basic usage of the module (configuration,
    functional APIs, etc.) that is integrated with Zephyr.

  • shall be built and executed (for example in QEMU) as part of
    twister runs in pull requests that introduce changes in module
    repositories.

    .. note::

    New modules, that are candidates for being included in the Zephyr
    default manifest, shall provide some level of integration testing.

    .. note::

    Vendor HALs are implicitly tested via Zephyr tests built or executed
    on target platforms, so they do not need to provide integration tests.

The purpose of integration testing is not to provide functional verification
of the module; this should be part of the testing framework of the external
project.

Certain external projects provide test suites that reside in the upstream
testing infrastructure but are written explicitly for Zephyr. These tests
may (but are not required to) be part of the Zephyr test framework.

Deprecating and removing modules


Modules may be deprecated for reasons including, but not limited to:

  • Lack of maintainership in the module
  • Licensing changes in the external project
  • Codebase becoming obsolete

The module information shall indicate whether a module is
deprecated and the build system shall issue a warning
when trying to build Zephyr using a deprecated module.

Deprecated modules may be removed from the Zephyr default manifest
after 2 Zephyr releases.

.. note::

text
Repositories of removed modules shall remain accessible via their
 original URL, as they are required by older Zephyr versions.

Integrate modules in Zephyr build system


The build system variable :makevar:ZEPHYR_MODULES is a CMake list_ of
absolute paths to the directories containing Zephyr modules. These modules
contain :file:CMakeLists.txt and :file:Kconfig files describing how to
build and configure them, respectively. Module :file:CMakeLists.txt files are
added to the build using CMake's add_subdirectory()_ command, and the
:file:Kconfig files are included in the build's Kconfig menu tree.

If you have :ref:west <west> installed, you don't need to worry about how
this variable is defined unless you are adding a new module. The build system
knows how to use west to set :makevar:ZEPHYR_MODULES. You can add additional
modules to this list by setting the :makevar:EXTRA_ZEPHYR_MODULES CMake
variable or by adding a :makevar:EXTRA_ZEPHYR_MODULES line to .zephyrrc
(See the section on :ref:env_vars for more details). This can be useful if you
want to keep the list of modules found with west and also add your own. If
:makevar:EXTRA_ZEPHYR_MODULES is set in multiple places, for example both as
an environment variable and as a CMake variable, the final list of additional
modules will be the merged result of all sources.

.. note::
If the module FOO is provided by :ref:west <west> but also given with
-DEXTRA_ZEPHYR_MODULES=//foo then the module given by the command
line variable :makevar:EXTRA_ZEPHYR_MODULES will take precedence.
This allows you to use a custom version of FOO when building and still
use other Zephyr modules provided by :ref:west <west>.
This can for example be useful for special test purposes.

If you want to permanently add modules to the zephyr workspace and you are
using zephyr as your manifest repository, you can also add a west manifest file
into the :zephyr_file:submanifests directory. See
:zephyr_file:submanifests/README.txt for more details.

See :ref:west-basics for more on west workspaces.

Finally, you can also specify the list of modules yourself in various ways, or
not use modules at all if your application doesn't need them.

.. _module-yml:

Module yaml file description


A module can be described using a file named :file:zephyr/module.yml.
The format of :file:zephyr/module.yml is described in the following:

Module name

Each Zephyr module is given a name by which it can be referred to in the build
system.

The name should be specified in the :file:zephyr/module.yml file. This will
ensure the module name is not changeable through user-defined directory names
or west manifest files:

.. code-block:: yaml

name:

In CMake the location of the Zephyr module can then be referred to using the
CMake variable ZEPHYR_<MODULE_NAME>_MODULE_DIR and the variable
ZEPHYR_<MODULE_NAME>_CMAKE_DIR holds the location of the directory
containing the module's :file:CMakeLists.txt file.

.. note::
When used for CMake and Kconfig variables, all letters in module names are
converted to uppercase and all non-alphanumeric characters are converted
to underscores (_).
As example, the module foo-bar must be referred to as
ZEPHYR_FOO_BAR_MODULE_DIR in CMake and Kconfig.

Here is an example for the Zephyr module foo:

.. code-block:: yaml

name: foo

.. note::
If the name field is not specified then the Zephyr module name will be
set to the name of the module folder.
As example, the Zephyr module located in :file:<workspace>/modules/bar will
use bar as its module name if nothing is specified in
:file:zephyr/module.yml.

Module integration files (in-module)

Inclusion of build files, :file:CMakeLists.txt and :file:Kconfig, can be
described as:

.. code-block:: yaml

build:
cmake:
kconfig: /Kconfig

The cmake: <cmake-directory> part specifies that
:file:<cmake-directory> contains the :file:CMakeLists.txt to use. The
kconfig: <directory>/Kconfig part specifies the Kconfig file to use.
Neither is required: cmake defaults to zephyr, and kconfig
defaults to zephyr/Kconfig.

Here is an example :file:module.yml file referring to
:file:CMakeLists.txt and :file:Kconfig files in the root directory of the
module:

.. code-block:: yaml

build:
cmake: .
kconfig: Kconfig

.. _sysbuild_module_integration:

Sysbuild integration

:ref:Sysbuild<sysbuild> is the Zephyr build system that allows for building
multiple images as part of a single application, the sysbuild build process
can be extended externally with modules as needed, for example to add custom
build steps or add additional targets to a build. Inclusion of
sysbuild-specific build files, :file:CMakeLists.txt and :file:Kconfig, can
be described as:

.. code-block:: yaml

build:
sysbuild-cmake:
sysbuild-kconfig: /Kconfig

The sysbuild-cmake: <cmake-directory> part specifies that
:file:<cmake-directory> contains the :file:CMakeLists.txt to use. The
sysbuild-kconfig: <directory>/Kconfig part specifies the Kconfig file to
use.

Here is an example :file:module.yml file referring to
:file:CMakeLists.txt and :file:Kconfig files in the sysbuild directory of
the module:

.. code-block:: yaml

build:
sysbuild-cmake: sysbuild
sysbuild-kconfig: sysbuild/Kconfig

The module description file :file:zephyr/module.yml can also be used to
specify that the build files, :file:CMakeLists.txt and :file:Kconfig, are
located in a :ref:modules_module_ext_root.

Build files located in a MODULE_EXT_ROOT can be described as:

.. code-block:: yaml

build:
sysbuild-cmake-ext: True
sysbuild-kconfig-ext: True

This allows control of the build inclusion to be described externally to the
Zephyr module.

.. _modules-vulnerability-monitoring:

Vulnerability monitoring

The module description file :file:zephyr/module.yml can be used to improve vulnerability monitoring.

If your module needs to track vulnerabilities using an external reference
(e.g your module is forked from another repository), you can use the security section.
It contains the field external-references that contains a list of references that needs to
be monitored for your module. The supported formats are:

  • CPE (Common Platform Enumeration)
  • PURL (Package URL)

.. code-block:: yaml

security:
external-references:
-
-
-

A real life example for Mbed TLS module could look like this:

.. code-block:: yaml

security:
external-references:
- cpe:2.3:a:arm:mbed_tls:3.5.2:::::::*
- pkg:github/Mbed-TLS/[email protected]

.. note::
CPE field must follow the CPE 2.3 schema provided by NVD <https://csrc.nist.gov/projects/security-content-automation-protocol/specifications/cpe>.
PURL field must follow the PURL specification provided by Github <https://github.com/package-url/purl-spec/blob/master/PURL-SPECIFICATION.rst>
.

Build system integration

When a module has a :file:module.yml file, it will automatically be included into
the Zephyr build system. The path to the module is then accessible through Kconfig
and CMake variables.

Zephyr modules

In both Kconfig and CMake, the variable ZEPHYR_<MODULE_NAME>_MODULE_DIR
contains the absolute path to the module.

Additionally, ZEPHYR_<MODULE_NAME>_MODULE and ZEPHYR_<MODULE_NAME>_MODULE_BLOBS
(in case the module declares blobs) symbols are automatically generated for available
modules. These can be used e.g. to declare dependencies from other Kconfig symbols
which depend on the module or blobs from the module. To satisfy compliance checking
when building Zephyr without the module present, it's recommended for the module to
have default definitions for these symbols in its respective Kconfig file under
modules/ in the Zephyr main tree.

In CMake, ZEPHYR_<MODULE_NAME>_CMAKE_DIR contains the
absolute path to the directory containing the :file:CMakeLists.txt file that
is included into CMake build system. This variable's value is empty if the
module.yml file does not specify a CMakeLists.txt.

To read these variables for a Zephyr module named foo:

  • In CMake: use ${ZEPHYR_FOO_MODULE_DIR} for the module's top level directory, and ${ZEPHYR_FOO_CMAKE_DIR} for the directory containing its :file:CMakeLists.txt
  • In Kconfig: use $(ZEPHYR_FOO_MODULE_DIR) for the module's top level directory

Notice how a lowercase module name foo is capitalized to FOO
in both CMake and Kconfig.

These variables can also be used to test whether a given module exists.
For example, to verify that foo is the name of a Zephyr module:

.. code-block:: cmake

if(ZEPHYR_FOO_MODULE_DIR)
# Do something if FOO exists.
endif()

In Kconfig, the variable may be used to find additional files to include.
For example, to include the file :file:some/Kconfig in module foo:

.. code-block:: kconfig

source "$(ZEPHYR_FOO_MODULE_DIR)/some/Kconfig"

During CMake processing of each Zephyr module, the following variables are
also available:

  • the current module's name: ${ZEPHYR_CURRENT_MODULE_NAME}
  • the current module's top level directory: ${ZEPHYR_CURRENT_MODULE_DIR}
  • the current module's :file:CMakeLists.txt directory: ${ZEPHYR_CURRENT_CMAKE_DIR}

This removes the need for a Zephyr module to know its own name during CMake
processing. The module can source additional CMake files using these CURRENT
variables. For example:

.. code-block:: cmake

include(${ZEPHYR_CURRENT_MODULE_DIR}/cmake/code.cmake)

It is possible to append values to a Zephyr CMake list_ variable from the module's first
CMakeLists.txt file.
To do so, append the value to the list and then set the list in the PARENT_SCOPE
of the CMakeLists.txt file. For example, to append bar to the FOO_LIST variable in the
Zephyr CMakeLists.txt scope:

.. code-block:: cmake

list(APPEND FOO_LIST bar)
set(FOO_LIST ${FOO_LIST} PARENT_SCOPE)

An example of a Zephyr list where this is useful is when adding additional
directories to the SYSCALL_INCLUDE_DIRS list.

Sysbuild modules

In both Kconfig and CMake, the variable SYSBUILD_CURRENT_MODULE_DIR
contains the absolute path to the sysbuild module. In CMake,
SYSBUILD_CURRENT_CMAKE_DIR contains the absolute path to the directory
containing the :file:CMakeLists.txt file that is included into CMake build
system. This variable's value is empty if the module.yml file does not specify
a CMakeLists.txt.

To read these variables for a sysbuild module:

  • In CMake: use ${SYSBUILD_CURRENT_MODULE_DIR} for the module's top level
    directory, and ${SYSBUILD_CURRENT_CMAKE_DIR} for the directory containing
    its :file:CMakeLists.txt
  • In Kconfig: use $(SYSBUILD_CURRENT_MODULE_DIR) for the module's top level
    directory

In Kconfig, the variable may be used to find additional files to include.
For example, to include the file :file:some/Kconfig:

.. code-block:: kconfig

source "$(SYSBUILD_CURRENT_MODULE_DIR)/some/Kconfig"

The module can source additional CMake files using these variables. For
example:

.. code-block:: cmake

include(${SYSBUILD_CURRENT_MODULE_DIR}/cmake/code.cmake)

It is possible to append values to a Zephyr CMake list_ variable from the
module's first CMakeLists.txt file.
To do so, append the value to the list and then set the list in the
PARENT_SCOPE of the CMakeLists.txt file. For example, to append bar to the
FOO_LIST variable in the Zephyr CMakeLists.txt scope:

.. code-block:: cmake

list(APPEND FOO_LIST bar)
set(FOO_LIST ${FOO_LIST} PARENT_SCOPE)

Sysbuild modules hooks

Sysbuild provides an infrastructure which allows a sysbuild module to define
a function which will be invoked by sysbuild at a pre-defined point in the
CMake flow.

Functions invoked by sysbuild:

  • <module-name>_pre_cmake(IMAGES ): This function is called for each
    sysbuild module before CMake configure is invoked for all images.
  • <module-name>_post_cmake(IMAGES ): This function is called for each
    sysbuild module after CMake configure has completed for all images.
  • <module-name>_pre_domains(IMAGES ): This function is called for each
    sysbuild module before domains yaml is created by sysbuild.
  • <module-name>_post_domains(IMAGES ): This function is called for each
    sysbuild module after domains yaml has been created by sysbuild.

arguments passed from sysbuild to the function defined by a module:

  • is the list of zephyr images that will be created by the build system.

If a module foo want to provide a post CMake configure function, then the
module's sysbuild :file:CMakeLists.txt file must define function foo_post_cmake().

To facilitate naming of functions, the module name is provided by sysbuild CMake
through the SYSBUILD_CURRENT_MODULE_NAME CMake variable when loading the
module's sysbuild :file:CMakeLists.txt file.

Example of how the foo sysbuild module can define foo_post_cmake():

.. code-block:: cmake

function(${SYSBUILD_CURRENT_MODULE_NAME}_post_cmake)
cmake_parse_arguments(POST_CMAKE "" "" "IMAGES" ${ARGN})

text
message("Invoking ${CMAKE_CURRENT_FUNCTION}. Images: ${POST_CMAKE_IMAGES}")

endfunction()

Zephyr module dependencies

A Zephyr module may be dependent on other Zephyr modules to be present in order
to function correctly. Or it might be that a given Zephyr module must be
processed after another Zephyr module, due to dependencies of certain CMake
targets.

Such a dependency can be described using the depends field.

.. code-block:: yaml

build:
depends:
-

Here is an example for the Zephyr module foo that is dependent on the Zephyr
module bar to be present in the build system:

.. code-block:: yaml

name: foo
build:
depends:
- bar

This example will ensure that bar is present when foo is included into
the build system, and it will also ensure that bar is processed before
foo.

.. _modules_module_ext_root:

Module integration files (external)

Module integration files can be located externally to the Zephyr module itself.
The MODULE_EXT_ROOT variable holds a list of roots containing integration
files located externally to Zephyr modules.

Module integration files in Zephyr

The Zephyr repository contain :file:CMakeLists.txt and :file:Kconfig build
files for certain known Zephyr modules.

Those files are located under

.. code-block:: none

└── modules └── ├── CMakeLists.txt └── Kconfig

Module integration files in a custom location

You can create a similar MODULE_EXT_ROOT for additional modules, and make
those modules known to Zephyr build system.

Create a MODULE_EXT_ROOT with the following structure

.. code-block:: none

└── modules ├── modules.cmake └── ├── CMakeLists.txt └── Kconfig

and then build your application by specifying -DMODULE_EXT_ROOT parameter to
the CMake build system. The MODULE_EXT_ROOT accepts a CMake list_ of roots as
argument.

A Zephyr module can automatically be added to the MODULE_EXT_ROOT
list using the module description file :file:zephyr/module.yml, see
:ref:modules_build_settings.

.. note::

ZEPHYR_BASE is always added as a MODULE_EXT_ROOT with the lowest
priority.
This allows you to overrule any integration files under
<ZEPHYR_BASE>/modules/<module_name> with your own implementation your own
MODULE_EXT_ROOT.

The :file:modules.cmake file must contain the logic that specifies the
integration files for Zephyr modules via specifically named CMake variables.

To include a module's CMake file, set the variable ZEPHYR_<MODULE_NAME>_CMAKE_DIR
to the path containing the CMake file.

To include a module's Kconfig file, set the variable ZEPHYR_<MODULE_NAME>_KCONFIG
to the path to the Kconfig file.

The following is an example on how to add support the FOO module.

Create the following structure

.. code-block:: none

└── modules ├── modules.cmake └── foo ├── CMakeLists.txt └── Kconfig

and inside the :file:modules.cmake file, add the following content

.. code-block:: cmake

set(ZEPHYR_FOO_CMAKE_DIR ${CMAKE_CURRENT_LIST_DIR}/foo)
set(ZEPHYR_FOO_KCONFIG ${CMAKE_CURRENT_LIST_DIR}/foo/Kconfig)

Module integration files (zephyr/module.yml)

The module description file :file:zephyr/module.yml can be used to specify
that the build files, :file:CMakeLists.txt and :file:Kconfig, are located
in a :ref:modules_module_ext_root.

Build files located in a MODULE_EXT_ROOT can be described as:

.. code-block:: yaml

build:
cmake-ext: True
kconfig-ext: True

This allows control of the build inclusion to be described externally to the
Zephyr module.

The Zephyr repository itself is always added as a Zephyr module ext root.

.. _modules_build_settings:

Build settings

It is possible to specify additional build settings that must be used when
including the module into the build system.

All root settings are relative to the root of the module.

Build settings supported in the :file:module.yml file are:

  • board_root: Contains additional boards that are available to the build
    system. Additional boards must be located in a :file:/boards
    folder.
  • dts_root: Contains additional dts files related to the architecture/soc
    families. Additional dts files must be located in a :file:<dts_root>/dts
    folder.
  • snippet_root: Contains additional snippets that are available for use.
    These snippets must be defined in :file:snippet.yml files underneath the
    :file:<snippet_root>/snippets folder. For example, if you have
    snippet_root: foo, then you should place your module's
    :file:snippet.yml files in :file:<your-module>/foo/snippets or any
    nested subdirectory.
  • soc_root: Contains additional SoCs that are available to the build
    system. Additional SoCs must be located in a :file:<soc_root>/soc folder.
  • arch_root: Contains additional architectures that are available to the
    build system. Additional architectures must be located in a
    :file:<arch_root>/arch folder.
  • module_ext_root: Contains :file:CMakeLists.txt and :file:Kconfig files
    for Zephyr modules, see also :ref:modules_module_ext_root.
  • sca_root: Contains additional :ref:SCA <sca> tool implementations
    available to the build system. Each tool must be located in
    :file:<sca_root>/sca/<tool> folder. The folder must contain a
    :file:sca.cmake.

Example of a :file:module.yaml file containing additional roots, and the
corresponding file system layout.

.. code-block:: yaml

build:
settings:
board_root: .
dts_root: .
soc_root: .
arch_root: .
module_ext_root: .

requires the following folder structure:

.. code-block:: none

├── arch ├── boards ├── dts ├── modules └── soc

Test Runner (Twister) integration

To execute both tests and samples available in modules, the Zephyr test runner
(twister) should be pointed to the directories containing those samples and
tests. This can be done by specifying the path to both samples and tests in the
:file:zephyr/module.yml file. Additionally, if a module defines out of tree
boards, the module file can point twister to the path where those files
are maintained in the module. For example:

.. code-block:: yaml

text
build:
  cmake: .
samples:
  - samples
tests:
  - tests
boards:
  - boards

Tests and Samples defined in the :file:zephyr/module.yml file are not detected
by twister automatically. To make twister aware of the tests and samples defined
in modules, the path for those tests and samples must be added to the command line
when executing twister, for example:

.. code-block:: shell

./scripts/zephyr_module.py --twister-out module_tests.args
if [ -s module_tests.args ]; then
west twister +module_tests.args --outdir module_tests ...
fi

.. _modules-bin-blobs:

Binary Blobs

Zephyr supports fetching and using :ref:binary blobs , and their
metadata is contained entirely in :file:zephyr/module.yml. This is because
a binary blob must always be associated with a Zephyr module, and thus the
blob metadata belongs in the module's description itself.

Binary blobs are fetched using :ref:west blobs <west-blobs>. If west is
:ref:not used <modules_without_west>, they must be downloaded and
verified manually.

The blobs section in :file:zephyr/module.yml consists of a sequence of
maps, each of which has the following entries:

  • path: The path to the binary blob, relative to the :file:zephyr/blobs/
    folder in the module repository
  • sha256: SHA-256 <https://en.wikipedia.org/wiki/SHA-2>_ checksum of the
    binary blob file
  • type: The :ref:type of binary blob . Currently limited
    to img or lib
  • version: A version string
  • license-path: Path to the license file for this blob, relative to the root
    of the module repository
  • url: URL(s) that identify the location the blob will be fetched from, as
    well as the fetching scheme to use. If it contains a list instead of a single string,
    each URL will be considered as a fallback for fetching the same blob.
  • description: Human-readable description of the binary blob
  • doc-url: A URL pointing to the location of the official documentation for
    this blob

The following entries may also be present:

  • click-through: A boolean indicating if a click-through license must be
    accepted to download this blob
  • size: Size of the blob in bytes. May be required by some fetchers
  • fetcher: The method used to download the blob. If not set, the method is
    inferred from the URL

Package manager dependencies

Zephyr modules can describe dependencies available from package managers,
currently only pip is supported.

A west extension command west packages <manager> is available to list
dependencies for Zephyr and present modules that leverage this feature in their
module.yml file.
Run west help packages for more details.

Python pip

Calling west packages pip lists requirement files_ for Zephyr and modules.
Passing --install installs these if there's an active virtual environment.

The following example demonstrates a zephyr/module.yml file with some
requirement files in the scripts directory of the module.

.. code-block:: yaml

text
package-managers:
  pip:
    requirement-files:
      - scripts/requirements-build.txt
      - scripts/requirements-doc.txt

.. _modules-runners:

External Runners

If a module has out of tree boards that require custom :ref:runners <west-runner>,
then it can add a list to its zephyr/module.yml file, for example:

.. code-block:: yaml

text
runners:
  - file: scripts/my-runner.py

Each file entry is imported when executing west flash or west debug and
subclasses of the ZephyrBinaryRunner are registered for use.

Module Inclusion

.. _modules_using_west:

Using West

If west is installed and :makevar:ZEPHYR_MODULES is not already set, the
build system finds all the modules in your :term:west installation and uses
those. It does this by running :ref:west list <west-built-in-misc> to get
the paths of all the projects in the installation, then filters the results to
just those projects which have the necessary module metadata files.

Each project in the west list output is tested like this:

  • If the project contains a file named :file:zephyr/module.yml, then the
    content of that file will be used to determine which files should be added
    to the build, as described in the previous section.

  • Otherwise (i.e. if the project has no :file:zephyr/module.yml), the
    build system looks for :file:zephyr/CMakeLists.txt and
    :file:zephyr/Kconfig files in the project. If both are present, the project
    is considered a module, and those files will be added to the build.

  • If neither of those checks succeed, the project is not considered a module,
    and is not added to :makevar:ZEPHYR_MODULES.

.. _modules_without_west:

Without West

If you don't have west installed or don't want the build system to use it to
find Zephyr modules, you can set :makevar:ZEPHYR_MODULES yourself using one
of the following options. Each of the directories in the list must contain
either a :file:zephyr/module.yml file or the files
:file:zephyr/CMakeLists.txt and :file:Kconfig, as described in the previous
section.

#. At the CMake command line, like this:

.. code-block:: console

text
cmake -DZEPHYR_MODULES=[;[...]] ...

#. At the top of your application's top level :file:CMakeLists.txt, like this:

.. code-block:: cmake

text
set(ZEPHYR_MODULES   [...])
  find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})

If you choose this option, make sure to set the variable before calling
find_package(Zephyr ...), as shown above.

#. In a separate CMake script which is pre-loaded to populate the CMake cache,
like this:

.. code-block:: cmake

text
# Put this in a file with a name like "zephyr-modules.cmake"
  set(ZEPHYR_MODULES  
    CACHE STRING "pre-cached modules")

You can tell the build system to use this file by adding -C zephyr-modules.cmake to your CMake command line.

Not using modules

If you don't have west installed and don't specify :makevar:ZEPHYR_MODULES
yourself, then no additional modules are added to the build. You will still be
able to build any applications that don't require code or Kconfig options
defined in an external repository.

Submitting changes to modules


When submitting new or making changes to existing modules the main repository
Zephyr needs a reference to the changes to be able to verify the changes. In the
main tree this is done using revisions. For code that is already merged and part
of the tree we use the commit hash, a tag, or a branch name. For pull requests
however, we require specifying the pull request number in the revision field to
allow building the zephyr main tree with the changes submitted to the
module.

To avoid merging changes to master with pull request information, the pull
request should be marked as DNM (Do Not Merge) or preferably a draft pull
request to make sure it is not merged by mistake and to allow for the module to
be merged first and be assigned a permanent commit hash. Drafts reduce noise by
not automatically notifying anyone until marked as "Ready for review".
Once the module is
merged, the revision will need to be changed either by the submitter or by the
maintainer to the commit hash of the module which reflects the changes.

Note that multiple and dependent changes to different modules can be submitted
using exactly the same process. In this case you will change multiple entries of
all modules that have a pull request against them.

.. _submitting_new_modules:

Process for submitting a new module

Please follow the process in :ref:external-src-process and obtain the TSC
approval to integrate the external source code as a module

If the request is approved, a new repository will
created by the project team and initialized with basic information that would
allow submitting code to the module project following the project contribution
guidelines.

If a module is maintained as a fork of another project on Github, the Zephyr
module related files and changes in relation to upstream need to be maintained
in a special branch named zephyr.

Maintainers from the Zephyr project will create the repository and initialize
it. You will be added as a collaborator in the new repository. Submit the
module content (code) to the new repository following the guidelines described
:ref:here <modules_using_west>, and then add a new entry to the
:zephyr_file:west.yml with the following information:

.. code-block:: console

text
- name: <name of repository>
      path: 
      revision: <ref pointer to module pull request>

For example, to add my_module to the manifest:

.. code-block:: console

text
- name: my_module
  path: modules/lib/my_module
  revision: pull/23/head

Where 23 in the example above indicated the pull request number submitted to the
my_module repository. Once the module changes are reviewed and merged, the
revision needs to be changed to the commit hash from the module repository.

.. _changes_to_existing_module:

Process for submitting changes to existing modules

#. Submit the changes using a pull request to an existing repository following
the :ref:contribution guidelines <contribute_guidelines> and
:ref:expectations <contributor-expectations>.
#. Submit a pull request changing the entry referencing the module into the
:zephyr_file:west.yml of the main Zephyr tree with the following
information:

.. code-block:: console

text
- name: <name of repository>
      path: 
      revision: <ref pointer to module pull request>

For example, to add my_module to the manifest:

.. code-block:: console

text
- name: my_module
  path: modules/lib/my_module
  revision: pull/23/head

Where 23 in the example above indicated the pull request number submitted to the
my_module repository. Once the module changes are reviewed and merged, the
revision needs to be changed to the commit hash from the module repository.

.. _CMake list: https://cmake.org/cmake/help/latest/manual/cmake-language.7.html#lists
.. _add_subdirectory(): https://cmake.org/cmake/help/latest/command/add_subdirectory.html
.. _GitHub issues: https://github.com/zephyrproject-rtos/zephyr/issues
.. _requirement files: https://pip.pypa.io/en/stable/reference/requirements-file-format/


Doc Hardware Index (`doc/hardware/index.rst`)

.. _hardware_support:

Hardware Support
################

.. toctree::
:maxdepth: 1

arch/index.rst
barriers/index.rst
cache/index.rst
emulator/index.rst
emulator/bus_emulators.rst
firmware/index.rst
peripherals/index.rst
pinctrl/index.rst
porting/index
virtualization/index.rst


Doc Introduction Index (`doc/introduction/index.rst`)

.. _introducing_zephyr:

Introduction
############

The Zephyr OS is based on a small-footprint kernel designed for use on
resource-constrained and embedded systems: from simple embedded environmental
sensors and LED wearables to sophisticated embedded controllers, smart
watches, and IoT wireless applications.

The Zephyr kernel supports multiple architectures, including:

  • ARCv2 (EM and HS) and ARCv3 (HS6X)
  • ARMv6-M, ARMv7-M, and ARMv8-M (Cortex-M)
  • ARMv7-A and ARMv8-A (Cortex-A, 32- and 64-bit)
  • ARMv7-R, ARMv8-R (Cortex-R, 32- and 64-bit)
  • Qualcomm Hexagon
  • Intel x86 (32- and 64-bit)
  • MIPS (MIPS32 Release 1 specification)
  • OpenRISC (32-bit)
  • Renesas RX
  • RISC-V (32- and 64-bit)
  • SPARC V8
  • Tensilica Xtensa
  • TriCore (TC1.6.2 and TC1.8)

The full list of supported boards based on these architectures can be found :ref:here .

In the context of the Zephyr OS, a :term:subsystem refers to a logically distinct
part of the operating system that handles specific functionality or provides
certain services. Subsystems can include components such as networking,
file systems, device driver classes, power management, and communication protocols,
among others. Each subsystem is designed to be modular and can be configured,
customized, and extended to meet the requirements of different embedded
applications.

Licensing


Zephyr is permissively licensed using the Apache 2.0 license_
(as found in the LICENSE file in the
project's GitHub repo_). There are some
imported or reused components of the Zephyr project that use other licensing,
as described in :ref:Zephyr_Licensing.

.. _Apache 2.0 license:
https://github.com/zephyrproject-rtos/zephyr/blob/main/LICENSE

.. _GitHub repo: https://github.com/zephyrproject-rtos/zephyr

Distinguishing Features


Zephyr offers a large and ever growing number of features including:

Extensive suite of Kernel services
Zephyr offers a number of familiar services for development:

  • Multi-threading Services for cooperative, priority-based,
    non-preemptive, and preemptive threads with optional round robin
    time-slicing. Includes POSIX pthreads compatible API support.

  • Interrupt Services for compile-time registration of interrupt handlers.

  • Memory Allocation Services for dynamic allocation and freeing of
    fixed-size or variable-size memory blocks.

  • Inter-thread Synchronization Services for binary semaphores,
    counting semaphores, and mutex semaphores.

  • Inter-thread Data Passing Services for basic message queues, enhanced
    message queues, and byte streams.

  • Power Management Services such as overarching, application or
    policy-defined, System Power Management and fine-grained, driver-defined,
    Device Power Management.

Multiple Scheduling Algorithms
Zephyr provides a comprehensive set of thread scheduling choices:

  • Cooperative and Preemptive Scheduling

  • Earliest Deadline First (EDF)

  • Meta IRQ scheduling implementing "interrupt bottom half" or "tasklet"
    behavior

  • Timeslicing: Enables time slicing between preemptible threads of equal
    priority

  • Multiple queuing strategies:

    • Simple linked-list ready queue
    • Red/black tree ready queue
    • Traditional multi-queue ready queue

.. _zephyr_intro_configurability:

Highly configurable / Modular for flexibility
Allows an application to incorporate only the capabilities it needs as it
needs them, and to specify their quantity and size.

Cross Architecture
Supports a wide variety of :ref:supported boards with different CPU
architectures and developer tools. Contributions have added support
for an increasing number of SoCs, platforms, and drivers.

Memory Protection
Implements configurable architecture-specific stack-overflow protection,
kernel object and device driver permission tracking, and thread isolation
with thread-level memory protection on x86, ARC, and ARM architectures,
userspace, and memory domains.

For platforms without MMU/MPU and memory constrained devices, supports
combining application-specific code with a custom kernel to create a
monolithic image that gets loaded and executed on a system's hardware. Both
the application code and kernel code execute in a single shared address
space.

Compile-time resource definition
Allows system resources to be defined at compile-time, which reduces code
size and increases performance for resource-limited systems.

Optimized Device Driver Model
Provides a consistent device model for configuring the drivers that are part
of the platform/system and a consistent model for initializing all the
drivers configured into the system and allows the reuse of drivers across
platforms that have common devices/IP blocks.

Devicetree Support
Use of :ref:devicetree <dt-guide> to describe hardware.
Information from devicetree is used to create the application image.

Native Networking Stack supporting multiple protocols
Networking support is fully featured and optimized, including LwM2M and BSD
sockets compatible support. OpenThread support (on Nordic chipsets) is also
provided - a mesh network designed to securely and reliably connect hundreds
of products around the home.

Bluetooth Low Energy 5.0 support
Bluetooth 5.0 compliant (ESR10) and Bluetooth Low Energy Controller support
(LE Link Layer). Includes Bluetooth Mesh and a Bluetooth qualification-ready
Bluetooth controller.

  • Generic Access Profile (GAP) with all possible LE roles
  • Generic Attribute Profile (GATT)
  • Pairing support, including the Secure Connections feature from Bluetooth
    4.2
  • Clean HCI driver abstraction
  • Raw HCI interface to run Zephyr as a Controller instead of a full Host
    stack
  • Verified with multiple popular controllers
  • Highly configurable

Mesh Support:

  • Relay, Friend Node, Low-Power Node (LPN) and GATT Proxy features
  • Both Provisioning bearers supported (PB-ADV & PB-GATT)
  • Highly configurable, fitting in devices with at least 16k RAM

Native Linux, macOS, and Windows Development
A command-line CMake build environment runs on popular developer OS
systems. A native port (:zephyr:board:native_sim <native_sim>) lets you build and run Zephyr as a native
application on Linux, aiding development and testing.

Virtual File System Interface with ext2, FatFs, and LittleFS Support
ext2, LittleFS and FatFS support; FCB (Flash Circular Buffer) for memory constrained
applications.

Powerful multi-backend logging Framework
Support for log filtering, object dumping, panic mode, multiple backends
(memory, networking, filesystem, console, ...) and integration with the shell
subsystem.

User friendly and full-featured Shell interface
A multi-instance shell subsystem with user-friendly features such as
autocompletion, wildcards, coloring, metakeys (arrows, backspace, ctrl+u,
etc.) and history. Support for static commands and dynamic sub-commands.

Settings on non-volatile storage
The settings subsystem gives modules a way to store persistent per-device
configuration and runtime state. Settings items are stored as key-value pair
strings.

Non-volatile storage (NVS)
NVS allows storage of binary blobs, strings, integers, longs, and any
combination of these.

Native port
:zephyr:board:Native sim <native_sim> allows running Zephyr as a Linux application with support
for various subsystems and networking.

.. include:: ../../README.rst
:start-after: start_include_here

Fundamental Terms and Concepts


See :ref:glossary


Doc Kernel Cleanup (`doc/kernel/cleanup.rst`)

.. _cleanup_api:

Scope-based Cleanup Helpers
###########################

.. contents::
:local:
:depth: 2

Overview


The Cleanup Helper API provides a mechanism for automatic resource cleanup when
variables go out of scope. This is similar to RAII in C++ or defer statements
in Go. By leveraging compiler support for the __cleanup attribute,
this API helps prevent resource leaks and simplifies error handling by ensuring
cleanup code is executed automatically.

It is required to set :kconfig:option:CONFIG_SCOPE_CLEANUP_HELPERS to enable this
feature, which is particularly useful for:

  • Automatic unlocking of mutexes and semaphores
  • Automatic freeing of dynamically allocated memory
  • Ensuring cleanup actions occur on all code paths (including early returns)
  • Reducing boilerplate cleanup code

.. warning::

The cleanup mechanism is implemented using the __cleanup attribute.
If the toolchain doesn't support this attribute, the API is not available.

For this reason this API is intended solely for user applications and not for
the kernel itself or other subsystems.

Core Concepts


The cleanup API provides three main abstractions:

Scoped Variables

A scoped variable defines a type with automatic init and exit behavior.
Variables declared with a scoped variable type are initialized using an
init function and automatically cleaned up using an exit function when they
go out of scope.

Scoped Guards

Scoped guards are specialized scoped variables that automatically acquire a lock or
resource on initialization and release it when going out of scope. This pattern
is commonly used with mutexes, semaphores, and other synchronization primitives.

Scoped Defers

Scoped defers execute a specified function when the variable goes out of scope,
without acquiring anything on initialization. This is similar to the defer
statement in languages like Go.

Defining Scoped Types


Custom Scoped Variables

Use :c:macro:SCOPE_VAR_DEFINE to define a custom scoped variable type with init
and exit functions:

.. code-block:: c

text
static inline struct flash_area *flash_area_init(int area_id)
{
    struct flash_area *fa;

    if (flash_area_open(area_id, &fa) < 0) {
        return NULL;
    }

    return fa;
}

static inline void flash_area_exit(struct flash_area *fa)
{
    if (fa != NULL) {
        flash_area_close(fa);
    }
}

// Define the scoped variable type
SCOPE_VAR_DEFINE(flash_area, struct flash_area *, flash_area_exit(_T),
                 flash_area_init(area_id), int area_id);

static int some_function(void)
{
    // Declare 'fa' with automatic cleanup
    scope_var(flash_area, fa)(PARTITION_ID(storage_partition));
    if (fa == NULL) {
        return -EINVAL;  // Exit function is still called
    }

    // Use fa normally
    printk("Has driver: %d\n", flash_area_has_driver(fa));

    // No need to manually close - exit function is called automatically
    return 0;
}

The _T variable in the exit function expression contains the value of the
variable being cleaned up.

Scoped Guards

Use :c:macro:SCOPE_GUARD_DEFINE to define a guard that acquires a lock on
initialization and releases it on scope exit:

.. code-block:: c

text
// Example guard definition (already provided by <zephyr/cleanup/kernel.h>)
SCOPE_GUARD_DEFINE(k_mutex, struct k_mutex *,
                   (void)k_mutex_lock(_T, K_FOREVER),
                   (void)k_mutex_unlock(_T));

static K_MUTEX_DEFINE(lock);

void critical_section(void)
{
    scope_guard(k_mutex)(&lock);

    // Lock is held here
    // Perform critical operations

    // Lock is automatically released when guard goes out of scope
}

Block-Scoped Guards

While :c:macro:scope_guard holds a guard until the end of the enclosing scope,
:c:macro:scoped_guard binds the guard to the brace block that immediately follows,
releasing it as soon as that block is exited. This makes short critical sections
explicit and keeps the lock object next to the code it protects:

.. code-block:: c

text
static K_MUTEX_DEFINE(lock);

void worker(void)
{
    // ... work that does not need the lock ...

    scoped_guard(k_mutex, &lock) {
        // lock held only inside these braces
    }
    // lock released here

    // ... more work without the lock held ...
}

The block runs exactly once. The lock is released on any exit from the block,
including break, return and goto. Note that continue leaves the block
(it behaves like break) rather than re-running it.

Conditional Guards

Guards defined with :c:macro:SCOPE_GUARD_DEFINE always acquire the lock (they block
with K_FOREVER). To express a guard whose acquisition may fail (for example a
non-blocking K_NO_WAIT try-lock), use :c:macro:SCOPE_COND_GUARD_DEFINE together
with :c:macro:scoped_cond_guard. The acquire expression is evaluated for success: on
failure the guard stores NULL, the supplied fail statement runs, and the block is
skipped.

.. code-block:: c

text
// Example guard definition (already provided by <zephyr/cleanup/kernel.h>)
SCOPE_COND_GUARD_DEFINE(k_mutex_try, struct k_mutex *,
                        k_mutex_lock(_T, K_NO_WAIT) == 0,
                        (void)k_mutex_unlock(_T));

static K_MUTEX_DEFINE(lock);

int try_critical_section(void)
{
    scoped_cond_guard(k_mutex_try, return -EBUSY, &lock) {
        // runs only if the lock was acquired
        // released automatically when the block is exited
    }

    return 0;
}

The fail statement can be any statement, such as break, return -EBUSY, or
{} to silently skip the block.

Scoped Defers

Use :c:macro:SCOPE_DEFER_DEFINE to define a defer that executes a cleanup function:

.. code-block:: c

text
// Define a defer for a custom cleanup function
static void cleanup_resources(void)
{
    // Cleanup code here
}

SCOPE_DEFER_DEFINE(cleanup_resources);

void some_function(void)
{
    scope_defer(cleanup_resources)();

    // Do work...

    // cleanup_resources() is called automatically
}

For functions with parameters:

.. code-block:: c

text
// Example deferred k_free (already provided by <zephyr/cleanup/kernel.h>)
SCOPE_DEFER_DEFINE(k_free, void *);

void allocate_and_use(void)
{
    void *ptr = k_malloc(100);
    scope_defer(k_free)(ptr);

    // Use ptr...

    // k_free(ptr) is called automatically
}

Usage Notes


Order of Cleanup

Cleanup functions are called in reverse order of declaration (LIFO - Last In,
First Out), which matches the natural nesting of resources:

.. code-block:: c

text
{
    scope_guard(k_mutex)(&lock);           // Acquired first
    void *ptr = k_malloc(100);
    scope_defer(k_free)(ptr);              // Registered second

    // Do work...

}  // ptr is freed first, then mutex is unlocked

Scope Rules

Cleanup occurs when the variable goes out of scope, which includes:

  • Reaching the end of a block
  • Early return statements
  • Break or continue in loops
  • Goto statements that jump out of scope

.. code-block:: c

text
void example_with_early_exit(struct k_mutex *lock)
{
    scope_guard(k_mutex)(lock);

    if (error_condition) {
        return;  // Guard cleanup happens here
    }

    // Normal path

}  // Guard cleanup also happens here

API Reference


.. doxygengroup:: cleanup_interface


Doc Kernel Code Relocation (`doc/kernel/code-relocation.rst`)

.. _code_data_relocation:

Code And Data Relocation
########################

Overview


This feature will allow relocating .text, .rodata, .data, and .bss sections from
required files and place them in the required memory region. The memory region
and file are given to the :ref:gen_relocate_app.py script in the form
of a string. This script is always invoked from inside cmake.

This script provides a robust way to re-order the memory contents without
actually having to modify the code. In simple terms this script will do the job
of __attribute__((section("name"))) for a bunch of files together.

A regular expression filter can be used to select only the required sections to be relocated.

Details


The memory region and file are given to the :ref:gen_relocate_app.py script
through a file where each line specifies a list of files to be placed in the
given region.

An example of such a file is:

.. code-block:: none

text
SRAM2:/home/xyz/zephyr/samples/hello_world/src/main.c,
 SRAM1:/home/xyz/zephyr/samples/hello_world/src/main2.c,

This script is invoked with the following parameters:
python3 gen_relocate_app.py -i input_file -o generated_linker -c generated_code

Kconfig :kconfig:option:CONFIG_CODE_DATA_RELOCATION option, when enabled in
prj.conf, will invoke the script and do the required relocation.

This script also trigger the generation of linker_relocate.ld and
code_relocation.c files. The linker_relocate.ld file creates
appropriate sections and links the required functions or variables from all the
selected files.

.. note::

The text section is split into 2 parts in the main linker script. The first
section will have some info regarding vector tables and other debug related
info. The second section will have the complete text section. This is
needed to force the required functions and data variables to the correct
locations. This is due to the behavior of the linker. The linker will only
link once and hence this text section had to be split to make room for the
generated linker script.

The code_relocation.c file has code that is needed for
initializing data sections, and a copy of the text sections (if XIP).
Also this contains code needed for bss zeroing and
for data copy operations from ROM to required memory type.

The procedure to invoke this feature is:

  • Enable :kconfig:option:CONFIG_CODE_DATA_RELOCATION in the prj.conf file

  • Inside the CMakeLists.txt file in the project, mention
    all the files that need relocation.

    zephyr_code_relocate(FILES src/main.c LOCATION SRAM2)

    Where the first argument is the file/files and the second
    argument is the memory where it must be placed.

    .. note::

    function zephyr_code_relocate() can be called as many times as required.

Additional Configurations

This section shows additional configuration options that can be set in
CMakeLists.txt.

  • If the memory is SRAM1, SRAM2, CCD, or AON, then place the
    full object in the sections. For example:

    .. code-block:: cmake

    zephyr_code_relocate(FILES src/file1.c LOCATION SRAM2)
    zephyr_code_relocate(FILES src/file2.c LOCATION SRAM1)

  • If the memory type is appended with _DATA, _TEXT, _RODATA,
    _BSS or _NOINIT, only the selected memory is placed in the required
    memory region. For example:

    .. code-block:: cmake

    zephyr_code_relocate(FILES src/file1.c LOCATION SRAM2_DATA)
    zephyr_code_relocate(FILES src/file2.c LOCATION SRAM2_TEXT)

  • Multiple regions can also be appended together such as:
    SRAM2_DATA_BSS_NOINIT. This will place all data: value-initialized,
    zero-initialized and uninitialized inside SRAM2.

  • Multiple files can be passed to the FILES argument, or CMake generator
    expressions can be used to relocate a comma-separated list of files.

    .. code-block:: cmake

    file(GLOB sources "file*.c")
    zephyr_code_relocate(FILES ${sources} LOCATION SRAM2)
    zephyr_code_relocate(FILES $<TARGET_PROPERTY:my_tgt,SOURCES> LOCATION SRAM2)

Section Filtering

By default, all sections of the specified files will be relocated. If
FILTER is used, a regular expression is provided to select only
the sections to be relocated.

The regular expression applies to sections names which can be used to
select the file's symbols when this one has been built with
-ffunction-sections and -fdata-sections which is the case by
default.

.. code-block:: cmake

text
zephyr_code_relocate(FILES src/file1.c FILTER ".*\\.func1|.*\\.func2" LOCATION SRAM2_TEXT)

The example above will only relocate func1() and func2() of file src/file1.c

NOKEEP flag

By default, all relocated functions and variables will be marked with KEEP()
when generating linker_relocate.ld. Therefore, if any input file happens to
contain unused symbols, then they will not be discarded by the linker, even when
it is invoked with --gc-sections. If you'd like to override this behavior,
you can pass NOKEEP to your zephyr_code_relocate() call.

.. code-block:: cmake

text
zephyr_code_relocate(FILES src/file1.c LOCATION SRAM2_TEXT NOKEEP)

The example above will help ensure that any unused code found in the .text
sections of file1.c will not stick to SRAM2.

NOCOPY flag

When a NOCOPY option is passed to the zephyr_code_relocate() function,
the relocation code is not generated in code_relocation.c. This flag can be
used when we want to move the content of a specific file (or set of files) to a
XIP area.

This example will place the .text section of the xip_external_flash.c file
to the EXTFLASH memory region where it will be executed from (XIP). The
.data will be relocated as usual into SRAM.

.. code-block:: cmake

text
zephyr_code_relocate(FILES src/xip_external_flash.c LOCATION EXTFLASH_TEXT NOCOPY)
 zephyr_code_relocate(FILES src/xip_external_flash.c LOCATION SRAM_DATA)

Relocating libraries

Libraries can be relocated using the LIBRARY argument to
zephyr_code_relocation() with the library name. For example, the following
snippet will relocate serial drivers to SRAM2:

.. code-block:: cmake

text
zephyr_code_relocate(LIBRARY drivers__serial LOCATION SRAM2)

Tips

Take care if relocating kernel/arch files, some contain early initialization
code that executes before code relocation takes place.

Additional MPU/MMU configuration may be required to ensure that the
destination memory region is configured to allow code execution.

Samples/ Tests

A test showcasing this feature is provided at
$ZEPHYR_BASE/tests/application_development/code_relocation

This test shows how the code relocation feature is used.

This test will place .text, .data, .bss from 3 files to various parts in the SRAM
using a custom linker file derived from include/zephyr/arch/arm/cortex_m/scripts/linker.ld

A sample showcasing the NOCOPY flag is provided here: :zephyr:code-sample:code_relocation_nocopy.


Doc Kernel Index (`doc/kernel/index.rst`)

.. _kernel:

Kernel

.. toctree::
:maxdepth: 1

services/index.rst
drivers/index.rst
usermode/index.rst
memory_management/index.rst
data_structures/index.rst
timing_functions/index.rst
object_cores/index.rst
timeutil.rst
precision_timing.rst
util/index.rst
iterable_sections/index.rst
code-relocation.rst
cleanup.rst


Doc Kernel Precision Timing (`doc/kernel/precision_timing.rst`)

.. SPDX-FileCopyrightText: Copyright The Zephyr Project Contributors
.. SPDX-FileCopyrightText: Copyright (c) 2026 Philipp Steiner
.. SPDX-License-Identifier: Apache-2.0

.. _precision_timing:

Precision Timing
################

The precision timing subsystem provides a small set of reusable mechanisms for
PTP, gPTP, and other users that control high-resolution clocks. Enable it with
:kconfig:option:CONFIG_PRECISION_TIMING.

.. note::

The API is at :ref:experimental <api_lifecycle_experimental> maturity and
may still change. A protocol does not change maturity by using this
subsystem.

The subsystem deliberately does not implement synchronization policy. PTP and
gPTP continue to own their protocol state machines, clock selection, step
thresholds, sample acceptance, lock detection, source-loss handling, and
diagnostics.

Precision time


:c:type:precision_time_t is a signed 64-bit nanosecond value. Checked
addition and subtraction helpers report overflow. The type does not identify a
time domain or timescale; modelling TAI, UTC, PHCs, monotonic time, and protocol
relationships is outside this API.

Precision clock


:c:struct:precision_clock dispatches four mandatory clock operations:

  • read the current time;
  • set an absolute time;
  • apply a phase adjustment; and
  • set a rate offset from the nominal frequency as parts per million with a
    16-bit binary fractional field.

All operations must be implemented by a clock adapter. Adjustment ranges and
other hardware constraints remain the responsibility of the underlying clock
implementation.

:c:struct:precision_clock_ptp_adapter exposes an existing Zephyr PTP clock
device through this interface. It performs the required conversion between
:c:struct:net_ptp_time and :c:type:precision_time_t; it does not add
capability discovery or synchronization state.

PI controller


:c:struct:precision_pi is an instance-based proportional-integral controller.
Each instance stores its own gains and integral term. For every error sample,
the update is equivalent to:

.. code-block:: c

integral += ki * error;
output = kp * error + integral;

The controller does not decide whether an error should be stepped, rejected, or
used for rate adjustment. It also does not track synchronization, acquisition,
lock, holdover, source timeout, or clock faults. Callers own those decisions and
reset the accumulated integral term when their policy requires it.

The PTP and gPTP integrations initialize their controllers from
:kconfig:option:CONFIG_PRECISION_TIMING_PI_KP and
:kconfig:option:CONFIG_PRECISION_TIMING_PI_KI. The integer values express the
gains in thousandths. Direct users of :c:func:precision_pi_init may provide
different gains for each controller instance.

Protocol integration


PTP and the gPTP default clock-update path each keep their existing policy and
use a :c:struct:precision_pi for the shared calculation. They initialize a
PTP-clock adapter once and use :c:struct:precision_clock operations to access
the PHC.

Sample


The :zephyr:code-sample:precision_timing sample demonstrates checked time
arithmetic, a software-backed precision clock, and PI-driven rate adjustment.

API reference


.. doxygengroup:: precision_timing

.. doxygengroup:: precision_time

.. doxygengroup:: precision_clock

.. doxygengroup:: precision_clock_ptp

.. doxygengroup:: precision_pi


Doc Kernel Timeutil (`doc/kernel/timeutil.rst`)

.. _timeutil_api:

Time Utilities
##############

Overview


:ref:kernel_timing_uptime in Zephyr is based on a tick counter. With
the default :kconfig:option:CONFIG_TICKLESS_KERNEL, this counter advances at a
nominally constant rate from zero at the instant the system started. The POSIX
equivalent to this counter is something like CLOCK_MONOTONIC or, in Linux,
CLOCK_MONOTONIC_RAW. :c:func:k_uptime_get() provides a millisecond
representation of this time.

Applications often need to correlate the Zephyr internal time with external
time scales used in daily life, such as local time or Coordinated Universal
Time. These systems interpret time in different ways and may have
discontinuities due to leap seconds <https://what-if.xkcd.com/26/>__ and
local time offsets like daylight saving time.

Because of these discontinuities, as well as significant inaccuracies in the
clocks underlying the cycle counter, the offset between time estimated from
the Zephyr clock and the actual time in a "real" civil time scale is not
constant and can vary widely over the runtime of a Zephyr application.

The time utilities API supports:

  • :ref:converting between time representations <timeutil_repr>
  • :ref:synchronizing and aligning time scales <timeutil_sync>
  • :ref:comparing, adding, and subtracting representations <timeutil_manip>

For terminology and concepts that support these functions see
:ref:timeutil_concepts.

Time Utility APIs


.. _timeutil_repr:

Representation Transformation

Time scale instants can be represented in multiple ways including:

  • Seconds since an epoch. POSIX representations of time in this form include
    time_t and struct timespec, which are generally interpreted as a
    representation of "UNIX Time" (see :rfc:8536#section-2).

  • Calendar time as a year, month, day, hour, minutes, and seconds relative to
    an epoch. POSIX representations of time in this form include struct tm.

Keep in mind that these are simply time representations that must be
interpreted relative to a time scale which may be local time, UTC, or some
other continuous or discontinuous scale.

Some necessary transformations are available in standard C library
routines. For example, time_t measuring seconds since the POSIX EPOCH is
converted to struct tm representing calendar time with gmtime() <https://pubs.opengroup.org/onlinepubs/9699919799/functions/gmtime.html>__.
Sub-second timestamps like struct timespec can also use this to produce
the calendar time representation and deal with sub-second offsets separately.

The inverse transformation is not standardized: APIs like mktime() expect
information about time zones. Zephyr provides this transformation with
:c:func:timeutil_timegm and :c:func:timeutil_timegm64.

To convert between struct timespec and k_timeout_t durations,
use :c:func:timespec_to_timeout and :c:func:timespec_from_timeout.

.. code-block:: c

text
k_timeout_t to;
struct timespec ts;

timespec_from_timeout(K_FOREVER, &ts);
to = timespec_to_timeout(&ts); /* to == K_FOREVER */

timespec_from_timeout(K_MSEC(100), &ts);
to = timespec_to_timeout(&ts); /* to == K_MSEC(100) */

.. doxygengroup:: timeutil_repr_apis

.. _timeutil_sync:

Time Scale Synchronization

There are several factors that affect synchronizing time scales:

  • The rate of discrete instant representation change. For example, Zephyr
    uptime is tracked in ticks which advance at events that nominally occur at
    :kconfig:option:CONFIG_SYS_CLOCK_TICKS_PER_SEC Hertz, while an external time
    source may provide data in whole or fractional seconds (e.g. microseconds).
  • The absolute offset required to align the two scales at a single instant.
  • The relative error between observable instants in each scale, required to
    align multiple instants consistently. For example, a reference clock that's
    conditioned by a 1-pulse-per-second GPS signal will be much more accurate
    than a Zephyr system clock driven by a RC oscillator with a +/- 250 ppm
    error.

Synchronization or alignment between time scales is done with a multi-step
process:

  • An instant in a time scale is represented by an (unsigned) 64-bit integer,
    assumed to advance at a fixed nominal rate.
  • :c:struct:timeutil_sync_config records the nominal rates of a reference
    time scale/source (e.g. TAI) and a local time source
    (e.g. :c:func:k_uptime_ticks).
  • :c:struct:timeutil_sync_instant records the representation of a single
    instant in both the reference and local time scales.
  • :c:struct:timeutil_sync_state provides storage for an initial instant, a
    recently received second observation, and a skew that can adjust for
    relative errors in the actual rate of each time scale.
  • :c:func:timeutil_sync_ref_from_local() and
    :c:func:timeutil_sync_local_from_ref() convert instants in one time scale
    to another taking into account skew that can be estimated from the two
    instances stored in the state structure by
    :c:func:timeutil_sync_estimate_skew.

.. doxygengroup:: timeutil_sync_apis

.. _timeutil_manip:

``timespec`` Manipulation

Checking the validity of a timespec can be done with :c:func:timespec_is_valid.

.. code-block:: c

text
struct timespec ts = {
    .tv_sec = 0,
    .tv_nsec = -1, /* out of range! */
};

if (!timespec_is_valid(&ts)) {
    /* error-handing code */
}

In some cases, invalid timespec objects may be re-normalized using
:c:func:timespec_normalize.

.. code-block:: c

text
if (!timespec_normalize(&ts)) {
    /* error-handling code */
}

/* ts should be normalized */
__ASSERT(timespec_is_valid(&ts) == true, "expected normalized timespec");

It is possible to compare two timespec objects for equality using :c:func:timespec_equal.

.. code-block:: c

text
if (timespec_equal(then, now)) {
    /* time is up! */
}

It is possible to compare and fully order (valid) timespec objects using
:c:func:timespec_compare.

.. code-block:: c

text
int cmp = timespec_compare(a, b);

switch (cmp) {
case 0:
    /* a == b */
    break;
case -1:
    /* a < b */
    break;
case +1:
    /* a > b */
    break;
}

It is possible to add, subtract, and negate timespec objects using
:c:func:timespec_add, :c:func:timespec_sub, and :c:func:timespec_negate,
respectively. Like :c:func:timespec_normalize, these functions will output
a normalized timespec when doing so would not result in overflow.
On success, these functions return true. If overflow would occur, the
functions return false.

.. code-block:: c

text
/* a += b */
if (!timespec_add(&a, &b)) {
    /* overflow */
}

/* a -= b */
if (!timespec_sub(&a, &b)) {
    /* overflow */
}

/* a = -a */
if (!timespec_negate(&a)) {
    /* overflow */
}

.. doxygengroup:: timeutil_timespec_apis

.. _timeutil_concepts:

Concepts Underlying Time Support in Zephyr


Terms from ISO/TC 154/WG 5 N0038 <https://www.loc.gov/standards/datetime/iso-tc154-wg5_n0038_iso_wd_8601-1_2016-02-16.pdf>__
(ISO/WD 8601-1) and elsewhere:

  • A time axis is a representation of time as an ordered sequence of
    instants.
  • A time scale is a way of representing an instant relative to an origin
    that serves as the epoch.
  • A time scale is monotonic (increasing) if the representation of successive
    time instants never decreases in value.
  • A time scale is continuous if the representation has no abrupt changes in
    value, e.g. jumping forward or back when going between successive instants.
  • Civil time <https://en.wikipedia.org/wiki/Civil_time>__ generally refers
    to time scales that legally defined by civil authorities, like local
    governments, often to align local midnight to solar time.

Relevant Time Scales

International Atomic Time <https://en.wikipedia.org/wiki/International_Atomic_Time>__ (TAI) is a time
scale based on averaging clocks that count in SI seconds. TAI is a monotonic
and continuous time scale.

Universal Time <https://en.wikipedia.org/wiki/Universal_Time>__ (UT) is a
time scale based on Earth’s rotation. UT is a discontinuous time scale as it
requires occasional adjustments (leap seconds <https://en.wikipedia.org/wiki/Leap_second>) to maintain alignment to
changes in Earth’s rotation. Thus the difference between TAI and UT varies
over time. There are several variants of UT, with UTC <https://en.wikipedia.org/wiki/Coordinated_Universal_Time>
being the most
common.

UT times are independent of location. UT is the basis for Standard Time
(or "local time") which is the time at a particular location. Standard
time has a fixed offset from UT at any given instant, primarily
influenced by longitude, but the offset may be adjusted ("daylight
saving time") to align standard time to the local solar time. In a sense
local time is "more discontinuous" than UT.

POSIX Time (see :rfc:8536#section-2) is a time scale
that counts seconds since the "POSIX epoch" at 1970-01-01T00:00:00Z (i.e. the
start of 1970 UTC). UNIX Time is an extension of POSIX
time using negative values to represent times before the POSIX epoch. Both of
these scales assume that every day has exactly 86400 seconds. In normal use
instants in these scales correspond to times in the UTC scale, so they inherit
the discontinuity.

The continuous analogue is UNIX Leap Time which is UNIX time plus all
leap-second corrections added after the POSIX epoch (when TAI-UTC was 8 s).

Example of Time Scale Differences

A positive leap second was introduced at the end of 2016, increasing the
difference between TAI and UTC from 36 seconds to 37 seconds. There was
no leap second introduced at the end of 1999, when the difference
between TAI and UTC was only 32 seconds. The following table shows
relevant civil and epoch times in several scales:

==================== ========== =================== ======= ==============
UTC Date UNIX time TAI Date TAI-UTC UNIX Leap Time
==================== ========== =================== ======= ==============
1970-01-01T00:00:00Z 0 1970-01-01T00:00:08 +8 0
1999-12-31T23:59:28Z 946684768 2000-01-01T00:00:00 +32 946684792
1999-12-31T23:59:59Z 946684799 2000-01-01T00:00:31 +32 946684823
2000-01-01T00:00:00Z 946684800 2000-01-01T00:00:32 +32 946684824
2016-12-31T23:59:59Z 1483228799 2017-01-01T00:00:35 +36 1483228827
2016-12-31T23:59:60Z undefined 2017-01-01T00:00:36 +36 1483228828
2017-01-01T00:00:00Z 1483228800 2017-01-01T00:00:37 +37 1483228829
==================== ========== =================== ======= ==============

Functional Requirements

The Zephyr tick counter has no concept of leap seconds or standard time
offsets and is a continuous time scale. However it can be relatively
inaccurate, with drifts as much as three minutes per hour (assuming an RC
timer with 5% tolerance).

There are two stages required to support conversion between Zephyr time and
common human time scales:

  • Translation between the continuous but inaccurate Zephyr time scale and an
    accurate external stable time scale;
  • Translation between the stable time scale and the (possibly discontinuous)
    civil time scale.

The API around :c:func:timeutil_sync_state_update() supports the first step
of converting between continuous time scales.

The second step requires external information including schedules of leap
seconds and local time offset changes. This may be best provided by an
external library, and is not currently part of the time utility APIs.

Selecting an External Source and Time Scale

If an application requires civil time accuracy within several seconds then UTC
could be used as the stable time source. However, if the external source
adjusts to a leap second there will be a discontinuity: the elapsed time
between two observations taken at 1 Hz is not equal to the numeric difference
between their timestamps.

For precise activities a continuous scale that is independent of local and
solar adjustments simplifies things considerably. Suitable continuous scales
include:

  • GPS time: epoch of 1980-01-06T00:00:00Z, continuous following TAI with an
    offset of TAI-GPS=19 s.
  • Bluetooth Mesh time: epoch of 2000-01-01T00:00:00Z, continuous following TAI
    with an offset of -32.
  • UNIX Leap Time: epoch of 1970-01-01T00:00:00Z, continuous following TAI with
    an offset of -8.

Because C and Zephyr library functions support conversion between integral and
calendar time representations using the UNIX epoch, UNIX Leap Time is an ideal
choice for the external time scale.

The mechanism used to populate synchronization points is not relevant: it may
involve reading from a local high-precision RTC peripheral, exchanging packets
over a network using a protocol like NTP or PTP, or processing NMEA messages
received a GPS with or without a 1pps signal.

``timespec`` Concepts

Originally from POSIX, struct timespec has been a part of the C standard
since C11. The definition of struct timespec is as shown below.

.. code-block:: c

struct timespec {
time_t tv_sec; /* seconds /
long tv_nsec; /
nanoseconds */
};

The tv_nsec field is only valid with values in the range [0, 999999999]. The
tv_sec field is the number of seconds since the epoch. If struct timespec is
used to express a difference, the tv_sec field may fall into a negative range.


Doc Project Code Flow (`doc/project/code_flow.rst`)

.. _code-flow-and-branches:

Code Flow and Branches
######################

Introduction


The zephyr Git repository has three types of branches:

main
Which contains the latest state of development

collab-*
Collaboration branches that are used for shared development
of new features to be introduced into the main branch when ready. Creating a new
collaboration branch requires a justification and TSC approval. Collaboration branches
shall be based off the main branch and any changes developed in the collab
branch shall target the main development branch. For released versions of
Zephyr, the introduction of fixes and new features, if approved by the TSC,
shall be done using backport pull requests.

vx.y-branch
Branches which track maintenance releases based on a major
release

Development in collaboration branches before features go to mainline allows teams to
work independently on a subsystem or a feature, improves efficiency and
turnaround time, and encourages collaboration and streamlines communication
between developers.

Changes submitted to a collaboration branch can evolve and improve
incrementally in a branch, before they are submitted to the mainline tree for
final integration.

By dedicating an isolated branch to complex features, it's
possible to initiate in-depth discussions around new additions before
integrating them into the official project.

Collaboration branches are ephemeral and shall be removed once the collaboration work
has been completed. When a branch is requested, the proposal should include the
following:

  • Define exit criteria for merging the collaboration branch changes back into the main branch.
  • Define a timeline for the expected life cycle of the branch. It is
    recommended to select a Zephyr release to set the timeline. Extensions to
    this timeline requires TSC approval.

Roles and Responsibilities


Collaboration branch owners have the following responsibilities:

  • Use the infrastructure and tools provided by the project (GitHub, Git)

  • All changes to collaboration branches shall come in form of github pull requests.

  • Force pushing a collaboration branch is only allowed when rebasing against the main branch.

  • Review changes coming from team members and request review from branch owners
    when submitting changes.

  • Keep the branch in sync with upstream and update on a regular basis.

  • Push changes frequently to upstream using the following methods:

    • GitHub pull requests: for example, when reviews have not been done in the local
      branch (one-man branch).
    • Merge requests: When a set of changes has been done in a local branch and
      has been reviewed and tested in a collaboration branch.

Doc Project Communication (`doc/project/communication.rst`)

.. _communication-and-collaboration:

Communication and Collaboration
###############################

The Zephyr Discord Server <https://chat.zephyrproject.org>_ is the primary
chat forum used by Zephyr developers, contributors, and users.

The Zephyr project mailing lists <https://lists.zephyrproject.org/g/main/subgroups>_ are used as an additional
communication tool by project members, contributors, and the community. There
are specialized mailing lists for specific interests. Several lists are public
and open. Mailing lists are always available for use in situations where
Discord is unavailable or an unsuitable forum.

In general, bug reports and other issues should be reported as GitHub Issues <https://github.com/zephyrproject-rtos/zephyr/issues>_ and not broadcasted to
the mailing list. The same applies to code reviews.


Doc Project Dev Env And Tools (`doc/project/dev_env_and_tools.rst`)

.. _dev-environment-and-tools:

Development Environment and Tools
#################################

Code Review


GitHub is intended to provide a framework for reviewing every commit before it
is accepted into the code base. Changes, in the form of Pull Requests (PR) are
uploaded to GitHub but don't actually become a part of the project until they've
been reviewed, passed a series of checks (CI), and are approved by maintainers.
GitHub is used to support the standard open source practice of submitting
patches, which are then reviewed by the project members before being applied to
the code base.

Pull requests should be appropriately :ref:labeled<gh_labels>,
and linked to any relevant :ref:bug or feature tracking issues
.

The Zephyr project uses GitHub for code reviews and Git tree management. When
submitting a change or an enhancement to any Zephyr component, a developer
should use GitHub. GitHub Actions automatically assigns a responsible reviewer
on a component basis, as defined in the :zephyr_file:MAINTAINERS.yml file
stored with the code tree in the Zephyr project repository. A limited set of
release managers are allowed to merge a pull request into the main branch once
reviews are complete.

.. _review_time:

Give reviewers time to review before code merge

The Zephyr project is a global project that is not tied to a certain geography
or timezone. We have developers and contributors from across the globe. When
changes are proposed using pull request, we need to allow for a minimal review
time to give developers and contributors the opportunity to review and comment
on changes. There are different categories of changes and we know that some
changes do require reviews by subject matter experts and owners of the subsystem
being changed. Many changes fall under the "trivial" category that can be
addressed with general reviews and do not need to be queued for a maintainer or
code-owner review. Additionally, some changes might require further discussions
and a decision by the TSC or the Security working group. To summarize the above,
the diagram below proposes minimal review times for each category:

.. figure:: pull_request_classes.png
:align: center
:alt: Pull request classes
:figclass: align-center

text
Pull request classes

Workflow

  • An author of a change can suggest in his pull-request which category a change
    should belong to. A project maintainers or TSC member monitoring the inflow of
    changes can change the label of a pull request by adding a comment justifying
    why a change should belong to another category.
  • The project will use the label system to categorize the pull requests.
  • Changes should not be merged before the minimal time has expired.

Categories/Labels

Hotfix
Any change that is a fix to an issue that blocks developers from doing their
daily work, for example CI breakage, Test breakage, Minor documentation fixes
that impact the user experience.

Such fixes can be merged at any time after they have passed CI checks. Depending
on the fix, severity, and availability of someone to review them (other than the
author) they can be merged with justification without review by one of the
project owners.

Trivial
Trivial changes are those that appear obvious enough and do not require maintainer or code-owner
involvement. Such changes should not change the logic or the design of a
subsystem or component. For example a trivial change can be:

  • Documentation changes
  • Configuration changes
  • Minor Build System tweaks
  • Minor optimization to code logic without changing the logic
  • Test changes and fixes
  • Sample modifications to support additional configuration or boards etc.

Maintainer
Any changes that touch the logic or the original design of a subsystem or
component will need to be reviewed by the code owner or the designated subsystem
maintainer. If the code changes is initiated by a contributor or developer other
than the owner the pull request needs to be assigned to the code owner who will
have to drive the pull request to a mergeable state by giving feedback to the
author and asking for more reviews from other developers.

Security
Changes that appear to have an impact to the overall security of the system need
to be reviewed by a security expert from the security working group.

TSC and Working Groups
Changes that introduce new features or functionality or change the way the
overall system works need to be reviewed by the TSC or the responsible Working
Group. For example for :ref:breaking API changes , the
proposal needs to be presented in the Architecture meeting so that the relevant
stakeholders are made aware of the change.

A Pull-Request should have an Assignee

  • An assignee to a pull request should not be the same as the
    author of the pull-request
  • An assignee to a pull request is responsible for driving the
    pull request to a mergeable state
  • An assignee is responsible for dismissing stale reviews and seeking reviews
    from additional developers and contributors
  • Pull requests should not be merged without an approval by the assignee.

Pull Request should not be merged by author without review

All pull requests need to be reviewed and should not be merged by the author
without a review. The following exceptions apply:

  • Hot fixes: Fixing CI issues, reverts, and system breakage
  • Release related changes: Changing version file, applying tags and release
    related activities without any code changes.

Developers and contributors should always seek review, however there are cases
when reviewers are not available and there is a need to get a code change into
the tree as soon as possible.

Reviewers shall not 'Request Changes' without comments or justification

Any change requests (-1) on a pull request have to be justified. A reviewer
should avoid blocking a pull-request with no justification. If a reviewer feels
that a change should not be merged without their review, then: Request change
of the category: for example:

  • Trivial -> Maintainer
  • Assign Pull Request to yourself, this will mean that a pull request should
    not be merged without your approval.

Pull Requests should have at least 2 approvals before they are merged

A pull-request shall be merged only with two positive reviews (approval). Beside
the person merging the pull-request (merging != approval), two additional
approvals are required to be able to merge a pull request. The person merging
the request can merge without approving or approve and merge to get to the 2
approvals required.

Reviewers should keep track of pull requests they have provided feedback to

If a reviewer has requested changes in a pull request, he or she should monitor
the state of the pull request and/or respond to mention requests to see if his
feedback has been addressed. Failing to do so, negative reviews shall be
dismissed by the assignee or an owner of the repository. Reviews will be
dismissed following the criteria below:

  • The feedback or concerns were visibly addressed by the author

  • The reviewer did not revisit the pull request after 2 week and multiple pings
    by the author

  • The review is unrelated to the code change or asking for unjustified
    structural changes such as:

    • Split the PR
    • Can you fix this unrelated code that happens to appear in the diff
    • Can you fix unrelated issues
    • Etc.

Closing Stale Issues and Pull Requests

  • The Pull requests and issues sections on Github are NOT discussion forums.
    They are items that we need to execute and drive to closure.
    Use the mailing lists for discussions.
  • In case of both issues and pull-requests the original poster needs to respond
    to questions and provide clarifications regarding the issue or the change.
    After one week without a response to a request, a second attempt to elicit
    a response from the contributor will be made. After one more week without a
    response the item may be closed (draft and DNM tagged pull requests are
    excluded).

Continuous Integration


All changes submitted to GitHub are subject to tests that are run on
emulated platforms and architectures to identify breakage and regressions that
can be immediately identified. Testing using Twister additionally performs build tests
of all boards and platforms. Documentation changes are also verified
through review and build testing to verify doc generation will be successful.

Any failures found during the CI test run will result in a negative review
assigned automatically by the CI system.
Developers are expected to fix issues and rework their patches and submit again.

The CI infrastructure currently runs the following tests:

  • Run checkpatch for code style issues (can vote -1 on errors; see note)

  • Gitlint: Git commit style based on project requirements

  • License Check: Check for conflicting licenses

  • Run twister script

    • Run kernel tests in QEMU (can vote -1 on errors)
    • Build various samples for different boards (can vote -1 on errors)
  • Verify documentation builds correctly.

.. note::

checkpatch is a Perl script that uses regular expressions to
extract information that requires a C language parser to process
accurately. As such it sometimes issues false positives. Known
cases include constructs like:

text
.. code-block:: c

  static uint8_t __aligned(PAGE_SIZE) page_pool[PAGE_SIZE * POOL_PAGES];
  IOPCTL_Type *base = config->base;

Both lines produce a diagnostic regarding spaces around the *
operator: the first is misidentified as a pointer type declaration
that would be correct as PAGE_SIZE *POOL_PAGES while the second
is misidentified as a multiplication expression that would be correct
as IOPCTL_Type * base.

Maintainers can override the -1 in cases where the CI infrastructure
gets the wrong answer.

.. _gh_labels:

Labeling issues and pull requests in GitHub


The project uses GitHub issues and pull requests (PRs) to track and manage
daily and long-term work and contributions to the Zephyr project. We use
GitHub labels to classify and organize these issues and PRs by area, type,
priority, and more, making it easier to find and report on relevant items.

All GitHub issues or pull requests must be appropriately labeled.
Issues and PRs often have multiple labels assigned,
to help classify them in the different available categories.
When reviewing a PR, if it has missing or incorrect labels, maintainers shall
fix it.

This saves us all time when searching, reduces the chances of the PR or issue
being forgotten, speeds up reviewing, avoids duplicate issue reports, etc.

These are the labels we currently have, grouped by applicability:

Labels applicable to issues only

.. list-table::
:header-rows: 1

    • Label
    • Description
    • :guilabel:priority: {high|medium|low}

    • To classify the impact and importance of a bug.

      Note: Issue priorities are generally set or changed during the bug-triage or TSC
      meetings.

    • :guilabel:Regression
    • Something, which was working, but does not anymore (bug subtype).
    • :guilabel:Duplicate
    • This issue is a duplicate of another issue (please specify).
    • :guilabel:Good first issue
    • Good for a first time contributor to take.
    • :guilabel:Release Notes
    • Issues that need to be mentioned in release notes as known issues with
      additional information.

Labels applicable to pull requests only

The issue or PR describes a change to a stable API.

.. list-table::
:header-rows: 1

    • Label
    • Description
    • :guilabel:Hotfix
    • Fix for an issue blocking development.
    • :guilabel:Trivial
    • Simple changes that can have shorter review time and be reviewed by anyone, i.e. typos,
      straightforward one-liner bug fixes, etc.
    • :guilabel:Maintainer
    • Maintainer review required.
    • :guilabel:Security Review
    • To be reviewed by a security expert.
    • :guilabel:DNM
    • This PR should not be merged (Do Not Merge). For work in progress, GitHub
      "draft" PRs are preferred.
    • :guilabel:Needs review
    • The PR needs attention from the maintainers.
    • :guilabel:Backport
    • The PR is a backport or should be backported.
    • :guilabel:Licensing
    • The PR has licensing issues which require a licensing expert to review it.

.. note::
For all labels applicable to PRs: Please note that the label, together with
PR complexity, affects how long a merge should be held to ensure proper
review. See :ref:review process <review_time> for details.

Labels applicable to both pull requests and issues

.. list-table::
:header-rows: 1

    • Label
    • Description
    • :guilabel:area: {area-name}

    • Indicates Zephyr subsystems (e.g, :guilabel:area: Kernel, :guilabel:area: I2C,
      :guilabel:area: Memory Management), project functions (e.g., :guilabel:area: Debugging,
      :guilabel:area: Documentation, :guilabel:area: Process), or other categories (e.g.,
      :guilabel:area: Coding Style, :guilabel:area: MISRA-C) affected by the bug or the pull request.

      An area maintainer should be able to filter by an area label and find all issues
      and PRs which relate to that area.

    • :guilabel:platform: {platform-name}
    • An issue or PR which affects only a particular platform.
    • :guilabel:Breaking API Change
    • The issue or PR describes a breaking change to a stable API. See additional information
      in :ref:breaking_api_changes.
    • :guilabel:bug
    • The issue is a bug, or the PR is fixing a bug.
    • :guilabel:Coverity
    • A Coverity detected issue or its fix.
    • :guilabel:Waiting for response
    • The Zephyr developers are waiting for the submitter to respond to a question, or
      address an issue.
    • :guilabel:Blocked
    • Blocked by another PR or issue.
    • :guilabel:Stale
    • An issue or a PR which seems abandoned, and requires attention by the author.
    • :guilabel:In progress
    • For PRs: is work in progress and should not be merged yet. For issues: Is being
      worked on.
    • :guilabel:RFC
    • The author would like input from the community. For a PR it should be considered
      a draft.
    • :guilabel:LTS
    • Long term release branch related.
    • :guilabel:EXT
    • Related to an external component.

Doc Project Documentation (`doc/project/documentation.rst`)

.. _code-documentation:

Code Documentation
###################

API Documentation


Well documented APIs enhance the experience for developers and are an essential
requirement for defining an API's success. Doxygen is a general purpose
documentation tool that the zephyr project uses for documenting APIs. It
generates either an on-line documentation browser (in HTML) and/or provides
input for other tools that is used to generate a reference manual from
documented source files. In particular, doxygen's XML output is used as an input
when producing the Zephyr project's online documentation.

Reference to Requirements


APIs for the most part document the implementation of requirements or advertised
features and can be traced back to features. We use the API documentation as the
main interface to trace implementation back to documented features. This is done
using doxygen's native requirements traceability commands (@satisfies and
@verifies) that reference requirements maintained somewhere else in a
requirement catalogue.

Test Documentation


To help understand what each test does and which functionality it tests we also
document all test code using the same tools and in the same context and generate
documentation for all unit and integration tests maintained in the same
environment. Tests are documented using references to the APIs or functionality
they validate by creating a link back to the APIs and by adding a reference to
the original requirements.

Documentation Guidelines


Test Code

The Zephyr project uses several test methodologies, the most common being the
:ref:Ztest framework <test-framework>. Test documentation should only be done
on the entry test functions (usually prefixed with test_) and those that are
called directly by the Ztest framework. Those tests are going to appear in test
reports and using their name and identifier is the best way to identify them
and trace back to them from requirements.

Test documentation should not interfere with the actual API documentation and
needs to follow a new structure to avoid confusion. Using a consistent naming
scheme and following a well-defined structure we will be able to group this
documentation in its own module and identify it uniquely when parsing test data
for traceability reports. Here are a few guidelines to be followed:

  • All test code documentation should be grouped under the all_tests doxygen
    group
  • All test documentation should be under doxygen groups that are prefixed
    with tests_

Documenting a Requirement

A requirement is documented with the doxygen @requirement command, which
takes a unique identifier and an optional title. Doxygen collects all
requirements on a single page and allows them to be referenced from anywhere by
their identifier. Use a comment block dedicated to the requirement, typically
maintained in the requirement catalogue::

text
/**
* @requirement ZEPH-015 (Give a semaphore)
*
* The kernel shall provide a mechanism to give a semaphore, increasing its
* count up to its configured maximum.
*/

The identifier used here (for example ZEPH-015) is the same one referenced by
the @satisfies and @verifies commands below, which is what links the
implementation and tests back to the requirement.

The doxygen @verifies command signifies that a test verifies a
requirement::

text
/**
* @brief Tests for the Semaphore kernel object
* @defgroup kernel_semaphore_tests Semaphore
* @ingroup all_tests
* @{
*/

...
/**
* @brief A brief description of the tests
* Some details about the test
* more details
*
* @verifies ZEPH-015
*/
void test_sema_thread2thread(void)
{
...
}
...

/**
* @}
*/

To get coverage of how an implementation or a piece of code satisfies a
requirement, we use the doxygen @satisfies command::

text
/**
* @brief Give a semaphore.
*
* This routine gives @a sem, unless the semaphore is already at its maximum
* permitted count.
*
* @note Can be called by ISRs.
*
* @param sem Address of the semaphore.
*
* @satisfies ZEPH-015
*/
__syscall void k_sem_give(struct k_sem *sem);

To generate the matrix, you will first need to build the documentation,
specifically you will need to build the doxygen XML output::

$ make doxygen

Parse the generated XML data from doxygen to generate the traceability matrix.


Doc Project Index (`doc/project/index.rst`)

.. _development_model:

Project and Governance
#######################

.. toctree::
:maxdepth: 1

tsc
project_roles
working_groups
release_process
proposals
code_flow
dev_env_and_tools
issues
communication
documentation

The Zephyr project defines a development process workflow using GitHub
Issues to track feature, enhancement, and bug reports together with GitHub
Pull Requests (PRs) for submitting and reviewing changes. Zephyr
community members work together to review these Issues and PRs, managing
feature enhancements and quality improvements of Zephyr through its regular
releases, as described in :ref:release_process.

We can only manage the volume of Issues and PRs, by requiring timely reviews,
feedback, and responses from the community and contributors, both for initial
submissions and for followup questions and clarifications. Read about the
project's :ref:development processes and tools <dev-environment-and-tools>
and specifics about :ref:review timelines <review_time> to learn about the
project's goals and guidelines for our active developer community.

:ref:project_roles describes in detail the Zephyr project roles and associated permissions
with respect to the development process workflow.

Terminology


  • mainline: The main tree where the core functionality and core features are
    being developed.
  • subsystem/feature branch: is a branch within the same repository. In our case,
    we will use the term branch also when referencing branches not in the same
    repository, which are a copy of a repository sharing the same history.
  • upstream: A parent branch the source code is based on. This is the branch you
    pull from and push to, basically your upstream.
  • LTS: Long Term Support

Doc Project Issues (`doc/project/issues.rst`)

.. _bug_reporting:

Bug Reporting
##############

To maintain traceability and relation between proposals, changes, features, and
issues, it is recommended to cross-reference source code commits with the
relevant GitHub issues and vice versa.
Any changes that originate from a tracked feature or issue should contain a
reference to the feature by mentioning the corresponding issue or pull-request
identifiers.

At any time it should be possible to establish the origin of a change and the
reason behind it by following the references in the code.

Reporting a regression issue


It could happen that the issue being reported is identified as a regression,
as the use case is known to be working on earlier commit or release.
In this case, providing directly the guilty commit when submitting the bug
gains a lot of time in the eventual bug fixing.

To identify the commit causing the regression, several methods could be used,
but tree bisecting method is an efficient one that doesn't require deep code
expertise and can be used by every one.

For this, git bisect_ is the recommended tool.

Recommendations on the process:

  • Run west update on each bisection step.
  • Once the bisection is over and a culprit identified, verify manually the result.

.. _git bisect:
https://git-scm.com/docs/git-bisect


Doc Project Project Roles (`doc/project/project_roles.rst`)

.. _project_roles:

TSC Project Roles


Project Roles
#############

You can participate in the Zephyr Project as a Contributor, Collaborator, or Maintainer.

Contributor: Any community member who contributes code, documentation, or other assets to the
project.

Collaborator: An active Contributor who is involved in one or more areas of the project.

Maintainer: A lead Collaborator responsible for a specific area or subsystem within the project.
Maintainers also serve as representatives for their area on the Technical Steering Committee (TSC)
as needed.

Areas in this context refer to specific subsystems, components, or modules within
the Zephyr Project codebase. Examples of areas include, but are not limited to, networking,
file systems, device drivers, architecture support, and board support packages (boards and SoC
definitions).

Areas in the project should at least have one Maintainer and may have multiple Collaborators.
Depending on the size and complexity of the area, there may be multiple Maintainers as well,
however, the number of maintainers should be kept to a practical minimum to ensure effective
management and decision-making.

.. _contributor:

Contributor
+++++++++++

A Contributor is a developer who wishes to contribute to the project,
at any level.

Contributors are granted the following rights and responsibilities:

  • Right to contribute code, documentation, translations, artwork, etc.
  • Right to report defects (bugs) and suggestions for enhancement.
  • Right to participate in the process of reviewing contributions by others.
  • Right to participate in the feature development process.
  • Responsibility to abide by decisions, once made. They are welcome to
    provide new, relevant information to reopen decisions.
  • Responsibility for issues and bugs introduced by one’s own contributions.
  • Responsibility to respect the rules of the community.
  • Responsibility to provide constructive advice whenever participating in
    discussions and in the review of contributions.
  • Responsibility to follow the project’s code of conduct
    (https://github.com/zephyrproject-rtos/zephyr/blob/main/CODE_OF_CONDUCT.md)

Zephyr Contributor Badge

When your first contribution to the Zephyr project gets merged, you'll become
eligible to claim your Zephyr Contributor Badge. This digital badge can be
displayed on your website, blog, social media profile, etc. It will allow you to
showcase your involvement in the Zephyr project and help raise its awareness.

You may apply for your Contributor Badge by filling out the Zephyr Contributor Badge form_.

.. _collaborator:

Collaborator
++++++++++++

A Collaborator is a Contributor who is also participating in the maintenance
of Zephyr source code. Their input weighs more when decisions are made, in a
fully meritocratic fashion.

You become a collaborator by showing consistent involvement in the project,
including making significant contributions to the project over a period of
time and by participating in the development and review of at least one area.

To request to become a Collaborator, submit a pull request adding yourself
to the collaborators section of an area in the :ref:maintainers_file and
notify the maintainers of that area. The addition needs to be approved by
the maintainers of that area.

Collaborators have the following rights and responsibilities, in addition to
those listed for Contributors:

  • Right to participate in setting goals for the short and medium terms for the
    area being maintained, alongside the maintainers of that area.
  • Responsibility to participate in the feature development process.
  • Responsibility to review relevant code changes within reasonable time.
  • Responsibility to ensure the quality of the code to expected levels.
  • Responsibility to participate in community discussions.
  • Responsibility to mentor new contributors when appropriate
  • Responsibility to participate in the quality verification and release
    process, when those happen.

Collaborator change requests on pull requests should
be addressed by the original submitter. In cases where the changes requested do
not follow the :ref:expectations <reviewer-expectations> and the guidelines
of the project or in cases of disagreement, it is the responsibility of the
assignee to advance the review process and resolve any disagreements.

Collaborator approval of pull requests are counted toward the minimum required
approvals needed to merge a PR. Other criteria for merging may apply.

.. _maintainer:

Maintainer
++++++++++

A Maintainer is a Collaborator who is also responsible for knowing,
directing and anticipating the needs of a given zephyr source code area.

An individual may become a maintainer of a given area by demonstrating
sustained and meaningful contributions over time. This includes:

  • Making significant technical contributions to the area.
  • Actively participating in the development process, including code reviews and
    design discussions.
  • Establishing familiarity with the architecture, constraints,
    and evolution of the area.

Maintainer status may also be granted when introducing a new area or subsystem to the project as its original author while demonstrating recognized expertise and long-term commitment to the area.

In all cases, maintainership reflects both technical ownership and ongoing
engagement with the community supporting that area.

To request to become a Maintainer, submit a pull request adding yourself
to the maintainers section of an area in the :ref:maintainers_file and
notify the existing maintainers of that area. The addition needs to be approved by
the maintainers of that area.

Usually, there's only one maintainer but depending on the area, there may be
multiple maintainers sharing the responsibility.

Maintainers have the following rights and responsibilities,
in addition to those listed for Contributors and Collaborators:

  • Right to set the overall architecture of the relevant subsystems or areas
    of involvement.
  • Right to make decisions in the relevant subsystems or areas of involvement,
    in conjunction with the collaborators and submitters.
    See :ref:pr_technical_escalation.
  • Responsibility to convey the direction of the relevant subsystem or areas to
    the TSC
  • Responsibility to ensure all contributions of the project have been reviewed
    within reasonable time.
  • Responsibility to enforce the Code of Conduct. As leaders in the community,
    maintainers are expected to be role models in upholding the project's code
    of conduct and creating a welcoming and inclusive environment for everyone.
  • Responsibility to triage static analysis issues in their code area.
    See :ref:static_analysis.

Maintainer approval of pull requests are counted toward the minimum
required approvals needed to merge a PR. Other criteria for merging may apply.

Teams and Supporting Activities
###############################

Assignee
++++++++

An Assignee is one of the maintainers of an area being changed in a pull request.

Assignees are set automatically based on the code being changed. Other
Maintainers or the Release Engineering team can set assignees when the latter is
not possible, or when another assignee is more appropriate, in this last case
documenting in a comment the motivation for the change.

  • Responsibility to drive the pull request to a mergeable state
  • Right to dismiss stale and unrelated reviews or reviews not following
    :ref:expectations <reviewer-expectations> from reviewers and seek reviews
    from additional maintainers, developers and contributors
  • Right to block pull requests from being merged until issues or changes
    requested are addressed
  • Responsibility to re-assign a pull request if they are the original submitter
    of the code
  • Solicit approvals from maintainers of the subsystems affected
  • Responsibility to drive the :ref:pr_technical_escalation process

Static Analysis Audit Team
++++++++++++++++++++++++++

The Static Analysis Audit team works closely with the release engineering
team to ensure that static analysis defects opened during a release
cycle are properly addressed. The team has the following rights and
responsibilities:

  • Right to revert any triage in a static analysis tool (e.g: Coverity)
    that does not follow the project expectations.
  • Responsibility to inform code owners about improper classifications.
  • Responsibility to alert TSC if any issues are not adequately addressed by the
    responsible code owners.

Joining the Static Analysis Audit team

  • Contributors highly involved in the project with some expertise
    in static analysis.

.. _release-engineering-team:

Release Engineering Team
++++++++++++++++++++++++

A team of active Maintainers involved in multiple areas.

  • The members of the Release Engineering team are expected to fill
    the Release Manager role based on a defined cadence and selection process.
  • The cadence and selection process are defined by the Release Engineering
    team and are approved by the TSC.
  • The team reports directly into the TSC.

Release Engineering team has the following rights and responsibilities:

  • Right to merge code changes to the zephyr tree following the project rules.
  • Right to revert any changes that have broken the code base
  • Right to close any stale changes after months of no activity
  • Responsibility to take directions from the TSC and follow them.
  • Responsibility to coordinate code merges with maintainers.
  • Responsibility to merge all contributions regardless of their
    origin and area if they have been approved by the respective
    maintainers and follow the merge criteria of a change.
  • Responsibility to keep the Zephyr code base in a working and passing state
    (as per CI)

Joining the Release Engineering team

  • Maintainers highly involved in the project may be nominated
    by a TSC voting member to join the Release Engineering team.
    Nominees may become members of the team by approval of the
    existing TSC voting members.
  • To ensure a functional Release Engineering team the TSC shall
    periodically review the team’s followed processes,
    the appropriate size, and the membership
    composition (ensure, for example, that team members are
    geographically distributed across multiple locations and
    time-zones).

Release Manager
+++++++++++++++

A Maintainer responsible for driving a specific release to
completion following the milestones and the roadmap of the
project for this specific release.

  • TSC has to approve a release manager.

A Release Manager is a member of the Release Engineering team and has
the rights and responsibilities of that team in addition to
the following:

  • Right to manage and coordinate all code merges after the
    code freeze milestone (M3, see program management overview <https://wiki.zephyrproject.org/Program-Management>_.)
  • Responsibility to drive and coordinate the triaging process
    for the release
  • Responsibility to create the release notes of the release
  • Responsibility to notify all stakeholders of the project,
    including the community at large about the status of the
    release in a timely manner.
  • Responsibility to coordinate with QA and validation and
    verify changes either directly or through QA before major
    changes and major milestones.

Roles / Permissions
+++++++++++++++++++

.. table:: Project Roles vs GitHub Permissions
:widths: 20 20 10 10 10 10 10
:align: center

text
================ =================== =========== ================ =========== =========== ============
      ..             ..               **Admin**  **Merge Rights**   Member      Owner     Collaborator
---------------- ------------------- ----------- ---------------- ----------- ----------- ------------
Main Roles       Contributor                                                                 x
---------------- ------------------- ----------- ---------------- ----------- ----------- ------------
    ..           Collaborator                                       x
---------------- ------------------- ----------- ---------------- ----------- ----------- ------------
    ..           Maintainer                                         x
Supportive Roles QA/Validation                                      x                        x
    ..           DevOps                   **x**
    ..           System Admin             **x**                                      x
    ..           Release Engineering                 **x**          x

================ =================== =========== ================ =========== =========== ============

Role Retirement
###############

Individuals approved by the TSC or representatives of the TSC to fill a project
role who are no longer actively fulfilling the rights and responsibilities
associated with their role may be requested by the TSC to retire from that role.

Retirements of inactive maintainers or collaborators are reflected by removing the
individual's GitHub user name from the relevant sections of the
:ref:maintainers_file in the Zephyr repository and may be initiated by the
TSC, representatives of the TSC or by the individuals themselves. Maintainers
may also initiate the removal of inactive collaborators in their area.

A maintainer may object to being retired, and request a decision by the TSC.

.. _maintainers_file:

MAINTAINERS File
################

The following guidelines apply to the structure, scope, and maintenance of the
MAINTAINERS file.

  • The MAINTAINERS file shall have designated individuals responsible for the
    accuracy, structure, and upkeep of the file, in accordance with the Zephyr
    Project Charter. These individuals shall be appointed by the TSC.

  • The granularity of maintainership should remain practical and manageable.

  • The TSC, in collaboration with existing maintainers and contributors, should
    actively identify and encourage contributors to step up as maintainers for
    orphaned areas of the codebase and should facilitate the assignment of
    maintainers to those components.

  • Unmaintained areas shall be clearly marked as such in the MAINTAINERS file.

  • Updates to the MAINTAINERS file should:

    • Generally be included as standalone commits when introducing new files or
      directories.
    • Major changes, including the addition of new areas and new maintainers,
      should be submitted as separate pull requests, requiring approval by the
      MAINTAINERS file’s maintainers. Such activities might be the result of splitting
      existing large areas into smaller ones or merging smaller areas.

Guidelines for assigning maintainers to different areas of the codebase:

Architectures, core components, subsystems, samples, and tests:
Each area shall have an explicitly assigned maintainer.

Boards (including related samples and tests) and SoCs (including DTS definitions)
Each board and SoC should have an explicitly assigned maintainer through a
platform area covering the boards, SoCs, and their related components and
drivers.

Drivers / Backends
The area of the API level shall have a maintainer and specific driver
implementations or backends shall also be covered through a platform area covering
the driver implementation. The driver area or the subsystem maintainers are
assigned in case of changes to driver instances or backends.

.. _Zephyr Contributor Badge form: https://forms.gle/oCw9iAPLhUsHTapc8


Doc Project Proposals (`doc/project/proposals.rst`)

.. _feature-tracking:

Feature Tracking
#################

To propose something new to the Zephyr Project:

#. Start by searching existing issues <https://github.com/zephyrproject-rtos/zephyr/issues>_ to see if there
is prior work on the area.
#. If not, feel free to create a new issue <https://github.com/zephyrproject-rtos/zephyr/issues/new/choose>_ of
the appropriate type (Enhancement, RFC/Proposal, etc.)

You should contact an assigned owner if you'd like to discuss or contribute to
an existing issue's implementation.

.. note::

Previously, the project used GitHub labels <https://docs.github.com/en/issues/using-labels-and-milestones-to-track-work/managing-labels>_
to track feature-related work. You may find issues with labels like
"Feature" or "Enhancement".

These labels are deprecated for new issues, which should be of the
appropriate type instead. For example, create an issue of type Enhancement
instead of adding the Enhancement label to a new issue.

Roadmap and Release Plans


Project roadmaps and release plans are both important tools for the project, but
they have very different purposes and should not be confused. A project roadmap
communicates the high-level overview of a project's strategy, while a release
plan is a tactical document designed to capture and track the features planned
for upcoming releases.

  • The project roadmap communicates the why; a release plan details the what
  • A release plan spans only a few months; a product roadmap might cover a year
    or more

Project Roadmap

The project roadmap should serve as a high-level, visual summary of the
project's strategic objectives and expectations.

If built properly, the roadmap can be a valuable tool for several reasons. It
can help the project present its plan in a compelling way to existing and new
stakeholders, to help recruit new members and it can be a helpful resource the
team and community can refer to throughout the project's development, to ensure
they are still executing according to plan.

As such, the roadmap should contain only strategic-level details, major project
themes, epics, and goals.

Release Plans

The release plan comes into play when the project roadmap's high-level strategy
is translated into an actionable plan built on specific features, enhancements,
and fixes that need to go into a specific release or milestone.

The release plan communicates those features and enhancements slated for your
project' next release (or the next few releases). So it acts as more of a
project plan, breaking the big ideas down into smaller projects the community
and main stakeholders of the project can make progress on.


Doc Project Release Process (`doc/project/release_process.rst`)

.. _release_process:

Release Process
###############

The Zephyr project releases on a time-based cycle, rather than a feature-driven
one. Zephyr releases represent an aggregation of the work of many contributors,
companies, and individuals from the community.

A time-based release process enables the Zephyr project to provide users with a
balance of the latest technologies and features and excellent overall quality. A
roughly 6-month release cycle allows the project to coordinate development of
the features that have actually been implemented, allowing the project to
maintain the quality of the overall release without delays because of one or two
features that are not ready yet.

Release Phases Overview


Each release cycle consists of a development phase followed by a
stabilization phase. Release candidates will be created during the
stabilization phase.

During the development phase, all sorts of changes can be merged. This is
called the merge window for the main branch for this reason. During the
stabilization phase, the project and its maintainers focus on fixing bugs and
documenting the release. During this time, new features are generally not
accepted. The main branch is in feature freeze during the stabilization
phase.

.. figure:: release_cycle.svg
:align: center
:alt: Release Cycle
:figclass: align-center
:width: 80%

text
Release Cycle

The milestones for the current major version can be found on the
Official GitHub Wiki <https://github.com/zephyrproject-rtos/zephyr/wiki/Release-Management>_.
Information on previous releases can be found :ref:here <zephyr_release_notes>.

.. note::

After each stable release is made, a new "release branch" for that release
is created.

For example, after Zephyr stable release v4.4.0 was announced, a new branch
v4.4-branch was created. Commits intended for v4.4.x point releases
(v4.4.1, v4.4.2, etc.) should be proposed with that branch as a target.

This page currently does not document the point release process in detail.

.. _merge_window:

Merge Window (Development Phase)

After tagging a release, the release managers open the main branch <https://github.com/zephyrproject-rtos/zephyr/tree/main>_ for development for
the next release cycle. We call this time the merge window or the
development phase for each release. During the merge window, any code which
meets the :ref:merge_criteria can be merged into the main branch. Most
changes for each release are made during its merge window.

Each release's merge window lasts approximately five months.

After the merge window, the release team tags the first release candidate for
the upcoming release. At that point, the main branch is closed for most feature
development, and the project is in :ref:feature freeze <feature_freeze> for
the next release. Feature freeze is described in the next section.

Here is an example timeline for a merge window:

  • the merge window opened when v4.3.0 <https://github.com/zephyrproject-rtos/zephyr/tree/v4.3.0>_ was tagged on 13
    November 2025. At this point, the main branch was open for merges for the
    next release, which was v4.4.0.

  • the merge window for v4.4.0 closed when v4.4.0-rc1 <https://github.com/zephyrproject-rtos/zephyr/tree/v4.4.0-rc1>_ was tagged
    on 24 March 2026. At this time, the project entered feature freeze for the
    v4.4.0 release.

.. _feature_freeze:

Feature Freeze (Stabilization Phase)

When the first release candidate is tagged, the release's merge window is
closed. This is called the feature freeze or stabilization phase for that
release. During feature freeze, no new features will be merged for that release
without a :ref:tsc approved exception.

Please be patient during the stabilization phase while waiting for pull request
review for new features.

As mentioned, the exception process for merging features during the feature
freeze requires TSC approval and a justification. As a general rule, if your
pull request is not yet merged and feature freeze is declared, the best thing
to do is to wait for the next :ref:merge window <merge_window> to open.

If you believe your feature merits an exception and should be merged during
feature freeze, contact the TSC. See the TSC wiki <https://github.com/zephyrproject-rtos/zephyr/wiki/Technical-Steering-Committee-%28TSC%29>_
page for general contact information.

Here is an example timeline for a feature freeze:

  • The feature freeze for v4.4.0 began when v4.4.0-rc1 <https://github.com/zephyrproject-rtos/zephyr/tree/v4.4.0-rc1>_ was tagged
    on 24 March 2026. At that time, new features required a TSC exception
    in order to be merged to the main branch.

  • The feature freeze for v4.4.0 ended when v4.4.0 <https://github.com/zephyrproject-rtos/zephyr/tree/v4.4.0>_ was tagged on 14
    April 2026. At that time, the main branch was open again for the next
    release's :ref:merge window <merge_window>.

The following sections describe the feature freeze in more detail.

Allowed Changes

After feature freeze, only stabilization-related changes shall be accepted:

  • Bug fixes addressing functional defects
  • Stabilization fixes improving reliability, build stability, or test behavior
  • Documentation updates (clarifications, corrections, improvements)
  • Tests for existing functionality (no new feature enablement)

For more details on when certain changes are accepted, see :ref:table <release_milestones>.

Exceptions to these allowed changes are rare and require both explicit
justification and TSC approval. As a general rule, if a feature misses the
development phase window, it should wait for the next development cycle.

Disallowed Changes

The following changes shall not be accepted after feature freeze:

  • New features or feature enhancements
  • API changes, unless required to resolve a critical defect
  • Refactoring not directly tied to a bug fix or stabilization effort
  • New subsystems, drivers, boards, or architectural changes

Issue Tracking during Feature Freeze


Referencing a GitHub issue in a pull request is recommended but not required
during feature freeze.

Pull requests must include a clear description of:

  • The issue being addressed
  • The impact of the issue
  • How the change resolves the issue

Maintainers and release engineers may request additional clarification when
the intent or scope of a pull request is not clear.

Mandatory Issue Usage

A GitHub issue shall be required in the following cases:

  • Release blockers
  • Fixes targeting maintenance of already released branches

Review and Approval

All pull requests shall follow the standard review and approval process.

Maintainers shall ensure that:

  • Changes comply with this policy
  • Scope is minimal and focused on stabilization
  • Risk is appropriate for the release phase

Release engineers may:

  • Reject or defer changes based on risk assessment
  • Request changes or additional justification

Risk Expectations

Changes accepted during stabilization shall be:

  • Minimal in scope
  • Low risk
  • Adequately tested

Changes introducing significant risk may be deferred to a future release,
even if they qualify as bug fixes.

.. _merge_criteria:

Pull Request Merge Criteria


The following criteria apply during all release phases.

.. figure:: img/img_release_activity.png
:width: 663px
:align: center
:alt: Release Activity

  • All :ref:pr_requirements must be met.

  • Minimal of 2 approvals, including an approval by the designated assignee.

  • Pull requests should be reviewed by at least a maintainer or collaborator of
    each affected area; Unless the changes to a given area are considered trivial
    enough, in which case approvals by other affected subsystems
    maintainers/collaborators would suffice.

  • Four eye principle on the organisation level. We already require at least 2
    approvals (basic four eye principle), however, such reviews and approvals
    might be unintentionally biased in the case where the submitter is from the
    same organisation as the approvers. To allow for project wide review and
    approvals, the merge criteria is extended with the guidelines below:

    • Changes or additions to common and shared code shall have approvals from
      different organisations (at least one approval from an
      organisation different than the submitters').
      Common and shared code is defined as anything that does not fall under
      :file:soc, :file:boards and :file:drivers/*/*.
    • Changes or additions to hardware support (driver, SoC, boards) shall at
      least have the merger be from a different organisation. This applies only
      to implementation of an API supporting vendor specific hardware and not the
      APIs.
    • Release engineers may make exceptions for areas with contributions primarily
      coming from one organisation and where reviews from other organisations are
      not possible, however, merges shall be completed by a person from a different
      organisation. In such cases, the minimum review period of at least 2 days
      shall be strictly followed to allow for additional reviews.
    • Release engineers shall not merge code changes originating and reviewed
      only by their own organisation. To be able to merge such changes, at least
      one review shall be from a different organisation.
  • A minimum review period of 2 business days, 4 hours for trivial changes (see
    :ref:review_time).

  • Hotfixes can be merged at any time after CI has passed and are excluded from
    most of the conditions listed above.

  • All required checks are passing:

    • Device Tree
    • Documentation
    • Code linters (Gitlint, Pylint, Ruff, Sphinx, etc.)
    • Identity/Emails
    • Kconfig
    • License checks
    • Checkpatch (Coding Style)
    • Integration Tests (Via twister) on emulation/simulation platforms
    • Simulated Bluetooth Tests

.. _release_quality_criteria:

Release Quality Criteria


The main motivation is to clearly have the criteria in place that must be met
for a release. This will help define when a release is "done" in terms that most
people can understand and in ways that help new people to understand the process
and participate in creating successful releases:

  • The release criteria documents all the requirements of our target audience for
    each Zephyr release
  • The target audiences for each release can be different, and may overlap
  • The criteria at any given time are not set in stone: there may be requirements
    that have been overlooked, or that are new, and in these cases, the criteria
    should be expanded to ensure all needs are covered.

Below is the high level criteria to be met for each release:

  • No blocker bugs / blocking issues
  • All relevant tests shall pass on Tier 0 platforms
  • All relevant tests shall pass on Tier 0 and 1 platforms (at least 1 per
    architecture/architecture variant/Hardware features)
  • All applicable samples/tests shall build on Tiers 0, 1 and 2
  • All high and critical static analysis and security issues addressed
  • Release Notes are up-to-date.

Blocker Bugs

Blocker bug process kicks in during the release process and is in effect after the
feature freeze milestone. An issue labeled as a blocker practically blocks a
release from happening. All blocker bugs shall be resolved before a release is
created.

A fix for a bug that is granted blocker status can be merged to 'main' and included in
the release all the way until the final release date.

Bugs of moderate severity and higher that have impact on all users are typically
the candidates to be promoted to blocker bugs

Contributors and member of the release engineering team shall follow these
guidelines for release blocker bugs:

  • Only mark bugs as blockers if the software (Zephyr) must not be released with
    the bug present.
  • All collaborators can add or remove blocking labels.
  • Evaluate bugs as potential blockers based on their severity and prevalence.
  • Provide detailed rationale whenever adding or removing a blocking label.
  • Ensure all blockers have the milestone tagged.
  • Release managers have final say on blocking status; contact them with any questions.

.. _release_milestones:

Release Milestones


This table documents milestones associated with each release.

.. list-table:: Release Milestones
:widths: 15 25 100 25
:header-rows: 1

    • Timeline
    • Checkpoint
    • Description
    • Owner
    • T-5M
    • Planning
    • Finalize dates for release, Assign release owner and agree on project wide goals for this release.
    • TSC
    • T-7W
    • Review target milestones
    • Finalize target milestones for features in flight.
    • Release Engineering
    • T-5W
    • Release Announcement
    • Release owner announces feature freeze and timeline for release.
    • Release Manager
    • T-4W
    • Release Timeline reminder
    • Release owner sends a reminder of the feature freeze and timeline for release.
    • Release Manager
    • T-3W
    • Feature Freeze (RC1)
    • After RC1, no new features may be introduced. Only stabilization,
      cosmetic updates, bug fixes, documentation improvements, and new tests
      for existing features are permitted.
    • Release Engineering
    • T-2W
    • 2nd Release Candidate
    • No new features after RC2, ONLY stabilization and cosmetic changes, bug and doc fixes are allowed.
    • Release Manager
    • T-1W
    • Hard Freeze (RC3)
    • Only blocker bug fixes after RC3, documentation improvements and changes
      to release notes are allowed.
      Release notes need to be complete by this checkpoint. Release Criteria is
      met.
    • Release Manager
    • T-0W
    • Release
    • Release Manager

.. _release_process_lts:

Long Term Support (LTS) Releases


Long-term support releases are designed to be supported and maintained
for an extended period and are the recommended release for
products and the auditable branch used for certification.

An LTS release is defined as:

  • Product focused
  • Extended Stabilisation period: Allow for more testing and bug fixing
  • Stable APIs
  • Quality Driven Process
  • Long Term: Maintained for an extended period of time (at least 5 years).

Product Focused

Zephyr LTS is the recommended release for product makers with an extended
support and maintenance which includes general stability and bug fixes,
security fixes.

An LTS includes both mature and new features. API and feature maturity is
documented and tracked. The footprint and scope of mature and stable APIs expands
as we move from one LTS to the next giving users access to bleeding edge features
and new hardware while keeping a stable foundation that evolves over time.

Extended Stabilisation Period

Zephyr LTS development cycle differs from regular releases and has an extended
stabilization period. Feature freeze of regular releases happens 3-4 weeks
before the scheduled release date. The stabilization period for LTS is extended
by 3 weeks with the feature freeze occurring 6-7 weeks before the anticipated
release date. The time between code freeze and release date is extended in this case.

Stable APIs

Zephyr LTS provides a stable and long-lived foundation for developing
products. To guarantee stability of the APIs and the implementation of such
APIs it is required that any release software that makes the core of the OS
went through the Zephyr API lifecycle and stabilized over at least 2 releases.
This guarantees that we release many of the highlighted and core features with
mature and well-established implementations with stable APIs that are
supported during the lifetime of the release LTS.

  • API Freeze (LTS - 2)

    • All stable APIs need to be frozen 2 releases before an LTS. APIs can be extended
      with additional features, but the core implementation is not modified. This
      is valid for the following subsystems for example:

      • Device Drivers (i2c.h, spi.h)...
      • Kernel (k_*):
      • OS services (logging,debugging, ..)
      • DTS: API and bindings stability
      • Kconfig
    • New APIs for experimental features can be added at any time as long as they
      are standalone and documented as experimental or unstable features/APIs.

  • Feature Freeze (LTS - 1)

    • No new features or overhaul/restructuring of code covering major LTS features.

      • Kernel + Base OS
      • Additional advertised LTS features
    • Auxiliary features on top of and/or extending the base OS and advertised LTS features
      can be added at any time and should be marked as experimental if applicable

Quality Driven Process

The Zephyr project follows industry standards and processes with the goal of
providing a quality oriented releases. This is achieved by providing the
following products to track progress, integrity and quality of the software
components provided by the project:

  • Compliance with published coding guidelines, style guides and naming
    conventions and documentation of deviations.

  • Static analysis reports

    • Regular static analysis on the complete tree using available commercial and
      open-source tools, and documentation of deviations and false positives.
  • Documented components and APIS

  • Requirements Catalog

  • Verification Plans

  • Verification Reports

  • Coverage Reports

  • Requirements Traceability Matrix (RTM)

  • SPDX License Reports

Each release is created with the above products to document the quality and the
state of the software when it was released.

Long Term Support and Maintenance

LTS releases are published every 2.5 to 3 years and are branched and maintained independently from
the main tree for approximately 5 years after they were released.

Support is provided in three main phases:

  • Phase 1 (first 2 years): General bug fixes and security fixes, including platform and driver
    fixes.
  • Phase 2 (following 3+ years): Security and OS stability fixes only.
  • Phase 3: Extended support may be available through third parties (details to be determined).

Support for a given LTS release (LTS N) continues until the initial release of the LTS two
versions ahead (LTS N+2). A final release of LTS N occurs shortly after the initial release of
LTS N+2.

The list of currently supported LTS releases and their EOL dates can be found
:ref:here <supported_releases>.

.. mermaid::
:caption: Long Term Support Release

gitGraph
commit id: "3.5"
commit id: "3.6"
commit id: "3.7"
branch "LTS"
checkout "LTS"
commit id: "3.7.1"
commit id: "3.7.2"
checkout main
commit id: "4.0"
commit id: "4.1"

Changes and fixes flow in both directions. However, changes from main branch to an
LTS branch will be limited to fixes that apply to both branches and for existing
features only.

All fixes for an LTS branch that apply to the mainline tree shall be submitted to
mainline tree as well.

Auditable Code Base

An auditable code base is to be established from a defined subset of Zephyr OS
features and will be limited in scope. The LTS, development tree, and the
auditable code bases shall be kept in sync after the audit branch is created,
but with a more rigorous process in place for adding new features into the audit
branch used for certification.

This process will be applied before new features move into the
auditable code base.

The initial and subsequent certification targets will be decided by the Zephyr project
governing board.

Processes to achieve selected certification will be determined by the Security and
Safety Working Groups and coordinated with the TSC.

Host Tools Support Policy


This section documents policies related to host tools required to develop
zephyr applications.

Python Version Policy

Zephyr tracks the Python upstream release schedule_ when determining its minimum supported Python
version.

The minimum supported version is selected to balance long-term support and practical availability in
mainstream, actively supported Linux distributions (e.g. current Ubuntu LTS and Debian Stable
releases).

A Python version is considered for removal when:

  • It is approaching or has reached upstream end-of-life (EOL), and
  • Newer Python versions are broadly available in current, actively supported major Linux
    distributions.

.. _Python upstream release schedule: https://devguide.python.org/versions/

Hardware Support Tiers


This section documents a rough set of tiers associated with hardware platforms.
These criteria are not currently formally enforced or evaluated at a board,
architecture, or SoC level.

Tier 0: Emulation Platforms

  • Tests are both built and run in these platforms in CI, and therefore runtime
    failures can block Pull Requests.
  • Supported by the Zephyr project itself, commitment to fix bugs in releases.
  • One Tier 0 platform is required for each new architecture.
  • Bugs reported against platforms of this tier are to be evaluated and treated as
    a general bug in Zephyr and should be dealt with the highest priority.

Tier 1: Supported Platforms

  • Commitment from a specific team to run tests using twister device
    testing for the "Zephyr compatibility test suite" (details TBD)
    on a regular basis using open-source and publicly available drivers.
  • Commitment to fix bugs in time for releases. Not supported by "Zephyr Project"
    itself.
  • General availability for purchase
  • Bugs reported against platforms of this tier are to be evaluated and treated
    as a general bug in Zephyr and should be dealt with medium to high priority.

Tier 2: Community Platforms

  • Platform implementation is available in upstream, no commitment to testing,
    may not be generally available.
  • Has a dedicated maintainer who commits to respond to issues / review patches.
  • Bugs reported against platforms of this tier are NOT considered as
    a general bug in Zephyr.

Tier 3: Deprecated and unsupported Platforms

  • Platform implementation is available, but no owner or unresponsive owner.
  • No commitment to support is available.
  • May be removed from upstream if no one works to bring it up to tier 2 or better.
  • Bugs reported against platforms of this tier are NOT considered as
    a general bug in Zephyr.

Release Procedure


This section documents the Release manager responsibilities so that it serves as
a knowledge repository for Release managers.

Release Checklist

Each release has a GitHub issue associated with it that contains the full
checklist. After a release is complete, a checklist for the next release is
created.

Tagging

The following syntax should be used for releases and tags in Git:

  • Release [Major].[Minor].[Patch Level]

  • Release Candidate [Major].[Minor].[Patch Level]-rc[RC Number]

  • Tagging:

    • v[Major].[Minor].[Patch Level]-rc[RC Number]
    • v[Major].[Minor].[Patch Level]
    • v[Major].[Minor].99 - A tag applied to main branch to signify that work on
      v[Major].[Minor+1] has started. For example, v1.7.99 will be tagged at the
      start of v1.8 process. The tag corresponds to
      VERSION_MAJOR/VERSION_MINOR/PATCHLEVEL macros as defined for a
      work-in-progress main branch version. Presence of this tag allows generation of
      sensible output for "git describe" on main branch, as typically used for
      automated builds and CI tools.

.. figure:: release_flow.png
:align: center
:alt: Releases
:figclass: align-center
:width: 80%

text
Zephyr Code and Releases

The final release and each release candidate shall be tagged using the following
steps:

.. note::

text
Tagging needs to be done via explicit git commands and not via GitHub's release
interface.  The GitHub release interface does not generate annotated tags (it
generates 'lightweight' tags regardless of release or pre-release). You should
also upload your gpg public key to your GitHub account, since the instructions
below involve creating signed tags. Alternatively, if you don't have a gpg key,
you can also use your ssh key for signing.

.. tabs::

text
.. tab:: Release Candidate

    .. note::

        This section uses tagging 1.11.0-rc1 as an example, replace with
        the appropriate release candidate version.

    #. Update the version variables in the :zephyr_file:`VERSION` file
       located in the root of the Git repository to match the version for
       this release candidate. The ``EXTRAVERSION`` variable is used to
       identify the rc[RC Number] value for this candidate::

        EXTRAVERSION = rc1

    #. Post a PR with the updated :zephyr_file:`VERSION` file using
       ``release: Zephyr 1.11.0-rc1`` as the commit subject. Merge
       the PR after successful CI.

    #. Tag and push the version, using an annotated tag::

        $ git pull
        $ git tag -s -m "Zephyr 1.11.0-rc1" v1.11.0-rc1

    #. Verify that the tag has been signed correctly, ``git show`` for the
       tag must contain a signature (look for the ``BEGIN PGP SIGNATURE``
       or ``BEGIN SSH SIGNATURE`` marker in the output)::

        $ git show v1.11.0-rc1

    #. Push the tag::

        $ git push [email protected]:zephyrproject-rtos/zephyr.git v1.11.0-rc1

    #. Send an email to the mailing lists (``announce`` and ``devel``)
       with a link to the release

.. tab:: Final Release

    .. note::

        This section uses tagging 1.11.0 as an example, replace with the
        appropriate final release version.

    When all final release criteria has been met and the final release notes
    have been approved and merged into the repository, the final release version
    will be set and repository tagged using the following procedure:

    #. Update the version variables in the :zephyr_file:`VERSION` file
       located in the root of the Git repository. Set ``EXTRAVERSION``
       variable to an empty string to indicate final release::

        EXTRAVERSION =

    #. Post a PR with the updated :zephyr_file:`VERSION` file using
       ``release: Zephyr 1.11.0`` as the commit subject. Merge
       the PR after successful CI.
    #. Tag and push the version, using two annotated tags::

        $ git pull
        $ git tag -s -m "Zephyr 1.11.0" v1.11.0

    #. Verify that the tag has been signed correctly, ``git show`` for the
       tag must contain a signature (look for the ``BEGIN PGP SIGNATURE``
       or ``BEGIN SSH SIGNATURE`` marker in the output)::

        $ git show v1.11.0

    #. Push the tag::

        $ git push [email protected]:zephyrproject-rtos/zephyr.git v1.11.0

    #. Find the new ``v1.11.0`` tag at the top of the releases page and
       edit the release with the ``Edit tag`` button with the following:

        * Copy the overview of ``docs/releases/release-notes-1.11.rst``
          into the release notes textbox and link to the full release notes
          file on docs.zephyrproject.org.

    #. Send an email to the mailing lists (``announce`` and ``devel``) with a link
       to the release

Doc Project Tsc (`doc/project/tsc.rst`)

.. _tsc:

Technical Steering Committee (TSC)


TSC Member Role
###############

The TSC role and its responsibilities is defined in the Zephyr project charter_.

Membership
++++++++++

A TSC member plays a pivotal role in shaping the technical direction of the
Zephyr Project. TSC members work collaboratively with other TSC members,
contributors, and stakeholders to ensure the project's success and
sustainability.

By fulfilling the rights and responsibilities below, TSC members contribute to
the overall success and growth of the Zephyr Project, ensuring that it remains a
vibrant and thriving open-source community for years to come.

Rights

Decision Making
Participate in key decisions related to the project's technical direction,
including architectural changes, feature additions, and release planning.

Voting
Exercise voting rights on important matters discussed within the TSC,
including feature proposals, code contributions, and community initiatives.

Access
Gain access to relevant project repositories, documentation, and communication
channels to stay informed and contribute effectively.

Leadership
Take on leadership roles within working groups or subcommittees dedicated to
specific technical areas or initiatives.

Representation
Act as a representative of the broader Zephyr community, advocating for the
interests of contributors, users, and stakeholders.

Responsibilities

TSC members are expected to fulfill the following responsibilities, though it is
not mandatory to fulfill all:

Technical Oversight
Provide guidance and oversight on technical matters, ensuring alignment with
project goals, standards, and best practices through active participation as
core members in working groups and committees.

Code Review
Participate in code reviews to maintain code quality, consistency, and
compatibility with project standards.

Community Engagement
Engage with the community through forums, mailing lists, conferences, and
other channels to foster collaboration, address concerns, and gather feedback.

Documentation
Contribute to the development and maintenance of project documentation,
including technical guides, API references, and best practices.

Release Management
Collaborate with the release manager and other stakeholders to plan and
coordinate project releases, ensuring timely delivery and quality assurance.

Contributor Support
Support and mentor new contributors, helping them navigate the project's
codebase, processes, and community norms.

Issue Triage
Assist in triaging and prioritizing issues reported by users and contributors,
facilitating timely resolution and communication.

Compliance and Licensing
Ensure compliance with project licensing requirements and open-source best
practices, addressing any licensing-related issues that may arise.

Conflict Resolution
Facilitate constructive discussions and resolution of technical disagreements
or conflicts within the community, promoting a healthy and inclusive
environment.

Continuous Improvement
Continuously seek opportunities to improve project governance, processes, and
infrastructure, driving innovation and sustainability.

Appointed TSC Members
+++++++++++++++++++++

See Zephyr project charter_ for more details.

  • Appointed TSC members have no term limits besides the term of their employment
    at the organization they represent or their organization's membership in the
    Zephyr Project.
  • Appointed TSC members can select an Alternate from the same organization.

Elected TSC Members
+++++++++++++++++++

Per the Zephyr project charter_, TSC members can nominate representatives from
the technical community at the rate of no more than one per quarter.

  • Majority vote is required to confirm a candidate.
  • Once elected, a TSC member serves for 2 years.
  • Elected TSC members do not have the right to appoint an Alternate.
  • To ensure continuity of the TSC, at the end of the 2 year term, the TSC is
    required to reconfirm the membership of elected members. If the elected member
    declines a new term or if the TSC fails to reconfirm the term, the seat will
    be open for new nominations.
  • If an elected TSC member resigns before the end of the 2 year term, their spot
    will be open for new members outside of the quarterly nomination limit. The
    elected member will serve a 2 year term.
  • The TSC has the right to terminate elected members who become inactive and are
    not fulfilling the responsibilities of TSC members as described in this
    document.
  • The number of elected members shall not exceed 20% of the total of appointed
    members.
  • Existing TSC members who were elected before May 2024 shall be re-confirmed
    after completing the 2 year term since they were first elected.

Suspensions
+++++++++++

As noted under Section 8b of the Project Charter, voting rights for a
representative who misses three consecutive meetings are subject to suspension
and suspended representatives do not count towards the quorum requirement.

A representative’s suspension will end and voting rights be restored at the start
of the next attended meeting. The TSC enforces the suspension policy for voting
members who miss three consecutive TSC weekly meetings.

Multi-day meetings (F2F events) are counted as "one" meeting. The TSC voted on
February 16, 2022 to discontinue default enforcement of the suspension policy.
The TSC voted on January 18, 2023 to re-enact default enforcement of the
suspension policy.

Notice of suspension will be sent to representatives who miss three consecutive
meetings, noting that rights will be restored upon next attendance of a TSC
meeting.

.. note::

As per Section 4b of the Project Charter, Platinum and Silver
Members may choose to opt out of a voting seat on the TSC.

Members who opt out and then wish to reclaim their seat later will have their
voting rights restored at the start of the second consecutive meeting
attended following notification to the TSC Chair.

Voting
++++++

Voting in the Zephyr Project is defined under Section 8 of the Project Charter.

Additional points of clarity / TSC interpretation have been added below. The
Governing Board may opt to update the Charter to include the below
refinements. Until then, additional clarifications (if/where needed) will be
discussed in the Process Working Group, and approved in the TSC.

  • TSC In-Meeting Voting For items requesting an in-meeting vote of the Zephyr
    Technical Steering Committee (TSC), assuming quorum requirements have been
    met, the default voting mechanism will be a verbal motion to determine if
    there is general consensus.
  • If there are no objections to a motion being brought forward, general
    consensus is assumed and the motion passes.
  • Should there be any objections raised, the vote will move to email, and be
    executed using the Voting Guidelines outlined in Section 8 of the Project
    Charter.
  • Should a motion be deemed urgent by the TSC Chair, and assuming quorum
    requirements have been met, the Chair may call for a roll call vote
    in-meeting.

Voting Options

  • Voting Options are:

    • "Yes",
    • "No" or
    • "Abstain"

Abstention

Abstentions do not count in tallying the vote negatively or positively; when
members abstain, they are in effect attending only to contribute to a quorum.

Abstentions do not impact the number of votes needed to decide a vote.

Quorum

Quorum for TSC meetings shall require 60% of the voting representatives... (ref
8b of the Charter)

Decisions

Decisions by vote shall be based on a majority vote, provided that at least
sixty percent (60%) of the TSC representatives must be either
present or participating electronically or by written action in order to
conduct a valid vote. (ref 8c of the Charter)

Example A:

40 eligible TSC voters. 3 abstain from a vote on a motion. 12 vote Yes. 11 vote
No.

Quorum reached: 26 votes cast (quorum = 60% of 40 = 24)
Majority vote: 12 Yes vs. 11 No. Yes wins.
Motion adopted.

Example B:

40 eligible TSC voters. 5 abstain from a vote on a motion. 12 vote Yes. 6
vote No. Quorum reached? 23 votes cast (quorum = 60% of 40 = 24)

Vote is not valid. Quorum not reached.

Example C:

40 eligible TSC voters. 21 abstain from a vote on a motion. 2 vote Yes. 1 votes
No. Quorum reached? 24 votes cast (quorum = 60% of 40 = 24)

Majority vote: 2 Yes vs. 1 No. Yes wins.

Immutable Votes
+++++++++++++++

Votes are considered immutable once cast. A voter may not change their vote,
once cast, between the time a Motion is brought forth and the time at which
results are announced.

.. _Zephyr project charter:
https://www.zephyrproject.org/wp-content/uploads/2023/08/LF-Zephyr-Charter-2023.08.21.pdf


Doc Project Working Groups (`doc/project/working_groups.rst`)

TSC Working Groups


Overview
########

The TSC, at its discretion, may establish working groups or subcommittees to
serve as focused teams dedicated to specific technical areas, initiatives, or
tasks.

Membership
##########

Working Group Membership Eligibility
++++++++++++++++++++++++++++++++++++

  • Each Working group (WG) shall determine its own membership eligibility, in
    consultation with the TSC.
  • Each working group shall have a team of members who are actively involved
    in its activities and decision-making processes.
  • It is expected that WG membership shall be open to all Zephyr project
    :ref:Collaborators <collaborator>; however, working groups may impose
    restrictions such as the number of participants from a single company.
  • All TSC members are eligible to join a working group as members, part of
    the responsibilities being a TSC member.
  • The minimal number of members may vary depending on the complexity of the
    tasks and the breadth of expertise required to address them effectively.
  • A working group should aim to have at least five to seven members to
    ensure diversity of perspectives, collaboration, and continuity.
  • The structure of each working group within the Zephyr Project should be
    designed to ensure effectiveness, productivity, and inclusivity. While the
    optimal size of a working group can vary depending on the specific context and
    scope of its activities.
  • Participation in WG meetings and discussions is open to all project
    :ref:contributors <contributor>.

Working Group Chair / Co-chair
++++++++++++++++++++++++++++++

Each working group may elect a Chair and optionally a Co-Chair who is
responsible for leading meetings and representing the working group to the TSC.

Working Group Chair / Co-Chair Elections
++++++++++++++++++++++++++++++++++++++++

  • The Chair and Co-Chair shall be elected by the members of the working group
  • Any member of the working group has the right to nominate themselves for the
    chair/co-chair positions.
  • The term for the chair/co-chair is one year
  • If a chair/co-chair resigns from the position before the end of the term, a
    vote is to be held to elect a new chair/co-chair.

Working Group Voter Eligibility
+++++++++++++++++++++++++++++++

  • Voting for a Chair or Co-Chair is open to the members of the working group.
  • Only 1 working group member from each company may vote in the election.
  • The Chair and Co-Chair shall be members of the working group.

Working Group Election Confirmation
++++++++++++++++++++++++++++++++++++

  • The elected Chair (and/or Co-Chair) is submitted to the TSC for confirmation.
  • The TSC decides to accept the outcome or requests a new voting.

Advisory role
#############

  • Working Groups are advisory in nature. They provide advice to the projects and
    to the TSC.
  • Working groups operate on a rough consensus basis. If the working group is
    unable to reach consensus on what advice to offer, the working group Chair
    shall raise the issue with the TSC or the relevant committee (Safety and
    Security), where a formal vote can be taken, or advise the project that the
    working group cannot reach consensus.
  • Working groups shall keep track of discussions and record any votes,
    decisions, or recommendations made and share results with the community and
    the TSC.
  • Working group meetings and offline discussions shall be captured in a
    standalone document with all supporting details such as attendance, quorum,
    actions to be taken, and next steps.
  • Decisions made within a working group are non-binding and are only considered
    ratified after communicating decisions and outcomes to the TSC.
  • Lacking any objections from the TSC within 1 week after the communication or
    report of any results, decisions of a working group are considered confirmed
    and ratified.

TSC Working Group Lifecycle
###########################

Creation of a TSC working group
+++++++++++++++++++++++++++++++

In order to create a TSC working group, a TSC member shall make a proposal to
the TSC (via TSC email list) that shall cover at least the following:

  • TSC working group name.
  • TSC working group purpose
  • TSC working group expected deliverables
  • TSC working group starting participants with at least one TSC member acting as
    a sponsor.
  • Optionally TSC working group definition of done

Update of a TSC working group
+++++++++++++++++++++++++++++

The TSC can modify a TSC working group via a TSC decision. To request such a
modification, a request is made to the TSC email list.

Conclusion of a TSC working group
+++++++++++++++++++++++++++++++++

The TSC decides the termination of the TSC working group in accordance with the
TSC decision procedure. The submission of a request to terminate the TSC working
group should cover:

  • TSC working group name
  • TSC working group deliveries
  • Motivation for termination of the TSC working group

Doc Releases Eol Releases (`doc/releases/eol_releases.rst`)

.. _eol_releases:

End-of-life releases
####################

Release notes and migration guides for end-of-life releases of Zephyr RTOS are kept here for
historical purposes.

.. When adding new entries to this page, please ensure you update RELEASE_NOTES_GLOB_PATTERNS
accordingly in doc/conf.py so that the .rst file(s) actually stop being built by Sphinx and
that redirects to this page are added for them.

.. _eol_releases_release_notes:

Release Notes


  • :zephyr_file:Zephyr 4.2 Release Notes <doc/releases/release-notes-4.2.rst>
  • :zephyr_file:Zephyr 4.1 Release Notes <doc/releases/release-notes-4.1.rst>
  • :zephyr_file:Zephyr 4.0 Release Notes <doc/releases/release-notes-4.0.rst>
  • :zephyr_file:Zephyr 3.6 Release Notes <doc/releases/release-notes-3.6.rst>
  • :zephyr_file:Zephyr 3.5 Release Notes <doc/releases/release-notes-3.5.rst>
  • :zephyr_file:Zephyr 3.4 Release Notes <doc/releases/release-notes-3.4.rst>
  • :zephyr_file:Zephyr 3.3 Release Notes <doc/releases/release-notes-3.3.rst>
  • :zephyr_file:Zephyr 3.2 Release Notes <doc/releases/release-notes-3.2.rst>
  • :zephyr_file:Zephyr 3.1 Release Notes <doc/releases/release-notes-3.1.rst>
  • :zephyr_file:Zephyr 3.0 Release Notes <doc/releases/release-notes-3.0.rst>
  • :zephyr_file:Zephyr 2.7 Release Notes <doc/releases/release-notes-2.7.rst>
  • :zephyr_file:Zephyr 2.6 Release Notes <doc/releases/release-notes-2.6.rst>
  • :zephyr_file:Zephyr 2.5 Release Notes <doc/releases/release-notes-2.5.rst>
  • :zephyr_file:Zephyr 2.4 Release Notes <doc/releases/release-notes-2.4.rst>
  • :zephyr_file:Zephyr 2.3 Release Notes <doc/releases/release-notes-2.3.rst>
  • :zephyr_file:Zephyr 2.2 Release Notes <doc/releases/release-notes-2.2.rst>
  • :zephyr_file:Zephyr 2.1 Release Notes <doc/releases/release-notes-2.1.rst>
  • :zephyr_file:Zephyr 2.0 Release Notes <doc/releases/release-notes-2.0.rst>
  • :zephyr_file:Zephyr 1.14 Release Notes <doc/releases/release-notes-1.14.rst>
  • :zephyr_file:Zephyr 1.13 Release Notes <doc/releases/release-notes-1.13.rst>
  • :zephyr_file:Zephyr 1.12 Release Notes <doc/releases/release-notes-1.12.rst>
  • :zephyr_file:Zephyr 1.11 Release Notes <doc/releases/release-notes-1.11.rst>
  • :zephyr_file:Zephyr 1.10 Release Notes <doc/releases/release-notes-1.10.rst>
  • :zephyr_file:Zephyr 1.9 Release Notes <doc/releases/release-notes-1.9.rst>
  • :zephyr_file:Zephyr 1.8 Release Notes <doc/releases/release-notes-1.8.rst>
  • :zephyr_file:Zephyr 1.7 Release Notes <doc/releases/release-notes-1.7.rst>
  • :zephyr_file:Zephyr 1.6 Release Notes <doc/releases/release-notes-1.6.rst>
  • :zephyr_file:Zephyr 1.5 Release Notes <doc/releases/release-notes-1.5.rst>

.. _eol_releases_migration_guides:

Migration Guides


  • :zephyr_file:Zephyr 4.2 Migration Guide <doc/releases/migration-guide-4.2.rst>
  • :zephyr_file:Zephyr 4.1 Migration Guide <doc/releases/migration-guide-4.1.rst>
  • :zephyr_file:Zephyr 4.0 Migration Guide <doc/releases/migration-guide-4.0.rst>
  • :zephyr_file:Zephyr 3.6 Migration Guide <doc/releases/migration-guide-3.6.rst>
  • :zephyr_file:Zephyr 3.5 Migration Guide <doc/releases/migration-guide-3.5.rst>

Doc Releases Index (`doc/releases/index.rst`)

.. _zephyr_release_notes:

Releases
########

Zephyr is distributed as source code and build scripts, not as a binary image.
Use :ref:west to :ref:get the code <get_the_code> for a specific version,
and see the GitHub repository_ for the full history of tagged releases.

The technical documentation for current and past releases is available at
https://docs.zephyrproject.org/ (use the version selector to select your release
of interest).

.. _supported_releases:

Supported Releases


The table below lists all actively supported releases. For most users, the
recommended starting point is either the latest stable release or the
current LTS release.

.. toctree::
:hidden:
:maxdepth: 1
:glob:
:reversed:

release-notes-3.7
release-notes-4.[3-5]
migration-guide-3.7
migration-guide-4.[3-5]

.. note::
| The next planned release is Zephyr 4.5, targeted for October 2026.
| The working drafts of the associated :doc:Release Notes <release-notes-4.5>
and :doc:Migration Guide <migration-guide-4.5> are already available.

.. list-table::
:header-rows: 1

text
* - Release
  - Release Date
  - EOL
  - Status
  - Supporting Documentation
* - `Zephyr 4.4.0`_
  - 2026-04-14
  - 2027-04-12
  - Latest stable
  - * :doc:`Release Notes <release-notes-4.4>`
    * :doc:`Migration Guide <migration-guide-4.4>`
* - `Zephyr 4.3.0`_
  - 2025-11-14
  - 2026-10-15
  - Stable
  - * :doc:`Release Notes <release-notes-4.3>`
    * :doc:`Migration Guide <migration-guide-4.3>`
* - `Zephyr 3.7.0 (LTS3)`_
  - 2024-07-26
  - 2029-07-27
  - Long Term Support
  - * :doc:`Release Notes <release-notes-3.7>`
    * :doc:`Migration Guide <migration-guide-3.7>`

Previous LTS releases that have reached end-of-life:

+-------------------------+---------------+
| Release | EOL |
+=========================+===============+
| Zephyr 2.7.6 (LTS2)_ | 2025-01-26 |
+-------------------------+---------------+
| Zephyr 1.14.1 (LTS1)_ | 2022-01-01 |
+-------------------------+---------------+

End-of-life releases

.. toctree::
:hidden:
:maxdepth: 1

eol_releases

End-of-life releases are no longer maintained and do not receive security fixes.
The release notes and migration guides for these releases are available
:ref:here <eol_releases>.

.. _zephyr_release_cycle:

Release Life Cycle and Maintenance


Major and Maintenance Releases

Zephyr delivers major releases on a six-month cadence, targeting April and
October each year. This schedule provides regular, well-tested releases without
overwhelming users with too-frequent updates, and avoids major holidays across
geographies.

Maintenance (point) releases are published on an unscheduled basis when enough
significant fixes have accumulated on a major release branch. Each point release
goes through a full QA cycle before publishing.

Long Term Support and Maintenance

While stable releases are supported for the duration of 2 release cycles (roughly 1 year),
some specific ones will be supported for a longer period by the Zephyr Project,
and are called Long Term Support (LTS) releases.

A Zephyr :ref:Long Term Support (LTS) <release_process_lts> release is
published every 2.5 to 3 years and is branched and maintained independently from the
main tree for approximately 5 years after it was released.

This offers more stability to project users and leaves more time to
upgrade to the following LTS release.

Transitioning to the new Release Cadence

The transition to the new release cadence will begin in 2026. Zephyr 4.4 is scheduled
for release in April 2026, and subsequent releases will occur every six months.

The projected timeline for upcoming releases is as follows:

+---------+-------------------+---------------------+
| Release | Planned Date | Notes |
+=========+===================+=====================+
| 4.4 | April 2026 | |
+---------+-------------------+---------------------+
| 4.5 | October 2026 | |
+---------+-------------------+---------------------+
| 4.6 | April 2027 | LTS4 |
+---------+-------------------+---------------------+
| 5.0 | October 2027 | Start of 5.x cycle |
+---------+-------------------+---------------------+
| 5.1 | April 2028 | |
+---------+-------------------+---------------------+
| 5.2 | October 2028 | |
+---------+-------------------+---------------------+
| 5.3 | April 2029 | |
+---------+-------------------+---------------------+
| 5.4 | October 2029 | LTS5 |
+---------+-------------------+---------------------+

Starting with the 5.x release cycle, all releases will follow the new six-month
cadence from the beginning.

Security Fixes

Each security issue fixed within Zephyr is backported or submitted to the
following releases:

  • Currently supported Long Term Support (LTS) release.

  • The most recent two releases.

For more information, see :ref:Security Vulnerability Reporting <reporting>.

Release documentation


Each release includes two companion documents:

  • Release notes summarize changes made across the project during the release cycle.
  • Migration guides describe changes that require action when moving an application from one major
    release to the next.

Release Notes

Release notes contain a list of changes that have been made to the different
areas of the project during the development cycle of the release.
Changes that require the user to modify their own application to support the new
release may be mentioned in the release notes, but the details regarding what
needs to be changed are to be detailed in the release's migration guide.

Updates to the release notes post release cycle is permitted but limited to
style, typographical fixes and to upmerge the notes from maintenance release
branches with the sole purpose of keeping the latest documentation consistent
with the changes in the project.

Migration Guides

Zephyr provides migration guides for all major releases, in order to assist
users transition from the previous release.

As mentioned in the previous section, changes in the code that require an action
(i.e. a modification of the source code or configuration files) on the part of
the user in order to keep the existing behavior of their application belong in
in the migration guide. This includes:

  • Breaking API changes
  • Deprecations
  • Devicetree or Kconfig changes that affect the user (changes to defaults,
    renames, etc)
  • Treewide changes that have an effect (e.g. changing the include path or
    defaulting to a different C standard library)
  • Anything else that can affect the compilation or runtime behavior of an
    existing application

Each entry in the migration guide must include a brief explanation of the change
as well as refer to the Pull Request that introduced it, in order for the user
to be able to understand the context of the change.

.. _GitHub repository: https://github.com/zephyrproject-rtos/zephyr
.. _GitHub tagged releases: https://github.com/zephyrproject-rtos/zephyr/tags
.. _Zephyr 1.14.1 (LTS1): https://docs.zephyrproject.org/1.14.1/
.. _Zephyr 2.7.6 (LTS2): https://docs.zephyrproject.org/2.7.6/
.. _Zephyr 3.7.0 (LTS3): https://docs.zephyrproject.org/3.7.0/
.. _Zephyr 4.3.0: https://docs.zephyrproject.org/4.3.0/
.. _Zephyr 4.4.0: https://docs.zephyrproject.org/4.4.0/


Doc Releases Migration Guide 3.5 (`doc/releases/migration-guide-3.5.rst`)

:orphan:

.. _migration_3.5:

Migration guide to Zephyr v3.5.0
################################

This document describes the changes required or recommended when migrating your
application from Zephyr v3.4.0 to Zephyr v3.5.0.

Any other changes (not directly related to migrating applications) can be found in
the :ref:release notes<zephyr_3.5>.

Required changes


Kernel

  • The kernel :c:func:k_mem_slab_free function has changed its signature, now
    taking a void *mem pointer instead of a void **mem double-pointer.
    The new signature will not immediately trigger a compiler error or warning,
    instead likely causing a invalid memory access at runtime. A new _ASSERT
    statement, that you can enable with :kconfig:option:CONFIG_ASSERT, will
    detect if you pass the function memory not belonging to the memory blocks in
    the slab.

  • :c:macro:CONTAINER_OF now performs type checking, this was very commonly
    misused to obtain user structure from :c:struct:k_work pointers without
    passing from :c:struct:k_work_delayable. This would now result in a build
    error and have to be done correctly using
    :c:func:k_work_delayable_from_work.

C Library

  • The default C library used on most targets has changed from the built-in
    minimal C library to Picolibc. While both provide standard C library
    interfaces and shouldn't cause any behavioral regressions for applications,
    there are a few side effects to be aware of when migrating to Picolibc.

    • Picolibc enables thread local storage
      (:kconfig:option:CONFIG_THREAD_LOCAL_STORAGE) where supported. This
      changes some internal operations within the kernel that improve
      performance using some TLS variables. Zephyr places TLS variables in the
      memory reserved for the stack, so stack usage for every thread will
      increase by 8-16 bytes.

    • Picolibc uses the same malloc implementation as the minimal C library, but
      the default heap size depends on which C library is in use. When using the
      minimal C library, the default heap is zero bytes, which means that malloc
      will always fail. When using Picolibc, the default is 16kB with
      :kconfig:option:CONFIG_MMU or :kconfig:option:ARCH_POSIX, 2kB with
      :kconfig:option:CONFIG_USERSPACE and
      :kconfig:option:CONFIG_MPU_REQUIRES_POWER_OF_TWO_ALIGNMENT. For all
      other targets, the default heap uses all remaining memory on the system.
      You can change this by adjusting
      :kconfig:option:CONFIG_COMMON_LIBC_MALLOC_ARENA_SIZE.

    • Picolibc can either be built as part of the OS build or pulled from the
      toolchain. When building as part of the OS, the build will increase by
      approximately 1000 files.

    • When using the standard C++ library with Picolibc, both of those must come
      from the toolchain as the standard C++ library depends upon the C library
      ABI.

    • Picolibc removes the -ffreestanding compiler option. This allows
      significant compiler optimization improvements, but also means that the
      compiler will now warn about declarations of main which don't conform to
      the Zephyr required type -- int main(void).

    • Picolibc has four different printf/scanf variants supported in Zephyr,
      'double', 'long long', 'integer', and 'minimal. 'double' offers a
      complete printf implementation with exact floating point in decimal and
      hexadecimal formats, full integer support including long long, C99
      integer size specifiers (j, z, t) and POSIX positional arguments. 'long
      long' mode removes float support, 'integer' removes long long support
      while 'minimal' mode also removes support for format modifiers and
      positional arguments. Building the library as a module allows finer
      control over the feature set provided at each level.

    • Picolibc's default floating point input/output code is larger than the
      minimal C library version (this is necessary to conform with the C
      language "round trip" requirements for these operations). If you use
      :kconfig:option:CONFIG_CBPRINTF_FP_SUPPORT, you will see increased
      memory usage unless you also disable
      :kconfig:option:CONFIG_PICOLIBC_IO_FLOAT_EXACT, which switches Picolibc
      to a smaller, but inexact conversion algorithm. This requires building
      Picolibc as a module.

Optional Modules

The following modules have been made optional and are not downloaded with west update by default anymore:

  • chre
  • lz4
  • nanopb
  • psa-arch-tests
  • sof
  • tf-m-tests
  • tflite-micro
  • thrift
  • zscilib

To enable them again use the west config manifest.project-filter -- +<module name> command, or west config manifest.group-filter -- +optional to
enable all optional modules, and then run west update again.

Device Drivers and Device Tree

  • zephyr,memory-region-mpu