diff --git a/.clang-format b/.clang-format index 7fc30f61..7dbeea78 100644 --- a/.clang-format +++ b/.clang-format @@ -77,6 +77,12 @@ IncludeCategories: - Regex: '' CaseSensitive: true Priority: 9 + # Python.h hence pybind11 headers must be included first + # https://docs.python.org/3/c-api/intro.html#include-files + - Regex: '' + Priority: -9 + - Regex: '"py_.*"' + Priority: -8 # Headers in <> with an extension. (+system libraries) - Regex: '<([A-Za-z0-9\-_])+\.h>' Priority: 2 diff --git a/Documentation/coding-style.rst b/Documentation/coding-style.rst index 3352b75c..e0864b78 100644 --- a/Documentation/coding-style.rst +++ b/Documentation/coding-style.rst @@ -95,6 +95,12 @@ 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 internal libcamera headers. +.. note:: + As an exception pybind11 headers and local ``py_*`` headers must be included first + in the Python bindings due to the requirements outlined in the `Python documentation`_. + +.. _Python documentation: https://docs.python.org/3/c-api/intro.html#include-files + C++ Specific Rules ------------------ diff --git a/src/py/libcamera/py_camera_manager.cpp b/src/py/libcamera/py_camera_manager.cpp index 9ccb7aad..3159bce5 100644 --- a/src/py/libcamera/py_camera_manager.cpp +++ b/src/py/libcamera/py_camera_manager.cpp @@ -4,6 +4,7 @@ */ #include "py_camera_manager.h" +#include "py_main.h" #include #include @@ -12,8 +13,6 @@ #include #include -#include "py_main.h" - namespace py = pybind11; using namespace libcamera; diff --git a/src/py/libcamera/py_camera_manager.h b/src/py/libcamera/py_camera_manager.h index af69b915..7da65172 100644 --- a/src/py/libcamera/py_camera_manager.h +++ b/src/py/libcamera/py_camera_manager.h @@ -5,12 +5,12 @@ #pragma once +#include + #include #include -#include - using namespace libcamera; class PyCameraManager diff --git a/src/py/libcamera/py_color_space.cpp b/src/py/libcamera/py_color_space.cpp index fd5a5dab..85e04967 100644 --- a/src/py/libcamera/py_color_space.cpp +++ b/src/py/libcamera/py_color_space.cpp @@ -5,15 +5,14 @@ * Python bindings - Color Space classes */ -#include -#include - #include #include #include #include "py_main.h" +#include + namespace py = pybind11; using namespace libcamera; diff --git a/src/py/libcamera/py_controls_generated.cpp.in b/src/py/libcamera/py_controls_generated.cpp.in index 22a132d1..c42a477b 100644 --- a/src/py/libcamera/py_controls_generated.cpp.in +++ b/src/py/libcamera/py_controls_generated.cpp.in @@ -7,12 +7,12 @@ * This file is auto-generated. Do not edit. */ -#include - #include #include "py_main.h" +#include + namespace py = pybind11; class Py{{mode|capitalize}} diff --git a/src/py/libcamera/py_enums.cpp b/src/py/libcamera/py_enums.cpp index 9e75ec1a..715b6388 100644 --- a/src/py/libcamera/py_enums.cpp +++ b/src/py/libcamera/py_enums.cpp @@ -5,12 +5,12 @@ * Python bindings - Enumerations */ -#include - #include #include "py_main.h" +#include + namespace py = pybind11; using namespace libcamera; diff --git a/src/py/libcamera/py_formats_generated.cpp.in b/src/py/libcamera/py_formats_generated.cpp.in index c5fb9063..9da3a3c7 100644 --- a/src/py/libcamera/py_formats_generated.cpp.in +++ b/src/py/libcamera/py_formats_generated.cpp.in @@ -7,12 +7,12 @@ * This file is auto-generated. Do not edit. */ -#include - #include #include "py_main.h" +#include + namespace py = pybind11; class PyFormats diff --git a/src/py/libcamera/py_geometry.cpp b/src/py/libcamera/py_geometry.cpp index c7e30360..1751a004 100644 --- a/src/py/libcamera/py_geometry.cpp +++ b/src/py/libcamera/py_geometry.cpp @@ -5,17 +5,16 @@ * Python bindings - Geometry classes */ -#include - -#include -#include - #include #include #include #include "py_main.h" +#include + +#include + namespace py = pybind11; using namespace libcamera; diff --git a/src/py/libcamera/py_helpers.cpp b/src/py/libcamera/py_helpers.cpp index 8c55ef84..b9142225 100644 --- a/src/py/libcamera/py_helpers.cpp +++ b/src/py/libcamera/py_helpers.cpp @@ -3,14 +3,14 @@ * Copyright (C) 2022, Tomi Valkeinen */ -#include "py_helpers.h" - -#include - #include #include #include +#include "py_helpers.h" + +#include + namespace py = pybind11; using namespace libcamera; diff --git a/src/py/libcamera/py_helpers.h b/src/py/libcamera/py_helpers.h index 983969df..989fae77 100644 --- a/src/py/libcamera/py_helpers.h +++ b/src/py/libcamera/py_helpers.h @@ -5,9 +5,9 @@ #pragma once -#include - #include +#include + pybind11::object controlValueToPy(const libcamera::ControlValue &cv); libcamera::ControlValue pyToControlValue(const pybind11::object &ob, libcamera::ControlType type); diff --git a/src/py/libcamera/py_main.cpp b/src/py/libcamera/py_main.cpp index a983ea75..d0ef6915 100644 --- a/src/py/libcamera/py_main.cpp +++ b/src/py/libcamera/py_main.cpp @@ -5,6 +5,13 @@ * Python bindings */ +#include +#include +#include +#include + +#include "py_camera_manager.h" +#include "py_helpers.h" #include "py_main.h" #include @@ -17,14 +24,6 @@ #include -#include -#include -#include -#include - -#include "py_camera_manager.h" -#include "py_helpers.h" - namespace py = pybind11; using namespace libcamera; diff --git a/src/py/libcamera/py_main.h b/src/py/libcamera/py_main.h index 4d594326..dd31c6d9 100644 --- a/src/py/libcamera/py_main.h +++ b/src/py/libcamera/py_main.h @@ -5,10 +5,10 @@ #pragma once -#include - #include +#include + namespace libcamera { LOG_DECLARE_CATEGORY(Python) diff --git a/src/py/libcamera/py_transform.cpp b/src/py/libcamera/py_transform.cpp index 768260ff..f6b59983 100644 --- a/src/py/libcamera/py_transform.cpp +++ b/src/py/libcamera/py_transform.cpp @@ -5,15 +5,14 @@ * Python bindings - Transform class */ -#include -#include - #include #include #include #include "py_main.h" +#include + namespace py = pybind11; using namespace libcamera;