[{"id":38214,"web_url":"https://patchwork.libcamera.org/comment/38214/","msgid":"<177132640500.3376561.10962787454352627884@ping.linuxembedded.co.uk>","date":"2026-02-17T11:06:45","subject":"Re: [PATCH v1] py: Fix include order","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Barnabás Pőcze (2026-02-17 08:53:09)\n> Python.h hence the pybind headers must be included first since pyconfig.h\n> unconditionally overrides certain feature test macros[0]. This was mostly\n> hidden by the fact that macro redefinitions with the same value do not\n> trigger compiler warnings. However, glibc 43 has changed certain defaults[1],\n> causing mismatches, leading to compiler warnings.\n> \n> So change the include order so that `<pybind11/...>` headers are included\n> first and then the local `\"py_...\"` headers, and then everything else.\n> \n> Also adjust `.clang-format` as well.\n\nAwesome, thanks. Could you also add a note to\nDocumentation/coding-style.rst where the include orders are mentioned\nplease?\n\n> \n> [0]: https://docs.python.org/3/c-api/intro.html#include-files\n> [1]: https://sourceware.org/git/?p=glibc.git;a=commit;h=a5cc3018f31a125f019685b239c6e5a0bf1a272b\n> \n> Link: https://github.com/python/cpython/issues/61322\n> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n> ---\n>  .clang-format                                 |  6 ++++++\n>  src/py/libcamera/py_camera_manager.cpp        |  3 +--\n>  src/py/libcamera/py_camera_manager.h          |  4 ++--\n>  src/py/libcamera/py_color_space.cpp           |  6 +++---\n>  src/py/libcamera/py_controls_generated.cpp.in |  4 ++--\n>  src/py/libcamera/py_enums.cpp                 |  4 ++--\n>  src/py/libcamera/py_formats_generated.cpp.in  |  4 ++--\n>  src/py/libcamera/py_geometry.cpp              | 10 +++++-----\n>  src/py/libcamera/py_helpers.cpp               |  8 ++++----\n>  src/py/libcamera/py_helpers.h                 |  4 ++--\n>  src/py/libcamera/py_main.cpp                  | 15 +++++++--------\n>  src/py/libcamera/py_main.h                    |  4 ++--\n>  src/py/libcamera/py_transform.cpp             |  6 +++---\n>  13 files changed, 41 insertions(+), 37 deletions(-)\n> \n> diff --git a/.clang-format b/.clang-format\n> index 7fc30f614..7dbeea784 100644\n> --- a/.clang-format\n> +++ b/.clang-format\n> @@ -77,6 +77,12 @@ IncludeCategories:\n>    - Regex:           '<Q([A-Za-z0-9\\-_])+>'\n>      CaseSensitive:   true\n>      Priority:        9\n> +  # Python.h hence pybind11 headers must be included first\n> +  # https://docs.python.org/3/c-api/intro.html#include-files\n> +  - Regex:           '<pybind11/.*>'\n> +    Priority:        -9\n> +  - Regex:           '\"py_.*\"'\n> +    Priority:        -8\n>    # Headers in <> with an extension. (+system libraries)\n>    - Regex:           '<([A-Za-z0-9\\-_])+\\.h>'\n>      Priority:        2\n> diff --git a/src/py/libcamera/py_camera_manager.cpp b/src/py/libcamera/py_camera_manager.cpp\n> index 9ccb7aada..3159bce5b 100644\n> --- a/src/py/libcamera/py_camera_manager.cpp\n> +++ b/src/py/libcamera/py_camera_manager.cpp\n> @@ -4,6 +4,7 @@\n>   */\n>  \n>  #include \"py_camera_manager.h\"\n> +#include \"py_main.h\"\n>  \n>  #include <errno.h>\n>  #include <memory>\n> @@ -12,8 +13,6 @@\n>  #include <unistd.h>\n>  #include <vector>\n>  \n> -#include \"py_main.h\"\n> -\n>  namespace py = pybind11;\n>  \n>  using namespace libcamera;\n> diff --git a/src/py/libcamera/py_camera_manager.h b/src/py/libcamera/py_camera_manager.h\n> index af69b915e..7da65172e 100644\n> --- a/src/py/libcamera/py_camera_manager.h\n> +++ b/src/py/libcamera/py_camera_manager.h\n> @@ -5,12 +5,12 @@\n>  \n>  #pragma once\n>  \n> +#include <pybind11/pybind11.h>\n> +\n>  #include <libcamera/base/mutex.h>\n>  \n>  #include <libcamera/libcamera.h>\n>  \n> -#include <pybind11/pybind11.h>\n> -\n>  using namespace libcamera;\n>  \n>  class PyCameraManager\n> diff --git a/src/py/libcamera/py_color_space.cpp b/src/py/libcamera/py_color_space.cpp\n> index fd5a5dabe..2f4d2d891 100644\n> --- a/src/py/libcamera/py_color_space.cpp\n> +++ b/src/py/libcamera/py_color_space.cpp\n> @@ -5,15 +5,15 @@\n>   * Python bindings - Color Space classes\n>   */\n>  \n> -#include <libcamera/color_space.h>\n> -#include <libcamera/libcamera.h>\n> -\n>  #include <pybind11/operators.h>\n>  #include <pybind11/pybind11.h>\n>  #include <pybind11/stl.h>\n>  \n>  #include \"py_main.h\"\n>  \n> +#include <libcamera/color_space.h>\n> +#include <libcamera/libcamera.h>\n> +\n>  namespace py = pybind11;\n>  \n>  using namespace libcamera;\n> diff --git a/src/py/libcamera/py_controls_generated.cpp.in b/src/py/libcamera/py_controls_generated.cpp.in\n> index 22a132d19..c42a477bb 100644\n> --- a/src/py/libcamera/py_controls_generated.cpp.in\n> +++ b/src/py/libcamera/py_controls_generated.cpp.in\n> @@ -7,12 +7,12 @@\n>   * This file is auto-generated. Do not edit.\n>   */\n>  \n> -#include <libcamera/{{header}}>\n> -\n>  #include <pybind11/pybind11.h>\n>  \n>  #include \"py_main.h\"\n>  \n> +#include <libcamera/{{header}}>\n> +\n>  namespace py = pybind11;\n>  \n>  class Py{{mode|capitalize}}\n> diff --git a/src/py/libcamera/py_enums.cpp b/src/py/libcamera/py_enums.cpp\n> index 9e75ec1a9..715b63880 100644\n> --- a/src/py/libcamera/py_enums.cpp\n> +++ b/src/py/libcamera/py_enums.cpp\n> @@ -5,12 +5,12 @@\n>   * Python bindings - Enumerations\n>   */\n>  \n> -#include <libcamera/libcamera.h>\n> -\n>  #include <pybind11/pybind11.h>\n>  \n>  #include \"py_main.h\"\n>  \n> +#include <libcamera/libcamera.h>\n> +\n>  namespace py = pybind11;\n>  \n>  using namespace libcamera;\n> diff --git a/src/py/libcamera/py_formats_generated.cpp.in b/src/py/libcamera/py_formats_generated.cpp.in\n> index c5fb90639..9da3a3c79 100644\n> --- a/src/py/libcamera/py_formats_generated.cpp.in\n> +++ b/src/py/libcamera/py_formats_generated.cpp.in\n> @@ -7,12 +7,12 @@\n>   * This file is auto-generated. Do not edit.\n>   */\n>  \n> -#include <libcamera/formats.h>\n> -\n>  #include <pybind11/pybind11.h>\n>  \n>  #include \"py_main.h\"\n>  \n> +#include <libcamera/formats.h>\n> +\n>  namespace py = pybind11;\n>  \n>  class PyFormats\n> diff --git a/src/py/libcamera/py_geometry.cpp b/src/py/libcamera/py_geometry.cpp\n> index c7e303609..d96015f03 100644\n> --- a/src/py/libcamera/py_geometry.cpp\n> +++ b/src/py/libcamera/py_geometry.cpp\n> @@ -5,17 +5,17 @@\n>   * Python bindings - Geometry classes\n>   */\n>  \n> -#include <array>\n> -\n> -#include <libcamera/geometry.h>\n> -#include <libcamera/libcamera.h>\n> -\n>  #include <pybind11/operators.h>\n>  #include <pybind11/pybind11.h>\n>  #include <pybind11/stl.h>\n>  \n>  #include \"py_main.h\"\n>  \n> +#include <array>\n> +\n> +#include <libcamera/geometry.h>\n> +#include <libcamera/libcamera.h>\n> +\n>  namespace py = pybind11;\n>  \n>  using namespace libcamera;\n> diff --git a/src/py/libcamera/py_helpers.cpp b/src/py/libcamera/py_helpers.cpp\n> index 8c55ef845..b9142225c 100644\n> --- a/src/py/libcamera/py_helpers.cpp\n> +++ b/src/py/libcamera/py_helpers.cpp\n> @@ -3,14 +3,14 @@\n>   * Copyright (C) 2022, Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>\n>   */\n>  \n> -#include \"py_helpers.h\"\n> -\n> -#include <libcamera/libcamera.h>\n> -\n>  #include <pybind11/functional.h>\n>  #include <pybind11/stl.h>\n>  #include <pybind11/stl_bind.h>\n>  \n> +#include \"py_helpers.h\"\n> +\n> +#include <libcamera/libcamera.h>\n> +\n>  namespace py = pybind11;\n>  \n>  using namespace libcamera;\n> diff --git a/src/py/libcamera/py_helpers.h b/src/py/libcamera/py_helpers.h\n> index 983969dff..989fae77b 100644\n> --- a/src/py/libcamera/py_helpers.h\n> +++ b/src/py/libcamera/py_helpers.h\n> @@ -5,9 +5,9 @@\n>  \n>  #pragma once\n>  \n> -#include <libcamera/libcamera.h>\n> -\n>  #include <pybind11/pybind11.h>\n>  \n> +#include <libcamera/libcamera.h>\n> +\n>  pybind11::object controlValueToPy(const libcamera::ControlValue &cv);\n>  libcamera::ControlValue pyToControlValue(const pybind11::object &ob, libcamera::ControlType type);\n> diff --git a/src/py/libcamera/py_main.cpp b/src/py/libcamera/py_main.cpp\n> index a983ea75c..d0ef6915b 100644\n> --- a/src/py/libcamera/py_main.cpp\n> +++ b/src/py/libcamera/py_main.cpp\n> @@ -5,6 +5,13 @@\n>   * Python bindings\n>   */\n>  \n> +#include <pybind11/functional.h>\n> +#include <pybind11/pybind11.h>\n> +#include <pybind11/stl.h>\n> +#include <pybind11/stl_bind.h>\n> +\n> +#include \"py_camera_manager.h\"\n> +#include \"py_helpers.h\"\n>  #include \"py_main.h\"\n>  \n>  #include <limits>\n> @@ -17,14 +24,6 @@\n>  \n>  #include <libcamera/libcamera.h>\n>  \n> -#include <pybind11/functional.h>\n> -#include <pybind11/pybind11.h>\n> -#include <pybind11/stl.h>\n> -#include <pybind11/stl_bind.h>\n> -\n> -#include \"py_camera_manager.h\"\n> -#include \"py_helpers.h\"\n> -\n>  namespace py = pybind11;\n>  \n>  using namespace libcamera;\n> diff --git a/src/py/libcamera/py_main.h b/src/py/libcamera/py_main.h\n> index 4d594326e..dd31c6d9a 100644\n> --- a/src/py/libcamera/py_main.h\n> +++ b/src/py/libcamera/py_main.h\n> @@ -5,10 +5,10 @@\n>  \n>  #pragma once\n>  \n> -#include <libcamera/base/log.h>\n> -\n>  #include <pybind11/pybind11.h>\n>  \n> +#include <libcamera/base/log.h>\n> +\n>  namespace libcamera {\n>  \n>  LOG_DECLARE_CATEGORY(Python)\n> diff --git a/src/py/libcamera/py_transform.cpp b/src/py/libcamera/py_transform.cpp\n> index 768260ffc..8719b5ff5 100644\n> --- a/src/py/libcamera/py_transform.cpp\n> +++ b/src/py/libcamera/py_transform.cpp\n> @@ -5,15 +5,15 @@\n>   * Python bindings - Transform class\n>   */\n>  \n> -#include <libcamera/transform.h>\n> -#include <libcamera/libcamera.h>\n> -\n>  #include <pybind11/operators.h>\n>  #include <pybind11/pybind11.h>\n>  #include <pybind11/stl.h>\n>  \n>  #include \"py_main.h\"\n>  \n> +#include <libcamera/transform.h>\n> +#include <libcamera/libcamera.h>\n> +\n>  namespace py = pybind11;\n>  \n>  using namespace libcamera;\n> -- \n> 2.53.0\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 859B0C0DA4\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 17 Feb 2026 11:06:50 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id BE20362210;\n\tTue, 17 Feb 2026 12:06:49 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id E89FD61FA0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 17 Feb 2026 12:06:47 +0100 (CET)","from monstersaurus.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust6594.18-1.cable.virginm.net [86.31.185.195])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 30401161;\n\tTue, 17 Feb 2026 12:05:56 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"pqamncOy\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1771326356;\n\tbh=E+LO8LV3pvSFv8c0sNuyrsfMeCy/E/DZ3r9qXHWUbcQ=;\n\th=In-Reply-To:References:Subject:From:To:Date:From;\n\tb=pqamncOyjl37d5mia8VbwwsWhbab/Os7H2CUilppv/rWbWg+3nvHMzNGIBXhu1hye\n\tRepzX4d8yzNp8vEbLwlzfgV0DuK+QMTY/PP9EvOYX3pJcfx5gYb2QWim+V2Vp4wq8A\n\tnOXjFoxUTSnt4XC90Y8Jo0gJHs4QVzuSJwWzUhwk=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20260217085309.61350-1-barnabas.pocze@ideasonboard.com>","References":"<20260217085309.61350-1-barnabas.pocze@ideasonboard.com>","Subject":"Re: [PATCH v1] py: Fix include order","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Tue, 17 Feb 2026 11:06:45 +0000","Message-ID":"<177132640500.3376561.10962787454352627884@ping.linuxembedded.co.uk>","User-Agent":"alot/0.9.1","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]