[libcamera-devel] [PATCH v2] clang-format: Regroup sort orders
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Mon Aug 9 18:36:12 CEST 2021
Hi Kieran,
Thank you for the patch.
On Mon, Aug 09, 2021 at 05:14:25PM +0100, Kieran Bingham wrote:
> Utilise the clang-format header sort to provide a regex based pattern
> match for our header inclusion coding style.
>
> Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> ---
> A sample of all headers from the project (+ a couple of extra tests)
> parsed through this can be seen at
> https://paste.ubuntu.com/p/Bt87C6M77y/
There are a few headers there such as a.h and b.h that don't seem to
exist in libcamera. Did you run the commands below on a test branch by
any chance ?
> This was generated by:
> git grep -h "^#include" | sort | uniq > all-headers.cpp
> git add all-headers.cpp
> git commit all-headers.cpp -m "Header Test"
> ./utils/checkstyle.py | patch -p0
>
> While some false positives are visible in this list
> (for instance <camera_metadata_hidden.h> in c/system headers section)
> this provides a great deal of the checks automatically, and the
> remaining cases may have to be spotted during review.
There's also
#include <jpeglib.h>
#include <libudev.h>
#include <tiffio.h>
#include <xf86drm.h>
#include <xf86drmMode.h>
#include <yaml.h>
in the system headers. I wonder if we should add a rule for those.
I've also spotted
#include "linux/bcm2835-isp.h"
that should be replaced with
#include <linux/bcm2835-isp.h>
> .clang-format | 49 +++++++++++++++++++++++++++++++---
> Documentation/coding-style.rst | 20 +++++++++++---
> 2 files changed, 62 insertions(+), 7 deletions(-)
>
> diff --git a/.clang-format b/.clang-format
> index 3a8a896e373d..56cfbfa1bec4 100644
> --- a/.clang-format
> +++ b/.clang-format
> @@ -66,10 +66,53 @@ ExperimentalAutoDetectBinPacking: false
> FixNamespaceComments: true
> ForEachMacros:
> - 'udev_list_entry_foreach'
> -IncludeBlocks: Preserve
> +SortIncludes: true
> +IncludeBlocks: Regroup
> IncludeCategories:
> - - Regex: '.*'
> - Priority: 1
> + # Headers matching the name of the component are matched automatically.
> + # Priority 1
> + # Headers in <> with an extension. (+system libraries)
> + - Regex: '<([A-Za-z0-9\-_])+\.h>'
> + Priority: 2
> + - Regex: '<sys/.*>'
> + Priority: 2
> + # Qt includes (match before C++ standard library)
> + - Regex: '<Q([A-Za-z0-9\-_])+>'
> + Priority: 10
> + CaseSensitive: true
> + # C++ standard library includes (no extension)
> + - Regex: '<([A-Za-z0-9\-_/])+>'
> + Priority: 3
> + # Linux headers, as a second group/subset of system headers
> + - Regex: '<linux/.*>'
> + Priority: 4
> + # Headers for libcamera Base support
> + - Regex: '<libcamera/base/private.h>'
> + Priority: 5
> + - Regex: '<libcamera/base/.*\.h>'
> + Priority: 6
> + # Public API Headers for libcamera, which are not in a subdir (i.e. ipa/,internal/)
> + - Regex: '<libcamera/([A-Za-z0-9\-_])+.h>'
> + Priority: 7
> + # IPA Interfaces
> + - Regex: '<libcamera/ipa/.*\.h>'
> + Priority: 8
> + # libcamera Internal headers in ""
> + - Regex: '"libcamera/internal/.*\.h"'
> + Priority: 9
> + # Other libraries headers with one group per library (.h or .hpp)
> + - Regex: '<.*/.*\.hp*>'
> + Priority: 10
> + # local modular includes "path/file.h" (.h or .hpp)
> + - Regex: '"(.*/)+.*\.hp*"'
> + Priority: 11
> + # Other local headers "file.h" with extension (.h or .hpp)
> + - Regex: '".*.hp*"'
> + Priority: 12
> + # Any unmatched line, separated from the last group
> + - Regex: '"*"'
> + Priority: 100
> +
> IncludeIsMainRegex: '(_test)?$'
> IndentCaseLabels: false
> IndentPPDirectives: None
> diff --git a/Documentation/coding-style.rst b/Documentation/coding-style.rst
> index 30c1778ed8bf..e4f1bb26024e 100644
> --- a/Documentation/coding-style.rst
> +++ b/Documentation/coding-style.rst
> @@ -70,19 +70,31 @@ macro. For .cpp files, if the file implements an API declared in a header file,
> that header file shall be included first in order to ensure it is
> self-contained.
>
> +While the following list is extensive, it documents the expected behaviour
> +defined by the clang-format configuraiton and tooling should assist with
> +ordering.
> +
> The headers shall be grouped and ordered as follows:
>
> 1. The header declaring the API being implemented (if any)
> -2. The C and C++ system and standard library headers
> -3. Other libraries' headers, with one group per library
> -4. Other project's headers
> +2. The C standard library and system headers
> +3. The C++ standard library headers
What's the rationale for splitting the C and C++ headers ?
> +4. Linux kernel headers
> +5. The libcamera base private header if required
> +6. The libcamera base library headers
> +7. The libcamera public API headers
> +8. The libcamera IPA interfaces
> +9. The internal libcamera headers
> +10. Other libraries' headers, with one group per library
> +11. Local headers grouped by subdirectory
> +12. Any local headers
There are substantial changes here, does this fix the documentation to
match what we actually do already, or does it change the current
practice ?
> Groups of headers shall be separated by a single blank line. Headers within
> each group shall be sorted alphabetically.
>
> System and library headers shall be included with angle brackets. Project
> headers shall be included with angle brackets for the libcamera public API
> -headers, and with double quotes for other libcamera headers.
> +headers, and with double quotes for internal libcamera headers.
>
>
> C++ Specific Rules
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list