blob: 1d63fb02778c8a5ebf8b1456530034f980620177 [file] [log] [blame]
.. _docs-pw-style:
============
Style guides
============
.. tip::
Pigweed runs ``pw format`` as part of ``pw presubmit`` to perform some code
formatting checks. To speed up the review process, consider adding ``pw
presubmit`` as a git push hook using the following command:
``pw presubmit --install``
.. grid:: 2
.. grid-item-card:: :octicon:`diff-added` C++ style
:link: docs-pw-style-cpp
:link-type: ref
:class-item: sales-pitch-cta-primary
Our C++ style guide: an extension of the Google C++ style with further
restrictions and guidance for embedded
.. grid-item-card:: :octicon:`pencil` Commit messages
:link: docs-pw-style-commit-message
:link-type: ref
:class-item: sales-pitch-cta-secondary
How to format commit messages for Pigweed
.. grid:: 2
.. grid-item-card:: :octicon:`code-square` Protobuf
:link: docs-pw-style-protobuf
:link-type: ref
:class-item: sales-pitch-cta-secondary
How to structure reference documentation for C++ code
.. grid-item-card:: :octicon:`terminal` CLI style
:link: docs-pw-style-cli
:link-type: ref
:class-item: sales-pitch-cta-secondary
How to style your CLI program so that it behaves
consistently with other Pigweed CLI programs
--------------------------
Documentation style guides
--------------------------
See the :ref:`documentation contributors homepage <docs-contrib-docs>`.
.. todo-check: disable
.. _docs-pw-todo-style:
----------
TODO style
----------
Pigweed expects TODO annotations to adhere to the following style:
.. todo-check: disable
.. code-block:: py
# TODO: https://pwbug.dev/123456789 - Some explanation of the problem at
# hand, which may span multiple lines if necessary.
.. todo-check: enable
.. admonition:: Note
Please include the ``https://`` to make it easier for code editors to
identify the bugs as URLs.
In Markdown docs like
`Rustdoc <https://doc.rust-lang.org/rustdoc/what-is-rustdoc.html>`_
the following format is preferred:
.. todo-check: disable
.. code-block:: rs
//! TODO: <pwbug.dev/123456789> - Explanation.
.. todo-check: enable
.. admonition:: Note
For Rustdoc, omit ``https://``. The additional Markdown syntax makes the
link explicit, and including ``https://`` makes the preamble disruptively
lengthy.
Some older forms are still allowed but discouraged. We allow the following
formats, ordered by preference with the preferred patterns at the top:
.. todo-check: disable
.. code-block:: py
# TODO: https://pwbug.dev/1234 - Explanation.
# TODO: b/1234 - Explanation.
# TODO: username@ - Explanation.
# TODO: username@example.com - Explanation.
# TODO(b/1234): Explanation.
# TODO(username): Explanation.
.. todo-check: enable
.. todo-check: enable
-----------------
Copyright headers
-----------------
Every Pigweed file containing source code must include copyright and license
information. This includes any JS/CSS files that you might be serving out to
browsers.
Apache header source code files that support ``//`` comments:
.. code-block:: none
// Copyright 2023 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
Apache header for source code files that support ``#`` comments:
.. code-block:: none
# Copyright 2023 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
.. _python-style:
------------
Python style
------------
Pigweed uses the standard Python style: PEP8, which is available on the web at
https://www.python.org/dev/peps/pep-0008/. All Pigweed Python code should pass
``pw format``, which invokes ``black`` with a couple options.
Python versions
===============
Pigweed officially supports :ref:`a few Python versions
<docs-concepts-python-version>`. Upstream Pigweed code must support those Python
versions. The only exception is :ref:`module-pw_env_setup`, which must also
support Python 2 and 3.6.
---------------
Build files: GN
---------------
Each Pigweed source module requires a GN build file named BUILD.gn. This
encapsulates the build targets and specifies their sources and dependencies.
GN build files use a format similar to `Bazel's BUILD files
<https://docs.bazel.build/versions/main/build-ref.html>`_
(see the `Bazel style guide
<https://docs.bazel.build/versions/main/skylark/build-style.html>`_).
C/C++ build targets include a list of fields. The primary fields are:
* ``<public>`` -- public header files
* ``<sources>`` -- source files and private header files
* ``<public_configs>`` -- public build configuration
* ``<configs>`` -- private build configuration
* ``<public_deps>`` -- public dependencies
* ``<deps>`` -- private dependencies
Assets within each field must be listed in alphabetical order.
.. code-block:: cpp
# Here is a brief example of a GN build file.
import("$dir_pw_unit_test/test.gni")
config("public_include_path") {
include_dirs = [ "public" ]
visibility = [":*"]
}
pw_source_set("pw_sample_module") {
public = [ "public/pw_sample_module/sample_module.h" ]
sources = [
"public/pw_sample_module/internal/secret_header.h",
"sample_module.cc",
"used_by_sample_module.cc",
]
public_configs = [ ":public_include_path" ]
public_deps = [ dir_pw_status ]
deps = [ dir_pw_varint ]
}
pw_test_group("tests") {
tests = [ ":sample_module_test" ]
}
pw_test("sample_module_test") {
sources = [ "sample_module_test.cc" ]
deps = [ ":sample_module" ]
}
pw_doc_group("docs") {
sources = [ "docs.rst" ]
}
------------------
Build files: Bazel
------------------
Build files for the Bazel build system must be named ``BUILD.bazel``. Bazel can
interpret files named just ``BUILD``, but Pigweed uses ``BUILD.bazel`` to avoid
ambiguity with other build systems or tooling.
Pigweed's Bazel files follow the `Bazel style guide
<https://docs.bazel.build/versions/main/skylark/build-style.html>`_.
------------------
Build files: Soong
------------------
Build files (blueprints) for the Soong build system must be named
``Android.bp``. The way Pigweed modules and backends are used is documented in
:ref:`module-pw_build_android`.
.. _owners-style:
--------------------
Code Owners (OWNERS)
--------------------
If you use Gerrit for source code hosting and have the
`code-owners <https://android-review.googlesource.com/plugins/code-owners/Documentation/backend-find-owners.html>`__
plug-in enabled Pigweed can help you enforce consistent styling on those files
and also detects some errors.
The styling follows these rules.
#. Content is grouped by type of line (Access grant, include, etc).
#. Each grouping is sorted alphabetically.
#. Groups are placed the following order with a blank line separating each
grouping.
* "set noparent" line
* "include" lines
* "file:" lines
* user grants (some examples: "*", "foo@example.com")
* "per-file:" lines
This plugin will, by default, act upon any file named "OWNERS".
.. toctree::
:hidden:
C++ <style/cpp>
Commit message <style/commit_message>
CLI <style/cli>
Protobuf <style/protobuf>
reStructuredText <style/rest>
Doxygen <style/doxygen>
Writing <style/writing>