| .. _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: |
| |
| http://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 appropiate 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. |