blob: 3ee9135c7b085296df210499144b7d7025c291f3 [file] [log] [blame]
.. _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.
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:
.. _GitHub repo:
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:
.. _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
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
.. _copyrights:
Copyrights Notices
Please follow this `Community Best Practice`_ for Copyright Notices from the
Linux Foundation.
.. _Community Best Practice:
.. _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
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
.. code-block:: none
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
(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)
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 <>
For your commits, replace:
- ``Your Name`` with your legal name (pseudonyms, hacker handles, and the
names of groups are not allowed)
- ```` with the same email address you are using 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.
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.
- If you forget to add the Signed-off-by: line, you can add it to your previous
commit by running ``git commit --amend -s``.
- If you've pushed your changes to GitHub already you'll need to force push
your branch after this with ``git push -f``.
Any contributions made as part of submitted pull requests are considered free
for the Project to use. Developers are permitted to cherry-pick patches that
are included in pull requests submitted by other contributors. It is expected
* the content of the patches will not be substantially modified,
* the cherry-picked commits or portions of a commit shall preserve the original
sign-off messages and the author identity.
:ref:`modifying_contributions` describes additional recommended policies
around working with contributions submitted by other developers.
.. _Zephyr Project website:
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
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 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
.. _source_tree_v2:
Source Tree Structure
To clone the main Zephyr Project repository use the instructions in
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:
The top-level file for the CMake build system, containing a lot of the
logic required to build Zephyr.
The top-level Kconfig file, which refers to the file :file:`Kconfig.zephyr`
also found in the top-level directory.
See :ref:`the Kconfig section of the manual <kconfig>` for detailed Kconfig
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.
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:
* architecture-specific kernel source files
* architecture-specific kernel include files for private APIs
SoC related code and configuration files.
Board related code and configuration files.
Zephyr technical documentation source files and tools used to
generate the web content.
Device driver code.
:ref:`devicetree <dt-guide>` source files used to describe non-discoverable
board-specific hardware details.
Include files for all public APIs, except those defined under :file:`lib`.
Architecture-independent kernel code.
Library code, including the minimal standard C library.
Miscellaneous code that doesn't belong to any of the other top-level
Sample applications that demonstrate the use of Zephyr features.
Various programs and other files used to build and test Zephyr
Additional build scripts needed to build Zephyr.
Subsystems of Zephyr, including:
* USB device stack code
* Networking code, including the Bluetooth stack and networking stacks
* File system code
* Bluetooth host and controller
Test code and benchmarks for Zephyr features.
Additional architecture independent data. It currently contains Zephyr's CMake
Pull Requests and Issues
.. _Zephyr Project Issues:
.. _open pull requests:
.. _Zephyr devel mailing list:
.. _Zephyr Discord Server:
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 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
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.
.. _Continuous Integration:
Tools and Git Setup
The name in the commit message ``Signed-off-by:`` line and your email must
match the change authorship information. Make sure your :file:`.gitconfig`
is set up correctly:
.. code-block:: console
git config --global "David Developer"
git config --global ""
When you submit a pull request to the project, a series of checks are
performed to verify your commit messages meet the requirements. The same step
done during the CI process can be performed locally using the the ``gitlint``
Run ``gitlint`` locally in your tree and branch where your patches have been
.. code-block:: console
Note, gitlint only checks HEAD (the most recent commit), so you should run it
after each commit, or use the ``--commits`` option to specify a commit range
covering all the development patches to be submitted.
.. note::
twister does not currently run on Windows.
To verify that your changes did not break any tests or samples, please run the
``twister`` script locally before submitting your pull request to GitHub. To
run the same tests the CI system runs, follow these steps from within your
local Zephyr source working directory:
.. code-block:: console
The above will execute the basic twister script, which will run various
kernel tests using the QEMU emulator. It will also do some build tests on
various samples with advanced features that can't run in QEMU.
We highly recommend you run these tests locally to avoid any CI
The `clang-format tool <>`_ can
be helpful to quickly reformat large amounts of new source code to our
`Coding Style`_ standards together with the ``.clang-format`` configuration file
provided in the repository. ``clang-format`` is well integrated into most
editors, but you can also run it manually like this:
.. code-block:: bash
clang-format -i my_source_file.c
``clang-format`` is part of LLVM, which can be downloaded from the project
`releases page <>`. Note that if
you are a Linux user, ``clang-format`` will likely be available as a package in
your distribution repositories.
.. _coding_style:
Coding Style
Use these coding guidelines to ensure that your development complies with the
project's style and naming conventions.
.. _Linux kernel coding style:
In general, follow the `Linux kernel coding style`_, with the
following exceptions:
* Add braces to every ``if``, ``else``, ``do``, ``while``, ``for`` and
``switch`` body, even for single-line code blocks. Use the ``--ignore BRACES``
flag to make *checkpatch* stop complaining.
* Use spaces instead of tabs to align comments after declarations, as needed.
* Use C89-style single line comments, ``/* */``. The C99-style single line
comment, ``//``, is not allowed.
* Use ``/** */`` for doxygen comments that need to appear in the documentation.
The Linux kernel GPL-licensed tool ``checkpatch`` is used to check
coding style conformity.
.. note::
checkpatch does not currently run on Windows.
Checkpatch is available in the scripts directory. To invoke it when committing
code, make the file *$ZEPHYR_BASE/.git/hooks/pre-commit* executable and edit
it to contain:
.. code-block:: bash
set -e exec
exec git diff --cached | ${ZEPHYR_BASE}/scripts/ -
Instead of running checkpatch at each commit, you may prefer to run it only
before pushing on zephyr repo. To do this, make the file
*$ZEPHYR_BASE/.git/hooks/pre-push* executable and edit it to contain:
.. code-block:: bash
echo "Run push hook"
while read local_ref local_sha remote_ref remote_sha
args="$remote $url $local_ref $local_sha $remote_ref $remote_sha"
exec ${ZEPHYR_BASE}/scripts/ $args
exit 0
If you want to override checkpatch verdict and push you branch despite reported
issues, you can add option --no-verify to the git push command.
A more complete alternative to this is using script from
ci-tools repo.
.. _Contribution Tools:
.. _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:
#. `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>`::
cd zephyrproject/zephyr
Rename the default remote pointing to the `upstream repository
<>`_ from ``origin`` to
git remote rename origin upstream
Let Git know about the fork you just created, naming it ``origin``::
git remote add origin<your github id>/zephyr
and verify the remote repos::
git remote -v
The output should look similar to::
origin<your github id>/zephyr (fetch)
origin<your github id>/zephyr (push)
upstream (fetch)
upstream (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)::
git checkout main
git checkout -b 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::
git checkout -b 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
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::
git status
#. Verify changes to be committed look as you expected::
git diff --cached
#. Commit your changes to your local repo::
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 `DCO`_. See the `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::
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 appropriate branch. The title and message from your
commit message should appear as well.
#. If you're working on a subsystem branch that's not ``main``,
you may need to change the intended branch for the pull request
here, for example, by changing the base branch from ``main`` to ``net``.
#. GitHub will assign one or more suggested reviewers (based on the
CODEOWNERS 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
#. 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.)::
git checkout main
git checkout -b 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::
git fetch --all
git rebase --ignore-whitespace upstream/main
The ``--ignore-whitespace`` option stops ``git apply`` (called by rebase)
from changing any whitespace. Continuing::
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::
git add [file(s)]
git rebase --continue
Update commit comment if needed, and continue::
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.
.. 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`_.
Commit Guidelines
Changes are submitted as Git commits. Each commit message must contain:
* A short and descriptive subject line that is less than 72 characters,
followed by a blank line. The subject line must include a prefix that
identifies the subsystem being changed, followed by a colon, and a short
title, for example: ``doc: update wiki references to new site``.
(If you're updating an existing file, you can use
``git log <filename>`` to see what developers used as the prefix for
previous patches of this file.)
* A change description with your logic or reasoning for the changes, followed
by a blank line. (Every single line has to be less than 75 characters.)
* A Signed-off-by line, ``Signed-off-by: <name> <email>`` typically added
automatically by using ``git commit -s``
* If the change addresses an issue, include a line of the form::
Fixes #<issue number>.
All changes and topics sent to GitHub must be well-formed, as described above.
Commit Message Body
When editing the commit message, please briefly explain what your change
does and why it's needed. A change summary of ``"Fixes stuff"`` will be rejected.
.. warning::
An empty change summary body is not permitted. Even for trivial changes, please
include a summary body in the commit message.
The description body of the commit message must include:
* **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.
For examples of accepted commit messages, you can refer to the Zephyr GitHub
`changelog <>`__.
Other Commit Expectations
* Commits must build cleanly when applied on top of each other, thus avoiding
breaking bisectability.
* Commits must pass all CI checks (see `Continuous Integration`_ for more
* Each commit must address a single identifiable issue and must be
logically self-contained. Unrelated changes should be submitted as
separate commits.
* You may submit pull request RFCs (requests for comments) to send work
proposals, progress snapshots of your work, or to get early feedback on
features or changes that will affect multiple areas in the code base.
* When major new functionality is added, tests for the new functionality MUST be
added to the automated test suite. All new APIs MUST be documented and tested
and tests MUST cover at least 80% of the added functionality using the code
coverage tool and reporting provided by the project.
Submitting Proposals
You can request a new feature or submit a proposal by submitting an issue to
our GitHub Repository.
If you would like to implement a new feature, please submit an issue with a
proposal (RFC) for your work first, to be sure that we can use it. Please
consider what kind of change it is:
* 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
* Small Features can be crafted and directly submitted as a Pull Request.
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
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::
Origin: Contiki OS
License: BSD 3-Clause
commit: 853207acfdc6549b10eb3e44504b1a75ae1ad63a
Purpose: Introduction of networking stack.
For example, a copy of an externally maintained import in a module repository::
Origin: Tiny Crypt
License: BSD 3-Clause
commit: 08ded7f21529c39e5133688ffb93a9d0c94e5c6e
Purpose: Introduction of TinyCrypt
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
`Contribution Tools`_ 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
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.
The ` mailing list
<>`_ archives any nightly build results
produced by CI.
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>`.