{"id":19375,"url":"https://patchwork.libcamera.org/api/1.1/patches/19375/?format=json","web_url":"https://patchwork.libcamera.org/patch/19375/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/1.1/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20240105164104.78398-5-dan.scally@ideasonboard.com>","date":"2024-01-05T16:41:03","name":"[libcamera-devel,v2,4/5] libcamera: Documentation: Split public/private documentation","commit_ref":null,"pull_url":null,"state":"superseded","archived":false,"hash":"c4c0393d6256f17b5a1902af71bee46cef4a974e","submitter":{"id":156,"url":"https://patchwork.libcamera.org/api/1.1/people/156/?format=json","name":"Dan Scally","email":"dan.scally@ideasonboard.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/19375/mbox/","series":[{"id":4134,"url":"https://patchwork.libcamera.org/api/1.1/series/4134/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=4134","date":"2024-01-05T16:40:59","name":"Improve libcamera documentation","version":2,"mbox":"https://patchwork.libcamera.org/series/4134/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/19375/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/19375/checks/","tags":{},"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 B24B0C3240\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri,  5 Jan 2024 16:41:29 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 3A85362B5B;\n\tFri,  5 Jan 2024 17:41:29 +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 1785B61D7F\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri,  5 Jan 2024 17:41:23 +0100 (CET)","from mail.ideasonboard.com\n\t(cpc141996-chfd3-2-0-cust928.12-3.cable.virginm.net [86.13.91.161])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id AB145720;\n\tFri,  5 Jan 2024 17:40:21 +0100 (CET)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1704472889;\n\tbh=NQpHMPwALrL+ZuhT+DAkDG8pXbOrNIfX059XoVyzUEo=;\n\th=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:\n\tFrom;\n\tb=LSbiJFcIVfKhdV7Heg34TFwzHSjMPayCsuTOAc1soDBeOC2LkjlgvRZFMtsZPJBCv\n\tlZ6qqFZMZsYNfPdtQEhhbpd3DWgLeLz9bo5xZ5UbdYsBRj+e3zlFej/pCRWwnFMRll\n\tFjV+OhrseBKnJxLvUuXxwsrOOiudIJNtK4PjU7Ai/UoxHDcsw3rfrXPq38NQJ08NDb\n\tZkD3PQgrggeUAo4qKatJwTu3AkIXtSMUpjF8Gdb+QTGCToJL7TRD4pkvP00zT1Z6ni\n\tBl+GAcSZWxgC+FYr+yk5kF9JvCqcE4JHwwslMTpeDTK3Ed7m8CtS23vqxClcudVHt6\n\t/nkCpABpqpXbw==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1704472821;\n\tbh=NQpHMPwALrL+ZuhT+DAkDG8pXbOrNIfX059XoVyzUEo=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=KUmm9/b5+ISDuBMJwlR4ej76KNpVQK1zHau2IDnSGQQqMoDYBLtot1oD6sgyIor9h\n\t0My1NQb58+G2A99Ki55J2kfxwhrwu7RE1cofZAKq/NgepSqa6qbKeDlbJJlhkulLRT\n\tRBH149bfDK4eZx7laUXdUqmu6mKkK1whAXy69KlE="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"KUmm9/b5\"; dkim-atps=neutral","To":"libcamera-devel@lists.libcamera.org","Date":"Fri,  5 Jan 2024 16:41:03 +0000","Message-Id":"<20240105164104.78398-5-dan.scally@ideasonboard.com>","X-Mailer":"git-send-email 2.34.1","In-Reply-To":"<20240105164104.78398-1-dan.scally@ideasonboard.com>","References":"<20240105164104.78398-1-dan.scally@ideasonboard.com>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","Subject":"[libcamera-devel] [PATCH v2 4/5] libcamera: Documentation: Split\n\tpublic/private documentation","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>","From":"Daniel Scally via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Daniel Scally <dan.scally@ideasonboard.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"},"content":"The API reference pages generated by Doxygen are comprehensive, but\ntherefore quite overwhelming for application developers who will\nlikely never need to use the majority of the library's objects. To\nreduce the complexity of the documentation, split it into two runs of\ndoxygen.\n\nIn the first run of doxygen we pass a specific list of source files\nto parse, which is built from the File arrays in Meson's build files.\nThis ensures that we only generate the documentation for code from\nthose files.\n\nIn the second run allow doxygen to generate documentation for all of\nthe library's objects as it currently does. This set will now be\noutput into build/Documentation/internal-api-html.\n\nSigned-off-by: Daniel Scally <dan.scally@ideasonboard.com>\n---\nChanges 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     | 21 +++++++\n Documentation/Doxyfile-public.in       |  5 ++\n Documentation/Doxyfile.in              | 26 ++-------\n Documentation/meson.build              | 76 +++++++++++++++++++++++---\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, 160 insertions(+), 30 deletions(-)\n create mode 100644 Documentation/Doxyfile-internal.in\n create mode 100644 Documentation/Doxyfile-public.in","diff":"diff --git a/Documentation/Doxyfile-internal.in b/Documentation/Doxyfile-internal.in\nnew file mode 100644\nindex 00000000..7b3cce49\n--- /dev/null\n+++ b/Documentation/Doxyfile-internal.in\n@@ -0,0 +1,21 @@\n+# SPDX-License-Identifier: CC-BY-SA-4.0\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@/src/libcamera/proxy/\ndiff --git a/Documentation/Doxyfile-public.in b/Documentation/Doxyfile-public.in\nnew file mode 100644\nindex 00000000..cdbc03a0\n--- /dev/null\n+++ b/Documentation/Doxyfile-public.in\n@@ -0,0 +1,5 @@\n+# SPDX-License-Identifier: CC-BY-SA-4.0\n+\n+INPUT                  = \"@TOP_SRCDIR@/Documentation\" \\\n+                         \"@INPUT@\" \\\n+                         \"@TOP_BUILDDIR@/src/libcamera/version.cpp\"\ndiff --git a/Documentation/Doxyfile.in b/Documentation/Doxyfile.in\nindex 48fea8bc..a271c7bc 100644\n--- a/Documentation/Doxyfile.in\n+++ b/Documentation/Doxyfile.in\n@@ -21,14 +21,6 @@ CASE_SENSE_NAMES       = YES\n \n QUIET                  = 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 FILE_PATTERNS          = *.c \\\n                          *.cpp \\\n                          *.h \\\n@@ -36,17 +28,8 @@ 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@/src/libcamera/proxy/\n+@INCLUDE_PATH          = @TOP_BUILDDIR@/Documentation\n+@INCLUDE               = @INCLUDE_FILE@\n \n EXCLUDE_PATTERNS       = @TOP_BUILDDIR@/include/libcamera/ipa/*_serializer.h \\\n                          @TOP_BUILDDIR@/include/libcamera/ipa/*_proxy.h \\\n@@ -70,7 +53,10 @@ EXCLUDE_SYMBOLS        = libcamera::BoundMethodArgs \\\n \n EXCLUDE_SYMLINKS       = YES\n \n-HTML_OUTPUT            = api-html\n+HIDE_UNDOC_CLASSES     = @HIDE_UNDOC_CLASSES@\n+HIDE_UNDOC_MEMBERS     = @HIDE_UNDOC_MEMBERS@\n+HTML_OUTPUT            = @HTML_OUTPUT@\n+INTERNAL_DOCS          = @INTERNAL_DOCS@\n \n GENERATE_LATEX         = NO\n \ndiff --git a/Documentation/meson.build b/Documentation/meson.build\nindex 7a58fec8..afaad751 100644\n--- a/Documentation/meson.build\n+++ b/Documentation/meson.build\n@@ -23,12 +23,7 @@ if doxygen.found() and dot.found()\n \n     cdata.set('PREDEFINED', ' \\\\\\n\\t\\t\\t '.join(doxygen_predefined))\n \n-    doxyfile = configure_file(input : 'Doxyfile.in',\n-                              output : 'Doxyfile',\n-                              configuration : cdata)\n-\n-    doxygen_input = [\n-        doxyfile,\n+    global_doxygen_input = [\n         libcamera_base_headers,\n         libcamera_base_sources,\n         libcamera_internal_headers,\n@@ -41,16 +36,79 @@ 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 \n+    # We need to generate two \"include\" files for the final Doxyfile which\n+    # define a set of source files to use in the documentation parsing. We\n+    # collected a list of the public sources in doxygen_public_sources, so we\n+    # pass that to the doxyfiles so that Doxyfile-public refers only to those\n+    # files. Although INPUT is sent to both, Doxyfile-internal.in doesn't refer\n+    # to it and just hardcodes the directories to parse.\n+    cdata.set('INPUT', '\" \\\\\\n\\t\\t\\t \"'.join(doxygen_public_sources))\n+    doxyfile_include_public = configure_file(input : 'Doxyfile-public.in',\n+                                             output : 'Doxyfile-include-public',\n+                                             configuration : cdata)\n+    doxyfile_include_internal = configure_file(input : 'Doxyfile-internal.in',\n+                                               output : 'Doxyfile-include-internal',\n+                                               configuration : cdata)\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. To achieve this we need to\n+    # flag as \\internal some of the comments for objects which we wish to hide,\n+    # and remove the auto generated documents via HIDE_UNDOC_CLASSES and\n+    # HIDE_UNDOC_MEMBERS.\n+\n+    cdata_public = configuration_data()\n+    cdata_public.merge_from(cdata)\n+    cdata_public.set('HIDE_UNDOC_CLASSES', 'YES')\n+    cdata_public.set('HIDE_UNDOC_MEMBERS', 'YES')\n+    cdata_public.set('HTML_OUTPUT', 'api-html')\n+    cdata_public.set('INCLUDE_FILE', 'Doxyfile-include-public')\n+    cdata_public.set('INTERNAL_DOCS', 'NO')\n+\n+    doxyfile_public = configure_file(input : 'Doxyfile.in',\n+                                     output : 'Doxyfile-public',\n+                                     configuration : cdata_public)\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, so _don't_ hide undocumented classes\n+    # as we want everything to show up and warnings to be generated if any\n+    # documentation is missing.\n+\n+    cdata_internal = configuration_data()\n+    cdata_internal.merge_from(cdata)\n+    cdata_internal.set('HIDE_UNDOC_CLASSES', 'NO')\n+    cdata_internal.set('HIDE_UNDOC_MEMBERS', 'NO')\n+    cdata_internal.set('HTML_OUTPUT', 'internal-api-html')\n+    cdata_internal.set('INCLUDE_FILE', 'Doxyfile-include-internal')\n+    cdata_internal.set('INTERNAL_DOCS', 'YES')\n+\n+    doxyfile_internal = configure_file(input : 'Doxyfile.in',\n+                                       output : 'Doxyfile-internal',\n+                                       configuration : cdata_internal)\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 #\ndiff --git a/include/libcamera/base/meson.build b/include/libcamera/base/meson.build\nindex f24f47de..82277f46 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+\t)\n+endforeach\ndiff --git a/include/libcamera/internal/meson.build b/include/libcamera/internal/meson.build\nindex 4d59cb2a..4af36884 100644\n--- a/include/libcamera/internal/meson.build\n+++ b/include/libcamera/internal/meson.build\n@@ -58,4 +58,11 @@ libcamera_internal_headers = [\n     libcamera_internal_headers_publically_undocumented\n ]\n \n+foreach lph : libcamera_internal_headers_publically_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')\ndiff --git a/include/libcamera/meson.build b/include/libcamera/meson.build\nindex bab858a3..25e2f8a4 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@@ -85,6 +92,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@@ -101,6 +109,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@@ -111,6 +120,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('.')\ndiff --git a/meson.build b/meson.build\nindex e49de4c2..cca1883e 100644\n--- a/meson.build\n+++ b/meson.build\n@@ -231,6 +231,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 \ndiff --git a/src/libcamera/base/class.cpp b/src/libcamera/base/class.cpp\nindex 9c2d9f21..70fd5cd5 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  */\ndiff --git a/src/libcamera/base/meson.build b/src/libcamera/base/meson.build\nindex 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 \ndiff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\nindex 0ad1a4b5..ed46f853 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  *\ndiff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp\nindex 355f3ada..61d45256 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  */\ndiff --git a/src/libcamera/framebuffer.cpp b/src/libcamera/framebuffer.cpp\nindex 5a7f3c0b..db450e11 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  *\ndiff --git a/src/libcamera/meson.build b/src/libcamera/meson.build\nindex 676470c1..413e14db 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\ndiff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp\nindex 949c556f..930d8c92 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  *\n","prefixes":["libcamera-devel","v2","4/5"]}