123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- .. _clangformat:
- clang-format
- ============
- ``clang-format`` is a tool to format C/C++/... code according to
- a set of rules and heuristics. Like most tools, it is not perfect
- nor covers every single case, but it is good enough to be helpful.
- ``clang-format`` can be used for several purposes:
- - Quickly reformat a block of code to the kernel style. Specially useful
- when moving code around and aligning/sorting. See clangformatreformat_.
- - Spot style mistakes, typos and possible improvements in files
- you maintain, patches you review, diffs, etc. See clangformatreview_.
- - Help you follow the coding style rules, specially useful for those
- new to kernel development or working at the same time in several
- projects with different coding styles.
- Its configuration file is ``.clang-format`` in the root of the kernel tree.
- The rules contained there try to approximate the most common kernel
- coding style. They also try to follow :ref:`Documentation/process/coding-style.rst <codingstyle>`
- as much as possible. Since not all the kernel follows the same style,
- it is possible that you may want to tweak the defaults for a particular
- subsystem or folder. To do so, you can override the defaults by writing
- another ``.clang-format`` file in a subfolder.
- The tool itself has already been included in the repositories of popular
- Linux distributions for a long time. Search for ``clang-format`` in
- your repositories. Otherwise, you can either download pre-built
- LLVM/clang binaries or build the source code from:
- https://releases.llvm.org/download.html
- See more information about the tool at:
- https://clang.llvm.org/docs/ClangFormat.html
- https://clang.llvm.org/docs/ClangFormatStyleOptions.html
- .. _clangformatreview:
- Review files and patches for coding style
- -----------------------------------------
- By running the tool in its inline mode, you can review full subsystems,
- folders or individual files for code style mistakes, typos or improvements.
- To do so, you can run something like::
- # Make sure your working directory is clean!
- clang-format -i kernel/*.[ch]
- And then take a look at the git diff.
- Counting the lines of such a diff is also useful for improving/tweaking
- the style options in the configuration file; as well as testing new
- ``clang-format`` features/versions.
- ``clang-format`` also supports reading unified diffs, so you can review
- patches and git diffs easily. See the documentation at:
- https://clang.llvm.org/docs/ClangFormat.html#script-for-patch-reformatting
- To avoid ``clang-format`` formatting some portion of a file, you can do::
- int formatted_code;
- // clang-format off
- void unformatted_code ;
- // clang-format on
- void formatted_code_again;
- While it might be tempting to use this to keep a file always in sync with
- ``clang-format``, specially if you are writing new files or if you are
- a maintainer, please note that people might be running different
- ``clang-format`` versions or not have it available at all. Therefore,
- you should probably refrain yourself from using this in kernel sources;
- at least until we see if ``clang-format`` becomes commonplace.
- .. _clangformatreformat:
- Reformatting blocks of code
- ---------------------------
- By using an integration with your text editor, you can reformat arbitrary
- blocks (selections) of code with a single keystroke. This is specially
- useful when moving code around, for complex code that is deeply intended,
- for multi-line macros (and aligning their backslashes), etc.
- Remember that you can always tweak the changes afterwards in those cases
- where the tool did not do an optimal job. But as a first approximation,
- it can be very useful.
- There are integrations for many popular text editors. For some of them,
- like vim, emacs, BBEdit and Visual Studio you can find support built-in.
- For instructions, read the appropriate section at:
- https://clang.llvm.org/docs/ClangFormat.html
- For Atom, Eclipse, Sublime Text, Visual Studio Code, XCode and other
- editors and IDEs you should be able to find ready-to-use plugins.
- For this use case, consider using a secondary ``.clang-format``
- so that you can tweak a few options. See clangformatextra_.
- .. _clangformatmissing:
- Missing support
- ---------------
- ``clang-format`` is missing support for some things that are common
- in kernel code. They are easy to remember, so if you use the tool
- regularly, you will quickly learn to avoid/ignore those.
- In particular, some very common ones you will notice are:
- - Aligned blocks of one-line ``#defines``, e.g.::
- #define TRACING_MAP_BITS_DEFAULT 11
- #define TRACING_MAP_BITS_MAX 17
- #define TRACING_MAP_BITS_MIN 7
- vs.::
- #define TRACING_MAP_BITS_DEFAULT 11
- #define TRACING_MAP_BITS_MAX 17
- #define TRACING_MAP_BITS_MIN 7
- - Aligned designated initializers, e.g.::
- static const struct file_operations uprobe_events_ops = {
- .owner = THIS_MODULE,
- .open = probes_open,
- .read = seq_read,
- .llseek = seq_lseek,
- .release = seq_release,
- .write = probes_write,
- };
- vs.::
- static const struct file_operations uprobe_events_ops = {
- .owner = THIS_MODULE,
- .open = probes_open,
- .read = seq_read,
- .llseek = seq_lseek,
- .release = seq_release,
- .write = probes_write,
- };
- .. _clangformatextra:
- Extra features/options
- ----------------------
- Some features/style options are not enabled by default in the configuration
- file in order to minimize the differences between the output and the current
- code. In other words, to make the difference as small as possible,
- which makes reviewing full-file style, as well diffs and patches as easy
- as possible.
- In other cases (e.g. particular subsystems/folders/files), the kernel style
- might be different and enabling some of these options may approximate
- better the style there.
- For instance:
- - Aligning assignments (``AlignConsecutiveAssignments``).
- - Aligning declarations (``AlignConsecutiveDeclarations``).
- - Reflowing text in comments (``ReflowComments``).
- - Sorting ``#includes`` (``SortIncludes``).
- They are typically useful for block re-formatting, rather than full-file.
- You might want to create another ``.clang-format`` file and use that one
- from your editor/IDE instead.
|