[{"id":30567,"web_url":"https://patchwork.libcamera.org/comment/30567/","msgid":"<20240804184851.GB29535@pendragon.ideasonboard.com>","date":"2024-08-04T18:48:51","subject":"Re: [PATCH v4 3/4] libcamera: Documentation: Split public/private\n\tdocumentation","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Dan,\n\nThank you for the patch.\n\nOn Wed, Jul 31, 2024 at 02:52:00PM +0100, Daniel Scally wrote:\n> The API reference pages generated by Doxygen are comprehensive, but\n> therefore quite overwhelming for application developers who will\n> likely never need to use the majority of the library's objects. To\n> reduce the complexity of the documentation, split it into two runs of\n> doxygen.\n> \n> In the first run of doxygen we pass a specific list of source files\n> to parse, which is built from the File arrays in Meson's build files.\n> This ensures that we only generate the documentation for code from\n> those files.\n> \n> In the second run allow doxygen to generate documentation for all of\n> the library's objects as it currently does. This set will now be\n> output into build/Documentation/internal-api-html.\n> \n> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com>\n> ---\n> Changes in v4:\n> \n> \t- Reversed the split methodology to include a common Doxyfile in both of\n> \t  the internal and public Doxyfiles, rather than generating a separate\n> \t  include for each. This simplies the meson.build.\n> \n> Changes in v3:\n> \n> \t- A typo\n> \t- Explicitly excluded include/libcamera/internal/span.h in\n> \t  Doxyfile-public.in\n> \n> Changes in v2:\n> \n> \t- Formatting fixes (Jacopo)\n> \t- Phraseology (Laurent)\n> \t- Switched to passing specific files to parse to doxygen rather than\n> \t  relying on \\internal to remove other docu-comments.\n> \n>  Documentation/Doxyfile-internal.in     | 30 ++++++++++++++++\n>  Documentation/Doxyfile-public.in       | 15 ++++++++\n>  Documentation/Doxyfile.in              | 23 ------------\n>  Documentation/meson.build              | 48 +++++++++++++++++++++++---\n>  include/libcamera/base/meson.build     |  7 ++++\n>  include/libcamera/internal/meson.build |  7 ++++\n>  include/libcamera/meson.build          | 10 ++++++\n>  meson.build                            |  8 +++++\n>  src/libcamera/base/class.cpp           |  1 +\n>  src/libcamera/base/meson.build         |  7 ++++\n>  src/libcamera/camera.cpp               |  7 ++++\n>  src/libcamera/camera_manager.cpp       |  1 +\n>  src/libcamera/framebuffer.cpp          |  6 +++-\n>  src/libcamera/meson.build              |  7 ++++\n>  src/libcamera/request.cpp              |  1 +\n>  15 files changed, 149 insertions(+), 29 deletions(-)\n>  create mode 100644 Documentation/Doxyfile-internal.in\n>  create mode 100644 Documentation/Doxyfile-public.in\n> \n> diff --git a/Documentation/Doxyfile-internal.in b/Documentation/Doxyfile-internal.in\n> new file mode 100644\n> index 00000000..9d4cf9d9\n> --- /dev/null\n> +++ b/Documentation/Doxyfile-internal.in\n> @@ -0,0 +1,30 @@\n> +# SPDX-License-Identifier: CC-BY-SA-4.0\n> +\n> +@INCLUDE_PATH          = @TOP_BUILDDIR@/Documentation\n> +@INCLUDE               = Doxyfile\n> +\n> +HIDE_UNDOC_CLASSES     = NO\n> +HIDE_UNDOC_MEMBERS     = NO\n> +HTML_OUTPUT            = internal-api-html\n> +INTERNAL_DOCS          = YES\n> +\n> +INPUT                  = \"@TOP_SRCDIR@/Documentation\" \\\n> +                         \"@TOP_SRCDIR@/include/libcamera\" \\\n> +                         \"@TOP_SRCDIR@/src/ipa/ipu3\" \\\n> +                         \"@TOP_SRCDIR@/src/ipa/libipa\" \\\n> +                         \"@TOP_SRCDIR@/src/libcamera\" \\\n> +                         \"@TOP_BUILDDIR@/include/libcamera\" \\\n> +                         \"@TOP_BUILDDIR@/src/libcamera\"\n> +\n> +EXCLUDE                = @TOP_SRCDIR@/include/libcamera/base/span.h \\\n> +                         @TOP_SRCDIR@/include/libcamera/internal/device_enumerator_sysfs.h \\\n> +                         @TOP_SRCDIR@/include/libcamera/internal/device_enumerator_udev.h \\\n> +                         @TOP_SRCDIR@/include/libcamera/internal/ipc_pipe_unixsocket.h \\\n> +                         @TOP_SRCDIR@/src/libcamera/device_enumerator_sysfs.cpp \\\n> +                         @TOP_SRCDIR@/src/libcamera/device_enumerator_udev.cpp \\\n> +                         @TOP_SRCDIR@/src/libcamera/ipc_pipe_unixsocket.cpp \\\n> +                         @TOP_SRCDIR@/src/libcamera/pipeline/ \\\n> +                         @TOP_SRCDIR@/src/libcamera/tracepoints.cpp \\\n> +                         @TOP_BUILDDIR@/include/libcamera/internal/tracepoints.h \\\n> +                         @TOP_BUILDDIR@/include/libcamera/ipa/soft_ipa_interface.h \\\n> +                         @TOP_BUILDDIR@/src/libcamera/proxy/\n> diff --git a/Documentation/Doxyfile-public.in b/Documentation/Doxyfile-public.in\n> new file mode 100644\n> index 00000000..7fbe53d5\n> --- /dev/null\n> +++ b/Documentation/Doxyfile-public.in\n> @@ -0,0 +1,15 @@\n> +# SPDX-License-Identifier: CC-BY-SA-4.0\n> +\n> +@INCLUDE_PATH          = @TOP_BUILDDIR@/Documentation\n> +@INCLUDE               = Doxyfile\n> +\n> +HIDE_UNDOC_CLASSES     = YES\n> +HIDE_UNDOC_MEMBERS     = YES\n> +HTML_OUTPUT            = api-html\n> +INTERNAL_DOCS          = NO\n> +\n> +INPUT                  = \"@TOP_SRCDIR@/Documentation\" \\\n> +                         \"@INPUT@\" \\\n> +                         \"@TOP_BUILDDIR@/src/libcamera/version.cpp\"\n> +\n> +EXCLUDE                = @TOP_SRCDIR@/include/libcamera/base/span.h\n> diff --git a/Documentation/Doxyfile.in b/Documentation/Doxyfile.in\n> index dd1d909b..a70aee43 100644\n> --- a/Documentation/Doxyfile.in\n> +++ b/Documentation/Doxyfile.in\n> @@ -22,14 +22,6 @@ CASE_SENSE_NAMES       = YES\n>  QUIET                  = YES\n>  WARN_AS_ERROR          = @WARN_AS_ERROR@\n>  \n> -INPUT                  = \"@TOP_SRCDIR@/Documentation\" \\\n> -                         \"@TOP_SRCDIR@/include/libcamera\" \\\n> -                         \"@TOP_SRCDIR@/src/ipa/ipu3\" \\\n> -                         \"@TOP_SRCDIR@/src/ipa/libipa\" \\\n> -                         \"@TOP_SRCDIR@/src/libcamera\" \\\n> -                         \"@TOP_BUILDDIR@/include/libcamera\" \\\n> -                         \"@TOP_BUILDDIR@/src/libcamera\"\n> -\n>  FILE_PATTERNS          = *.c \\\n>                           *.cpp \\\n>                           *.dox \\\n> @@ -37,19 +29,6 @@ FILE_PATTERNS          = *.c \\\n>  \n>  RECURSIVE              = YES\n>  \n> -EXCLUDE                = @TOP_SRCDIR@/include/libcamera/base/span.h \\\n> -                         @TOP_SRCDIR@/include/libcamera/internal/device_enumerator_sysfs.h \\\n> -                         @TOP_SRCDIR@/include/libcamera/internal/device_enumerator_udev.h \\\n> -                         @TOP_SRCDIR@/include/libcamera/internal/ipc_pipe_unixsocket.h \\\n> -                         @TOP_SRCDIR@/src/libcamera/device_enumerator_sysfs.cpp \\\n> -                         @TOP_SRCDIR@/src/libcamera/device_enumerator_udev.cpp \\\n> -                         @TOP_SRCDIR@/src/libcamera/ipc_pipe_unixsocket.cpp \\\n> -                         @TOP_SRCDIR@/src/libcamera/pipeline/ \\\n> -                         @TOP_SRCDIR@/src/libcamera/tracepoints.cpp \\\n> -                         @TOP_BUILDDIR@/include/libcamera/internal/tracepoints.h \\\n> -                         @TOP_BUILDDIR@/include/libcamera/ipa/soft_ipa_interface.h \\\n> -                         @TOP_BUILDDIR@/src/libcamera/proxy/\n> -\n>  EXCLUDE_PATTERNS       = @TOP_BUILDDIR@/include/libcamera/ipa/*_serializer.h \\\n>                           @TOP_BUILDDIR@/include/libcamera/ipa/*_proxy.h \\\n>                           @TOP_BUILDDIR@/include/libcamera/ipa/ipu3_*.h \\\n> @@ -72,8 +51,6 @@ EXCLUDE_SYMBOLS        = libcamera::BoundMethodArgs \\\n>  \n>  EXCLUDE_SYMLINKS       = YES\n>  \n> -HTML_OUTPUT            = api-html\n> -\n>  GENERATE_LATEX         = NO\n>  \n>  MACRO_EXPANSION        = YES\n> diff --git a/Documentation/meson.build b/Documentation/meson.build\n> index 30d39523..8349d924 100644\n> --- a/Documentation/meson.build\n> +++ b/Documentation/meson.build\n> @@ -24,12 +24,22 @@ if doxygen.found() and dot.found()\n>  \n>      cdata.set('PREDEFINED', ' \\\\\\n\\t\\t\\t '.join(doxygen_predefined))\n>  \n> +    # We run doxygen twice - the first run excludes internal API objects as it\n> +    # is intended to document the public API only. A second run covers all of\n> +    # the library's objects for libcamera developers. Common configuration is\n> +    # set in an initially generated Doxyfile, which is then included by the two\n> +    # final Doxyfiles. We collected a list of the public sources in\n> +    # doxygen_public_sources to pass to the public run and include it in cdata\n> +    # here - although both Doxyfile and Doxyfile-internal will also receive\n> +    # the same parameter they simply ignore it.\n> +\n> +    cdata.set('INPUT', '\" \\\\\\n\\t\\t\\t \"'.join(doxygen_public_sources))\n> +\n>      doxyfile = configure_file(input : 'Doxyfile.in',\n>                                output : 'Doxyfile',\n>                                configuration : cdata)\n>  \n> -    doxygen_input = [\n> -        doxyfile,\n\nDoxygen includes Doxyfile in Doxyfile-public and Doxyfile-internal, but\nmeson doesn't know about that dependency. I think you need to keep\ndoxyfile here to handle the dependency correctly and ensure the\ndocumentation gets properly recompiled.\n\n> +    global_doxygen_input = [\n>          libcamera_base_headers,\n>          libcamera_base_sources,\n>          libcamera_internal_headers,\n> @@ -42,16 +52,44 @@ if doxygen.found() and dot.found()\n>      ]\n>  \n>      if is_variable('ipu3_ipa_sources')\n> -        doxygen_input += [ipu3_ipa_sources]\n> +        global_doxygen_input += [ipu3_ipa_sources]\n>      endif\n\nI think that's only needed for the internal documentation.\n\n>  \n> +    # This is the \"public\" run of doxygen generating an abridged version of the\n> +    # API's documentation, as informed by the INPUT parameter in cdata.\n> +\n> +    doxyfile_public = configure_file(input : 'Doxyfile-public.in',\n> +                                     output : 'Doxyfile-public',\n> +                                     configuration : cdata)\n> +\n> +    public_doxygen_input = global_doxygen_input\n> +    public_doxygen_input += doxyfile_public\n> +\n>      custom_target('doxygen',\n> -                  input : doxygen_input,\n> +                  input : public_doxygen_input,\n>                    output : 'api-html',\n> -                  command : [doxygen, doxyfile],\n> +                  command : [doxygen, doxyfile_public],\n>                    install : true,\n>                    install_dir : doc_install_dir,\n>                    install_tag : 'doc')\n> +\n> +    # This is the internal documentation, which hard-codes a list of directories\n> +    # to parse in its doxyfile and so ignores the INPUT parameter from cdata.\n> +\n> +    doxyfile_internal = configure_file(input : 'Doxyfile-internal.in',\n> +                                       output : 'Doxyfile-internal',\n> +                                       configuration : cdata)\n> +\n> +    internal_doxygen_input = global_doxygen_input\n> +    internal_doxygen_input += doxyfile_internal\n> +\n> +    custom_target('doxygen-internal',\n> +                  input : internal_doxygen_input,\n> +                  output : 'internal-api-html',\n> +                  command : [doxygen, doxyfile_internal],\n> +                  install : true,\n> +                  install_dir : doc_install_dir,\n> +                  install_tag : 'doc-internal')\n>  endif\n>  \n>  #\n> diff --git a/include/libcamera/base/meson.build b/include/libcamera/base/meson.build\n> index bace25d5..837ef40a 100644\n> --- a/include/libcamera/base/meson.build\n> +++ b/include/libcamera/base/meson.build\n> @@ -38,3 +38,10 @@ libcamera_base_headers = [\n>  \n>  install_headers(libcamera_base_public_headers,\n>                  subdir : libcamera_base_include_dir)\n> +\n> +foreach lbph : libcamera_base_public_headers\n> +\tdoxygen_public_sources += '/'.join(\n> +\t\tmeson.project_source_root(),\n> +\t\t'@0@'.format(lbph)\n\nLooks like we'll need to do better:\n\ninclude/libcamera/base/meson.build:46: DEPRECATION: Project uses feature that was always broken, and is now deprecated since '1.3.0': str.format: Value other than strings, integers, bools, options, dictionaries and lists thereof..\n\n:-(\n\nThe file object gained a full_path() method in v1.4.0, but we can't\ndepend on that yet.\n\nFor the public headers, I think we could set RECURSIVE = NO in\nDoxyfile-public.in, and add\n\n@TOP_SRCDIR@/include/libcamera\n@TOP_BUILDDIR@/include/libcamera\n\nthe INPUT. Due to what I think could be considered as a bug in doxygen,\nIMAGE_PATH seems to be affected by RECURSIVE:\n\n[2/104] Generating Documentation/doxygen with a custom command\nFAILED: Documentation/api-html \n/usr/bin/doxygen Documentation/Doxyfile-public\nsrc/libcamera/orientation.cpp:42: error: image file rotation/rotate0.svg is not found in IMAGE_PATH: assuming external image. (warning treated as error, aborting now)\n\nSetting IMAGE_PATH to\n\nIMAGE_PATH             = \"@TOP_SRCDIR@/Documentation/images\" \\\n                         \"@TOP_SRCDIR@/Documentation/images/rotation\"\n\nseems to work around the issue. If we submit a bug report to get this\nfixed in Doxygen, I think we can live with this for now.\n\nThis won't help for the source files, and would also not be a good\noption for include/libcamera/base/, as it contains a mix of public and\ninternal headers. We could move the latter to\ninclude/libcamera/base/internal (or include/libcamera/internal/base),\nbut I'm not thrilled. So it looks like we need something better. I'm\nexperimenting and will likely send a v5.\n\n> +\t)\n> +endforeach\n> diff --git a/include/libcamera/internal/meson.build b/include/libcamera/internal/meson.build\n> index 76c939bf..53fc2846 100644\n> --- a/include/libcamera/internal/meson.build\n> +++ b/include/libcamera/internal/meson.build\n> @@ -60,5 +60,12 @@ libcamera_internal_headers = [\n>      libcamera_internal_headers_undocumented,\n>  ]\n>  \n> +foreach lph : libcamera_internal_headers_documented\n> +\tdoxygen_public_sources += '/'.join(\n> +\t\tmeson.project_source_root(),\n> +\t\t'@0@'.format(lph)\n> +\t)\n> +endforeach\n> +\n>  subdir('converter')\n>  subdir('software_isp')\n> diff --git a/include/libcamera/meson.build b/include/libcamera/meson.build\n> index 84c6c4cb..59273785 100644\n> --- a/include/libcamera/meson.build\n> +++ b/include/libcamera/meson.build\n> @@ -26,6 +26,13 @@ subdir('ipa')\n>  install_headers(libcamera_public_headers,\n>                  subdir : libcamera_include_dir)\n>  \n> +foreach lph : libcamera_public_headers\n> +\tdoxygen_public_sources += '/'.join(\n> +\t\tmeson.project_source_root(),\n> +\t\t'@0@'.format(lph)\n> +\t)\n> +endforeach\n> +\n>  #\n>  # Generate headers from templates.\n>  #\n> @@ -86,6 +93,7 @@ foreach mode, entry : controls_map\n>                                                  '-r', ranges_file, '@INPUT@'],\n>                                       install : true,\n>                                       install_dir : libcamera_headers_install_dir)\n> +    doxygen_public_sources += control_headers.get(-1).full_path()\n>  endforeach\n>  \n>  libcamera_public_headers += control_headers\n> @@ -102,6 +110,7 @@ formats_h = custom_target('formats_h',\n>                            install : true,\n>                            install_dir : libcamera_headers_install_dir)\n>  libcamera_public_headers += formats_h\n> +doxygen_public_sources += formats_h.full_path()\n>  \n>  # libcamera.h\n>  libcamera_h = custom_target('gen-header',\n> @@ -112,6 +121,7 @@ libcamera_h = custom_target('gen-header',\n>                              install_dir : libcamera_headers_install_dir)\n>  \n>  libcamera_public_headers += libcamera_h\n> +doxygen_public_sources += libcamera_h.full_path()\n>  \n>  # version.h\n>  version = libcamera_version.split('.')\n> diff --git a/meson.build b/meson.build\n> index 2acd8c3e..8084f2fb 100644\n> --- a/meson.build\n> +++ b/meson.build\n> @@ -241,6 +241,14 @@ endif\n>  # Utilities are parsed first to provide support for other components.\n>  subdir('utils')\n>  \n> +# To support auto-generation of documentation we need an array of the paths to\n> +# public headers and source files so that we can tell doxygen which files to\n> +# look at later. Unfortunately the inclusion of custom targets in some of the\n> +# existing arrays precludes using them directly and you cannot generate File\n> +# objects from generated files, so we need to collect paths to relevant files\n> +# within an array.\n> +doxygen_public_sources = []\n> +\n>  subdir('include')\n>  subdir('src')\n>  \n> diff --git a/src/libcamera/base/class.cpp b/src/libcamera/base/class.cpp\n> index 61998398..b7ef3a1e 100644\n> --- a/src/libcamera/base/class.cpp\n> +++ b/src/libcamera/base/class.cpp\n> @@ -184,6 +184,7 @@ Extensible::Extensible(std::unique_ptr<Extensible::Private> d)\n>   */\n>  \n>  /**\n> + * \\internal\n>   * \\class Extensible::Private\n>   * \\brief Base class for private data managed through a d-pointer\n>   */\n> diff --git a/src/libcamera/base/meson.build b/src/libcamera/base/meson.build\n> index 523c5885..ae949a51 100644\n> --- a/src/libcamera/base/meson.build\n> +++ b/src/libcamera/base/meson.build\n> @@ -30,6 +30,13 @@ libcamera_base_sources = [\n>  \tlibcamera_base_internal_sources\n>  ]\n>  \n> +foreach lbps : libcamera_base_public_sources\n> +\tdoxygen_public_sources += '/'.join(\n> +\t\tmeson.project_source_root(),\n> +\t\t'@0@'.format(lbps)\n> +\t)\n> +endforeach\n> +\n>  libdw = dependency('libdw', required : false)\n>  libunwind = dependency('libunwind', required : false)\n>  \n> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n> index 67f34901..63285e2b 100644\n> --- a/src/libcamera/camera.cpp\n> +++ b/src/libcamera/camera.cpp\n> @@ -560,6 +560,13 @@ CameraConfiguration::Status CameraConfiguration::validateColorSpaces(ColorSpaceF\n>   */\n>  \n>  /**\n> + * \\internal\n> + * \\file libcamera\\internal\\camera.h\n> + * \\brief Internal Camera device handling\n> + */\n> +\n> +/**\n> + * \\internal\n>   * \\class Camera::Private\n>   * \\brief Base class for camera private data\n>   *\n> diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp\n> index 95a9e326..5a21132a 100644\n> --- a/src/libcamera/camera_manager.cpp\n> +++ b/src/libcamera/camera_manager.cpp\n> @@ -23,6 +23,7 @@\n>   */\n>  \n>  /**\n> + * \\internal\n>   * \\file libcamera/internal/camera_manager.h\n>   * \\brief Internal camera manager support\n>   */\n> diff --git a/src/libcamera/framebuffer.cpp b/src/libcamera/framebuffer.cpp\n> index 63d679cb..0f8c8f9d 100644\n> --- a/src/libcamera/framebuffer.cpp\n> +++ b/src/libcamera/framebuffer.cpp\n> @@ -16,7 +16,10 @@\n>  /**\n>   * \\file libcamera/framebuffer.h\n>   * \\brief Frame buffer handling\n> - *\n> + */\n> +\n> +/**\n> + * \\internal\n>   * \\file libcamera/internal/framebuffer.h\n>   * \\brief Internal frame buffer handling support\n>   */\n> @@ -105,6 +108,7 @@ LOG_DEFINE_CATEGORY(Buffer)\n>   */\n>  \n>  /**\n> + * \\internal\n>   * \\class FrameBuffer::Private\n>   * \\brief Base class for FrameBuffer private data\n>   *\n> diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build\n> index 9c74241d..1cc24cdc 100644\n> --- a/src/libcamera/meson.build\n> +++ b/src/libcamera/meson.build\n> @@ -59,6 +59,13 @@ libcamera_sources = [\n>  \tlibcamera_internal_sources\n>  ]\n>  \n> +foreach lps : libcamera_public_sources\n> +\tdoxygen_public_sources += '/'.join(\n> +\t\tmeson.project_source_root(),\n> +\t\t'@0@'.format(lps)\n> +\t)\n> +endforeach\n> +\n>  libcamera_sources += libcamera_public_headers\n>  libcamera_sources += libcamera_generated_ipa_headers\n>  libcamera_sources += libcamera_tracepoint_header\n> diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp\n> index cfb451e9..e8604121 100644\n> --- a/src/libcamera/request.cpp\n> +++ b/src/libcamera/request.cpp\n> @@ -33,6 +33,7 @@ namespace libcamera {\n>  LOG_DEFINE_CATEGORY(Request)\n>  \n>  /**\n> + * \\internal\n>   * \\class Request::Private\n>   * \\brief Request private data\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 F1BEBBDC71\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSun,  4 Aug 2024 18:49:17 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 097476195E;\n\tSun,  4 Aug 2024 20:49:16 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 482B06192D\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun,  4 Aug 2024 20:49:14 +0200 (CEST)","from pendragon.ideasonboard.com (81-175-209-231.bb.dnainternet.fi\n\t[81.175.209.231])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 289791BA;\n\tSun,  4 Aug 2024 20:48:23 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"NBjg1sk/\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1722797303;\n\tbh=ewSF2f/OPfu23xn/9FA+FsA1ebLz283IBIPJfruGb+8=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=NBjg1sk/SV5q5Wh4QeJK39zeXG37O7E+F9x22/5z0hYCrOWMaXuqVrUYdTHBFuTKE\n\tmG713Ol4Ilicb/LdDsUYD8s4hlSrTrvewTZx0H5bwg5poKWvI2Xn1GELjRAd75glIF\n\tS9cMXNIKEFUgsP61i3oeYUci2tWXd/6fKsuJaVWo=","Date":"Sun, 4 Aug 2024 21:48:51 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Daniel Scally <dan.scally@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org,\n\tJacopo Mondi <jacopo.mondi@ideasonboard.com>,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>","Subject":"Re: [PATCH v4 3/4] libcamera: Documentation: Split public/private\n\tdocumentation","Message-ID":"<20240804184851.GB29535@pendragon.ideasonboard.com>","References":"<20240731135201.2866145-1-dan.scally@ideasonboard.com>\n\t<20240731135201.2866145-4-dan.scally@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20240731135201.2866145-4-dan.scally@ideasonboard.com>","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>"}}]