You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1101 lines
40 KiB
1101 lines
40 KiB
.. _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_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 |
|
|
|
../LICENSING.rst |
|
|
|
.. _copyrights: |
|
|
|
Copyrights Notices |
|
******************* |
|
|
|
Please follow this `Community Best Practice`_ for Copyright Notices from the |
|
Linux Foundation. |
|
|
|
|
|
.. _Community Best Practice: |
|
https://www.linuxfoundation.org/blog/copyright-notices-in-open-source-software-projects/ |
|
|
|
.. _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 http://developercertificate.org/. |
|
|
|
.. 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 |
|
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 <your.email@example.com> |
|
|
|
For your commits, replace: |
|
|
|
- ``Your Name`` with your legal name (pseudonyms, hacker handles, and the |
|
names of groups are not allowed) |
|
|
|
- ``your.email@example.com`` 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. |
|
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. |
|
|
|
- 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``. |
|
|
|
Notes |
|
===== |
|
|
|
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 |
|
that |
|
|
|
* 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. |
|
|
|
|
|
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 |
|
|
|
.. _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. |
|
|
|
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: |
|
|
|
* 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: |
|
|
|
* 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 ``z.developer@example.com``: |
|
|
|
.. code-block:: console |
|
|
|
git config --global user.name "Zephyr Developer" |
|
git config --global user.email "z.developer@example.com" |
|
|
|
.. 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 advisible 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. |
|
|
|
.. _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. |
|
|
|
Examples and more details follow. |
|
|
|
Example |
|
------- |
|
|
|
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 <z.developer@example.com> |
|
|
|
[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 ``z.developer@example.com``: |
|
|
|
.. code-block:: none |
|
|
|
Signed-off-by: Zephyr Developer <z.developer@example.com> |
|
|
|
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. |
|
|
|
Adding links |
|
------------ |
|
|
|
.. _GitHub references: |
|
https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/autolinked-references-and-urls |
|
|
|
Do not include `GitHub references`_ in the commit message directly, as it can |
|
lose meaning in case the repository is forked, for example. Instead, if the |
|
change addresses a specific GitHub issue, include in the Pull Request message a |
|
line of the form: |
|
|
|
.. code-block:: none |
|
|
|
Fixes #[issue number] |
|
|
|
Where ``[issue number]`` is the relevant GitHub issue's number. For |
|
example: |
|
|
|
.. code-block:: none |
|
|
|
Fixes: #1234 |
|
|
|
You can point to other relevant information that can be found on the web using |
|
:code:`Link:` tags. This includes, for example: GitHub issues, datasheets, |
|
reference manuals, etc. |
|
|
|
.. code-block:: none |
|
|
|
Link: https://github.com/zephyrproject-rtos/zephyr/issues/<issue number> |
|
|
|
.. _coding_style: |
|
|
|
Coding Style |
|
============ |
|
|
|
.. _Linux kernel coding style: |
|
https://kernel.org/doc/html/latest/process/coding-style.html |
|
|
|
In general, follow the `Linux kernel coding style`_, with the following |
|
exceptions: |
|
|
|
* The line length is 100 columns or fewer. In the documentation, longer lines |
|
for URL references are an allowed exception. |
|
* Add braces to every ``if``, ``else``, ``do``, ``while``, ``for`` and |
|
``switch`` body, even for single-line code blocks. |
|
* 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. |
|
* Avoid using binary literals (constants starting with ``0b``). |
|
* Avoid using non-ASCII symbols in code, unless it significantly improves |
|
clarity, avoid emojis in any case. |
|
|
|
Use these coding guidelines to ensure that your development complies with the |
|
project's style and naming conventions. |
|
|
|
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 |
|
|
|
#!/bin/sh |
|
set -e exec |
|
exec git diff --cached | ${ZEPHYR_BASE}/scripts/checkpatch.pl - |
|
|
|
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 |
|
|
|
#!/bin/sh |
|
remote="$1" |
|
url="$2" |
|
|
|
z40=0000000000000000000000000000000000000000 |
|
|
|
echo "Run push hook" |
|
|
|
while read local_ref local_sha remote_ref remote_sha |
|
do |
|
args="$remote $url $local_ref $local_sha $remote_ref $remote_sha" |
|
exec ${ZEPHYR_BASE}/scripts/series-push-hook.sh $args |
|
done |
|
|
|
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 :ref:`check_compliance_py` script. |
|
|
|
clang-format |
|
------------ |
|
|
|
The `clang-format tool <https://clang.llvm.org/docs/ClangFormat.html>`_ 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 <https://github.com/llvm/llvm-project/releases>`_. Note that if |
|
you are a Linux user, ``clang-format`` will likely be available as a package in |
|
your distribution repositories. |
|
|
|
When there are differences between the `Coding Style`_ guidelines and the |
|
formatting generated by code formatting tools, the `Coding Style`_ guidelines |
|
take precedence. If there is ambiguity between formatting tools and the |
|
guidelines, maintainers may decide which style should be adopted. |
|
|
|
.. _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 ``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 upstream/main.. |
|
|
|
twister |
|
------- |
|
|
|
.. note:: |
|
twister is only fully supported on Linux; on Windows and MacOS the execution |
|
of tests is not supported, only building. |
|
|
|
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/sensors.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>`:: |
|
|
|
cd zephyrproject/zephyr |
|
|
|
Rename the default remote pointing to the `upstream repository |
|
<https://github.com/zephyrproject-rtos/zephyr>`_ from ``origin`` to |
|
``upstream``:: |
|
|
|
git remote rename origin upstream |
|
|
|
Let Git know about the fork you just created, naming it ``origin``:: |
|
|
|
git remote add origin https://github.com/<your github id>/zephyr |
|
|
|
and verify the remote repos:: |
|
|
|
git remote -v |
|
|
|
The output should look similar to:: |
|
|
|
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):: |
|
|
|
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 |
|
files:: |
|
|
|
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 :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:: |
|
|
|
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. |
|
|
|
.. note:: As more commits are merged upstream, the GitHub PR page will show |
|
a ``This branch is out-of-date with the base branch`` message and a |
|
``Update branch`` button on the PR page. That message should be ignored, |
|
as the commits will be rebased as part of merging anyway, and triggering |
|
a branch update from the GitHub UI will cause the PR approvals to be |
|
dropped. |
|
|
|
#. 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 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. |
|
|
|
#. After pushing the requested change, check on the PR page if there is a |
|
merge conflict. If so, rebase your local branch:: |
|
|
|
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:: |
|
|
|
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 |
|
|
|
|
|
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 |
|
present):: |
|
|
|
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 |
|
URL: http://www.contiki-os.org/ |
|
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 |
|
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.md&title=>`_ |
|
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 |
|
devel@lists.zephyrproject.org 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.
|
|
|