[libcamera-devel,12/16] libcamera/base: Validate internal headers as private
diff mbox series

Message ID 20210625013539.625803-13-kieran.bingham@ideasonboard.com
State Accepted
Headers show
Series
  • libcamera-base: A new split on libcamera
Related show

Commit Message

Kieran Bingham June 25, 2021, 1:35 a.m. UTC
Headers which must not be exposed as part of the public libcamera API
can include base/private.h.

Any interface which includes the private.h header will only be able to
build if the libcamera_private dependency is used (or the
libcamera_base_private dependency directly)

Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
---
 include/libcamera/base/event_dispatcher.h     |  2 ++
 .../libcamera/base/event_dispatcher_poll.h    |  2 ++
 include/libcamera/base/event_notifier.h       |  1 +
 include/libcamera/base/file.h                 |  1 +
 include/libcamera/base/log.h                  |  1 +
 include/libcamera/base/meson.build            |  1 +
 include/libcamera/base/private.h              | 22 +++++++++++++++++++
 include/libcamera/base/semaphore.h            |  1 +
 include/libcamera/base/thread.h               |  1 +
 include/libcamera/base/timer.h                |  1 +
 include/libcamera/base/utils.h                |  2 ++
 src/android/meson.build                       |  2 +-
 src/ipa/ipu3/meson.build                      |  2 +-
 src/ipa/libipa/meson.build                    |  2 +-
 src/ipa/raspberrypi/meson.build               |  2 +-
 src/ipa/rkisp1/meson.build                    |  2 +-
 src/ipa/vimc/meson.build                      |  2 +-
 src/libcamera/base/meson.build                |  8 +++++++
 src/libcamera/meson.build                     | 10 +++++++--
 src/libcamera/proxy/worker/meson.build        |  2 +-
 src/v4l2/meson.build                          |  2 +-
 test/camera/meson.build                       |  2 +-
 test/ipa/meson.build                          |  2 +-
 test/ipc/meson.build                          |  2 +-
 test/libtest/meson.build                      |  2 +-
 test/log/meson.build                          |  2 +-
 test/media_device/meson.build                 |  4 ++--
 test/meson.build                              |  2 +-
 test/pipeline/ipu3/meson.build                |  2 +-
 test/pipeline/rkisp1/meson.build              |  2 +-
 test/process/meson.build                      |  2 +-
 .../generated_serializer/meson.build          |  2 +-
 test/serialization/meson.build                |  2 +-
 test/v4l2_subdevice/meson.build               |  2 +-
 test/v4l2_videodevice/meson.build             |  2 +-
 35 files changed, 74 insertions(+), 25 deletions(-)
 create mode 100644 include/libcamera/base/private.h

Comments

Hirokazu Honda June 25, 2021, 4:12 a.m. UTC | #1
Hi Kieran, thank you for the patch.

On Fri, Jun 25, 2021 at 10:35 AM Kieran Bingham
<kieran.bingham@ideasonboard.com> wrote:
>
> Headers which must not be exposed as part of the public libcamera API
> can include base/private.h.
>
> Any interface which includes the private.h header will only be able to
> build if the libcamera_private dependency is used (or the
> libcamera_base_private dependency directly)
>

I couldn't understand well which one of the four dependencies
(libcamera_private, libcamera_base, libcamera_dep,
libcamera_base_private) should be used in a specific target.
Would you mind describing the rule of using these dependencies?

> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
> ---
>  include/libcamera/base/event_dispatcher.h     |  2 ++
>  .../libcamera/base/event_dispatcher_poll.h    |  2 ++
>  include/libcamera/base/event_notifier.h       |  1 +
>  include/libcamera/base/file.h                 |  1 +
>  include/libcamera/base/log.h                  |  1 +
>  include/libcamera/base/meson.build            |  1 +
>  include/libcamera/base/private.h              | 22 +++++++++++++++++++
>  include/libcamera/base/semaphore.h            |  1 +
>  include/libcamera/base/thread.h               |  1 +
>  include/libcamera/base/timer.h                |  1 +
>  include/libcamera/base/utils.h                |  2 ++
>  src/android/meson.build                       |  2 +-
>  src/ipa/ipu3/meson.build                      |  2 +-
>  src/ipa/libipa/meson.build                    |  2 +-
>  src/ipa/raspberrypi/meson.build               |  2 +-
>  src/ipa/rkisp1/meson.build                    |  2 +-
>  src/ipa/vimc/meson.build                      |  2 +-
>  src/libcamera/base/meson.build                |  8 +++++++
>  src/libcamera/meson.build                     | 10 +++++++--
>  src/libcamera/proxy/worker/meson.build        |  2 +-
>  src/v4l2/meson.build                          |  2 +-
>  test/camera/meson.build                       |  2 +-
>  test/ipa/meson.build                          |  2 +-
>  test/ipc/meson.build                          |  2 +-
>  test/libtest/meson.build                      |  2 +-
>  test/log/meson.build                          |  2 +-
>  test/media_device/meson.build                 |  4 ++--
>  test/meson.build                              |  2 +-
>  test/pipeline/ipu3/meson.build                |  2 +-
>  test/pipeline/rkisp1/meson.build              |  2 +-
>  test/process/meson.build                      |  2 +-
>  .../generated_serializer/meson.build          |  2 +-
>  test/serialization/meson.build                |  2 +-
>  test/v4l2_subdevice/meson.build               |  2 +-
>  test/v4l2_videodevice/meson.build             |  2 +-
>  35 files changed, 74 insertions(+), 25 deletions(-)
>  create mode 100644 include/libcamera/base/private.h
>
> diff --git a/include/libcamera/base/event_dispatcher.h b/include/libcamera/base/event_dispatcher.h
> index 045df27fff16..825af7a33919 100644
> --- a/include/libcamera/base/event_dispatcher.h
> +++ b/include/libcamera/base/event_dispatcher.h
> @@ -9,6 +9,8 @@
>
>  #include <vector>
>
> +#include <libcamera/base/private.h>
> +
>  namespace libcamera {
>
>  class EventNotifier;
> diff --git a/include/libcamera/base/event_dispatcher_poll.h b/include/libcamera/base/event_dispatcher_poll.h
> index ae2a3f04e4b9..88835902980c 100644
> --- a/include/libcamera/base/event_dispatcher_poll.h
> +++ b/include/libcamera/base/event_dispatcher_poll.h
> @@ -13,6 +13,8 @@
>
>  #include <libcamera/base/event_dispatcher.h>
>
> +#include <libcamera/base/private.h>
> +
>  struct pollfd;
>
>  namespace libcamera {
> diff --git a/include/libcamera/base/event_notifier.h b/include/libcamera/base/event_notifier.h
> index 8a6419f23004..6bb4e5143aa6 100644
> --- a/include/libcamera/base/event_notifier.h
> +++ b/include/libcamera/base/event_notifier.h
> @@ -8,6 +8,7 @@
>  #define __LIBCAMERA_INTERNAL_EVENT_NOTIFIER_H__
>
>  #include <libcamera/base/object.h>
> +#include <libcamera/base/private.h>
>  #include <libcamera/base/signal.h>
>
>  namespace libcamera {
> diff --git a/include/libcamera/base/file.h b/include/libcamera/base/file.h
> index e8e4b76e1a4e..cecbb254591f 100644
> --- a/include/libcamera/base/file.h
> +++ b/include/libcamera/base/file.h
> @@ -12,6 +12,7 @@
>  #include <sys/types.h>
>
>  #include <libcamera/base/class.h>
> +#include <libcamera/base/private.h>
>
>  #include <libcamera/span.h>
>
> diff --git a/include/libcamera/base/log.h b/include/libcamera/base/log.h
> index b93c947ae7db..70582cd47902 100644
> --- a/include/libcamera/base/log.h
> +++ b/include/libcamera/base/log.h
> @@ -11,6 +11,7 @@
>  #include <sstream>
>
>  #include <libcamera/base/class.h>
> +#include <libcamera/base/private.h>
>  #include <libcamera/base/utils.h>
>
>  namespace libcamera {
> diff --git a/include/libcamera/base/meson.build b/include/libcamera/base/meson.build
> index 83c664affc88..aaac324d7149 100644
> --- a/include/libcamera/base/meson.build
> +++ b/include/libcamera/base/meson.build
> @@ -12,6 +12,7 @@ libcamera_base_headers = files([
>      'log.h',
>      'message.h',
>      'object.h',
> +    'private.h',
>      'semaphore.h',
>      'signal.h',
>      'thread.h',
> diff --git a/include/libcamera/base/private.h b/include/libcamera/base/private.h
> new file mode 100644
> index 000000000000..b54ad076688e
> --- /dev/null
> +++ b/include/libcamera/base/private.h
> @@ -0,0 +1,22 @@
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/*
> + * Copyright (C) 2021, Google Inc.
> + *
> + * private.h - Private Header Validation
> + *
> + * A selection of internal libcamera headers are installed as part
> + * of the libcamera package to allow sharing of a select subset of
> + * internal functionality with IPA module developers only.
> + *
> + * This functionality is not considered part of the public libcamera
> + * API, and can therefore potentially face ABI instabilities which
> + * should not be exposed to applications. IPA modules however should be
> + * versioned and more closely matched to the libcamera installation.
> + *
> + * Components which include this file can not be included in any file
> + * which forms part of the libcamera API.
> + */
> +
> +#ifndef LIBCAMERA_BASE_PRIVATE
> +#error "Private headers must not be included in the libcamera API"
> +#endif
> diff --git a/include/libcamera/base/semaphore.h b/include/libcamera/base/semaphore.h
> index c8e62e3ee68b..d8146eb8060b 100644
> --- a/include/libcamera/base/semaphore.h
> +++ b/include/libcamera/base/semaphore.h
> @@ -9,6 +9,7 @@
>
>  #include <condition_variable>
>
> +#include <libcamera/base/private.h>
>  #include <libcamera/base/thread.h>
>
>  namespace libcamera {
> diff --git a/include/libcamera/base/thread.h b/include/libcamera/base/thread.h
> index 2ed18d49c978..b30ed12715a2 100644
> --- a/include/libcamera/base/thread.h
> +++ b/include/libcamera/base/thread.h
> @@ -13,6 +13,7 @@
>  #include <thread>
>
>  #include <libcamera/base/message.h>
> +#include <libcamera/base/private.h>
>  #include <libcamera/base/signal.h>
>  #include <libcamera/base/utils.h>
>
> diff --git a/include/libcamera/base/timer.h b/include/libcamera/base/timer.h
> index e79e85f1ef0d..f762e8767d97 100644
> --- a/include/libcamera/base/timer.h
> +++ b/include/libcamera/base/timer.h
> @@ -11,6 +11,7 @@
>  #include <stdint.h>
>
>  #include <libcamera/base/object.h>
> +#include <libcamera/base/private.h>
>  #include <libcamera/base/signal.h>
>
>  namespace libcamera {
> diff --git a/include/libcamera/base/utils.h b/include/libcamera/base/utils.h
> index d1aaff65211a..07685045aa05 100644
> --- a/include/libcamera/base/utils.h
> +++ b/include/libcamera/base/utils.h
> @@ -19,6 +19,8 @@
>  #include <utility>
>  #include <vector>
>
> +#include <libcamera/base/private.h>
> +
>  #ifndef __DOXYGEN__
>
>  /* uClibc and uClibc-ng don't provide O_TMPFILE */
> diff --git a/src/android/meson.build b/src/android/meson.build
> index bd58ef964c2a..7d1e7e85f16e 100644
> --- a/src/android/meson.build
> +++ b/src/android/meson.build
> @@ -4,7 +4,7 @@ android_deps = [
>      dependency('libexif', required : get_option('android')),
>      dependency('libjpeg', required : get_option('android')),
>      dependency('yaml-0.1', required : get_option('android')),
> -    libcamera_dep,
> +    libcamera_private,
>  ]
>
>  android_enabled = true
> diff --git a/src/ipa/ipu3/meson.build b/src/ipa/ipu3/meson.build
> index 0d843846acde..b63641908710 100644
> --- a/src/ipa/ipu3/meson.build
> +++ b/src/ipa/ipu3/meson.build
> @@ -12,7 +12,7 @@ mod = shared_module(ipa_name,
>                      [ipu3_ipa_sources, libcamera_generated_ipa_headers],
>                      name_prefix : '',
>                      include_directories : [ipa_includes, libipa_includes],
> -                    dependencies : libcamera_dep,
> +                    dependencies : libcamera_private,
>                      link_with : libipa,
>                      install : true,
>                      install_dir : ipa_install_dir)
> diff --git a/src/ipa/libipa/meson.build b/src/ipa/libipa/meson.build
> index 038fc49060ef..ca541a5aafd7 100644
> --- a/src/ipa/libipa/meson.build
> +++ b/src/ipa/libipa/meson.build
> @@ -14,4 +14,4 @@ libipa_includes = include_directories('..')
>
>  libipa = static_library('ipa', [libipa_sources, libipa_headers],
>                          include_directories : ipa_includes,
> -                        dependencies : libcamera_dep)
> +                        dependencies : libcamera_private)
> diff --git a/src/ipa/raspberrypi/meson.build b/src/ipa/raspberrypi/meson.build
> index 230356d3ce3a..d7203aa042cd 100644
> --- a/src/ipa/raspberrypi/meson.build
> +++ b/src/ipa/raspberrypi/meson.build
> @@ -3,7 +3,7 @@
>  ipa_name = 'ipa_rpi'
>
>  rpi_ipa_deps = [
> -    libcamera_dep,
> +    libcamera_private,
>      dependency('boost'),
>      libatomic,
>  ]
> diff --git a/src/ipa/rkisp1/meson.build b/src/ipa/rkisp1/meson.build
> index 1a1c71591039..f76b37f5af50 100644
> --- a/src/ipa/rkisp1/meson.build
> +++ b/src/ipa/rkisp1/meson.build
> @@ -6,7 +6,7 @@ mod = shared_module(ipa_name,
>                      ['rkisp1.cpp', libcamera_generated_ipa_headers],
>                      name_prefix : '',
>                      include_directories : [ipa_includes, libipa_includes],
> -                    dependencies : libcamera_dep,
> +                    dependencies : libcamera_private,
>                      link_with : libipa,
>                      install : true,
>                      install_dir : ipa_install_dir)
> diff --git a/src/ipa/vimc/meson.build b/src/ipa/vimc/meson.build
> index a35825ae25a6..ecbeee136451 100644
> --- a/src/ipa/vimc/meson.build
> +++ b/src/ipa/vimc/meson.build
> @@ -6,7 +6,7 @@ mod = shared_module(ipa_name,
>                      ['vimc.cpp', libcamera_generated_ipa_headers],
>                      name_prefix : '',
>                      include_directories : [ipa_includes, libipa_includes],
> -                    dependencies : libcamera_dep,
> +                    dependencies : libcamera_private,
>                      link_with : libipa,
>                      install : true,
>                      install_dir : ipa_install_dir)
> diff --git a/src/libcamera/base/meson.build b/src/libcamera/base/meson.build
> index a8b04cfc8a5f..871721571e98 100644
> --- a/src/libcamera/base/meson.build
> +++ b/src/libcamera/base/meson.build
> @@ -21,10 +21,15 @@ libcamera_base_deps = [
>      dependency('threads'),
>  ]
>
> +# Internal components must use the libcamera_base_private dependency to enable
> +# the use of headers which must not be exposed to the libcamera public api.
> +libcamera_base_args = [ '-DLIBCAMERA_BASE_PRIVATE' ]
> +
>  libcamera_base_lib = shared_library('libcamera-base',
>                                      [libcamera_base_sources, libcamera_base_headers],
>                                      name_prefix : '',
>                                      install : true,
> +                                    cpp_args : libcamera_base_args,
>                                      include_directories : libcamera_includes,
>                                      dependencies : libcamera_base_deps)
>
> @@ -39,3 +44,6 @@ pkg_mod.generate(libcamera_base_lib,
>                   version : '1.0',
>                   description : 'Camera support base utility library',
>                   subdirs : 'libcamera')
> +
> +libcamera_base_private = declare_dependency(dependencies : libcamera_base,
> +                                            compile_args : libcamera_base_args)
> diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
> index 1f163cfe1225..64c7475f1a2e 100644
> --- a/src/libcamera/meson.build
> +++ b/src/libcamera/meson.build
> @@ -115,7 +115,7 @@ libcamera_deps = [
>      libgnutls,
>      liblttng,
>      libudev,
> -    libcamera_base,
> +    libcamera_base_private,
>  ]
>
>  # We add '/' to the build_rpath as a 'safe' path to act as a boolean flag.
> @@ -143,9 +143,15 @@ libcamera_dep = declare_dependency(sources : [
>                                         libcamera_generated_ipa_headers,
>                                     ],
>                                     include_directories : libcamera_includes,
> -                                   dependencies: libcamera_base,
> +                                   dependencies : libcamera_base,
>                                     link_with : libcamera)
>
> +# Internal dependancy for components and plugins which can use Private APIs
> +libcamera_private = declare_dependency(dependencies : [
> +                                           libcamera_dep,
> +                                           libcamera_base_private,
> +                                       ])
> +
>  pkg_mod = import('pkgconfig')
>  pkg_mod.generate(libcamera,
>                   libraries : libcamera_base_lib,
> diff --git a/src/libcamera/proxy/worker/meson.build b/src/libcamera/proxy/worker/meson.build
> index 28fe5f1fd6b2..70c8760a3d42 100644
> --- a/src/libcamera/proxy/worker/meson.build
> +++ b/src/libcamera/proxy/worker/meson.build
> @@ -21,7 +21,7 @@ foreach mojom : ipa_mojoms
>                         [worker, libcamera_generated_ipa_headers],
>                         install : true,
>                         install_dir : proxy_install_dir,
> -                       dependencies : libcamera_dep)
> +                       dependencies : libcamera_private)
>  endforeach
>
>  config_h.set('IPA_PROXY_DIR',
> diff --git a/src/v4l2/meson.build b/src/v4l2/meson.build
> index 0accac194be4..f78497b6799b 100644
> --- a/src/v4l2/meson.build
> +++ b/src/v4l2/meson.build
> @@ -31,5 +31,5 @@ v4l2_compat = shared_library('v4l2-compat',
>                               v4l2_compat_sources,
>                               name_prefix : '',
>                               install : true,
> -                             dependencies : [libcamera_dep, libdl],
> +                             dependencies : [libcamera_private, libdl],
>                               cpp_args : v4l2_compat_cpp_args)
> diff --git a/test/camera/meson.build b/test/camera/meson.build
> index 9cb95affffab..002a87b594e0 100644
> --- a/test/camera/meson.build
> +++ b/test/camera/meson.build
> @@ -12,7 +12,7 @@ camera_tests = [
>
>  foreach t : camera_tests
>      exe = executable(t[0], t[1],
> -                     dependencies : libcamera_dep,
> +                     dependencies : libcamera_private,
>                       link_with : test_libraries,
>                       include_directories : test_includes_internal)
>      test(t[0], exe, suite : 'camera', is_parallel : false)
> diff --git a/test/ipa/meson.build b/test/ipa/meson.build
> index e8a041b5bbd2..7938633e54ab 100644
> --- a/test/ipa/meson.build
> +++ b/test/ipa/meson.build
> @@ -7,7 +7,7 @@ ipa_test = [
>
>  foreach t : ipa_test
>      exe = executable(t[0], [t[1], libcamera_generated_ipa_headers],
> -                     dependencies : libcamera_dep,
> +                     dependencies : libcamera_private,
>                       link_with : [libipa, test_libraries],
>                       include_directories : [libipa_includes, test_includes_internal])
>
> diff --git a/test/ipc/meson.build b/test/ipc/meson.build
> index ad47b2feb718..2a6cd7fb8433 100644
> --- a/test/ipc/meson.build
> +++ b/test/ipc/meson.build
> @@ -7,7 +7,7 @@ ipc_tests = [
>
>  foreach t : ipc_tests
>      exe = executable(t[0], t[1],
> -                     dependencies : libcamera_dep,
> +                     dependencies : libcamera_private,
>                       link_with : test_libraries,
>                       include_directories : test_includes_internal)
>
> diff --git a/test/libtest/meson.build b/test/libtest/meson.build
> index 542335ea5e7c..351629f3ce73 100644
> --- a/test/libtest/meson.build
> +++ b/test/libtest/meson.build
> @@ -18,7 +18,7 @@ test_includes_internal = [
>  ]
>
>  libtest = static_library('libtest', libtest_sources,
> -                         dependencies : libcamera_dep,
> +                         dependencies : libcamera_private,
>                           include_directories : test_includes_internal)
>
>  test_libraries = [libtest]
> diff --git a/test/log/meson.build b/test/log/meson.build
> index 8cd664e04a00..ac87841a24e1 100644
> --- a/test/log/meson.build
> +++ b/test/log/meson.build
> @@ -7,7 +7,7 @@ log_test = [
>
>  foreach t : log_test
>      exe = executable(t[0], t[1],
> -                     dependencies : libcamera_dep,
> +                     dependencies : libcamera_private,
>                       link_with : test_libraries,
>                       include_directories : test_includes_internal)
>
> diff --git a/test/media_device/meson.build b/test/media_device/meson.build
> index 1dfcdd8bd744..83dfe8f11d2f 100644
> --- a/test/media_device/meson.build
> +++ b/test/media_device/meson.build
> @@ -11,12 +11,12 @@ media_device_tests = [
>  ]
>
>  lib_mdev_test = static_library('lib_mdev_test', lib_mdev_test_sources,
> -                               dependencies : libcamera_dep,
> +                               dependencies : libcamera_private,
>                                 include_directories : test_includes_internal)
>
>  foreach t : media_device_tests
>      exe = executable(t[0], t[1],
> -                     dependencies : libcamera_dep,
> +                     dependencies : libcamera_private,
>                       link_with : [test_libraries, lib_mdev_test],
>                       include_directories : test_includes_internal)
>
> diff --git a/test/meson.build b/test/meson.build
> index 045ad2a2d7c9..b8615e0fd3e6 100644
> --- a/test/meson.build
> +++ b/test/meson.build
> @@ -64,7 +64,7 @@ endforeach
>
>  foreach t : internal_tests
>      exe = executable(t[0], t[1],
> -                     dependencies : libcamera_dep,
> +                     dependencies : libcamera_private,
>                       link_with : test_libraries,
>                       include_directories : test_includes_internal)
>
> diff --git a/test/pipeline/ipu3/meson.build b/test/pipeline/ipu3/meson.build
> index d062ecd269f2..16701080ca2b 100644
> --- a/test/pipeline/ipu3/meson.build
> +++ b/test/pipeline/ipu3/meson.build
> @@ -6,7 +6,7 @@ ipu3_test = [
>
>  foreach t : ipu3_test
>      exe = executable(t[0], t[1],
> -                     dependencies : libcamera_dep,
> +                     dependencies : libcamera_private,
>                       link_with : test_libraries,
>                       include_directories : test_includes_internal)
>
> diff --git a/test/pipeline/rkisp1/meson.build b/test/pipeline/rkisp1/meson.build
> index ece147b054e4..364b5711a0f9 100644
> --- a/test/pipeline/rkisp1/meson.build
> +++ b/test/pipeline/rkisp1/meson.build
> @@ -6,7 +6,7 @@ rkisp1_test = [
>
>  foreach t : rkisp1_test
>      exe = executable(t[0], t[1],
> -                     dependencies : libcamera_dep,
> +                     dependencies : libcamera_private,
>                       link_with : test_libraries,
>                       include_directories : test_includes_internal)
>
> diff --git a/test/process/meson.build b/test/process/meson.build
> index d2272d509db3..af86b277db63 100644
> --- a/test/process/meson.build
> +++ b/test/process/meson.build
> @@ -6,7 +6,7 @@ process_tests = [
>
>  foreach t : process_tests
>      exe = executable(t[0], t[1],
> -                     dependencies : libcamera_dep,
> +                     dependencies : libcamera_private,
>                       link_with : test_libraries,
>                       include_directories : test_includes_internal)
>
> diff --git a/test/serialization/generated_serializer/meson.build b/test/serialization/generated_serializer/meson.build
> index 2460e0b114b3..9fb9cd1db968 100644
> --- a/test/serialization/generated_serializer/meson.build
> +++ b/test/serialization/generated_serializer/meson.build
> @@ -8,7 +8,7 @@ exe = executable('generated_serializer_test',
>                       generated_test_header,
>                       generated_test_serializer,
>                   ],
> -                 dependencies : libcamera_dep,
> +                 dependencies : libcamera_private,
>                   link_with : test_libraries,
>                   include_directories : [
>                       test_includes_internal,
> diff --git a/test/serialization/meson.build b/test/serialization/meson.build
> index 60ebf3255b28..5446e4907f33 100644
> --- a/test/serialization/meson.build
> +++ b/test/serialization/meson.build
> @@ -9,7 +9,7 @@ serialization_tests = [
>
>  foreach t : serialization_tests
>      exe = executable(t[0], [t[1], 'serialization_test.cpp'],
> -                     dependencies : libcamera_dep,
> +                     dependencies : libcamera_private,
>                       link_with : test_libraries,
>                       include_directories : test_includes_internal)
>      test(t[0], exe, suite : 'serialization', is_parallel : true)
> diff --git a/test/v4l2_subdevice/meson.build b/test/v4l2_subdevice/meson.build
> index 40d39766af9b..d82be3c60b75 100644
> --- a/test/v4l2_subdevice/meson.build
> +++ b/test/v4l2_subdevice/meson.build
> @@ -7,7 +7,7 @@ v4l2_subdevice_tests = [
>
>  foreach t : v4l2_subdevice_tests
>      exe = executable(t[0], [t[1], 'v4l2_subdevice_test.cpp'],
> -        dependencies : libcamera_dep,
> +        dependencies : libcamera_private,
>          link_with : test_libraries,
>          include_directories : test_includes_internal)
>      test(t[0], exe, suite : 'v4l2_subdevice', is_parallel : false)
> diff --git a/test/v4l2_videodevice/meson.build b/test/v4l2_videodevice/meson.build
> index e733518c0185..643f82edce5e 100644
> --- a/test/v4l2_videodevice/meson.build
> +++ b/test/v4l2_videodevice/meson.build
> @@ -16,7 +16,7 @@ v4l2_videodevice_tests = [
>
>  foreach t : v4l2_videodevice_tests
>      exe = executable(t[0], [t[1], 'v4l2_videodevice_test.cpp'],
> -                     dependencies : libcamera_dep,
> +                     dependencies : libcamera_private,
>                       link_with : test_libraries,
>                       include_directories : test_includes_internal)
>      test(t[0], exe, suite : 'v4l2_videodevice', is_parallel : false)
> --
> 2.30.2
>
Paul Elder June 25, 2021, 8:40 a.m. UTC | #2
Hi Hiro,

On Fri, Jun 25, 2021 at 01:12:57PM +0900, Hirokazu Honda wrote:
> Hi Kieran, thank you for the patch.
> 
> On Fri, Jun 25, 2021 at 10:35 AM Kieran Bingham
> <kieran.bingham@ideasonboard.com> wrote:
> >
> > Headers which must not be exposed as part of the public libcamera API
> > can include base/private.h.
> >
> > Any interface which includes the private.h header will only be able to
> > build if the libcamera_private dependency is used (or the
> > libcamera_base_private dependency directly)
> >
> 
> I couldn't understand well which one of the four dependencies
> (libcamera_private, libcamera_base, libcamera_dep,
> libcamera_base_private) should be used in a specific target.
> Would you mind describing the rule of using these dependencies?

My understanding is that:

- libcamera_base is everything in base
- libcamera_base_private is libcamera_base + the macro required for
  using the private headers
- libcamera_dep is public + private, for things like IPAs and internal
  components (but doesn't include the macro for private headers)
- libcamera_private is libcamera_dep + the macro

Kieran, is this correct? (it is a bit hard to keep track of...)


Paul

> 
> > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
> > ---
> >  include/libcamera/base/event_dispatcher.h     |  2 ++
> >  .../libcamera/base/event_dispatcher_poll.h    |  2 ++
> >  include/libcamera/base/event_notifier.h       |  1 +
> >  include/libcamera/base/file.h                 |  1 +
> >  include/libcamera/base/log.h                  |  1 +
> >  include/libcamera/base/meson.build            |  1 +
> >  include/libcamera/base/private.h              | 22 +++++++++++++++++++
> >  include/libcamera/base/semaphore.h            |  1 +
> >  include/libcamera/base/thread.h               |  1 +
> >  include/libcamera/base/timer.h                |  1 +
> >  include/libcamera/base/utils.h                |  2 ++
> >  src/android/meson.build                       |  2 +-
> >  src/ipa/ipu3/meson.build                      |  2 +-
> >  src/ipa/libipa/meson.build                    |  2 +-
> >  src/ipa/raspberrypi/meson.build               |  2 +-
> >  src/ipa/rkisp1/meson.build                    |  2 +-
> >  src/ipa/vimc/meson.build                      |  2 +-
> >  src/libcamera/base/meson.build                |  8 +++++++
> >  src/libcamera/meson.build                     | 10 +++++++--
> >  src/libcamera/proxy/worker/meson.build        |  2 +-
> >  src/v4l2/meson.build                          |  2 +-
> >  test/camera/meson.build                       |  2 +-
> >  test/ipa/meson.build                          |  2 +-
> >  test/ipc/meson.build                          |  2 +-
> >  test/libtest/meson.build                      |  2 +-
> >  test/log/meson.build                          |  2 +-
> >  test/media_device/meson.build                 |  4 ++--
> >  test/meson.build                              |  2 +-
> >  test/pipeline/ipu3/meson.build                |  2 +-
> >  test/pipeline/rkisp1/meson.build              |  2 +-
> >  test/process/meson.build                      |  2 +-
> >  .../generated_serializer/meson.build          |  2 +-
> >  test/serialization/meson.build                |  2 +-
> >  test/v4l2_subdevice/meson.build               |  2 +-
> >  test/v4l2_videodevice/meson.build             |  2 +-
> >  35 files changed, 74 insertions(+), 25 deletions(-)
> >  create mode 100644 include/libcamera/base/private.h
> >
> > diff --git a/include/libcamera/base/event_dispatcher.h b/include/libcamera/base/event_dispatcher.h
> > index 045df27fff16..825af7a33919 100644
> > --- a/include/libcamera/base/event_dispatcher.h
> > +++ b/include/libcamera/base/event_dispatcher.h
> > @@ -9,6 +9,8 @@
> >
> >  #include <vector>
> >
> > +#include <libcamera/base/private.h>
> > +
> >  namespace libcamera {
> >
> >  class EventNotifier;
> > diff --git a/include/libcamera/base/event_dispatcher_poll.h b/include/libcamera/base/event_dispatcher_poll.h
> > index ae2a3f04e4b9..88835902980c 100644
> > --- a/include/libcamera/base/event_dispatcher_poll.h
> > +++ b/include/libcamera/base/event_dispatcher_poll.h
> > @@ -13,6 +13,8 @@
> >
> >  #include <libcamera/base/event_dispatcher.h>
> >
> > +#include <libcamera/base/private.h>
> > +
> >  struct pollfd;
> >
> >  namespace libcamera {
> > diff --git a/include/libcamera/base/event_notifier.h b/include/libcamera/base/event_notifier.h
> > index 8a6419f23004..6bb4e5143aa6 100644
> > --- a/include/libcamera/base/event_notifier.h
> > +++ b/include/libcamera/base/event_notifier.h
> > @@ -8,6 +8,7 @@
> >  #define __LIBCAMERA_INTERNAL_EVENT_NOTIFIER_H__
> >
> >  #include <libcamera/base/object.h>
> > +#include <libcamera/base/private.h>
> >  #include <libcamera/base/signal.h>
> >
> >  namespace libcamera {
> > diff --git a/include/libcamera/base/file.h b/include/libcamera/base/file.h
> > index e8e4b76e1a4e..cecbb254591f 100644
> > --- a/include/libcamera/base/file.h
> > +++ b/include/libcamera/base/file.h
> > @@ -12,6 +12,7 @@
> >  #include <sys/types.h>
> >
> >  #include <libcamera/base/class.h>
> > +#include <libcamera/base/private.h>
> >
> >  #include <libcamera/span.h>
> >
> > diff --git a/include/libcamera/base/log.h b/include/libcamera/base/log.h
> > index b93c947ae7db..70582cd47902 100644
> > --- a/include/libcamera/base/log.h
> > +++ b/include/libcamera/base/log.h
> > @@ -11,6 +11,7 @@
> >  #include <sstream>
> >
> >  #include <libcamera/base/class.h>
> > +#include <libcamera/base/private.h>
> >  #include <libcamera/base/utils.h>
> >
> >  namespace libcamera {
> > diff --git a/include/libcamera/base/meson.build b/include/libcamera/base/meson.build
> > index 83c664affc88..aaac324d7149 100644
> > --- a/include/libcamera/base/meson.build
> > +++ b/include/libcamera/base/meson.build
> > @@ -12,6 +12,7 @@ libcamera_base_headers = files([
> >      'log.h',
> >      'message.h',
> >      'object.h',
> > +    'private.h',
> >      'semaphore.h',
> >      'signal.h',
> >      'thread.h',
> > diff --git a/include/libcamera/base/private.h b/include/libcamera/base/private.h
> > new file mode 100644
> > index 000000000000..b54ad076688e
> > --- /dev/null
> > +++ b/include/libcamera/base/private.h
> > @@ -0,0 +1,22 @@
> > +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> > +/*
> > + * Copyright (C) 2021, Google Inc.
> > + *
> > + * private.h - Private Header Validation
> > + *
> > + * A selection of internal libcamera headers are installed as part
> > + * of the libcamera package to allow sharing of a select subset of
> > + * internal functionality with IPA module developers only.
> > + *
> > + * This functionality is not considered part of the public libcamera
> > + * API, and can therefore potentially face ABI instabilities which
> > + * should not be exposed to applications. IPA modules however should be
> > + * versioned and more closely matched to the libcamera installation.
> > + *
> > + * Components which include this file can not be included in any file
> > + * which forms part of the libcamera API.
> > + */
> > +
> > +#ifndef LIBCAMERA_BASE_PRIVATE
> > +#error "Private headers must not be included in the libcamera API"
> > +#endif
> > diff --git a/include/libcamera/base/semaphore.h b/include/libcamera/base/semaphore.h
> > index c8e62e3ee68b..d8146eb8060b 100644
> > --- a/include/libcamera/base/semaphore.h
> > +++ b/include/libcamera/base/semaphore.h
> > @@ -9,6 +9,7 @@
> >
> >  #include <condition_variable>
> >
> > +#include <libcamera/base/private.h>
> >  #include <libcamera/base/thread.h>
> >
> >  namespace libcamera {
> > diff --git a/include/libcamera/base/thread.h b/include/libcamera/base/thread.h
> > index 2ed18d49c978..b30ed12715a2 100644
> > --- a/include/libcamera/base/thread.h
> > +++ b/include/libcamera/base/thread.h
> > @@ -13,6 +13,7 @@
> >  #include <thread>
> >
> >  #include <libcamera/base/message.h>
> > +#include <libcamera/base/private.h>
> >  #include <libcamera/base/signal.h>
> >  #include <libcamera/base/utils.h>
> >
> > diff --git a/include/libcamera/base/timer.h b/include/libcamera/base/timer.h
> > index e79e85f1ef0d..f762e8767d97 100644
> > --- a/include/libcamera/base/timer.h
> > +++ b/include/libcamera/base/timer.h
> > @@ -11,6 +11,7 @@
> >  #include <stdint.h>
> >
> >  #include <libcamera/base/object.h>
> > +#include <libcamera/base/private.h>
> >  #include <libcamera/base/signal.h>
> >
> >  namespace libcamera {
> > diff --git a/include/libcamera/base/utils.h b/include/libcamera/base/utils.h
> > index d1aaff65211a..07685045aa05 100644
> > --- a/include/libcamera/base/utils.h
> > +++ b/include/libcamera/base/utils.h
> > @@ -19,6 +19,8 @@
> >  #include <utility>
> >  #include <vector>
> >
> > +#include <libcamera/base/private.h>
> > +
> >  #ifndef __DOXYGEN__
> >
> >  /* uClibc and uClibc-ng don't provide O_TMPFILE */
> > diff --git a/src/android/meson.build b/src/android/meson.build
> > index bd58ef964c2a..7d1e7e85f16e 100644
> > --- a/src/android/meson.build
> > +++ b/src/android/meson.build
> > @@ -4,7 +4,7 @@ android_deps = [
> >      dependency('libexif', required : get_option('android')),
> >      dependency('libjpeg', required : get_option('android')),
> >      dependency('yaml-0.1', required : get_option('android')),
> > -    libcamera_dep,
> > +    libcamera_private,
> >  ]
> >
> >  android_enabled = true
> > diff --git a/src/ipa/ipu3/meson.build b/src/ipa/ipu3/meson.build
> > index 0d843846acde..b63641908710 100644
> > --- a/src/ipa/ipu3/meson.build
> > +++ b/src/ipa/ipu3/meson.build
> > @@ -12,7 +12,7 @@ mod = shared_module(ipa_name,
> >                      [ipu3_ipa_sources, libcamera_generated_ipa_headers],
> >                      name_prefix : '',
> >                      include_directories : [ipa_includes, libipa_includes],
> > -                    dependencies : libcamera_dep,
> > +                    dependencies : libcamera_private,
> >                      link_with : libipa,
> >                      install : true,
> >                      install_dir : ipa_install_dir)
> > diff --git a/src/ipa/libipa/meson.build b/src/ipa/libipa/meson.build
> > index 038fc49060ef..ca541a5aafd7 100644
> > --- a/src/ipa/libipa/meson.build
> > +++ b/src/ipa/libipa/meson.build
> > @@ -14,4 +14,4 @@ libipa_includes = include_directories('..')
> >
> >  libipa = static_library('ipa', [libipa_sources, libipa_headers],
> >                          include_directories : ipa_includes,
> > -                        dependencies : libcamera_dep)
> > +                        dependencies : libcamera_private)
> > diff --git a/src/ipa/raspberrypi/meson.build b/src/ipa/raspberrypi/meson.build
> > index 230356d3ce3a..d7203aa042cd 100644
> > --- a/src/ipa/raspberrypi/meson.build
> > +++ b/src/ipa/raspberrypi/meson.build
> > @@ -3,7 +3,7 @@
> >  ipa_name = 'ipa_rpi'
> >
> >  rpi_ipa_deps = [
> > -    libcamera_dep,
> > +    libcamera_private,
> >      dependency('boost'),
> >      libatomic,
> >  ]
> > diff --git a/src/ipa/rkisp1/meson.build b/src/ipa/rkisp1/meson.build
> > index 1a1c71591039..f76b37f5af50 100644
> > --- a/src/ipa/rkisp1/meson.build
> > +++ b/src/ipa/rkisp1/meson.build
> > @@ -6,7 +6,7 @@ mod = shared_module(ipa_name,
> >                      ['rkisp1.cpp', libcamera_generated_ipa_headers],
> >                      name_prefix : '',
> >                      include_directories : [ipa_includes, libipa_includes],
> > -                    dependencies : libcamera_dep,
> > +                    dependencies : libcamera_private,
> >                      link_with : libipa,
> >                      install : true,
> >                      install_dir : ipa_install_dir)
> > diff --git a/src/ipa/vimc/meson.build b/src/ipa/vimc/meson.build
> > index a35825ae25a6..ecbeee136451 100644
> > --- a/src/ipa/vimc/meson.build
> > +++ b/src/ipa/vimc/meson.build
> > @@ -6,7 +6,7 @@ mod = shared_module(ipa_name,
> >                      ['vimc.cpp', libcamera_generated_ipa_headers],
> >                      name_prefix : '',
> >                      include_directories : [ipa_includes, libipa_includes],
> > -                    dependencies : libcamera_dep,
> > +                    dependencies : libcamera_private,
> >                      link_with : libipa,
> >                      install : true,
> >                      install_dir : ipa_install_dir)
> > diff --git a/src/libcamera/base/meson.build b/src/libcamera/base/meson.build
> > index a8b04cfc8a5f..871721571e98 100644
> > --- a/src/libcamera/base/meson.build
> > +++ b/src/libcamera/base/meson.build
> > @@ -21,10 +21,15 @@ libcamera_base_deps = [
> >      dependency('threads'),
> >  ]
> >
> > +# Internal components must use the libcamera_base_private dependency to enable
> > +# the use of headers which must not be exposed to the libcamera public api.
> > +libcamera_base_args = [ '-DLIBCAMERA_BASE_PRIVATE' ]
> > +
> >  libcamera_base_lib = shared_library('libcamera-base',
> >                                      [libcamera_base_sources, libcamera_base_headers],
> >                                      name_prefix : '',
> >                                      install : true,
> > +                                    cpp_args : libcamera_base_args,
> >                                      include_directories : libcamera_includes,
> >                                      dependencies : libcamera_base_deps)
> >
> > @@ -39,3 +44,6 @@ pkg_mod.generate(libcamera_base_lib,
> >                   version : '1.0',
> >                   description : 'Camera support base utility library',
> >                   subdirs : 'libcamera')
> > +
> > +libcamera_base_private = declare_dependency(dependencies : libcamera_base,
> > +                                            compile_args : libcamera_base_args)
> > diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
> > index 1f163cfe1225..64c7475f1a2e 100644
> > --- a/src/libcamera/meson.build
> > +++ b/src/libcamera/meson.build
> > @@ -115,7 +115,7 @@ libcamera_deps = [
> >      libgnutls,
> >      liblttng,
> >      libudev,
> > -    libcamera_base,
> > +    libcamera_base_private,
> >  ]
> >
> >  # We add '/' to the build_rpath as a 'safe' path to act as a boolean flag.
> > @@ -143,9 +143,15 @@ libcamera_dep = declare_dependency(sources : [
> >                                         libcamera_generated_ipa_headers,
> >                                     ],
> >                                     include_directories : libcamera_includes,
> > -                                   dependencies: libcamera_base,
> > +                                   dependencies : libcamera_base,
> >                                     link_with : libcamera)
> >
> > +# Internal dependancy for components and plugins which can use Private APIs
> > +libcamera_private = declare_dependency(dependencies : [
> > +                                           libcamera_dep,
> > +                                           libcamera_base_private,
> > +                                       ])
> > +
> >  pkg_mod = import('pkgconfig')
> >  pkg_mod.generate(libcamera,
> >                   libraries : libcamera_base_lib,
> > diff --git a/src/libcamera/proxy/worker/meson.build b/src/libcamera/proxy/worker/meson.build
> > index 28fe5f1fd6b2..70c8760a3d42 100644
> > --- a/src/libcamera/proxy/worker/meson.build
> > +++ b/src/libcamera/proxy/worker/meson.build
> > @@ -21,7 +21,7 @@ foreach mojom : ipa_mojoms
> >                         [worker, libcamera_generated_ipa_headers],
> >                         install : true,
> >                         install_dir : proxy_install_dir,
> > -                       dependencies : libcamera_dep)
> > +                       dependencies : libcamera_private)
> >  endforeach
> >
> >  config_h.set('IPA_PROXY_DIR',
> > diff --git a/src/v4l2/meson.build b/src/v4l2/meson.build
> > index 0accac194be4..f78497b6799b 100644
> > --- a/src/v4l2/meson.build
> > +++ b/src/v4l2/meson.build
> > @@ -31,5 +31,5 @@ v4l2_compat = shared_library('v4l2-compat',
> >                               v4l2_compat_sources,
> >                               name_prefix : '',
> >                               install : true,
> > -                             dependencies : [libcamera_dep, libdl],
> > +                             dependencies : [libcamera_private, libdl],
> >                               cpp_args : v4l2_compat_cpp_args)
> > diff --git a/test/camera/meson.build b/test/camera/meson.build
> > index 9cb95affffab..002a87b594e0 100644
> > --- a/test/camera/meson.build
> > +++ b/test/camera/meson.build
> > @@ -12,7 +12,7 @@ camera_tests = [
> >
> >  foreach t : camera_tests
> >      exe = executable(t[0], t[1],
> > -                     dependencies : libcamera_dep,
> > +                     dependencies : libcamera_private,
> >                       link_with : test_libraries,
> >                       include_directories : test_includes_internal)
> >      test(t[0], exe, suite : 'camera', is_parallel : false)
> > diff --git a/test/ipa/meson.build b/test/ipa/meson.build
> > index e8a041b5bbd2..7938633e54ab 100644
> > --- a/test/ipa/meson.build
> > +++ b/test/ipa/meson.build
> > @@ -7,7 +7,7 @@ ipa_test = [
> >
> >  foreach t : ipa_test
> >      exe = executable(t[0], [t[1], libcamera_generated_ipa_headers],
> > -                     dependencies : libcamera_dep,
> > +                     dependencies : libcamera_private,
> >                       link_with : [libipa, test_libraries],
> >                       include_directories : [libipa_includes, test_includes_internal])
> >
> > diff --git a/test/ipc/meson.build b/test/ipc/meson.build
> > index ad47b2feb718..2a6cd7fb8433 100644
> > --- a/test/ipc/meson.build
> > +++ b/test/ipc/meson.build
> > @@ -7,7 +7,7 @@ ipc_tests = [
> >
> >  foreach t : ipc_tests
> >      exe = executable(t[0], t[1],
> > -                     dependencies : libcamera_dep,
> > +                     dependencies : libcamera_private,
> >                       link_with : test_libraries,
> >                       include_directories : test_includes_internal)
> >
> > diff --git a/test/libtest/meson.build b/test/libtest/meson.build
> > index 542335ea5e7c..351629f3ce73 100644
> > --- a/test/libtest/meson.build
> > +++ b/test/libtest/meson.build
> > @@ -18,7 +18,7 @@ test_includes_internal = [
> >  ]
> >
> >  libtest = static_library('libtest', libtest_sources,
> > -                         dependencies : libcamera_dep,
> > +                         dependencies : libcamera_private,
> >                           include_directories : test_includes_internal)
> >
> >  test_libraries = [libtest]
> > diff --git a/test/log/meson.build b/test/log/meson.build
> > index 8cd664e04a00..ac87841a24e1 100644
> > --- a/test/log/meson.build
> > +++ b/test/log/meson.build
> > @@ -7,7 +7,7 @@ log_test = [
> >
> >  foreach t : log_test
> >      exe = executable(t[0], t[1],
> > -                     dependencies : libcamera_dep,
> > +                     dependencies : libcamera_private,
> >                       link_with : test_libraries,
> >                       include_directories : test_includes_internal)
> >
> > diff --git a/test/media_device/meson.build b/test/media_device/meson.build
> > index 1dfcdd8bd744..83dfe8f11d2f 100644
> > --- a/test/media_device/meson.build
> > +++ b/test/media_device/meson.build
> > @@ -11,12 +11,12 @@ media_device_tests = [
> >  ]
> >
> >  lib_mdev_test = static_library('lib_mdev_test', lib_mdev_test_sources,
> > -                               dependencies : libcamera_dep,
> > +                               dependencies : libcamera_private,
> >                                 include_directories : test_includes_internal)
> >
> >  foreach t : media_device_tests
> >      exe = executable(t[0], t[1],
> > -                     dependencies : libcamera_dep,
> > +                     dependencies : libcamera_private,
> >                       link_with : [test_libraries, lib_mdev_test],
> >                       include_directories : test_includes_internal)
> >
> > diff --git a/test/meson.build b/test/meson.build
> > index 045ad2a2d7c9..b8615e0fd3e6 100644
> > --- a/test/meson.build
> > +++ b/test/meson.build
> > @@ -64,7 +64,7 @@ endforeach
> >
> >  foreach t : internal_tests
> >      exe = executable(t[0], t[1],
> > -                     dependencies : libcamera_dep,
> > +                     dependencies : libcamera_private,
> >                       link_with : test_libraries,
> >                       include_directories : test_includes_internal)
> >
> > diff --git a/test/pipeline/ipu3/meson.build b/test/pipeline/ipu3/meson.build
> > index d062ecd269f2..16701080ca2b 100644
> > --- a/test/pipeline/ipu3/meson.build
> > +++ b/test/pipeline/ipu3/meson.build
> > @@ -6,7 +6,7 @@ ipu3_test = [
> >
> >  foreach t : ipu3_test
> >      exe = executable(t[0], t[1],
> > -                     dependencies : libcamera_dep,
> > +                     dependencies : libcamera_private,
> >                       link_with : test_libraries,
> >                       include_directories : test_includes_internal)
> >
> > diff --git a/test/pipeline/rkisp1/meson.build b/test/pipeline/rkisp1/meson.build
> > index ece147b054e4..364b5711a0f9 100644
> > --- a/test/pipeline/rkisp1/meson.build
> > +++ b/test/pipeline/rkisp1/meson.build
> > @@ -6,7 +6,7 @@ rkisp1_test = [
> >
> >  foreach t : rkisp1_test
> >      exe = executable(t[0], t[1],
> > -                     dependencies : libcamera_dep,
> > +                     dependencies : libcamera_private,
> >                       link_with : test_libraries,
> >                       include_directories : test_includes_internal)
> >
> > diff --git a/test/process/meson.build b/test/process/meson.build
> > index d2272d509db3..af86b277db63 100644
> > --- a/test/process/meson.build
> > +++ b/test/process/meson.build
> > @@ -6,7 +6,7 @@ process_tests = [
> >
> >  foreach t : process_tests
> >      exe = executable(t[0], t[1],
> > -                     dependencies : libcamera_dep,
> > +                     dependencies : libcamera_private,
> >                       link_with : test_libraries,
> >                       include_directories : test_includes_internal)
> >
> > diff --git a/test/serialization/generated_serializer/meson.build b/test/serialization/generated_serializer/meson.build
> > index 2460e0b114b3..9fb9cd1db968 100644
> > --- a/test/serialization/generated_serializer/meson.build
> > +++ b/test/serialization/generated_serializer/meson.build
> > @@ -8,7 +8,7 @@ exe = executable('generated_serializer_test',
> >                       generated_test_header,
> >                       generated_test_serializer,
> >                   ],
> > -                 dependencies : libcamera_dep,
> > +                 dependencies : libcamera_private,
> >                   link_with : test_libraries,
> >                   include_directories : [
> >                       test_includes_internal,
> > diff --git a/test/serialization/meson.build b/test/serialization/meson.build
> > index 60ebf3255b28..5446e4907f33 100644
> > --- a/test/serialization/meson.build
> > +++ b/test/serialization/meson.build
> > @@ -9,7 +9,7 @@ serialization_tests = [
> >
> >  foreach t : serialization_tests
> >      exe = executable(t[0], [t[1], 'serialization_test.cpp'],
> > -                     dependencies : libcamera_dep,
> > +                     dependencies : libcamera_private,
> >                       link_with : test_libraries,
> >                       include_directories : test_includes_internal)
> >      test(t[0], exe, suite : 'serialization', is_parallel : true)
> > diff --git a/test/v4l2_subdevice/meson.build b/test/v4l2_subdevice/meson.build
> > index 40d39766af9b..d82be3c60b75 100644
> > --- a/test/v4l2_subdevice/meson.build
> > +++ b/test/v4l2_subdevice/meson.build
> > @@ -7,7 +7,7 @@ v4l2_subdevice_tests = [
> >
> >  foreach t : v4l2_subdevice_tests
> >      exe = executable(t[0], [t[1], 'v4l2_subdevice_test.cpp'],
> > -        dependencies : libcamera_dep,
> > +        dependencies : libcamera_private,
> >          link_with : test_libraries,
> >          include_directories : test_includes_internal)
> >      test(t[0], exe, suite : 'v4l2_subdevice', is_parallel : false)
> > diff --git a/test/v4l2_videodevice/meson.build b/test/v4l2_videodevice/meson.build
> > index e733518c0185..643f82edce5e 100644
> > --- a/test/v4l2_videodevice/meson.build
> > +++ b/test/v4l2_videodevice/meson.build
> > @@ -16,7 +16,7 @@ v4l2_videodevice_tests = [
> >
> >  foreach t : v4l2_videodevice_tests
> >      exe = executable(t[0], [t[1], 'v4l2_videodevice_test.cpp'],
> > -                     dependencies : libcamera_dep,
> > +                     dependencies : libcamera_private,
> >                       link_with : test_libraries,
> >                       include_directories : test_includes_internal)
> >      test(t[0], exe, suite : 'v4l2_videodevice', is_parallel : false)
> > --
> > 2.30.2
> >
Kieran Bingham June 25, 2021, 9:34 a.m. UTC | #3
Hi Paul, Hiro,

On 25/06/2021 09:40, paul.elder@ideasonboard.com wrote:
> Hi Hiro,
> 
> On Fri, Jun 25, 2021 at 01:12:57PM +0900, Hirokazu Honda wrote:
>> Hi Kieran, thank you for the patch.
>>
>> On Fri, Jun 25, 2021 at 10:35 AM Kieran Bingham
>> <kieran.bingham@ideasonboard.com> wrote:
>>>
>>> Headers which must not be exposed as part of the public libcamera API
>>> can include base/private.h.
>>>
>>> Any interface which includes the private.h header will only be able to
>>> build if the libcamera_private dependency is used (or the
>>> libcamera_base_private dependency directly)
>>>
>>
>> I couldn't understand well which one of the four dependencies
>> (libcamera_private, libcamera_base, libcamera_dep,
>> libcamera_base_private) should be used in a specific target.
>> Would you mind describing the rule of using these dependencies?
> 
> My understanding is that:
> 
> - libcamera_base is everything in base
> - libcamera_base_private is libcamera_base + the macro required for
>   using the private headers

Correct.

> - libcamera_dep is public + private, for things like IPAs and internal
>   components (but doesn't include the macro for private headers)

- libcamera_dep is the existing, widely used dependency for linking
against libcamera within the meson project.

It indeed links against all things public and private currently, and
anything which references this could use any part of the libcamera library.

(However after this patch, any inclusion of a header without defining
'LIBCAMERA_BASE_PRIVATE' will hit a compile break)


> - libcamera_private is libcamera_dep + the macro

Correct - this allows a component to link against libcamera, whilst also
defining that it is explicitly allowed to access 'private' components,
which should not leak to the public APIs.

> 
> Kieran, is this correct? (it is a bit hard to keep track of...)

I've added


Build targets which are intended to use the private API's will use the
libcamera_private to handle the automatic definition of the inclusion
guard.


It's hard to go into more detail on this in this commit, as it's about
to get changed in the up coming patches, and I don't want someone to
read this and say "Oh I should use the libcamera_dep for my public
component, as ... it will very soon become libcamera_public"



> 
> 
> Paul
> 
>>
>>> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
>>> ---
>>>  include/libcamera/base/event_dispatcher.h     |  2 ++
>>>  .../libcamera/base/event_dispatcher_poll.h    |  2 ++
>>>  include/libcamera/base/event_notifier.h       |  1 +
>>>  include/libcamera/base/file.h                 |  1 +
>>>  include/libcamera/base/log.h                  |  1 +
>>>  include/libcamera/base/meson.build            |  1 +
>>>  include/libcamera/base/private.h              | 22 +++++++++++++++++++
>>>  include/libcamera/base/semaphore.h            |  1 +
>>>  include/libcamera/base/thread.h               |  1 +
>>>  include/libcamera/base/timer.h                |  1 +
>>>  include/libcamera/base/utils.h                |  2 ++
>>>  src/android/meson.build                       |  2 +-
>>>  src/ipa/ipu3/meson.build                      |  2 +-
>>>  src/ipa/libipa/meson.build                    |  2 +-
>>>  src/ipa/raspberrypi/meson.build               |  2 +-
>>>  src/ipa/rkisp1/meson.build                    |  2 +-
>>>  src/ipa/vimc/meson.build                      |  2 +-
>>>  src/libcamera/base/meson.build                |  8 +++++++
>>>  src/libcamera/meson.build                     | 10 +++++++--
>>>  src/libcamera/proxy/worker/meson.build        |  2 +-
>>>  src/v4l2/meson.build                          |  2 +-
>>>  test/camera/meson.build                       |  2 +-
>>>  test/ipa/meson.build                          |  2 +-
>>>  test/ipc/meson.build                          |  2 +-
>>>  test/libtest/meson.build                      |  2 +-
>>>  test/log/meson.build                          |  2 +-
>>>  test/media_device/meson.build                 |  4 ++--
>>>  test/meson.build                              |  2 +-
>>>  test/pipeline/ipu3/meson.build                |  2 +-
>>>  test/pipeline/rkisp1/meson.build              |  2 +-
>>>  test/process/meson.build                      |  2 +-
>>>  .../generated_serializer/meson.build          |  2 +-
>>>  test/serialization/meson.build                |  2 +-
>>>  test/v4l2_subdevice/meson.build               |  2 +-
>>>  test/v4l2_videodevice/meson.build             |  2 +-
>>>  35 files changed, 74 insertions(+), 25 deletions(-)
>>>  create mode 100644 include/libcamera/base/private.h
>>>
>>> diff --git a/include/libcamera/base/event_dispatcher.h b/include/libcamera/base/event_dispatcher.h
>>> index 045df27fff16..825af7a33919 100644
>>> --- a/include/libcamera/base/event_dispatcher.h
>>> +++ b/include/libcamera/base/event_dispatcher.h
>>> @@ -9,6 +9,8 @@
>>>
>>>  #include <vector>
>>>
>>> +#include <libcamera/base/private.h>
>>> +
>>>  namespace libcamera {
>>>
>>>  class EventNotifier;
>>> diff --git a/include/libcamera/base/event_dispatcher_poll.h b/include/libcamera/base/event_dispatcher_poll.h
>>> index ae2a3f04e4b9..88835902980c 100644
>>> --- a/include/libcamera/base/event_dispatcher_poll.h
>>> +++ b/include/libcamera/base/event_dispatcher_poll.h
>>> @@ -13,6 +13,8 @@
>>>
>>>  #include <libcamera/base/event_dispatcher.h>
>>>
>>> +#include <libcamera/base/private.h>
>>> +
>>>  struct pollfd;
>>>
>>>  namespace libcamera {
>>> diff --git a/include/libcamera/base/event_notifier.h b/include/libcamera/base/event_notifier.h
>>> index 8a6419f23004..6bb4e5143aa6 100644
>>> --- a/include/libcamera/base/event_notifier.h
>>> +++ b/include/libcamera/base/event_notifier.h
>>> @@ -8,6 +8,7 @@
>>>  #define __LIBCAMERA_INTERNAL_EVENT_NOTIFIER_H__
>>>
>>>  #include <libcamera/base/object.h>
>>> +#include <libcamera/base/private.h>
>>>  #include <libcamera/base/signal.h>
>>>
>>>  namespace libcamera {
>>> diff --git a/include/libcamera/base/file.h b/include/libcamera/base/file.h
>>> index e8e4b76e1a4e..cecbb254591f 100644
>>> --- a/include/libcamera/base/file.h
>>> +++ b/include/libcamera/base/file.h
>>> @@ -12,6 +12,7 @@
>>>  #include <sys/types.h>
>>>
>>>  #include <libcamera/base/class.h>
>>> +#include <libcamera/base/private.h>
>>>
>>>  #include <libcamera/span.h>
>>>
>>> diff --git a/include/libcamera/base/log.h b/include/libcamera/base/log.h
>>> index b93c947ae7db..70582cd47902 100644
>>> --- a/include/libcamera/base/log.h
>>> +++ b/include/libcamera/base/log.h
>>> @@ -11,6 +11,7 @@
>>>  #include <sstream>
>>>
>>>  #include <libcamera/base/class.h>
>>> +#include <libcamera/base/private.h>
>>>  #include <libcamera/base/utils.h>
>>>
>>>  namespace libcamera {
>>> diff --git a/include/libcamera/base/meson.build b/include/libcamera/base/meson.build
>>> index 83c664affc88..aaac324d7149 100644
>>> --- a/include/libcamera/base/meson.build
>>> +++ b/include/libcamera/base/meson.build
>>> @@ -12,6 +12,7 @@ libcamera_base_headers = files([
>>>      'log.h',
>>>      'message.h',
>>>      'object.h',
>>> +    'private.h',
>>>      'semaphore.h',
>>>      'signal.h',
>>>      'thread.h',
>>> diff --git a/include/libcamera/base/private.h b/include/libcamera/base/private.h
>>> new file mode 100644
>>> index 000000000000..b54ad076688e
>>> --- /dev/null
>>> +++ b/include/libcamera/base/private.h
>>> @@ -0,0 +1,22 @@
>>> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
>>> +/*
>>> + * Copyright (C) 2021, Google Inc.
>>> + *
>>> + * private.h - Private Header Validation
>>> + *
>>> + * A selection of internal libcamera headers are installed as part
>>> + * of the libcamera package to allow sharing of a select subset of
>>> + * internal functionality with IPA module developers only.
>>> + *
>>> + * This functionality is not considered part of the public libcamera
>>> + * API, and can therefore potentially face ABI instabilities which
>>> + * should not be exposed to applications. IPA modules however should be
>>> + * versioned and more closely matched to the libcamera installation.
>>> + *
>>> + * Components which include this file can not be included in any file
>>> + * which forms part of the libcamera API.
>>> + */
>>> +
>>> +#ifndef LIBCAMERA_BASE_PRIVATE
>>> +#error "Private headers must not be included in the libcamera API"
>>> +#endif
>>> diff --git a/include/libcamera/base/semaphore.h b/include/libcamera/base/semaphore.h
>>> index c8e62e3ee68b..d8146eb8060b 100644
>>> --- a/include/libcamera/base/semaphore.h
>>> +++ b/include/libcamera/base/semaphore.h
>>> @@ -9,6 +9,7 @@
>>>
>>>  #include <condition_variable>
>>>
>>> +#include <libcamera/base/private.h>
>>>  #include <libcamera/base/thread.h>
>>>
>>>  namespace libcamera {
>>> diff --git a/include/libcamera/base/thread.h b/include/libcamera/base/thread.h
>>> index 2ed18d49c978..b30ed12715a2 100644
>>> --- a/include/libcamera/base/thread.h
>>> +++ b/include/libcamera/base/thread.h
>>> @@ -13,6 +13,7 @@
>>>  #include <thread>
>>>
>>>  #include <libcamera/base/message.h>
>>> +#include <libcamera/base/private.h>
>>>  #include <libcamera/base/signal.h>
>>>  #include <libcamera/base/utils.h>
>>>
>>> diff --git a/include/libcamera/base/timer.h b/include/libcamera/base/timer.h
>>> index e79e85f1ef0d..f762e8767d97 100644
>>> --- a/include/libcamera/base/timer.h
>>> +++ b/include/libcamera/base/timer.h
>>> @@ -11,6 +11,7 @@
>>>  #include <stdint.h>
>>>
>>>  #include <libcamera/base/object.h>
>>> +#include <libcamera/base/private.h>
>>>  #include <libcamera/base/signal.h>
>>>
>>>  namespace libcamera {
>>> diff --git a/include/libcamera/base/utils.h b/include/libcamera/base/utils.h
>>> index d1aaff65211a..07685045aa05 100644
>>> --- a/include/libcamera/base/utils.h
>>> +++ b/include/libcamera/base/utils.h
>>> @@ -19,6 +19,8 @@
>>>  #include <utility>
>>>  #include <vector>
>>>
>>> +#include <libcamera/base/private.h>
>>> +
>>>  #ifndef __DOXYGEN__
>>>
>>>  /* uClibc and uClibc-ng don't provide O_TMPFILE */
>>> diff --git a/src/android/meson.build b/src/android/meson.build
>>> index bd58ef964c2a..7d1e7e85f16e 100644
>>> --- a/src/android/meson.build
>>> +++ b/src/android/meson.build
>>> @@ -4,7 +4,7 @@ android_deps = [
>>>      dependency('libexif', required : get_option('android')),
>>>      dependency('libjpeg', required : get_option('android')),
>>>      dependency('yaml-0.1', required : get_option('android')),
>>> -    libcamera_dep,
>>> +    libcamera_private,
>>>  ]
>>>
>>>  android_enabled = true
>>> diff --git a/src/ipa/ipu3/meson.build b/src/ipa/ipu3/meson.build
>>> index 0d843846acde..b63641908710 100644
>>> --- a/src/ipa/ipu3/meson.build
>>> +++ b/src/ipa/ipu3/meson.build
>>> @@ -12,7 +12,7 @@ mod = shared_module(ipa_name,
>>>                      [ipu3_ipa_sources, libcamera_generated_ipa_headers],
>>>                      name_prefix : '',
>>>                      include_directories : [ipa_includes, libipa_includes],
>>> -                    dependencies : libcamera_dep,
>>> +                    dependencies : libcamera_private,
>>>                      link_with : libipa,
>>>                      install : true,
>>>                      install_dir : ipa_install_dir)
>>> diff --git a/src/ipa/libipa/meson.build b/src/ipa/libipa/meson.build
>>> index 038fc49060ef..ca541a5aafd7 100644
>>> --- a/src/ipa/libipa/meson.build
>>> +++ b/src/ipa/libipa/meson.build
>>> @@ -14,4 +14,4 @@ libipa_includes = include_directories('..')
>>>
>>>  libipa = static_library('ipa', [libipa_sources, libipa_headers],
>>>                          include_directories : ipa_includes,
>>> -                        dependencies : libcamera_dep)
>>> +                        dependencies : libcamera_private)
>>> diff --git a/src/ipa/raspberrypi/meson.build b/src/ipa/raspberrypi/meson.build
>>> index 230356d3ce3a..d7203aa042cd 100644
>>> --- a/src/ipa/raspberrypi/meson.build
>>> +++ b/src/ipa/raspberrypi/meson.build
>>> @@ -3,7 +3,7 @@
>>>  ipa_name = 'ipa_rpi'
>>>
>>>  rpi_ipa_deps = [
>>> -    libcamera_dep,
>>> +    libcamera_private,
>>>      dependency('boost'),
>>>      libatomic,
>>>  ]
>>> diff --git a/src/ipa/rkisp1/meson.build b/src/ipa/rkisp1/meson.build
>>> index 1a1c71591039..f76b37f5af50 100644
>>> --- a/src/ipa/rkisp1/meson.build
>>> +++ b/src/ipa/rkisp1/meson.build
>>> @@ -6,7 +6,7 @@ mod = shared_module(ipa_name,
>>>                      ['rkisp1.cpp', libcamera_generated_ipa_headers],
>>>                      name_prefix : '',
>>>                      include_directories : [ipa_includes, libipa_includes],
>>> -                    dependencies : libcamera_dep,
>>> +                    dependencies : libcamera_private,
>>>                      link_with : libipa,
>>>                      install : true,
>>>                      install_dir : ipa_install_dir)
>>> diff --git a/src/ipa/vimc/meson.build b/src/ipa/vimc/meson.build
>>> index a35825ae25a6..ecbeee136451 100644
>>> --- a/src/ipa/vimc/meson.build
>>> +++ b/src/ipa/vimc/meson.build
>>> @@ -6,7 +6,7 @@ mod = shared_module(ipa_name,
>>>                      ['vimc.cpp', libcamera_generated_ipa_headers],
>>>                      name_prefix : '',
>>>                      include_directories : [ipa_includes, libipa_includes],
>>> -                    dependencies : libcamera_dep,
>>> +                    dependencies : libcamera_private,
>>>                      link_with : libipa,
>>>                      install : true,
>>>                      install_dir : ipa_install_dir)
>>> diff --git a/src/libcamera/base/meson.build b/src/libcamera/base/meson.build
>>> index a8b04cfc8a5f..871721571e98 100644
>>> --- a/src/libcamera/base/meson.build
>>> +++ b/src/libcamera/base/meson.build
>>> @@ -21,10 +21,15 @@ libcamera_base_deps = [
>>>      dependency('threads'),
>>>  ]
>>>
>>> +# Internal components must use the libcamera_base_private dependency to enable
>>> +# the use of headers which must not be exposed to the libcamera public api.
>>> +libcamera_base_args = [ '-DLIBCAMERA_BASE_PRIVATE' ]
>>> +
>>>  libcamera_base_lib = shared_library('libcamera-base',
>>>                                      [libcamera_base_sources, libcamera_base_headers],
>>>                                      name_prefix : '',
>>>                                      install : true,
>>> +                                    cpp_args : libcamera_base_args,
>>>                                      include_directories : libcamera_includes,
>>>                                      dependencies : libcamera_base_deps)
>>>
>>> @@ -39,3 +44,6 @@ pkg_mod.generate(libcamera_base_lib,
>>>                   version : '1.0',
>>>                   description : 'Camera support base utility library',
>>>                   subdirs : 'libcamera')
>>> +
>>> +libcamera_base_private = declare_dependency(dependencies : libcamera_base,
>>> +                                            compile_args : libcamera_base_args)
>>> diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
>>> index 1f163cfe1225..64c7475f1a2e 100644
>>> --- a/src/libcamera/meson.build
>>> +++ b/src/libcamera/meson.build
>>> @@ -115,7 +115,7 @@ libcamera_deps = [
>>>      libgnutls,
>>>      liblttng,
>>>      libudev,
>>> -    libcamera_base,
>>> +    libcamera_base_private,
>>>  ]
>>>
>>>  # We add '/' to the build_rpath as a 'safe' path to act as a boolean flag.
>>> @@ -143,9 +143,15 @@ libcamera_dep = declare_dependency(sources : [
>>>                                         libcamera_generated_ipa_headers,
>>>                                     ],
>>>                                     include_directories : libcamera_includes,
>>> -                                   dependencies: libcamera_base,
>>> +                                   dependencies : libcamera_base,
>>>                                     link_with : libcamera)
>>>
>>> +# Internal dependancy for components and plugins which can use Private APIs
>>> +libcamera_private = declare_dependency(dependencies : [
>>> +                                           libcamera_dep,
>>> +                                           libcamera_base_private,
>>> +                                       ])
>>> +
>>>  pkg_mod = import('pkgconfig')
>>>  pkg_mod.generate(libcamera,
>>>                   libraries : libcamera_base_lib,
>>> diff --git a/src/libcamera/proxy/worker/meson.build b/src/libcamera/proxy/worker/meson.build
>>> index 28fe5f1fd6b2..70c8760a3d42 100644
>>> --- a/src/libcamera/proxy/worker/meson.build
>>> +++ b/src/libcamera/proxy/worker/meson.build
>>> @@ -21,7 +21,7 @@ foreach mojom : ipa_mojoms
>>>                         [worker, libcamera_generated_ipa_headers],
>>>                         install : true,
>>>                         install_dir : proxy_install_dir,
>>> -                       dependencies : libcamera_dep)
>>> +                       dependencies : libcamera_private)
>>>  endforeach
>>>
>>>  config_h.set('IPA_PROXY_DIR',
>>> diff --git a/src/v4l2/meson.build b/src/v4l2/meson.build
>>> index 0accac194be4..f78497b6799b 100644
>>> --- a/src/v4l2/meson.build
>>> +++ b/src/v4l2/meson.build
>>> @@ -31,5 +31,5 @@ v4l2_compat = shared_library('v4l2-compat',
>>>                               v4l2_compat_sources,
>>>                               name_prefix : '',
>>>                               install : true,
>>> -                             dependencies : [libcamera_dep, libdl],
>>> +                             dependencies : [libcamera_private, libdl],
>>>                               cpp_args : v4l2_compat_cpp_args)
>>> diff --git a/test/camera/meson.build b/test/camera/meson.build
>>> index 9cb95affffab..002a87b594e0 100644
>>> --- a/test/camera/meson.build
>>> +++ b/test/camera/meson.build
>>> @@ -12,7 +12,7 @@ camera_tests = [
>>>
>>>  foreach t : camera_tests
>>>      exe = executable(t[0], t[1],
>>> -                     dependencies : libcamera_dep,
>>> +                     dependencies : libcamera_private,
>>>                       link_with : test_libraries,
>>>                       include_directories : test_includes_internal)
>>>      test(t[0], exe, suite : 'camera', is_parallel : false)
>>> diff --git a/test/ipa/meson.build b/test/ipa/meson.build
>>> index e8a041b5bbd2..7938633e54ab 100644
>>> --- a/test/ipa/meson.build
>>> +++ b/test/ipa/meson.build
>>> @@ -7,7 +7,7 @@ ipa_test = [
>>>
>>>  foreach t : ipa_test
>>>      exe = executable(t[0], [t[1], libcamera_generated_ipa_headers],
>>> -                     dependencies : libcamera_dep,
>>> +                     dependencies : libcamera_private,
>>>                       link_with : [libipa, test_libraries],
>>>                       include_directories : [libipa_includes, test_includes_internal])
>>>
>>> diff --git a/test/ipc/meson.build b/test/ipc/meson.build
>>> index ad47b2feb718..2a6cd7fb8433 100644
>>> --- a/test/ipc/meson.build
>>> +++ b/test/ipc/meson.build
>>> @@ -7,7 +7,7 @@ ipc_tests = [
>>>
>>>  foreach t : ipc_tests
>>>      exe = executable(t[0], t[1],
>>> -                     dependencies : libcamera_dep,
>>> +                     dependencies : libcamera_private,
>>>                       link_with : test_libraries,
>>>                       include_directories : test_includes_internal)
>>>
>>> diff --git a/test/libtest/meson.build b/test/libtest/meson.build
>>> index 542335ea5e7c..351629f3ce73 100644
>>> --- a/test/libtest/meson.build
>>> +++ b/test/libtest/meson.build
>>> @@ -18,7 +18,7 @@ test_includes_internal = [
>>>  ]
>>>
>>>  libtest = static_library('libtest', libtest_sources,
>>> -                         dependencies : libcamera_dep,
>>> +                         dependencies : libcamera_private,
>>>                           include_directories : test_includes_internal)
>>>
>>>  test_libraries = [libtest]
>>> diff --git a/test/log/meson.build b/test/log/meson.build
>>> index 8cd664e04a00..ac87841a24e1 100644
>>> --- a/test/log/meson.build
>>> +++ b/test/log/meson.build
>>> @@ -7,7 +7,7 @@ log_test = [
>>>
>>>  foreach t : log_test
>>>      exe = executable(t[0], t[1],
>>> -                     dependencies : libcamera_dep,
>>> +                     dependencies : libcamera_private,
>>>                       link_with : test_libraries,
>>>                       include_directories : test_includes_internal)
>>>
>>> diff --git a/test/media_device/meson.build b/test/media_device/meson.build
>>> index 1dfcdd8bd744..83dfe8f11d2f 100644
>>> --- a/test/media_device/meson.build
>>> +++ b/test/media_device/meson.build
>>> @@ -11,12 +11,12 @@ media_device_tests = [
>>>  ]
>>>
>>>  lib_mdev_test = static_library('lib_mdev_test', lib_mdev_test_sources,
>>> -                               dependencies : libcamera_dep,
>>> +                               dependencies : libcamera_private,
>>>                                 include_directories : test_includes_internal)
>>>
>>>  foreach t : media_device_tests
>>>      exe = executable(t[0], t[1],
>>> -                     dependencies : libcamera_dep,
>>> +                     dependencies : libcamera_private,
>>>                       link_with : [test_libraries, lib_mdev_test],
>>>                       include_directories : test_includes_internal)
>>>
>>> diff --git a/test/meson.build b/test/meson.build
>>> index 045ad2a2d7c9..b8615e0fd3e6 100644
>>> --- a/test/meson.build
>>> +++ b/test/meson.build
>>> @@ -64,7 +64,7 @@ endforeach
>>>
>>>  foreach t : internal_tests
>>>      exe = executable(t[0], t[1],
>>> -                     dependencies : libcamera_dep,
>>> +                     dependencies : libcamera_private,
>>>                       link_with : test_libraries,
>>>                       include_directories : test_includes_internal)
>>>
>>> diff --git a/test/pipeline/ipu3/meson.build b/test/pipeline/ipu3/meson.build
>>> index d062ecd269f2..16701080ca2b 100644
>>> --- a/test/pipeline/ipu3/meson.build
>>> +++ b/test/pipeline/ipu3/meson.build
>>> @@ -6,7 +6,7 @@ ipu3_test = [
>>>
>>>  foreach t : ipu3_test
>>>      exe = executable(t[0], t[1],
>>> -                     dependencies : libcamera_dep,
>>> +                     dependencies : libcamera_private,
>>>                       link_with : test_libraries,
>>>                       include_directories : test_includes_internal)
>>>
>>> diff --git a/test/pipeline/rkisp1/meson.build b/test/pipeline/rkisp1/meson.build
>>> index ece147b054e4..364b5711a0f9 100644
>>> --- a/test/pipeline/rkisp1/meson.build
>>> +++ b/test/pipeline/rkisp1/meson.build
>>> @@ -6,7 +6,7 @@ rkisp1_test = [
>>>
>>>  foreach t : rkisp1_test
>>>      exe = executable(t[0], t[1],
>>> -                     dependencies : libcamera_dep,
>>> +                     dependencies : libcamera_private,
>>>                       link_with : test_libraries,
>>>                       include_directories : test_includes_internal)
>>>
>>> diff --git a/test/process/meson.build b/test/process/meson.build
>>> index d2272d509db3..af86b277db63 100644
>>> --- a/test/process/meson.build
>>> +++ b/test/process/meson.build
>>> @@ -6,7 +6,7 @@ process_tests = [
>>>
>>>  foreach t : process_tests
>>>      exe = executable(t[0], t[1],
>>> -                     dependencies : libcamera_dep,
>>> +                     dependencies : libcamera_private,
>>>                       link_with : test_libraries,
>>>                       include_directories : test_includes_internal)
>>>
>>> diff --git a/test/serialization/generated_serializer/meson.build b/test/serialization/generated_serializer/meson.build
>>> index 2460e0b114b3..9fb9cd1db968 100644
>>> --- a/test/serialization/generated_serializer/meson.build
>>> +++ b/test/serialization/generated_serializer/meson.build
>>> @@ -8,7 +8,7 @@ exe = executable('generated_serializer_test',
>>>                       generated_test_header,
>>>                       generated_test_serializer,
>>>                   ],
>>> -                 dependencies : libcamera_dep,
>>> +                 dependencies : libcamera_private,
>>>                   link_with : test_libraries,
>>>                   include_directories : [
>>>                       test_includes_internal,
>>> diff --git a/test/serialization/meson.build b/test/serialization/meson.build
>>> index 60ebf3255b28..5446e4907f33 100644
>>> --- a/test/serialization/meson.build
>>> +++ b/test/serialization/meson.build
>>> @@ -9,7 +9,7 @@ serialization_tests = [
>>>
>>>  foreach t : serialization_tests
>>>      exe = executable(t[0], [t[1], 'serialization_test.cpp'],
>>> -                     dependencies : libcamera_dep,
>>> +                     dependencies : libcamera_private,
>>>                       link_with : test_libraries,
>>>                       include_directories : test_includes_internal)
>>>      test(t[0], exe, suite : 'serialization', is_parallel : true)
>>> diff --git a/test/v4l2_subdevice/meson.build b/test/v4l2_subdevice/meson.build
>>> index 40d39766af9b..d82be3c60b75 100644
>>> --- a/test/v4l2_subdevice/meson.build
>>> +++ b/test/v4l2_subdevice/meson.build
>>> @@ -7,7 +7,7 @@ v4l2_subdevice_tests = [
>>>
>>>  foreach t : v4l2_subdevice_tests
>>>      exe = executable(t[0], [t[1], 'v4l2_subdevice_test.cpp'],
>>> -        dependencies : libcamera_dep,
>>> +        dependencies : libcamera_private,
>>>          link_with : test_libraries,
>>>          include_directories : test_includes_internal)
>>>      test(t[0], exe, suite : 'v4l2_subdevice', is_parallel : false)
>>> diff --git a/test/v4l2_videodevice/meson.build b/test/v4l2_videodevice/meson.build
>>> index e733518c0185..643f82edce5e 100644
>>> --- a/test/v4l2_videodevice/meson.build
>>> +++ b/test/v4l2_videodevice/meson.build
>>> @@ -16,7 +16,7 @@ v4l2_videodevice_tests = [
>>>
>>>  foreach t : v4l2_videodevice_tests
>>>      exe = executable(t[0], [t[1], 'v4l2_videodevice_test.cpp'],
>>> -                     dependencies : libcamera_dep,
>>> +                     dependencies : libcamera_private,
>>>                       link_with : test_libraries,
>>>                       include_directories : test_includes_internal)
>>>      test(t[0], exe, suite : 'v4l2_videodevice', is_parallel : false)
>>> --
>>> 2.30.2
>>>
Laurent Pinchart June 25, 2021, 12:50 p.m. UTC | #4
Hi Kieran,

Thank you for the patch.

On Fri, Jun 25, 2021 at 10:34:29AM +0100, Kieran Bingham wrote:
> On 25/06/2021 09:40, paul.elder@ideasonboard.com wrote:
> > On Fri, Jun 25, 2021 at 01:12:57PM +0900, Hirokazu Honda wrote:
> >> On Fri, Jun 25, 2021 at 10:35 AM Kieran Bingham wrote:
> >>>
> >>> Headers which must not be exposed as part of the public libcamera API
> >>> can include base/private.h.
> >>>
> >>> Any interface which includes the private.h header will only be able to
> >>> build if the libcamera_private dependency is used (or the
> >>> libcamera_base_private dependency directly)
> >>
> >> I couldn't understand well which one of the four dependencies
> >> (libcamera_private, libcamera_base, libcamera_dep,
> >> libcamera_base_private) should be used in a specific target.
> >> Would you mind describing the rule of using these dependencies?
> > 
> > My understanding is that:
> > 
> > - libcamera_base is everything in base
> > - libcamera_base_private is libcamera_base + the macro required for
> >   using the private headers
> 
> Correct.
> 
> > - libcamera_dep is public + private, for things like IPAs and internal
> >   components (but doesn't include the macro for private headers)
> 
> - libcamera_dep is the existing, widely used dependency for linking
> against libcamera within the meson project.
> 
> It indeed links against all things public and private currently, and
> anything which references this could use any part of the libcamera library.
> 
> (However after this patch, any inclusion of a header without defining
> 'LIBCAMERA_BASE_PRIVATE' will hit a compile break)
> 
> > - libcamera_private is libcamera_dep + the macro
> 
> Correct - this allows a component to link against libcamera, whilst also
> defining that it is explicitly allowed to access 'private' components,
> which should not leak to the public APIs.
> 
> > Kieran, is this correct? (it is a bit hard to keep track of...)
> 
> I've added
> 
> 
> Build targets which are intended to use the private API's will use the
> libcamera_private to handle the automatic definition of the inclusion
> guard.
> 
> 
> It's hard to go into more detail on this in this commit, as it's about
> to get changed in the up coming patches, and I don't want someone to
> read this and say "Oh I should use the libcamera_dep for my public
> component, as ... it will very soon become libcamera_public"

Let's make sure it's properly documented with the whole series applied,
it should be enough.

> >>> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
> >>> ---
> >>>  include/libcamera/base/event_dispatcher.h     |  2 ++
> >>>  .../libcamera/base/event_dispatcher_poll.h    |  2 ++
> >>>  include/libcamera/base/event_notifier.h       |  1 +
> >>>  include/libcamera/base/file.h                 |  1 +
> >>>  include/libcamera/base/log.h                  |  1 +
> >>>  include/libcamera/base/meson.build            |  1 +
> >>>  include/libcamera/base/private.h              | 22 +++++++++++++++++++
> >>>  include/libcamera/base/semaphore.h            |  1 +
> >>>  include/libcamera/base/thread.h               |  1 +
> >>>  include/libcamera/base/timer.h                |  1 +
> >>>  include/libcamera/base/utils.h                |  2 ++
> >>>  src/android/meson.build                       |  2 +-
> >>>  src/ipa/ipu3/meson.build                      |  2 +-
> >>>  src/ipa/libipa/meson.build                    |  2 +-
> >>>  src/ipa/raspberrypi/meson.build               |  2 +-
> >>>  src/ipa/rkisp1/meson.build                    |  2 +-
> >>>  src/ipa/vimc/meson.build                      |  2 +-
> >>>  src/libcamera/base/meson.build                |  8 +++++++
> >>>  src/libcamera/meson.build                     | 10 +++++++--
> >>>  src/libcamera/proxy/worker/meson.build        |  2 +-
> >>>  src/v4l2/meson.build                          |  2 +-
> >>>  test/camera/meson.build                       |  2 +-
> >>>  test/ipa/meson.build                          |  2 +-
> >>>  test/ipc/meson.build                          |  2 +-
> >>>  test/libtest/meson.build                      |  2 +-
> >>>  test/log/meson.build                          |  2 +-
> >>>  test/media_device/meson.build                 |  4 ++--
> >>>  test/meson.build                              |  2 +-
> >>>  test/pipeline/ipu3/meson.build                |  2 +-
> >>>  test/pipeline/rkisp1/meson.build              |  2 +-
> >>>  test/process/meson.build                      |  2 +-
> >>>  .../generated_serializer/meson.build          |  2 +-
> >>>  test/serialization/meson.build                |  2 +-
> >>>  test/v4l2_subdevice/meson.build               |  2 +-
> >>>  test/v4l2_videodevice/meson.build             |  2 +-
> >>>  35 files changed, 74 insertions(+), 25 deletions(-)
> >>>  create mode 100644 include/libcamera/base/private.h
> >>>
> >>> diff --git a/include/libcamera/base/event_dispatcher.h b/include/libcamera/base/event_dispatcher.h
> >>> index 045df27fff16..825af7a33919 100644
> >>> --- a/include/libcamera/base/event_dispatcher.h
> >>> +++ b/include/libcamera/base/event_dispatcher.h
> >>> @@ -9,6 +9,8 @@
> >>>
> >>>  #include <vector>
> >>>
> >>> +#include <libcamera/base/private.h>
> >>> +
> >>>  namespace libcamera {
> >>>
> >>>  class EventNotifier;
> >>> diff --git a/include/libcamera/base/event_dispatcher_poll.h b/include/libcamera/base/event_dispatcher_poll.h
> >>> index ae2a3f04e4b9..88835902980c 100644
> >>> --- a/include/libcamera/base/event_dispatcher_poll.h
> >>> +++ b/include/libcamera/base/event_dispatcher_poll.h
> >>> @@ -13,6 +13,8 @@
> >>>
> >>>  #include <libcamera/base/event_dispatcher.h>
> >>>

Extra blank line ?

I'd be tempted to move private.h to the very beginning, but it may cause
issues with clang-format I suppose.

> >>> +#include <libcamera/base/private.h>
> >>> +
> >>>  struct pollfd;
> >>>
> >>>  namespace libcamera {
> >>> diff --git a/include/libcamera/base/event_notifier.h b/include/libcamera/base/event_notifier.h
> >>> index 8a6419f23004..6bb4e5143aa6 100644
> >>> --- a/include/libcamera/base/event_notifier.h
> >>> +++ b/include/libcamera/base/event_notifier.h
> >>> @@ -8,6 +8,7 @@
> >>>  #define __LIBCAMERA_INTERNAL_EVENT_NOTIFIER_H__
> >>>
> >>>  #include <libcamera/base/object.h>
> >>> +#include <libcamera/base/private.h>
> >>>  #include <libcamera/base/signal.h>
> >>>
> >>>  namespace libcamera {
> >>> diff --git a/include/libcamera/base/file.h b/include/libcamera/base/file.h
> >>> index e8e4b76e1a4e..cecbb254591f 100644
> >>> --- a/include/libcamera/base/file.h
> >>> +++ b/include/libcamera/base/file.h
> >>> @@ -12,6 +12,7 @@
> >>>  #include <sys/types.h>
> >>>
> >>>  #include <libcamera/base/class.h>
> >>> +#include <libcamera/base/private.h>
> >>>
> >>>  #include <libcamera/span.h>
> >>>
> >>> diff --git a/include/libcamera/base/log.h b/include/libcamera/base/log.h
> >>> index b93c947ae7db..70582cd47902 100644
> >>> --- a/include/libcamera/base/log.h
> >>> +++ b/include/libcamera/base/log.h
> >>> @@ -11,6 +11,7 @@
> >>>  #include <sstream>
> >>>
> >>>  #include <libcamera/base/class.h>
> >>> +#include <libcamera/base/private.h>
> >>>  #include <libcamera/base/utils.h>
> >>>
> >>>  namespace libcamera {
> >>> diff --git a/include/libcamera/base/meson.build b/include/libcamera/base/meson.build
> >>> index 83c664affc88..aaac324d7149 100644
> >>> --- a/include/libcamera/base/meson.build
> >>> +++ b/include/libcamera/base/meson.build
> >>> @@ -12,6 +12,7 @@ libcamera_base_headers = files([
> >>>      'log.h',
> >>>      'message.h',
> >>>      'object.h',
> >>> +    'private.h',
> >>>      'semaphore.h',
> >>>      'signal.h',
> >>>      'thread.h',
> >>> diff --git a/include/libcamera/base/private.h b/include/libcamera/base/private.h
> >>> new file mode 100644
> >>> index 000000000000..b54ad076688e
> >>> --- /dev/null
> >>> +++ b/include/libcamera/base/private.h
> >>> @@ -0,0 +1,22 @@
> >>> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> >>> +/*
> >>> + * Copyright (C) 2021, Google Inc.
> >>> + *
> >>> + * private.h - Private Header Validation
> >>> + *
> >>> + * A selection of internal libcamera headers are installed as part
> >>> + * of the libcamera package to allow sharing of a select subset of
> >>> + * internal functionality with IPA module developers only.

s/developers //

> >>> + *
> >>> + * This functionality is not considered part of the public libcamera
> >>> + * API, and can therefore potentially face ABI instabilities which
> >>> + * should not be exposed to applications. IPA modules however should be
> >>> + * versioned and more closely matched to the libcamera installation.
> >>> + *
> >>> + * Components which include this file can not be included in any file
> >>> + * which forms part of the libcamera API.
> >>> + */
> >>> +
> >>> +#ifndef LIBCAMERA_BASE_PRIVATE
> >>> +#error "Private headers must not be included in the libcamera API"
> >>> +#endif
> >>> diff --git a/include/libcamera/base/semaphore.h b/include/libcamera/base/semaphore.h
> >>> index c8e62e3ee68b..d8146eb8060b 100644
> >>> --- a/include/libcamera/base/semaphore.h
> >>> +++ b/include/libcamera/base/semaphore.h
> >>> @@ -9,6 +9,7 @@
> >>>
> >>>  #include <condition_variable>
> >>>
> >>> +#include <libcamera/base/private.h>
> >>>  #include <libcamera/base/thread.h>
> >>>
> >>>  namespace libcamera {
> >>> diff --git a/include/libcamera/base/thread.h b/include/libcamera/base/thread.h
> >>> index 2ed18d49c978..b30ed12715a2 100644
> >>> --- a/include/libcamera/base/thread.h
> >>> +++ b/include/libcamera/base/thread.h
> >>> @@ -13,6 +13,7 @@
> >>>  #include <thread>
> >>>
> >>>  #include <libcamera/base/message.h>
> >>> +#include <libcamera/base/private.h>
> >>>  #include <libcamera/base/signal.h>
> >>>  #include <libcamera/base/utils.h>
> >>>
> >>> diff --git a/include/libcamera/base/timer.h b/include/libcamera/base/timer.h
> >>> index e79e85f1ef0d..f762e8767d97 100644
> >>> --- a/include/libcamera/base/timer.h
> >>> +++ b/include/libcamera/base/timer.h
> >>> @@ -11,6 +11,7 @@
> >>>  #include <stdint.h>
> >>>
> >>>  #include <libcamera/base/object.h>
> >>> +#include <libcamera/base/private.h>
> >>>  #include <libcamera/base/signal.h>
> >>>
> >>>  namespace libcamera {
> >>> diff --git a/include/libcamera/base/utils.h b/include/libcamera/base/utils.h
> >>> index d1aaff65211a..07685045aa05 100644
> >>> --- a/include/libcamera/base/utils.h
> >>> +++ b/include/libcamera/base/utils.h
> >>> @@ -19,6 +19,8 @@
> >>>  #include <utility>
> >>>  #include <vector>
> >>>
> >>> +#include <libcamera/base/private.h>
> >>> +
> >>>  #ifndef __DOXYGEN__
> >>>
> >>>  /* uClibc and uClibc-ng don't provide O_TMPFILE */
> >>> diff --git a/src/android/meson.build b/src/android/meson.build
> >>> index bd58ef964c2a..7d1e7e85f16e 100644
> >>> --- a/src/android/meson.build
> >>> +++ b/src/android/meson.build
> >>> @@ -4,7 +4,7 @@ android_deps = [
> >>>      dependency('libexif', required : get_option('android')),
> >>>      dependency('libjpeg', required : get_option('android')),
> >>>      dependency('yaml-0.1', required : get_option('android')),
> >>> -    libcamera_dep,
> >>> +    libcamera_private,
> >>>  ]
> >>>
> >>>  android_enabled = true
> >>> diff --git a/src/ipa/ipu3/meson.build b/src/ipa/ipu3/meson.build
> >>> index 0d843846acde..b63641908710 100644
> >>> --- a/src/ipa/ipu3/meson.build
> >>> +++ b/src/ipa/ipu3/meson.build
> >>> @@ -12,7 +12,7 @@ mod = shared_module(ipa_name,
> >>>                      [ipu3_ipa_sources, libcamera_generated_ipa_headers],
> >>>                      name_prefix : '',
> >>>                      include_directories : [ipa_includes, libipa_includes],
> >>> -                    dependencies : libcamera_dep,
> >>> +                    dependencies : libcamera_private,
> >>>                      link_with : libipa,
> >>>                      install : true,
> >>>                      install_dir : ipa_install_dir)
> >>> diff --git a/src/ipa/libipa/meson.build b/src/ipa/libipa/meson.build
> >>> index 038fc49060ef..ca541a5aafd7 100644
> >>> --- a/src/ipa/libipa/meson.build
> >>> +++ b/src/ipa/libipa/meson.build
> >>> @@ -14,4 +14,4 @@ libipa_includes = include_directories('..')
> >>>
> >>>  libipa = static_library('ipa', [libipa_sources, libipa_headers],
> >>>                          include_directories : ipa_includes,
> >>> -                        dependencies : libcamera_dep)
> >>> +                        dependencies : libcamera_private)
> >>> diff --git a/src/ipa/raspberrypi/meson.build b/src/ipa/raspberrypi/meson.build
> >>> index 230356d3ce3a..d7203aa042cd 100644
> >>> --- a/src/ipa/raspberrypi/meson.build
> >>> +++ b/src/ipa/raspberrypi/meson.build
> >>> @@ -3,7 +3,7 @@
> >>>  ipa_name = 'ipa_rpi'
> >>>
> >>>  rpi_ipa_deps = [
> >>> -    libcamera_dep,
> >>> +    libcamera_private,
> >>>      dependency('boost'),
> >>>      libatomic,
> >>>  ]
> >>> diff --git a/src/ipa/rkisp1/meson.build b/src/ipa/rkisp1/meson.build
> >>> index 1a1c71591039..f76b37f5af50 100644
> >>> --- a/src/ipa/rkisp1/meson.build
> >>> +++ b/src/ipa/rkisp1/meson.build
> >>> @@ -6,7 +6,7 @@ mod = shared_module(ipa_name,
> >>>                      ['rkisp1.cpp', libcamera_generated_ipa_headers],
> >>>                      name_prefix : '',
> >>>                      include_directories : [ipa_includes, libipa_includes],
> >>> -                    dependencies : libcamera_dep,
> >>> +                    dependencies : libcamera_private,
> >>>                      link_with : libipa,
> >>>                      install : true,
> >>>                      install_dir : ipa_install_dir)
> >>> diff --git a/src/ipa/vimc/meson.build b/src/ipa/vimc/meson.build
> >>> index a35825ae25a6..ecbeee136451 100644
> >>> --- a/src/ipa/vimc/meson.build
> >>> +++ b/src/ipa/vimc/meson.build
> >>> @@ -6,7 +6,7 @@ mod = shared_module(ipa_name,
> >>>                      ['vimc.cpp', libcamera_generated_ipa_headers],
> >>>                      name_prefix : '',
> >>>                      include_directories : [ipa_includes, libipa_includes],
> >>> -                    dependencies : libcamera_dep,
> >>> +                    dependencies : libcamera_private,
> >>>                      link_with : libipa,
> >>>                      install : true,
> >>>                      install_dir : ipa_install_dir)
> >>> diff --git a/src/libcamera/base/meson.build b/src/libcamera/base/meson.build
> >>> index a8b04cfc8a5f..871721571e98 100644
> >>> --- a/src/libcamera/base/meson.build
> >>> +++ b/src/libcamera/base/meson.build
> >>> @@ -21,10 +21,15 @@ libcamera_base_deps = [
> >>>      dependency('threads'),
> >>>  ]
> >>>
> >>> +# Internal components must use the libcamera_base_private dependency to enable
> >>> +# the use of headers which must not be exposed to the libcamera public api.
> >>> +libcamera_base_args = [ '-DLIBCAMERA_BASE_PRIVATE' ]
> >>> +
> >>>  libcamera_base_lib = shared_library('libcamera-base',
> >>>                                      [libcamera_base_sources, libcamera_base_headers],
> >>>                                      name_prefix : '',
> >>>                                      install : true,
> >>> +                                    cpp_args : libcamera_base_args,
> >>>                                      include_directories : libcamera_includes,
> >>>                                      dependencies : libcamera_base_deps)
> >>>
> >>> @@ -39,3 +44,6 @@ pkg_mod.generate(libcamera_base_lib,
> >>>                   version : '1.0',
> >>>                   description : 'Camera support base utility library',
> >>>                   subdirs : 'libcamera')
> >>> +
> >>> +libcamera_base_private = declare_dependency(dependencies : libcamera_base,
> >>> +                                            compile_args : libcamera_base_args)
> >>> diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
> >>> index 1f163cfe1225..64c7475f1a2e 100644
> >>> --- a/src/libcamera/meson.build
> >>> +++ b/src/libcamera/meson.build
> >>> @@ -115,7 +115,7 @@ libcamera_deps = [
> >>>      libgnutls,
> >>>      liblttng,
> >>>      libudev,
> >>> -    libcamera_base,
> >>> +    libcamera_base_private,
> >>>  ]
> >>>
> >>>  # We add '/' to the build_rpath as a 'safe' path to act as a boolean flag.
> >>> @@ -143,9 +143,15 @@ libcamera_dep = declare_dependency(sources : [
> >>>                                         libcamera_generated_ipa_headers,
> >>>                                     ],
> >>>                                     include_directories : libcamera_includes,
> >>> -                                   dependencies: libcamera_base,
> >>> +                                   dependencies : libcamera_base,
> >>>                                     link_with : libcamera)
> >>>
> >>> +# Internal dependancy for components and plugins which can use Private APIs

s/dependancy/dependency/
s/Private/private/

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> >>> +libcamera_private = declare_dependency(dependencies : [
> >>> +                                           libcamera_dep,
> >>> +                                           libcamera_base_private,
> >>> +                                       ])
> >>> +
> >>>  pkg_mod = import('pkgconfig')
> >>>  pkg_mod.generate(libcamera,
> >>>                   libraries : libcamera_base_lib,
> >>> diff --git a/src/libcamera/proxy/worker/meson.build b/src/libcamera/proxy/worker/meson.build
> >>> index 28fe5f1fd6b2..70c8760a3d42 100644
> >>> --- a/src/libcamera/proxy/worker/meson.build
> >>> +++ b/src/libcamera/proxy/worker/meson.build
> >>> @@ -21,7 +21,7 @@ foreach mojom : ipa_mojoms
> >>>                         [worker, libcamera_generated_ipa_headers],
> >>>                         install : true,
> >>>                         install_dir : proxy_install_dir,
> >>> -                       dependencies : libcamera_dep)
> >>> +                       dependencies : libcamera_private)
> >>>  endforeach
> >>>
> >>>  config_h.set('IPA_PROXY_DIR',
> >>> diff --git a/src/v4l2/meson.build b/src/v4l2/meson.build
> >>> index 0accac194be4..f78497b6799b 100644
> >>> --- a/src/v4l2/meson.build
> >>> +++ b/src/v4l2/meson.build
> >>> @@ -31,5 +31,5 @@ v4l2_compat = shared_library('v4l2-compat',
> >>>                               v4l2_compat_sources,
> >>>                               name_prefix : '',
> >>>                               install : true,
> >>> -                             dependencies : [libcamera_dep, libdl],
> >>> +                             dependencies : [libcamera_private, libdl],
> >>>                               cpp_args : v4l2_compat_cpp_args)
> >>> diff --git a/test/camera/meson.build b/test/camera/meson.build
> >>> index 9cb95affffab..002a87b594e0 100644
> >>> --- a/test/camera/meson.build
> >>> +++ b/test/camera/meson.build
> >>> @@ -12,7 +12,7 @@ camera_tests = [
> >>>
> >>>  foreach t : camera_tests
> >>>      exe = executable(t[0], t[1],
> >>> -                     dependencies : libcamera_dep,
> >>> +                     dependencies : libcamera_private,
> >>>                       link_with : test_libraries,
> >>>                       include_directories : test_includes_internal)
> >>>      test(t[0], exe, suite : 'camera', is_parallel : false)
> >>> diff --git a/test/ipa/meson.build b/test/ipa/meson.build
> >>> index e8a041b5bbd2..7938633e54ab 100644
> >>> --- a/test/ipa/meson.build
> >>> +++ b/test/ipa/meson.build
> >>> @@ -7,7 +7,7 @@ ipa_test = [
> >>>
> >>>  foreach t : ipa_test
> >>>      exe = executable(t[0], [t[1], libcamera_generated_ipa_headers],
> >>> -                     dependencies : libcamera_dep,
> >>> +                     dependencies : libcamera_private,
> >>>                       link_with : [libipa, test_libraries],
> >>>                       include_directories : [libipa_includes, test_includes_internal])
> >>>
> >>> diff --git a/test/ipc/meson.build b/test/ipc/meson.build
> >>> index ad47b2feb718..2a6cd7fb8433 100644
> >>> --- a/test/ipc/meson.build
> >>> +++ b/test/ipc/meson.build
> >>> @@ -7,7 +7,7 @@ ipc_tests = [
> >>>
> >>>  foreach t : ipc_tests
> >>>      exe = executable(t[0], t[1],
> >>> -                     dependencies : libcamera_dep,
> >>> +                     dependencies : libcamera_private,
> >>>                       link_with : test_libraries,
> >>>                       include_directories : test_includes_internal)
> >>>
> >>> diff --git a/test/libtest/meson.build b/test/libtest/meson.build
> >>> index 542335ea5e7c..351629f3ce73 100644
> >>> --- a/test/libtest/meson.build
> >>> +++ b/test/libtest/meson.build
> >>> @@ -18,7 +18,7 @@ test_includes_internal = [
> >>>  ]
> >>>
> >>>  libtest = static_library('libtest', libtest_sources,
> >>> -                         dependencies : libcamera_dep,
> >>> +                         dependencies : libcamera_private,
> >>>                           include_directories : test_includes_internal)
> >>>
> >>>  test_libraries = [libtest]
> >>> diff --git a/test/log/meson.build b/test/log/meson.build
> >>> index 8cd664e04a00..ac87841a24e1 100644
> >>> --- a/test/log/meson.build
> >>> +++ b/test/log/meson.build
> >>> @@ -7,7 +7,7 @@ log_test = [
> >>>
> >>>  foreach t : log_test
> >>>      exe = executable(t[0], t[1],
> >>> -                     dependencies : libcamera_dep,
> >>> +                     dependencies : libcamera_private,
> >>>                       link_with : test_libraries,
> >>>                       include_directories : test_includes_internal)
> >>>
> >>> diff --git a/test/media_device/meson.build b/test/media_device/meson.build
> >>> index 1dfcdd8bd744..83dfe8f11d2f 100644
> >>> --- a/test/media_device/meson.build
> >>> +++ b/test/media_device/meson.build
> >>> @@ -11,12 +11,12 @@ media_device_tests = [
> >>>  ]
> >>>
> >>>  lib_mdev_test = static_library('lib_mdev_test', lib_mdev_test_sources,
> >>> -                               dependencies : libcamera_dep,
> >>> +                               dependencies : libcamera_private,
> >>>                                 include_directories : test_includes_internal)
> >>>
> >>>  foreach t : media_device_tests
> >>>      exe = executable(t[0], t[1],
> >>> -                     dependencies : libcamera_dep,
> >>> +                     dependencies : libcamera_private,
> >>>                       link_with : [test_libraries, lib_mdev_test],
> >>>                       include_directories : test_includes_internal)
> >>>
> >>> diff --git a/test/meson.build b/test/meson.build
> >>> index 045ad2a2d7c9..b8615e0fd3e6 100644
> >>> --- a/test/meson.build
> >>> +++ b/test/meson.build
> >>> @@ -64,7 +64,7 @@ endforeach
> >>>
> >>>  foreach t : internal_tests
> >>>      exe = executable(t[0], t[1],
> >>> -                     dependencies : libcamera_dep,
> >>> +                     dependencies : libcamera_private,
> >>>                       link_with : test_libraries,
> >>>                       include_directories : test_includes_internal)
> >>>
> >>> diff --git a/test/pipeline/ipu3/meson.build b/test/pipeline/ipu3/meson.build
> >>> index d062ecd269f2..16701080ca2b 100644
> >>> --- a/test/pipeline/ipu3/meson.build
> >>> +++ b/test/pipeline/ipu3/meson.build
> >>> @@ -6,7 +6,7 @@ ipu3_test = [
> >>>
> >>>  foreach t : ipu3_test
> >>>      exe = executable(t[0], t[1],
> >>> -                     dependencies : libcamera_dep,
> >>> +                     dependencies : libcamera_private,
> >>>                       link_with : test_libraries,
> >>>                       include_directories : test_includes_internal)
> >>>
> >>> diff --git a/test/pipeline/rkisp1/meson.build b/test/pipeline/rkisp1/meson.build
> >>> index ece147b054e4..364b5711a0f9 100644
> >>> --- a/test/pipeline/rkisp1/meson.build
> >>> +++ b/test/pipeline/rkisp1/meson.build
> >>> @@ -6,7 +6,7 @@ rkisp1_test = [
> >>>
> >>>  foreach t : rkisp1_test
> >>>      exe = executable(t[0], t[1],
> >>> -                     dependencies : libcamera_dep,
> >>> +                     dependencies : libcamera_private,
> >>>                       link_with : test_libraries,
> >>>                       include_directories : test_includes_internal)
> >>>
> >>> diff --git a/test/process/meson.build b/test/process/meson.build
> >>> index d2272d509db3..af86b277db63 100644
> >>> --- a/test/process/meson.build
> >>> +++ b/test/process/meson.build
> >>> @@ -6,7 +6,7 @@ process_tests = [
> >>>
> >>>  foreach t : process_tests
> >>>      exe = executable(t[0], t[1],
> >>> -                     dependencies : libcamera_dep,
> >>> +                     dependencies : libcamera_private,
> >>>                       link_with : test_libraries,
> >>>                       include_directories : test_includes_internal)
> >>>
> >>> diff --git a/test/serialization/generated_serializer/meson.build b/test/serialization/generated_serializer/meson.build
> >>> index 2460e0b114b3..9fb9cd1db968 100644
> >>> --- a/test/serialization/generated_serializer/meson.build
> >>> +++ b/test/serialization/generated_serializer/meson.build
> >>> @@ -8,7 +8,7 @@ exe = executable('generated_serializer_test',
> >>>                       generated_test_header,
> >>>                       generated_test_serializer,
> >>>                   ],
> >>> -                 dependencies : libcamera_dep,
> >>> +                 dependencies : libcamera_private,
> >>>                   link_with : test_libraries,
> >>>                   include_directories : [
> >>>                       test_includes_internal,
> >>> diff --git a/test/serialization/meson.build b/test/serialization/meson.build
> >>> index 60ebf3255b28..5446e4907f33 100644
> >>> --- a/test/serialization/meson.build
> >>> +++ b/test/serialization/meson.build
> >>> @@ -9,7 +9,7 @@ serialization_tests = [
> >>>
> >>>  foreach t : serialization_tests
> >>>      exe = executable(t[0], [t[1], 'serialization_test.cpp'],
> >>> -                     dependencies : libcamera_dep,
> >>> +                     dependencies : libcamera_private,
> >>>                       link_with : test_libraries,
> >>>                       include_directories : test_includes_internal)
> >>>      test(t[0], exe, suite : 'serialization', is_parallel : true)
> >>> diff --git a/test/v4l2_subdevice/meson.build b/test/v4l2_subdevice/meson.build
> >>> index 40d39766af9b..d82be3c60b75 100644
> >>> --- a/test/v4l2_subdevice/meson.build
> >>> +++ b/test/v4l2_subdevice/meson.build
> >>> @@ -7,7 +7,7 @@ v4l2_subdevice_tests = [
> >>>
> >>>  foreach t : v4l2_subdevice_tests
> >>>      exe = executable(t[0], [t[1], 'v4l2_subdevice_test.cpp'],
> >>> -        dependencies : libcamera_dep,
> >>> +        dependencies : libcamera_private,
> >>>          link_with : test_libraries,
> >>>          include_directories : test_includes_internal)
> >>>      test(t[0], exe, suite : 'v4l2_subdevice', is_parallel : false)
> >>> diff --git a/test/v4l2_videodevice/meson.build b/test/v4l2_videodevice/meson.build
> >>> index e733518c0185..643f82edce5e 100644
> >>> --- a/test/v4l2_videodevice/meson.build
> >>> +++ b/test/v4l2_videodevice/meson.build
> >>> @@ -16,7 +16,7 @@ v4l2_videodevice_tests = [
> >>>
> >>>  foreach t : v4l2_videodevice_tests
> >>>      exe = executable(t[0], [t[1], 'v4l2_videodevice_test.cpp'],
> >>> -                     dependencies : libcamera_dep,
> >>> +                     dependencies : libcamera_private,
> >>>                       link_with : test_libraries,
> >>>                       include_directories : test_includes_internal)
> >>>      test(t[0], exe, suite : 'v4l2_videodevice', is_parallel : false)
Kieran Bingham June 25, 2021, 2:49 p.m. UTC | #5
On 25/06/2021 13:50, Laurent Pinchart wrote:
> Hi Kieran,
> 
> Thank you for the patch.
> 
> On Fri, Jun 25, 2021 at 10:34:29AM +0100, Kieran Bingham wrote:
>> On 25/06/2021 09:40, paul.elder@ideasonboard.com wrote:
>>> On Fri, Jun 25, 2021 at 01:12:57PM +0900, Hirokazu Honda wrote:
>>>> On Fri, Jun 25, 2021 at 10:35 AM Kieran Bingham wrote:
>>>>>
>>>>> Headers which must not be exposed as part of the public libcamera API
>>>>> can include base/private.h.
>>>>>
>>>>> Any interface which includes the private.h header will only be able to
>>>>> build if the libcamera_private dependency is used (or the
>>>>> libcamera_base_private dependency directly)
>>>>
>>>> I couldn't understand well which one of the four dependencies
>>>> (libcamera_private, libcamera_base, libcamera_dep,
>>>> libcamera_base_private) should be used in a specific target.
>>>> Would you mind describing the rule of using these dependencies?
>>>
>>> My understanding is that:
>>>
>>> - libcamera_base is everything in base
>>> - libcamera_base_private is libcamera_base + the macro required for
>>>   using the private headers
>>
>> Correct.
>>
>>> - libcamera_dep is public + private, for things like IPAs and internal
>>>   components (but doesn't include the macro for private headers)
>>
>> - libcamera_dep is the existing, widely used dependency for linking
>> against libcamera within the meson project.
>>
>> It indeed links against all things public and private currently, and
>> anything which references this could use any part of the libcamera library.
>>
>> (However after this patch, any inclusion of a header without defining
>> 'LIBCAMERA_BASE_PRIVATE' will hit a compile break)
>>
>>> - libcamera_private is libcamera_dep + the macro
>>
>> Correct - this allows a component to link against libcamera, whilst also
>> defining that it is explicitly allowed to access 'private' components,
>> which should not leak to the public APIs.
>>
>>> Kieran, is this correct? (it is a bit hard to keep track of...)
>>
>> I've added
>>
>>
>> Build targets which are intended to use the private API's will use the
>> libcamera_private to handle the automatic definition of the inclusion
>> guard.
>>
>>
>> It's hard to go into more detail on this in this commit, as it's about
>> to get changed in the up coming patches, and I don't want someone to
>> read this and say "Oh I should use the libcamera_dep for my public
>> component, as ... it will very soon become libcamera_public"
> 
> Let's make sure it's properly documented with the whole series applied,
> it should be enough.
> 
>>>>> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
>>>>> ---
>>>>>  include/libcamera/base/event_dispatcher.h     |  2 ++
>>>>>  .../libcamera/base/event_dispatcher_poll.h    |  2 ++
>>>>>  include/libcamera/base/event_notifier.h       |  1 +
>>>>>  include/libcamera/base/file.h                 |  1 +
>>>>>  include/libcamera/base/log.h                  |  1 +
>>>>>  include/libcamera/base/meson.build            |  1 +
>>>>>  include/libcamera/base/private.h              | 22 +++++++++++++++++++
>>>>>  include/libcamera/base/semaphore.h            |  1 +
>>>>>  include/libcamera/base/thread.h               |  1 +
>>>>>  include/libcamera/base/timer.h                |  1 +
>>>>>  include/libcamera/base/utils.h                |  2 ++
>>>>>  src/android/meson.build                       |  2 +-
>>>>>  src/ipa/ipu3/meson.build                      |  2 +-
>>>>>  src/ipa/libipa/meson.build                    |  2 +-
>>>>>  src/ipa/raspberrypi/meson.build               |  2 +-
>>>>>  src/ipa/rkisp1/meson.build                    |  2 +-
>>>>>  src/ipa/vimc/meson.build                      |  2 +-
>>>>>  src/libcamera/base/meson.build                |  8 +++++++
>>>>>  src/libcamera/meson.build                     | 10 +++++++--
>>>>>  src/libcamera/proxy/worker/meson.build        |  2 +-
>>>>>  src/v4l2/meson.build                          |  2 +-
>>>>>  test/camera/meson.build                       |  2 +-
>>>>>  test/ipa/meson.build                          |  2 +-
>>>>>  test/ipc/meson.build                          |  2 +-
>>>>>  test/libtest/meson.build                      |  2 +-
>>>>>  test/log/meson.build                          |  2 +-
>>>>>  test/media_device/meson.build                 |  4 ++--
>>>>>  test/meson.build                              |  2 +-
>>>>>  test/pipeline/ipu3/meson.build                |  2 +-
>>>>>  test/pipeline/rkisp1/meson.build              |  2 +-
>>>>>  test/process/meson.build                      |  2 +-
>>>>>  .../generated_serializer/meson.build          |  2 +-
>>>>>  test/serialization/meson.build                |  2 +-
>>>>>  test/v4l2_subdevice/meson.build               |  2 +-
>>>>>  test/v4l2_videodevice/meson.build             |  2 +-
>>>>>  35 files changed, 74 insertions(+), 25 deletions(-)
>>>>>  create mode 100644 include/libcamera/base/private.h
>>>>>
>>>>> diff --git a/include/libcamera/base/event_dispatcher.h b/include/libcamera/base/event_dispatcher.h
>>>>> index 045df27fff16..825af7a33919 100644
>>>>> --- a/include/libcamera/base/event_dispatcher.h
>>>>> +++ b/include/libcamera/base/event_dispatcher.h
>>>>> @@ -9,6 +9,8 @@
>>>>>
>>>>>  #include <vector>
>>>>>
>>>>> +#include <libcamera/base/private.h>
>>>>> +
>>>>>  namespace libcamera {
>>>>>
>>>>>  class EventNotifier;
>>>>> diff --git a/include/libcamera/base/event_dispatcher_poll.h b/include/libcamera/base/event_dispatcher_poll.h
>>>>> index ae2a3f04e4b9..88835902980c 100644
>>>>> --- a/include/libcamera/base/event_dispatcher_poll.h
>>>>> +++ b/include/libcamera/base/event_dispatcher_poll.h
>>>>> @@ -13,6 +13,8 @@
>>>>>
>>>>>  #include <libcamera/base/event_dispatcher.h>
>>>>>
> 
> Extra blank line ?
> 
> I'd be tempted to move private.h to the very beginning, but it may cause
> issues with clang-format I suppose.

I had the same thoughts but left it to be sorted automatically.

But ... now I'm better at handling the .clang-format sorts - I can
create a new 'group' for private headers to separate it.

I think that's a useful thing, as these need to stand out as private as
a declaration, not be hidden in amongst others.

We're late enough in the series that I can do this without rebase pain.

I'll update it now.

> 
>>>>> +#include <libcamera/base/private.h>
>>>>> +
>>>>>  struct pollfd;
>>>>>
>>>>>  namespace libcamera {
>>>>> diff --git a/include/libcamera/base/event_notifier.h b/include/libcamera/base/event_notifier.h
>>>>> index 8a6419f23004..6bb4e5143aa6 100644
>>>>> --- a/include/libcamera/base/event_notifier.h
>>>>> +++ b/include/libcamera/base/event_notifier.h
>>>>> @@ -8,6 +8,7 @@
>>>>>  #define __LIBCAMERA_INTERNAL_EVENT_NOTIFIER_H__
>>>>>
>>>>>  #include <libcamera/base/object.h>
>>>>> +#include <libcamera/base/private.h>
>>>>>  #include <libcamera/base/signal.h>
>>>>>
>>>>>  namespace libcamera {
>>>>> diff --git a/include/libcamera/base/file.h b/include/libcamera/base/file.h
>>>>> index e8e4b76e1a4e..cecbb254591f 100644
>>>>> --- a/include/libcamera/base/file.h
>>>>> +++ b/include/libcamera/base/file.h
>>>>> @@ -12,6 +12,7 @@
>>>>>  #include <sys/types.h>
>>>>>
>>>>>  #include <libcamera/base/class.h>
>>>>> +#include <libcamera/base/private.h>
>>>>>
>>>>>  #include <libcamera/span.h>
>>>>>
>>>>> diff --git a/include/libcamera/base/log.h b/include/libcamera/base/log.h
>>>>> index b93c947ae7db..70582cd47902 100644
>>>>> --- a/include/libcamera/base/log.h
>>>>> +++ b/include/libcamera/base/log.h
>>>>> @@ -11,6 +11,7 @@
>>>>>  #include <sstream>
>>>>>
>>>>>  #include <libcamera/base/class.h>
>>>>> +#include <libcamera/base/private.h>
>>>>>  #include <libcamera/base/utils.h>
>>>>>
>>>>>  namespace libcamera {
>>>>> diff --git a/include/libcamera/base/meson.build b/include/libcamera/base/meson.build
>>>>> index 83c664affc88..aaac324d7149 100644
>>>>> --- a/include/libcamera/base/meson.build
>>>>> +++ b/include/libcamera/base/meson.build
>>>>> @@ -12,6 +12,7 @@ libcamera_base_headers = files([
>>>>>      'log.h',
>>>>>      'message.h',
>>>>>      'object.h',
>>>>> +    'private.h',
>>>>>      'semaphore.h',
>>>>>      'signal.h',
>>>>>      'thread.h',
>>>>> diff --git a/include/libcamera/base/private.h b/include/libcamera/base/private.h
>>>>> new file mode 100644
>>>>> index 000000000000..b54ad076688e
>>>>> --- /dev/null
>>>>> +++ b/include/libcamera/base/private.h
>>>>> @@ -0,0 +1,22 @@
>>>>> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
>>>>> +/*
>>>>> + * Copyright (C) 2021, Google Inc.
>>>>> + *
>>>>> + * private.h - Private Header Validation
>>>>> + *
>>>>> + * A selection of internal libcamera headers are installed as part
>>>>> + * of the libcamera package to allow sharing of a select subset of
>>>>> + * internal functionality with IPA module developers only.
> 
> s/developers //
> 
>>>>> + *
>>>>> + * This functionality is not considered part of the public libcamera
>>>>> + * API, and can therefore potentially face ABI instabilities which
>>>>> + * should not be exposed to applications. IPA modules however should be
>>>>> + * versioned and more closely matched to the libcamera installation.
>>>>> + *
>>>>> + * Components which include this file can not be included in any file
>>>>> + * which forms part of the libcamera API.
>>>>> + */
>>>>> +
>>>>> +#ifndef LIBCAMERA_BASE_PRIVATE
>>>>> +#error "Private headers must not be included in the libcamera API"
>>>>> +#endif
>>>>> diff --git a/include/libcamera/base/semaphore.h b/include/libcamera/base/semaphore.h
>>>>> index c8e62e3ee68b..d8146eb8060b 100644
>>>>> --- a/include/libcamera/base/semaphore.h
>>>>> +++ b/include/libcamera/base/semaphore.h
>>>>> @@ -9,6 +9,7 @@
>>>>>
>>>>>  #include <condition_variable>
>>>>>
>>>>> +#include <libcamera/base/private.h>
>>>>>  #include <libcamera/base/thread.h>
>>>>>
>>>>>  namespace libcamera {
>>>>> diff --git a/include/libcamera/base/thread.h b/include/libcamera/base/thread.h
>>>>> index 2ed18d49c978..b30ed12715a2 100644
>>>>> --- a/include/libcamera/base/thread.h
>>>>> +++ b/include/libcamera/base/thread.h
>>>>> @@ -13,6 +13,7 @@
>>>>>  #include <thread>
>>>>>
>>>>>  #include <libcamera/base/message.h>
>>>>> +#include <libcamera/base/private.h>
>>>>>  #include <libcamera/base/signal.h>
>>>>>  #include <libcamera/base/utils.h>
>>>>>
>>>>> diff --git a/include/libcamera/base/timer.h b/include/libcamera/base/timer.h
>>>>> index e79e85f1ef0d..f762e8767d97 100644
>>>>> --- a/include/libcamera/base/timer.h
>>>>> +++ b/include/libcamera/base/timer.h
>>>>> @@ -11,6 +11,7 @@
>>>>>  #include <stdint.h>
>>>>>
>>>>>  #include <libcamera/base/object.h>
>>>>> +#include <libcamera/base/private.h>
>>>>>  #include <libcamera/base/signal.h>
>>>>>
>>>>>  namespace libcamera {
>>>>> diff --git a/include/libcamera/base/utils.h b/include/libcamera/base/utils.h
>>>>> index d1aaff65211a..07685045aa05 100644
>>>>> --- a/include/libcamera/base/utils.h
>>>>> +++ b/include/libcamera/base/utils.h
>>>>> @@ -19,6 +19,8 @@
>>>>>  #include <utility>
>>>>>  #include <vector>
>>>>>
>>>>> +#include <libcamera/base/private.h>
>>>>> +
>>>>>  #ifndef __DOXYGEN__
>>>>>
>>>>>  /* uClibc and uClibc-ng don't provide O_TMPFILE */
>>>>> diff --git a/src/android/meson.build b/src/android/meson.build
>>>>> index bd58ef964c2a..7d1e7e85f16e 100644
>>>>> --- a/src/android/meson.build
>>>>> +++ b/src/android/meson.build
>>>>> @@ -4,7 +4,7 @@ android_deps = [
>>>>>      dependency('libexif', required : get_option('android')),
>>>>>      dependency('libjpeg', required : get_option('android')),
>>>>>      dependency('yaml-0.1', required : get_option('android')),
>>>>> -    libcamera_dep,
>>>>> +    libcamera_private,
>>>>>  ]
>>>>>
>>>>>  android_enabled = true
>>>>> diff --git a/src/ipa/ipu3/meson.build b/src/ipa/ipu3/meson.build
>>>>> index 0d843846acde..b63641908710 100644
>>>>> --- a/src/ipa/ipu3/meson.build
>>>>> +++ b/src/ipa/ipu3/meson.build
>>>>> @@ -12,7 +12,7 @@ mod = shared_module(ipa_name,
>>>>>                      [ipu3_ipa_sources, libcamera_generated_ipa_headers],
>>>>>                      name_prefix : '',
>>>>>                      include_directories : [ipa_includes, libipa_includes],
>>>>> -                    dependencies : libcamera_dep,
>>>>> +                    dependencies : libcamera_private,
>>>>>                      link_with : libipa,
>>>>>                      install : true,
>>>>>                      install_dir : ipa_install_dir)
>>>>> diff --git a/src/ipa/libipa/meson.build b/src/ipa/libipa/meson.build
>>>>> index 038fc49060ef..ca541a5aafd7 100644
>>>>> --- a/src/ipa/libipa/meson.build
>>>>> +++ b/src/ipa/libipa/meson.build
>>>>> @@ -14,4 +14,4 @@ libipa_includes = include_directories('..')
>>>>>
>>>>>  libipa = static_library('ipa', [libipa_sources, libipa_headers],
>>>>>                          include_directories : ipa_includes,
>>>>> -                        dependencies : libcamera_dep)
>>>>> +                        dependencies : libcamera_private)
>>>>> diff --git a/src/ipa/raspberrypi/meson.build b/src/ipa/raspberrypi/meson.build
>>>>> index 230356d3ce3a..d7203aa042cd 100644
>>>>> --- a/src/ipa/raspberrypi/meson.build
>>>>> +++ b/src/ipa/raspberrypi/meson.build
>>>>> @@ -3,7 +3,7 @@
>>>>>  ipa_name = 'ipa_rpi'
>>>>>
>>>>>  rpi_ipa_deps = [
>>>>> -    libcamera_dep,
>>>>> +    libcamera_private,
>>>>>      dependency('boost'),
>>>>>      libatomic,
>>>>>  ]
>>>>> diff --git a/src/ipa/rkisp1/meson.build b/src/ipa/rkisp1/meson.build
>>>>> index 1a1c71591039..f76b37f5af50 100644
>>>>> --- a/src/ipa/rkisp1/meson.build
>>>>> +++ b/src/ipa/rkisp1/meson.build
>>>>> @@ -6,7 +6,7 @@ mod = shared_module(ipa_name,
>>>>>                      ['rkisp1.cpp', libcamera_generated_ipa_headers],
>>>>>                      name_prefix : '',
>>>>>                      include_directories : [ipa_includes, libipa_includes],
>>>>> -                    dependencies : libcamera_dep,
>>>>> +                    dependencies : libcamera_private,
>>>>>                      link_with : libipa,
>>>>>                      install : true,
>>>>>                      install_dir : ipa_install_dir)
>>>>> diff --git a/src/ipa/vimc/meson.build b/src/ipa/vimc/meson.build
>>>>> index a35825ae25a6..ecbeee136451 100644
>>>>> --- a/src/ipa/vimc/meson.build
>>>>> +++ b/src/ipa/vimc/meson.build
>>>>> @@ -6,7 +6,7 @@ mod = shared_module(ipa_name,
>>>>>                      ['vimc.cpp', libcamera_generated_ipa_headers],
>>>>>                      name_prefix : '',
>>>>>                      include_directories : [ipa_includes, libipa_includes],
>>>>> -                    dependencies : libcamera_dep,
>>>>> +                    dependencies : libcamera_private,
>>>>>                      link_with : libipa,
>>>>>                      install : true,
>>>>>                      install_dir : ipa_install_dir)
>>>>> diff --git a/src/libcamera/base/meson.build b/src/libcamera/base/meson.build
>>>>> index a8b04cfc8a5f..871721571e98 100644
>>>>> --- a/src/libcamera/base/meson.build
>>>>> +++ b/src/libcamera/base/meson.build
>>>>> @@ -21,10 +21,15 @@ libcamera_base_deps = [
>>>>>      dependency('threads'),
>>>>>  ]
>>>>>
>>>>> +# Internal components must use the libcamera_base_private dependency to enable
>>>>> +# the use of headers which must not be exposed to the libcamera public api.
>>>>> +libcamera_base_args = [ '-DLIBCAMERA_BASE_PRIVATE' ]
>>>>> +
>>>>>  libcamera_base_lib = shared_library('libcamera-base',
>>>>>                                      [libcamera_base_sources, libcamera_base_headers],
>>>>>                                      name_prefix : '',
>>>>>                                      install : true,
>>>>> +                                    cpp_args : libcamera_base_args,
>>>>>                                      include_directories : libcamera_includes,
>>>>>                                      dependencies : libcamera_base_deps)
>>>>>
>>>>> @@ -39,3 +44,6 @@ pkg_mod.generate(libcamera_base_lib,
>>>>>                   version : '1.0',
>>>>>                   description : 'Camera support base utility library',
>>>>>                   subdirs : 'libcamera')
>>>>> +
>>>>> +libcamera_base_private = declare_dependency(dependencies : libcamera_base,
>>>>> +                                            compile_args : libcamera_base_args)
>>>>> diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
>>>>> index 1f163cfe1225..64c7475f1a2e 100644
>>>>> --- a/src/libcamera/meson.build
>>>>> +++ b/src/libcamera/meson.build
>>>>> @@ -115,7 +115,7 @@ libcamera_deps = [
>>>>>      libgnutls,
>>>>>      liblttng,
>>>>>      libudev,
>>>>> -    libcamera_base,
>>>>> +    libcamera_base_private,
>>>>>  ]
>>>>>
>>>>>  # We add '/' to the build_rpath as a 'safe' path to act as a boolean flag.
>>>>> @@ -143,9 +143,15 @@ libcamera_dep = declare_dependency(sources : [
>>>>>                                         libcamera_generated_ipa_headers,
>>>>>                                     ],
>>>>>                                     include_directories : libcamera_includes,
>>>>> -                                   dependencies: libcamera_base,
>>>>> +                                   dependencies : libcamera_base,
>>>>>                                     link_with : libcamera)
>>>>>
>>>>> +# Internal dependancy for components and plugins which can use Private APIs
> 
> s/dependancy/dependency/
> s/Private/private/
> 
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> 
>>>>> +libcamera_private = declare_dependency(dependencies : [
>>>>> +                                           libcamera_dep,
>>>>> +                                           libcamera_base_private,
>>>>> +                                       ])
>>>>> +
>>>>>  pkg_mod = import('pkgconfig')
>>>>>  pkg_mod.generate(libcamera,
>>>>>                   libraries : libcamera_base_lib,
>>>>> diff --git a/src/libcamera/proxy/worker/meson.build b/src/libcamera/proxy/worker/meson.build
>>>>> index 28fe5f1fd6b2..70c8760a3d42 100644
>>>>> --- a/src/libcamera/proxy/worker/meson.build
>>>>> +++ b/src/libcamera/proxy/worker/meson.build
>>>>> @@ -21,7 +21,7 @@ foreach mojom : ipa_mojoms
>>>>>                         [worker, libcamera_generated_ipa_headers],
>>>>>                         install : true,
>>>>>                         install_dir : proxy_install_dir,
>>>>> -                       dependencies : libcamera_dep)
>>>>> +                       dependencies : libcamera_private)
>>>>>  endforeach
>>>>>
>>>>>  config_h.set('IPA_PROXY_DIR',
>>>>> diff --git a/src/v4l2/meson.build b/src/v4l2/meson.build
>>>>> index 0accac194be4..f78497b6799b 100644
>>>>> --- a/src/v4l2/meson.build
>>>>> +++ b/src/v4l2/meson.build
>>>>> @@ -31,5 +31,5 @@ v4l2_compat = shared_library('v4l2-compat',
>>>>>                               v4l2_compat_sources,
>>>>>                               name_prefix : '',
>>>>>                               install : true,
>>>>> -                             dependencies : [libcamera_dep, libdl],
>>>>> +                             dependencies : [libcamera_private, libdl],
>>>>>                               cpp_args : v4l2_compat_cpp_args)
>>>>> diff --git a/test/camera/meson.build b/test/camera/meson.build
>>>>> index 9cb95affffab..002a87b594e0 100644
>>>>> --- a/test/camera/meson.build
>>>>> +++ b/test/camera/meson.build
>>>>> @@ -12,7 +12,7 @@ camera_tests = [
>>>>>
>>>>>  foreach t : camera_tests
>>>>>      exe = executable(t[0], t[1],
>>>>> -                     dependencies : libcamera_dep,
>>>>> +                     dependencies : libcamera_private,
>>>>>                       link_with : test_libraries,
>>>>>                       include_directories : test_includes_internal)
>>>>>      test(t[0], exe, suite : 'camera', is_parallel : false)
>>>>> diff --git a/test/ipa/meson.build b/test/ipa/meson.build
>>>>> index e8a041b5bbd2..7938633e54ab 100644
>>>>> --- a/test/ipa/meson.build
>>>>> +++ b/test/ipa/meson.build
>>>>> @@ -7,7 +7,7 @@ ipa_test = [
>>>>>
>>>>>  foreach t : ipa_test
>>>>>      exe = executable(t[0], [t[1], libcamera_generated_ipa_headers],
>>>>> -                     dependencies : libcamera_dep,
>>>>> +                     dependencies : libcamera_private,
>>>>>                       link_with : [libipa, test_libraries],
>>>>>                       include_directories : [libipa_includes, test_includes_internal])
>>>>>
>>>>> diff --git a/test/ipc/meson.build b/test/ipc/meson.build
>>>>> index ad47b2feb718..2a6cd7fb8433 100644
>>>>> --- a/test/ipc/meson.build
>>>>> +++ b/test/ipc/meson.build
>>>>> @@ -7,7 +7,7 @@ ipc_tests = [
>>>>>
>>>>>  foreach t : ipc_tests
>>>>>      exe = executable(t[0], t[1],
>>>>> -                     dependencies : libcamera_dep,
>>>>> +                     dependencies : libcamera_private,
>>>>>                       link_with : test_libraries,
>>>>>                       include_directories : test_includes_internal)
>>>>>
>>>>> diff --git a/test/libtest/meson.build b/test/libtest/meson.build
>>>>> index 542335ea5e7c..351629f3ce73 100644
>>>>> --- a/test/libtest/meson.build
>>>>> +++ b/test/libtest/meson.build
>>>>> @@ -18,7 +18,7 @@ test_includes_internal = [
>>>>>  ]
>>>>>
>>>>>  libtest = static_library('libtest', libtest_sources,
>>>>> -                         dependencies : libcamera_dep,
>>>>> +                         dependencies : libcamera_private,
>>>>>                           include_directories : test_includes_internal)
>>>>>
>>>>>  test_libraries = [libtest]
>>>>> diff --git a/test/log/meson.build b/test/log/meson.build
>>>>> index 8cd664e04a00..ac87841a24e1 100644
>>>>> --- a/test/log/meson.build
>>>>> +++ b/test/log/meson.build
>>>>> @@ -7,7 +7,7 @@ log_test = [
>>>>>
>>>>>  foreach t : log_test
>>>>>      exe = executable(t[0], t[1],
>>>>> -                     dependencies : libcamera_dep,
>>>>> +                     dependencies : libcamera_private,
>>>>>                       link_with : test_libraries,
>>>>>                       include_directories : test_includes_internal)
>>>>>
>>>>> diff --git a/test/media_device/meson.build b/test/media_device/meson.build
>>>>> index 1dfcdd8bd744..83dfe8f11d2f 100644
>>>>> --- a/test/media_device/meson.build
>>>>> +++ b/test/media_device/meson.build
>>>>> @@ -11,12 +11,12 @@ media_device_tests = [
>>>>>  ]
>>>>>
>>>>>  lib_mdev_test = static_library('lib_mdev_test', lib_mdev_test_sources,
>>>>> -                               dependencies : libcamera_dep,
>>>>> +                               dependencies : libcamera_private,
>>>>>                                 include_directories : test_includes_internal)
>>>>>
>>>>>  foreach t : media_device_tests
>>>>>      exe = executable(t[0], t[1],
>>>>> -                     dependencies : libcamera_dep,
>>>>> +                     dependencies : libcamera_private,
>>>>>                       link_with : [test_libraries, lib_mdev_test],
>>>>>                       include_directories : test_includes_internal)
>>>>>
>>>>> diff --git a/test/meson.build b/test/meson.build
>>>>> index 045ad2a2d7c9..b8615e0fd3e6 100644
>>>>> --- a/test/meson.build
>>>>> +++ b/test/meson.build
>>>>> @@ -64,7 +64,7 @@ endforeach
>>>>>
>>>>>  foreach t : internal_tests
>>>>>      exe = executable(t[0], t[1],
>>>>> -                     dependencies : libcamera_dep,
>>>>> +                     dependencies : libcamera_private,
>>>>>                       link_with : test_libraries,
>>>>>                       include_directories : test_includes_internal)
>>>>>
>>>>> diff --git a/test/pipeline/ipu3/meson.build b/test/pipeline/ipu3/meson.build
>>>>> index d062ecd269f2..16701080ca2b 100644
>>>>> --- a/test/pipeline/ipu3/meson.build
>>>>> +++ b/test/pipeline/ipu3/meson.build
>>>>> @@ -6,7 +6,7 @@ ipu3_test = [
>>>>>
>>>>>  foreach t : ipu3_test
>>>>>      exe = executable(t[0], t[1],
>>>>> -                     dependencies : libcamera_dep,
>>>>> +                     dependencies : libcamera_private,
>>>>>                       link_with : test_libraries,
>>>>>                       include_directories : test_includes_internal)
>>>>>
>>>>> diff --git a/test/pipeline/rkisp1/meson.build b/test/pipeline/rkisp1/meson.build
>>>>> index ece147b054e4..364b5711a0f9 100644
>>>>> --- a/test/pipeline/rkisp1/meson.build
>>>>> +++ b/test/pipeline/rkisp1/meson.build
>>>>> @@ -6,7 +6,7 @@ rkisp1_test = [
>>>>>
>>>>>  foreach t : rkisp1_test
>>>>>      exe = executable(t[0], t[1],
>>>>> -                     dependencies : libcamera_dep,
>>>>> +                     dependencies : libcamera_private,
>>>>>                       link_with : test_libraries,
>>>>>                       include_directories : test_includes_internal)
>>>>>
>>>>> diff --git a/test/process/meson.build b/test/process/meson.build
>>>>> index d2272d509db3..af86b277db63 100644
>>>>> --- a/test/process/meson.build
>>>>> +++ b/test/process/meson.build
>>>>> @@ -6,7 +6,7 @@ process_tests = [
>>>>>
>>>>>  foreach t : process_tests
>>>>>      exe = executable(t[0], t[1],
>>>>> -                     dependencies : libcamera_dep,
>>>>> +                     dependencies : libcamera_private,
>>>>>                       link_with : test_libraries,
>>>>>                       include_directories : test_includes_internal)
>>>>>
>>>>> diff --git a/test/serialization/generated_serializer/meson.build b/test/serialization/generated_serializer/meson.build
>>>>> index 2460e0b114b3..9fb9cd1db968 100644
>>>>> --- a/test/serialization/generated_serializer/meson.build
>>>>> +++ b/test/serialization/generated_serializer/meson.build
>>>>> @@ -8,7 +8,7 @@ exe = executable('generated_serializer_test',
>>>>>                       generated_test_header,
>>>>>                       generated_test_serializer,
>>>>>                   ],
>>>>> -                 dependencies : libcamera_dep,
>>>>> +                 dependencies : libcamera_private,
>>>>>                   link_with : test_libraries,
>>>>>                   include_directories : [
>>>>>                       test_includes_internal,
>>>>> diff --git a/test/serialization/meson.build b/test/serialization/meson.build
>>>>> index 60ebf3255b28..5446e4907f33 100644
>>>>> --- a/test/serialization/meson.build
>>>>> +++ b/test/serialization/meson.build
>>>>> @@ -9,7 +9,7 @@ serialization_tests = [
>>>>>
>>>>>  foreach t : serialization_tests
>>>>>      exe = executable(t[0], [t[1], 'serialization_test.cpp'],
>>>>> -                     dependencies : libcamera_dep,
>>>>> +                     dependencies : libcamera_private,
>>>>>                       link_with : test_libraries,
>>>>>                       include_directories : test_includes_internal)
>>>>>      test(t[0], exe, suite : 'serialization', is_parallel : true)
>>>>> diff --git a/test/v4l2_subdevice/meson.build b/test/v4l2_subdevice/meson.build
>>>>> index 40d39766af9b..d82be3c60b75 100644
>>>>> --- a/test/v4l2_subdevice/meson.build
>>>>> +++ b/test/v4l2_subdevice/meson.build
>>>>> @@ -7,7 +7,7 @@ v4l2_subdevice_tests = [
>>>>>
>>>>>  foreach t : v4l2_subdevice_tests
>>>>>      exe = executable(t[0], [t[1], 'v4l2_subdevice_test.cpp'],
>>>>> -        dependencies : libcamera_dep,
>>>>> +        dependencies : libcamera_private,
>>>>>          link_with : test_libraries,
>>>>>          include_directories : test_includes_internal)
>>>>>      test(t[0], exe, suite : 'v4l2_subdevice', is_parallel : false)
>>>>> diff --git a/test/v4l2_videodevice/meson.build b/test/v4l2_videodevice/meson.build
>>>>> index e733518c0185..643f82edce5e 100644
>>>>> --- a/test/v4l2_videodevice/meson.build
>>>>> +++ b/test/v4l2_videodevice/meson.build
>>>>> @@ -16,7 +16,7 @@ v4l2_videodevice_tests = [
>>>>>
>>>>>  foreach t : v4l2_videodevice_tests
>>>>>      exe = executable(t[0], [t[1], 'v4l2_videodevice_test.cpp'],
>>>>> -                     dependencies : libcamera_dep,
>>>>> +                     dependencies : libcamera_private,
>>>>>                       link_with : test_libraries,
>>>>>                       include_directories : test_includes_internal)
>>>>>      test(t[0], exe, suite : 'v4l2_videodevice', is_parallel : false)
>
Hirokazu Honda June 28, 2021, 4:48 a.m. UTC | #6
Thanks Kieran and Paul,

On Fri, Jun 25, 2021 at 6:34 PM Kieran Bingham
<kieran.bingham@ideasonboard.com> wrote:
>
> Hi Paul, Hiro,
>
> On 25/06/2021 09:40, paul.elder@ideasonboard.com wrote:
> > Hi Hiro,
> >
> > On Fri, Jun 25, 2021 at 01:12:57PM +0900, Hirokazu Honda wrote:
> >> Hi Kieran, thank you for the patch.
> >>
> >> On Fri, Jun 25, 2021 at 10:35 AM Kieran Bingham
> >> <kieran.bingham@ideasonboard.com> wrote:
> >>>
> >>> Headers which must not be exposed as part of the public libcamera API
> >>> can include base/private.h.
> >>>
> >>> Any interface which includes the private.h header will only be able to
> >>> build if the libcamera_private dependency is used (or the
> >>> libcamera_base_private dependency directly)
> >>>
> >>
> >> I couldn't understand well which one of the four dependencies
> >> (libcamera_private, libcamera_base, libcamera_dep,
> >> libcamera_base_private) should be used in a specific target.
> >> Would you mind describing the rule of using these dependencies?
> >
> > My understanding is that:
> >
> > - libcamera_base is everything in base
> > - libcamera_base_private is libcamera_base + the macro required for
> >   using the private headers
>
> Correct.
>
> > - libcamera_dep is public + private, for things like IPAs and internal
> >   components (but doesn't include the macro for private headers)
>
> - libcamera_dep is the existing, widely used dependency for linking
> against libcamera within the meson project.
>
> It indeed links against all things public and private currently, and
> anything which references this could use any part of the libcamera library.
>
> (However after this patch, any inclusion of a header without defining
> 'LIBCAMERA_BASE_PRIVATE' will hit a compile break)
>
>
> > - libcamera_private is libcamera_dep + the macro
>
> Correct - this allows a component to link against libcamera, whilst also
> defining that it is explicitly allowed to access 'private' components,
> which should not leak to the public APIs.
>
> >
> > Kieran, is this correct? (it is a bit hard to keep track of...)
>
> I've added
>
>
> Build targets which are intended to use the private API's will use the
> libcamera_private to handle the automatic definition of the inclusion
> guard.
>
>
> It's hard to go into more detail on this in this commit, as it's about
> to get changed in the up coming patches, and I don't want someone to
> read this and say "Oh I should use the libcamera_dep for my public
> component, as ... it will very soon become libcamera_public"
>

It would be great if the document about the targets is added later.

Reviewed-by: Hirokazu Honda <hiroh@chromium.org>

>
>
> >
> >
> > Paul
> >
> >>
> >>> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
> >>> ---
> >>>  include/libcamera/base/event_dispatcher.h     |  2 ++
> >>>  .../libcamera/base/event_dispatcher_poll.h    |  2 ++
> >>>  include/libcamera/base/event_notifier.h       |  1 +
> >>>  include/libcamera/base/file.h                 |  1 +
> >>>  include/libcamera/base/log.h                  |  1 +
> >>>  include/libcamera/base/meson.build            |  1 +
> >>>  include/libcamera/base/private.h              | 22 +++++++++++++++++++
> >>>  include/libcamera/base/semaphore.h            |  1 +
> >>>  include/libcamera/base/thread.h               |  1 +
> >>>  include/libcamera/base/timer.h                |  1 +
> >>>  include/libcamera/base/utils.h                |  2 ++
> >>>  src/android/meson.build                       |  2 +-
> >>>  src/ipa/ipu3/meson.build                      |  2 +-
> >>>  src/ipa/libipa/meson.build                    |  2 +-
> >>>  src/ipa/raspberrypi/meson.build               |  2 +-
> >>>  src/ipa/rkisp1/meson.build                    |  2 +-
> >>>  src/ipa/vimc/meson.build                      |  2 +-
> >>>  src/libcamera/base/meson.build                |  8 +++++++
> >>>  src/libcamera/meson.build                     | 10 +++++++--
> >>>  src/libcamera/proxy/worker/meson.build        |  2 +-
> >>>  src/v4l2/meson.build                          |  2 +-
> >>>  test/camera/meson.build                       |  2 +-
> >>>  test/ipa/meson.build                          |  2 +-
> >>>  test/ipc/meson.build                          |  2 +-
> >>>  test/libtest/meson.build                      |  2 +-
> >>>  test/log/meson.build                          |  2 +-
> >>>  test/media_device/meson.build                 |  4 ++--
> >>>  test/meson.build                              |  2 +-
> >>>  test/pipeline/ipu3/meson.build                |  2 +-
> >>>  test/pipeline/rkisp1/meson.build              |  2 +-
> >>>  test/process/meson.build                      |  2 +-
> >>>  .../generated_serializer/meson.build          |  2 +-
> >>>  test/serialization/meson.build                |  2 +-
> >>>  test/v4l2_subdevice/meson.build               |  2 +-
> >>>  test/v4l2_videodevice/meson.build             |  2 +-
> >>>  35 files changed, 74 insertions(+), 25 deletions(-)
> >>>  create mode 100644 include/libcamera/base/private.h
> >>>
> >>> diff --git a/include/libcamera/base/event_dispatcher.h b/include/libcamera/base/event_dispatcher.h
> >>> index 045df27fff16..825af7a33919 100644
> >>> --- a/include/libcamera/base/event_dispatcher.h
> >>> +++ b/include/libcamera/base/event_dispatcher.h
> >>> @@ -9,6 +9,8 @@
> >>>
> >>>  #include <vector>
> >>>
> >>> +#include <libcamera/base/private.h>
> >>> +
> >>>  namespace libcamera {
> >>>
> >>>  class EventNotifier;
> >>> diff --git a/include/libcamera/base/event_dispatcher_poll.h b/include/libcamera/base/event_dispatcher_poll.h
> >>> index ae2a3f04e4b9..88835902980c 100644
> >>> --- a/include/libcamera/base/event_dispatcher_poll.h
> >>> +++ b/include/libcamera/base/event_dispatcher_poll.h
> >>> @@ -13,6 +13,8 @@
> >>>
> >>>  #include <libcamera/base/event_dispatcher.h>
> >>>
> >>> +#include <libcamera/base/private.h>
> >>> +
> >>>  struct pollfd;
> >>>
> >>>  namespace libcamera {
> >>> diff --git a/include/libcamera/base/event_notifier.h b/include/libcamera/base/event_notifier.h
> >>> index 8a6419f23004..6bb4e5143aa6 100644
> >>> --- a/include/libcamera/base/event_notifier.h
> >>> +++ b/include/libcamera/base/event_notifier.h
> >>> @@ -8,6 +8,7 @@
> >>>  #define __LIBCAMERA_INTERNAL_EVENT_NOTIFIER_H__
> >>>
> >>>  #include <libcamera/base/object.h>
> >>> +#include <libcamera/base/private.h>
> >>>  #include <libcamera/base/signal.h>
> >>>
> >>>  namespace libcamera {
> >>> diff --git a/include/libcamera/base/file.h b/include/libcamera/base/file.h
> >>> index e8e4b76e1a4e..cecbb254591f 100644
> >>> --- a/include/libcamera/base/file.h
> >>> +++ b/include/libcamera/base/file.h
> >>> @@ -12,6 +12,7 @@
> >>>  #include <sys/types.h>
> >>>
> >>>  #include <libcamera/base/class.h>
> >>> +#include <libcamera/base/private.h>
> >>>
> >>>  #include <libcamera/span.h>
> >>>
> >>> diff --git a/include/libcamera/base/log.h b/include/libcamera/base/log.h
> >>> index b93c947ae7db..70582cd47902 100644
> >>> --- a/include/libcamera/base/log.h
> >>> +++ b/include/libcamera/base/log.h
> >>> @@ -11,6 +11,7 @@
> >>>  #include <sstream>
> >>>
> >>>  #include <libcamera/base/class.h>
> >>> +#include <libcamera/base/private.h>
> >>>  #include <libcamera/base/utils.h>
> >>>
> >>>  namespace libcamera {
> >>> diff --git a/include/libcamera/base/meson.build b/include/libcamera/base/meson.build
> >>> index 83c664affc88..aaac324d7149 100644
> >>> --- a/include/libcamera/base/meson.build
> >>> +++ b/include/libcamera/base/meson.build
> >>> @@ -12,6 +12,7 @@ libcamera_base_headers = files([
> >>>      'log.h',
> >>>      'message.h',
> >>>      'object.h',
> >>> +    'private.h',
> >>>      'semaphore.h',
> >>>      'signal.h',
> >>>      'thread.h',
> >>> diff --git a/include/libcamera/base/private.h b/include/libcamera/base/private.h
> >>> new file mode 100644
> >>> index 000000000000..b54ad076688e
> >>> --- /dev/null
> >>> +++ b/include/libcamera/base/private.h
> >>> @@ -0,0 +1,22 @@
> >>> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> >>> +/*
> >>> + * Copyright (C) 2021, Google Inc.
> >>> + *
> >>> + * private.h - Private Header Validation
> >>> + *
> >>> + * A selection of internal libcamera headers are installed as part
> >>> + * of the libcamera package to allow sharing of a select subset of
> >>> + * internal functionality with IPA module developers only.
> >>> + *
> >>> + * This functionality is not considered part of the public libcamera
> >>> + * API, and can therefore potentially face ABI instabilities which
> >>> + * should not be exposed to applications. IPA modules however should be
> >>> + * versioned and more closely matched to the libcamera installation.
> >>> + *
> >>> + * Components which include this file can not be included in any file
> >>> + * which forms part of the libcamera API.
> >>> + */
> >>> +
> >>> +#ifndef LIBCAMERA_BASE_PRIVATE
> >>> +#error "Private headers must not be included in the libcamera API"
> >>> +#endif
> >>> diff --git a/include/libcamera/base/semaphore.h b/include/libcamera/base/semaphore.h
> >>> index c8e62e3ee68b..d8146eb8060b 100644
> >>> --- a/include/libcamera/base/semaphore.h
> >>> +++ b/include/libcamera/base/semaphore.h
> >>> @@ -9,6 +9,7 @@
> >>>
> >>>  #include <condition_variable>
> >>>
> >>> +#include <libcamera/base/private.h>
> >>>  #include <libcamera/base/thread.h>
> >>>
> >>>  namespace libcamera {
> >>> diff --git a/include/libcamera/base/thread.h b/include/libcamera/base/thread.h
> >>> index 2ed18d49c978..b30ed12715a2 100644
> >>> --- a/include/libcamera/base/thread.h
> >>> +++ b/include/libcamera/base/thread.h
> >>> @@ -13,6 +13,7 @@
> >>>  #include <thread>
> >>>
> >>>  #include <libcamera/base/message.h>
> >>> +#include <libcamera/base/private.h>
> >>>  #include <libcamera/base/signal.h>
> >>>  #include <libcamera/base/utils.h>
> >>>
> >>> diff --git a/include/libcamera/base/timer.h b/include/libcamera/base/timer.h
> >>> index e79e85f1ef0d..f762e8767d97 100644
> >>> --- a/include/libcamera/base/timer.h
> >>> +++ b/include/libcamera/base/timer.h
> >>> @@ -11,6 +11,7 @@
> >>>  #include <stdint.h>
> >>>
> >>>  #include <libcamera/base/object.h>
> >>> +#include <libcamera/base/private.h>
> >>>  #include <libcamera/base/signal.h>
> >>>
> >>>  namespace libcamera {
> >>> diff --git a/include/libcamera/base/utils.h b/include/libcamera/base/utils.h
> >>> index d1aaff65211a..07685045aa05 100644
> >>> --- a/include/libcamera/base/utils.h
> >>> +++ b/include/libcamera/base/utils.h
> >>> @@ -19,6 +19,8 @@
> >>>  #include <utility>
> >>>  #include <vector>
> >>>
> >>> +#include <libcamera/base/private.h>
> >>> +
> >>>  #ifndef __DOXYGEN__
> >>>
> >>>  /* uClibc and uClibc-ng don't provide O_TMPFILE */
> >>> diff --git a/src/android/meson.build b/src/android/meson.build
> >>> index bd58ef964c2a..7d1e7e85f16e 100644
> >>> --- a/src/android/meson.build
> >>> +++ b/src/android/meson.build
> >>> @@ -4,7 +4,7 @@ android_deps = [
> >>>      dependency('libexif', required : get_option('android')),
> >>>      dependency('libjpeg', required : get_option('android')),
> >>>      dependency('yaml-0.1', required : get_option('android')),
> >>> -    libcamera_dep,
> >>> +    libcamera_private,
> >>>  ]
> >>>
> >>>  android_enabled = true
> >>> diff --git a/src/ipa/ipu3/meson.build b/src/ipa/ipu3/meson.build
> >>> index 0d843846acde..b63641908710 100644
> >>> --- a/src/ipa/ipu3/meson.build
> >>> +++ b/src/ipa/ipu3/meson.build
> >>> @@ -12,7 +12,7 @@ mod = shared_module(ipa_name,
> >>>                      [ipu3_ipa_sources, libcamera_generated_ipa_headers],
> >>>                      name_prefix : '',
> >>>                      include_directories : [ipa_includes, libipa_includes],
> >>> -                    dependencies : libcamera_dep,
> >>> +                    dependencies : libcamera_private,
> >>>                      link_with : libipa,
> >>>                      install : true,
> >>>                      install_dir : ipa_install_dir)
> >>> diff --git a/src/ipa/libipa/meson.build b/src/ipa/libipa/meson.build
> >>> index 038fc49060ef..ca541a5aafd7 100644
> >>> --- a/src/ipa/libipa/meson.build
> >>> +++ b/src/ipa/libipa/meson.build
> >>> @@ -14,4 +14,4 @@ libipa_includes = include_directories('..')
> >>>
> >>>  libipa = static_library('ipa', [libipa_sources, libipa_headers],
> >>>                          include_directories : ipa_includes,
> >>> -                        dependencies : libcamera_dep)
> >>> +                        dependencies : libcamera_private)
> >>> diff --git a/src/ipa/raspberrypi/meson.build b/src/ipa/raspberrypi/meson.build
> >>> index 230356d3ce3a..d7203aa042cd 100644
> >>> --- a/src/ipa/raspberrypi/meson.build
> >>> +++ b/src/ipa/raspberrypi/meson.build
> >>> @@ -3,7 +3,7 @@
> >>>  ipa_name = 'ipa_rpi'
> >>>
> >>>  rpi_ipa_deps = [
> >>> -    libcamera_dep,
> >>> +    libcamera_private,
> >>>      dependency('boost'),
> >>>      libatomic,
> >>>  ]
> >>> diff --git a/src/ipa/rkisp1/meson.build b/src/ipa/rkisp1/meson.build
> >>> index 1a1c71591039..f76b37f5af50 100644
> >>> --- a/src/ipa/rkisp1/meson.build
> >>> +++ b/src/ipa/rkisp1/meson.build
> >>> @@ -6,7 +6,7 @@ mod = shared_module(ipa_name,
> >>>                      ['rkisp1.cpp', libcamera_generated_ipa_headers],
> >>>                      name_prefix : '',
> >>>                      include_directories : [ipa_includes, libipa_includes],
> >>> -                    dependencies : libcamera_dep,
> >>> +                    dependencies : libcamera_private,
> >>>                      link_with : libipa,
> >>>                      install : true,
> >>>                      install_dir : ipa_install_dir)
> >>> diff --git a/src/ipa/vimc/meson.build b/src/ipa/vimc/meson.build
> >>> index a35825ae25a6..ecbeee136451 100644
> >>> --- a/src/ipa/vimc/meson.build
> >>> +++ b/src/ipa/vimc/meson.build
> >>> @@ -6,7 +6,7 @@ mod = shared_module(ipa_name,
> >>>                      ['vimc.cpp', libcamera_generated_ipa_headers],
> >>>                      name_prefix : '',
> >>>                      include_directories : [ipa_includes, libipa_includes],
> >>> -                    dependencies : libcamera_dep,
> >>> +                    dependencies : libcamera_private,
> >>>                      link_with : libipa,
> >>>                      install : true,
> >>>                      install_dir : ipa_install_dir)
> >>> diff --git a/src/libcamera/base/meson.build b/src/libcamera/base/meson.build
> >>> index a8b04cfc8a5f..871721571e98 100644
> >>> --- a/src/libcamera/base/meson.build
> >>> +++ b/src/libcamera/base/meson.build
> >>> @@ -21,10 +21,15 @@ libcamera_base_deps = [
> >>>      dependency('threads'),
> >>>  ]
> >>>
> >>> +# Internal components must use the libcamera_base_private dependency to enable
> >>> +# the use of headers which must not be exposed to the libcamera public api.
> >>> +libcamera_base_args = [ '-DLIBCAMERA_BASE_PRIVATE' ]
> >>> +
> >>>  libcamera_base_lib = shared_library('libcamera-base',
> >>>                                      [libcamera_base_sources, libcamera_base_headers],
> >>>                                      name_prefix : '',
> >>>                                      install : true,
> >>> +                                    cpp_args : libcamera_base_args,
> >>>                                      include_directories : libcamera_includes,
> >>>                                      dependencies : libcamera_base_deps)
> >>>
> >>> @@ -39,3 +44,6 @@ pkg_mod.generate(libcamera_base_lib,
> >>>                   version : '1.0',
> >>>                   description : 'Camera support base utility library',
> >>>                   subdirs : 'libcamera')
> >>> +
> >>> +libcamera_base_private = declare_dependency(dependencies : libcamera_base,
> >>> +                                            compile_args : libcamera_base_args)
> >>> diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
> >>> index 1f163cfe1225..64c7475f1a2e 100644
> >>> --- a/src/libcamera/meson.build
> >>> +++ b/src/libcamera/meson.build
> >>> @@ -115,7 +115,7 @@ libcamera_deps = [
> >>>      libgnutls,
> >>>      liblttng,
> >>>      libudev,
> >>> -    libcamera_base,
> >>> +    libcamera_base_private,
> >>>  ]
> >>>
> >>>  # We add '/' to the build_rpath as a 'safe' path to act as a boolean flag.
> >>> @@ -143,9 +143,15 @@ libcamera_dep = declare_dependency(sources : [
> >>>                                         libcamera_generated_ipa_headers,
> >>>                                     ],
> >>>                                     include_directories : libcamera_includes,
> >>> -                                   dependencies: libcamera_base,
> >>> +                                   dependencies : libcamera_base,
> >>>                                     link_with : libcamera)
> >>>
> >>> +# Internal dependancy for components and plugins which can use Private APIs
> >>> +libcamera_private = declare_dependency(dependencies : [
> >>> +                                           libcamera_dep,
> >>> +                                           libcamera_base_private,
> >>> +                                       ])
> >>> +
> >>>  pkg_mod = import('pkgconfig')
> >>>  pkg_mod.generate(libcamera,
> >>>                   libraries : libcamera_base_lib,
> >>> diff --git a/src/libcamera/proxy/worker/meson.build b/src/libcamera/proxy/worker/meson.build
> >>> index 28fe5f1fd6b2..70c8760a3d42 100644
> >>> --- a/src/libcamera/proxy/worker/meson.build
> >>> +++ b/src/libcamera/proxy/worker/meson.build
> >>> @@ -21,7 +21,7 @@ foreach mojom : ipa_mojoms
> >>>                         [worker, libcamera_generated_ipa_headers],
> >>>                         install : true,
> >>>                         install_dir : proxy_install_dir,
> >>> -                       dependencies : libcamera_dep)
> >>> +                       dependencies : libcamera_private)
> >>>  endforeach
> >>>
> >>>  config_h.set('IPA_PROXY_DIR',
> >>> diff --git a/src/v4l2/meson.build b/src/v4l2/meson.build
> >>> index 0accac194be4..f78497b6799b 100644
> >>> --- a/src/v4l2/meson.build
> >>> +++ b/src/v4l2/meson.build
> >>> @@ -31,5 +31,5 @@ v4l2_compat = shared_library('v4l2-compat',
> >>>                               v4l2_compat_sources,
> >>>                               name_prefix : '',
> >>>                               install : true,
> >>> -                             dependencies : [libcamera_dep, libdl],
> >>> +                             dependencies : [libcamera_private, libdl],
> >>>                               cpp_args : v4l2_compat_cpp_args)
> >>> diff --git a/test/camera/meson.build b/test/camera/meson.build
> >>> index 9cb95affffab..002a87b594e0 100644
> >>> --- a/test/camera/meson.build
> >>> +++ b/test/camera/meson.build
> >>> @@ -12,7 +12,7 @@ camera_tests = [
> >>>
> >>>  foreach t : camera_tests
> >>>      exe = executable(t[0], t[1],
> >>> -                     dependencies : libcamera_dep,
> >>> +                     dependencies : libcamera_private,
> >>>                       link_with : test_libraries,
> >>>                       include_directories : test_includes_internal)
> >>>      test(t[0], exe, suite : 'camera', is_parallel : false)
> >>> diff --git a/test/ipa/meson.build b/test/ipa/meson.build
> >>> index e8a041b5bbd2..7938633e54ab 100644
> >>> --- a/test/ipa/meson.build
> >>> +++ b/test/ipa/meson.build
> >>> @@ -7,7 +7,7 @@ ipa_test = [
> >>>
> >>>  foreach t : ipa_test
> >>>      exe = executable(t[0], [t[1], libcamera_generated_ipa_headers],
> >>> -                     dependencies : libcamera_dep,
> >>> +                     dependencies : libcamera_private,
> >>>                       link_with : [libipa, test_libraries],
> >>>                       include_directories : [libipa_includes, test_includes_internal])
> >>>
> >>> diff --git a/test/ipc/meson.build b/test/ipc/meson.build
> >>> index ad47b2feb718..2a6cd7fb8433 100644
> >>> --- a/test/ipc/meson.build
> >>> +++ b/test/ipc/meson.build
> >>> @@ -7,7 +7,7 @@ ipc_tests = [
> >>>
> >>>  foreach t : ipc_tests
> >>>      exe = executable(t[0], t[1],
> >>> -                     dependencies : libcamera_dep,
> >>> +                     dependencies : libcamera_private,
> >>>                       link_with : test_libraries,
> >>>                       include_directories : test_includes_internal)
> >>>
> >>> diff --git a/test/libtest/meson.build b/test/libtest/meson.build
> >>> index 542335ea5e7c..351629f3ce73 100644
> >>> --- a/test/libtest/meson.build
> >>> +++ b/test/libtest/meson.build
> >>> @@ -18,7 +18,7 @@ test_includes_internal = [
> >>>  ]
> >>>
> >>>  libtest = static_library('libtest', libtest_sources,
> >>> -                         dependencies : libcamera_dep,
> >>> +                         dependencies : libcamera_private,
> >>>                           include_directories : test_includes_internal)
> >>>
> >>>  test_libraries = [libtest]
> >>> diff --git a/test/log/meson.build b/test/log/meson.build
> >>> index 8cd664e04a00..ac87841a24e1 100644
> >>> --- a/test/log/meson.build
> >>> +++ b/test/log/meson.build
> >>> @@ -7,7 +7,7 @@ log_test = [
> >>>
> >>>  foreach t : log_test
> >>>      exe = executable(t[0], t[1],
> >>> -                     dependencies : libcamera_dep,
> >>> +                     dependencies : libcamera_private,
> >>>                       link_with : test_libraries,
> >>>                       include_directories : test_includes_internal)
> >>>
> >>> diff --git a/test/media_device/meson.build b/test/media_device/meson.build
> >>> index 1dfcdd8bd744..83dfe8f11d2f 100644
> >>> --- a/test/media_device/meson.build
> >>> +++ b/test/media_device/meson.build
> >>> @@ -11,12 +11,12 @@ media_device_tests = [
> >>>  ]
> >>>
> >>>  lib_mdev_test = static_library('lib_mdev_test', lib_mdev_test_sources,
> >>> -                               dependencies : libcamera_dep,
> >>> +                               dependencies : libcamera_private,
> >>>                                 include_directories : test_includes_internal)
> >>>
> >>>  foreach t : media_device_tests
> >>>      exe = executable(t[0], t[1],
> >>> -                     dependencies : libcamera_dep,
> >>> +                     dependencies : libcamera_private,
> >>>                       link_with : [test_libraries, lib_mdev_test],
> >>>                       include_directories : test_includes_internal)
> >>>
> >>> diff --git a/test/meson.build b/test/meson.build
> >>> index 045ad2a2d7c9..b8615e0fd3e6 100644
> >>> --- a/test/meson.build
> >>> +++ b/test/meson.build
> >>> @@ -64,7 +64,7 @@ endforeach
> >>>
> >>>  foreach t : internal_tests
> >>>      exe = executable(t[0], t[1],
> >>> -                     dependencies : libcamera_dep,
> >>> +                     dependencies : libcamera_private,
> >>>                       link_with : test_libraries,
> >>>                       include_directories : test_includes_internal)
> >>>
> >>> diff --git a/test/pipeline/ipu3/meson.build b/test/pipeline/ipu3/meson.build
> >>> index d062ecd269f2..16701080ca2b 100644
> >>> --- a/test/pipeline/ipu3/meson.build
> >>> +++ b/test/pipeline/ipu3/meson.build
> >>> @@ -6,7 +6,7 @@ ipu3_test = [
> >>>
> >>>  foreach t : ipu3_test
> >>>      exe = executable(t[0], t[1],
> >>> -                     dependencies : libcamera_dep,
> >>> +                     dependencies : libcamera_private,
> >>>                       link_with : test_libraries,
> >>>                       include_directories : test_includes_internal)
> >>>
> >>> diff --git a/test/pipeline/rkisp1/meson.build b/test/pipeline/rkisp1/meson.build
> >>> index ece147b054e4..364b5711a0f9 100644
> >>> --- a/test/pipeline/rkisp1/meson.build
> >>> +++ b/test/pipeline/rkisp1/meson.build
> >>> @@ -6,7 +6,7 @@ rkisp1_test = [
> >>>
> >>>  foreach t : rkisp1_test
> >>>      exe = executable(t[0], t[1],
> >>> -                     dependencies : libcamera_dep,
> >>> +                     dependencies : libcamera_private,
> >>>                       link_with : test_libraries,
> >>>                       include_directories : test_includes_internal)
> >>>
> >>> diff --git a/test/process/meson.build b/test/process/meson.build
> >>> index d2272d509db3..af86b277db63 100644
> >>> --- a/test/process/meson.build
> >>> +++ b/test/process/meson.build
> >>> @@ -6,7 +6,7 @@ process_tests = [
> >>>
> >>>  foreach t : process_tests
> >>>      exe = executable(t[0], t[1],
> >>> -                     dependencies : libcamera_dep,
> >>> +                     dependencies : libcamera_private,
> >>>                       link_with : test_libraries,
> >>>                       include_directories : test_includes_internal)
> >>>
> >>> diff --git a/test/serialization/generated_serializer/meson.build b/test/serialization/generated_serializer/meson.build
> >>> index 2460e0b114b3..9fb9cd1db968 100644
> >>> --- a/test/serialization/generated_serializer/meson.build
> >>> +++ b/test/serialization/generated_serializer/meson.build
> >>> @@ -8,7 +8,7 @@ exe = executable('generated_serializer_test',
> >>>                       generated_test_header,
> >>>                       generated_test_serializer,
> >>>                   ],
> >>> -                 dependencies : libcamera_dep,
> >>> +                 dependencies : libcamera_private,
> >>>                   link_with : test_libraries,
> >>>                   include_directories : [
> >>>                       test_includes_internal,
> >>> diff --git a/test/serialization/meson.build b/test/serialization/meson.build
> >>> index 60ebf3255b28..5446e4907f33 100644
> >>> --- a/test/serialization/meson.build
> >>> +++ b/test/serialization/meson.build
> >>> @@ -9,7 +9,7 @@ serialization_tests = [
> >>>
> >>>  foreach t : serialization_tests
> >>>      exe = executable(t[0], [t[1], 'serialization_test.cpp'],
> >>> -                     dependencies : libcamera_dep,
> >>> +                     dependencies : libcamera_private,
> >>>                       link_with : test_libraries,
> >>>                       include_directories : test_includes_internal)
> >>>      test(t[0], exe, suite : 'serialization', is_parallel : true)
> >>> diff --git a/test/v4l2_subdevice/meson.build b/test/v4l2_subdevice/meson.build
> >>> index 40d39766af9b..d82be3c60b75 100644
> >>> --- a/test/v4l2_subdevice/meson.build
> >>> +++ b/test/v4l2_subdevice/meson.build
> >>> @@ -7,7 +7,7 @@ v4l2_subdevice_tests = [
> >>>
> >>>  foreach t : v4l2_subdevice_tests
> >>>      exe = executable(t[0], [t[1], 'v4l2_subdevice_test.cpp'],
> >>> -        dependencies : libcamera_dep,
> >>> +        dependencies : libcamera_private,
> >>>          link_with : test_libraries,
> >>>          include_directories : test_includes_internal)
> >>>      test(t[0], exe, suite : 'v4l2_subdevice', is_parallel : false)
> >>> diff --git a/test/v4l2_videodevice/meson.build b/test/v4l2_videodevice/meson.build
> >>> index e733518c0185..643f82edce5e 100644
> >>> --- a/test/v4l2_videodevice/meson.build
> >>> +++ b/test/v4l2_videodevice/meson.build
> >>> @@ -16,7 +16,7 @@ v4l2_videodevice_tests = [
> >>>
> >>>  foreach t : v4l2_videodevice_tests
> >>>      exe = executable(t[0], [t[1], 'v4l2_videodevice_test.cpp'],
> >>> -                     dependencies : libcamera_dep,
> >>> +                     dependencies : libcamera_private,
> >>>                       link_with : test_libraries,
> >>>                       include_directories : test_includes_internal)
> >>>      test(t[0], exe, suite : 'v4l2_videodevice', is_parallel : false)
> >>> --
> >>> 2.30.2
> >>>
Kieran Bingham June 28, 2021, 8:31 a.m. UTC | #7
Hi Hiro,

On 28/06/2021 05:48, Hirokazu Honda wrote:
> Thanks Kieran and Paul,
> 
> On Fri, Jun 25, 2021 at 6:34 PM Kieran Bingham
> <kieran.bingham@ideasonboard.com> wrote:
>>
>> Hi Paul, Hiro,
>>
>> On 25/06/2021 09:40, paul.elder@ideasonboard.com wrote:
>>> Hi Hiro,
>>>
>>> On Fri, Jun 25, 2021 at 01:12:57PM +0900, Hirokazu Honda wrote:
>>>> Hi Kieran, thank you for the patch.
>>>>
>>>> On Fri, Jun 25, 2021 at 10:35 AM Kieran Bingham
>>>> <kieran.bingham@ideasonboard.com> wrote:
>>>>>
>>>>> Headers which must not be exposed as part of the public libcamera API
>>>>> can include base/private.h.
>>>>>
>>>>> Any interface which includes the private.h header will only be able to
>>>>> build if the libcamera_private dependency is used (or the
>>>>> libcamera_base_private dependency directly)
>>>>>
>>>>
>>>> I couldn't understand well which one of the four dependencies
>>>> (libcamera_private, libcamera_base, libcamera_dep,
>>>> libcamera_base_private) should be used in a specific target.
>>>> Would you mind describing the rule of using these dependencies?
>>>
>>> My understanding is that:
>>>
>>> - libcamera_base is everything in base
>>> - libcamera_base_private is libcamera_base + the macro required for
>>>   using the private headers
>>
>> Correct.
>>
>>> - libcamera_dep is public + private, for things like IPAs and internal
>>>   components (but doesn't include the macro for private headers)
>>
>> - libcamera_dep is the existing, widely used dependency for linking
>> against libcamera within the meson project.
>>
>> It indeed links against all things public and private currently, and
>> anything which references this could use any part of the libcamera library.
>>
>> (However after this patch, any inclusion of a header without defining
>> 'LIBCAMERA_BASE_PRIVATE' will hit a compile break)
>>
>>
>>> - libcamera_private is libcamera_dep + the macro
>>
>> Correct - this allows a component to link against libcamera, whilst also
>> defining that it is explicitly allowed to access 'private' components,
>> which should not leak to the public APIs.
>>
>>>
>>> Kieran, is this correct? (it is a bit hard to keep track of...)
>>
>> I've added
>>
>>
>> Build targets which are intended to use the private API's will use the
>> libcamera_private to handle the automatic definition of the inclusion
>> guard.
>>
>>
>> It's hard to go into more detail on this in this commit, as it's about
>> to get changed in the up coming patches, and I don't want someone to
>> read this and say "Oh I should use the libcamera_dep for my public
>> component, as ... it will very soon become libcamera_public"
>>
> 
> It would be great if the document about the targets is added later.
> 

Agreed, I'll add something.

> Reviewed-by: Hirokazu Honda <hiroh@chromium.org>

Thank you, but the series is already merged, I pushed it on Friday.

> 
>>
>>
>>>
>>>
>>> Paul
>>>
>>>>
>>>>> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
>>>>> ---
>>>>>  include/libcamera/base/event_dispatcher.h     |  2 ++
>>>>>  .../libcamera/base/event_dispatcher_poll.h    |  2 ++
>>>>>  include/libcamera/base/event_notifier.h       |  1 +
>>>>>  include/libcamera/base/file.h                 |  1 +
>>>>>  include/libcamera/base/log.h                  |  1 +
>>>>>  include/libcamera/base/meson.build            |  1 +
>>>>>  include/libcamera/base/private.h              | 22 +++++++++++++++++++
>>>>>  include/libcamera/base/semaphore.h            |  1 +
>>>>>  include/libcamera/base/thread.h               |  1 +
>>>>>  include/libcamera/base/timer.h                |  1 +
>>>>>  include/libcamera/base/utils.h                |  2 ++
>>>>>  src/android/meson.build                       |  2 +-
>>>>>  src/ipa/ipu3/meson.build                      |  2 +-
>>>>>  src/ipa/libipa/meson.build                    |  2 +-
>>>>>  src/ipa/raspberrypi/meson.build               |  2 +-
>>>>>  src/ipa/rkisp1/meson.build                    |  2 +-
>>>>>  src/ipa/vimc/meson.build                      |  2 +-
>>>>>  src/libcamera/base/meson.build                |  8 +++++++
>>>>>  src/libcamera/meson.build                     | 10 +++++++--
>>>>>  src/libcamera/proxy/worker/meson.build        |  2 +-
>>>>>  src/v4l2/meson.build                          |  2 +-
>>>>>  test/camera/meson.build                       |  2 +-
>>>>>  test/ipa/meson.build                          |  2 +-
>>>>>  test/ipc/meson.build                          |  2 +-
>>>>>  test/libtest/meson.build                      |  2 +-
>>>>>  test/log/meson.build                          |  2 +-
>>>>>  test/media_device/meson.build                 |  4 ++--
>>>>>  test/meson.build                              |  2 +-
>>>>>  test/pipeline/ipu3/meson.build                |  2 +-
>>>>>  test/pipeline/rkisp1/meson.build              |  2 +-
>>>>>  test/process/meson.build                      |  2 +-
>>>>>  .../generated_serializer/meson.build          |  2 +-
>>>>>  test/serialization/meson.build                |  2 +-
>>>>>  test/v4l2_subdevice/meson.build               |  2 +-
>>>>>  test/v4l2_videodevice/meson.build             |  2 +-
>>>>>  35 files changed, 74 insertions(+), 25 deletions(-)
>>>>>  create mode 100644 include/libcamera/base/private.h
>>>>>
>>>>> diff --git a/include/libcamera/base/event_dispatcher.h b/include/libcamera/base/event_dispatcher.h
>>>>> index 045df27fff16..825af7a33919 100644
>>>>> --- a/include/libcamera/base/event_dispatcher.h
>>>>> +++ b/include/libcamera/base/event_dispatcher.h
>>>>> @@ -9,6 +9,8 @@
>>>>>
>>>>>  #include <vector>
>>>>>
>>>>> +#include <libcamera/base/private.h>
>>>>> +
>>>>>  namespace libcamera {
>>>>>
>>>>>  class EventNotifier;
>>>>> diff --git a/include/libcamera/base/event_dispatcher_poll.h b/include/libcamera/base/event_dispatcher_poll.h
>>>>> index ae2a3f04e4b9..88835902980c 100644
>>>>> --- a/include/libcamera/base/event_dispatcher_poll.h
>>>>> +++ b/include/libcamera/base/event_dispatcher_poll.h
>>>>> @@ -13,6 +13,8 @@
>>>>>
>>>>>  #include <libcamera/base/event_dispatcher.h>
>>>>>
>>>>> +#include <libcamera/base/private.h>
>>>>> +
>>>>>  struct pollfd;
>>>>>
>>>>>  namespace libcamera {
>>>>> diff --git a/include/libcamera/base/event_notifier.h b/include/libcamera/base/event_notifier.h
>>>>> index 8a6419f23004..6bb4e5143aa6 100644
>>>>> --- a/include/libcamera/base/event_notifier.h
>>>>> +++ b/include/libcamera/base/event_notifier.h
>>>>> @@ -8,6 +8,7 @@
>>>>>  #define __LIBCAMERA_INTERNAL_EVENT_NOTIFIER_H__
>>>>>
>>>>>  #include <libcamera/base/object.h>
>>>>> +#include <libcamera/base/private.h>
>>>>>  #include <libcamera/base/signal.h>
>>>>>
>>>>>  namespace libcamera {
>>>>> diff --git a/include/libcamera/base/file.h b/include/libcamera/base/file.h
>>>>> index e8e4b76e1a4e..cecbb254591f 100644
>>>>> --- a/include/libcamera/base/file.h
>>>>> +++ b/include/libcamera/base/file.h
>>>>> @@ -12,6 +12,7 @@
>>>>>  #include <sys/types.h>
>>>>>
>>>>>  #include <libcamera/base/class.h>
>>>>> +#include <libcamera/base/private.h>
>>>>>
>>>>>  #include <libcamera/span.h>
>>>>>
>>>>> diff --git a/include/libcamera/base/log.h b/include/libcamera/base/log.h
>>>>> index b93c947ae7db..70582cd47902 100644
>>>>> --- a/include/libcamera/base/log.h
>>>>> +++ b/include/libcamera/base/log.h
>>>>> @@ -11,6 +11,7 @@
>>>>>  #include <sstream>
>>>>>
>>>>>  #include <libcamera/base/class.h>
>>>>> +#include <libcamera/base/private.h>
>>>>>  #include <libcamera/base/utils.h>
>>>>>
>>>>>  namespace libcamera {
>>>>> diff --git a/include/libcamera/base/meson.build b/include/libcamera/base/meson.build
>>>>> index 83c664affc88..aaac324d7149 100644
>>>>> --- a/include/libcamera/base/meson.build
>>>>> +++ b/include/libcamera/base/meson.build
>>>>> @@ -12,6 +12,7 @@ libcamera_base_headers = files([
>>>>>      'log.h',
>>>>>      'message.h',
>>>>>      'object.h',
>>>>> +    'private.h',
>>>>>      'semaphore.h',
>>>>>      'signal.h',
>>>>>      'thread.h',
>>>>> diff --git a/include/libcamera/base/private.h b/include/libcamera/base/private.h
>>>>> new file mode 100644
>>>>> index 000000000000..b54ad076688e
>>>>> --- /dev/null
>>>>> +++ b/include/libcamera/base/private.h
>>>>> @@ -0,0 +1,22 @@
>>>>> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
>>>>> +/*
>>>>> + * Copyright (C) 2021, Google Inc.
>>>>> + *
>>>>> + * private.h - Private Header Validation
>>>>> + *
>>>>> + * A selection of internal libcamera headers are installed as part
>>>>> + * of the libcamera package to allow sharing of a select subset of
>>>>> + * internal functionality with IPA module developers only.
>>>>> + *
>>>>> + * This functionality is not considered part of the public libcamera
>>>>> + * API, and can therefore potentially face ABI instabilities which
>>>>> + * should not be exposed to applications. IPA modules however should be
>>>>> + * versioned and more closely matched to the libcamera installation.
>>>>> + *
>>>>> + * Components which include this file can not be included in any file
>>>>> + * which forms part of the libcamera API.
>>>>> + */
>>>>> +
>>>>> +#ifndef LIBCAMERA_BASE_PRIVATE
>>>>> +#error "Private headers must not be included in the libcamera API"
>>>>> +#endif
>>>>> diff --git a/include/libcamera/base/semaphore.h b/include/libcamera/base/semaphore.h
>>>>> index c8e62e3ee68b..d8146eb8060b 100644
>>>>> --- a/include/libcamera/base/semaphore.h
>>>>> +++ b/include/libcamera/base/semaphore.h
>>>>> @@ -9,6 +9,7 @@
>>>>>
>>>>>  #include <condition_variable>
>>>>>
>>>>> +#include <libcamera/base/private.h>
>>>>>  #include <libcamera/base/thread.h>
>>>>>
>>>>>  namespace libcamera {
>>>>> diff --git a/include/libcamera/base/thread.h b/include/libcamera/base/thread.h
>>>>> index 2ed18d49c978..b30ed12715a2 100644
>>>>> --- a/include/libcamera/base/thread.h
>>>>> +++ b/include/libcamera/base/thread.h
>>>>> @@ -13,6 +13,7 @@
>>>>>  #include <thread>
>>>>>
>>>>>  #include <libcamera/base/message.h>
>>>>> +#include <libcamera/base/private.h>
>>>>>  #include <libcamera/base/signal.h>
>>>>>  #include <libcamera/base/utils.h>
>>>>>
>>>>> diff --git a/include/libcamera/base/timer.h b/include/libcamera/base/timer.h
>>>>> index e79e85f1ef0d..f762e8767d97 100644
>>>>> --- a/include/libcamera/base/timer.h
>>>>> +++ b/include/libcamera/base/timer.h
>>>>> @@ -11,6 +11,7 @@
>>>>>  #include <stdint.h>
>>>>>
>>>>>  #include <libcamera/base/object.h>
>>>>> +#include <libcamera/base/private.h>
>>>>>  #include <libcamera/base/signal.h>
>>>>>
>>>>>  namespace libcamera {
>>>>> diff --git a/include/libcamera/base/utils.h b/include/libcamera/base/utils.h
>>>>> index d1aaff65211a..07685045aa05 100644
>>>>> --- a/include/libcamera/base/utils.h
>>>>> +++ b/include/libcamera/base/utils.h
>>>>> @@ -19,6 +19,8 @@
>>>>>  #include <utility>
>>>>>  #include <vector>
>>>>>
>>>>> +#include <libcamera/base/private.h>
>>>>> +
>>>>>  #ifndef __DOXYGEN__
>>>>>
>>>>>  /* uClibc and uClibc-ng don't provide O_TMPFILE */
>>>>> diff --git a/src/android/meson.build b/src/android/meson.build
>>>>> index bd58ef964c2a..7d1e7e85f16e 100644
>>>>> --- a/src/android/meson.build
>>>>> +++ b/src/android/meson.build
>>>>> @@ -4,7 +4,7 @@ android_deps = [
>>>>>      dependency('libexif', required : get_option('android')),
>>>>>      dependency('libjpeg', required : get_option('android')),
>>>>>      dependency('yaml-0.1', required : get_option('android')),
>>>>> -    libcamera_dep,
>>>>> +    libcamera_private,
>>>>>  ]
>>>>>
>>>>>  android_enabled = true
>>>>> diff --git a/src/ipa/ipu3/meson.build b/src/ipa/ipu3/meson.build
>>>>> index 0d843846acde..b63641908710 100644
>>>>> --- a/src/ipa/ipu3/meson.build
>>>>> +++ b/src/ipa/ipu3/meson.build
>>>>> @@ -12,7 +12,7 @@ mod = shared_module(ipa_name,
>>>>>                      [ipu3_ipa_sources, libcamera_generated_ipa_headers],
>>>>>                      name_prefix : '',
>>>>>                      include_directories : [ipa_includes, libipa_includes],
>>>>> -                    dependencies : libcamera_dep,
>>>>> +                    dependencies : libcamera_private,
>>>>>                      link_with : libipa,
>>>>>                      install : true,
>>>>>                      install_dir : ipa_install_dir)
>>>>> diff --git a/src/ipa/libipa/meson.build b/src/ipa/libipa/meson.build
>>>>> index 038fc49060ef..ca541a5aafd7 100644
>>>>> --- a/src/ipa/libipa/meson.build
>>>>> +++ b/src/ipa/libipa/meson.build
>>>>> @@ -14,4 +14,4 @@ libipa_includes = include_directories('..')
>>>>>
>>>>>  libipa = static_library('ipa', [libipa_sources, libipa_headers],
>>>>>                          include_directories : ipa_includes,
>>>>> -                        dependencies : libcamera_dep)
>>>>> +                        dependencies : libcamera_private)
>>>>> diff --git a/src/ipa/raspberrypi/meson.build b/src/ipa/raspberrypi/meson.build
>>>>> index 230356d3ce3a..d7203aa042cd 100644
>>>>> --- a/src/ipa/raspberrypi/meson.build
>>>>> +++ b/src/ipa/raspberrypi/meson.build
>>>>> @@ -3,7 +3,7 @@
>>>>>  ipa_name = 'ipa_rpi'
>>>>>
>>>>>  rpi_ipa_deps = [
>>>>> -    libcamera_dep,
>>>>> +    libcamera_private,
>>>>>      dependency('boost'),
>>>>>      libatomic,
>>>>>  ]
>>>>> diff --git a/src/ipa/rkisp1/meson.build b/src/ipa/rkisp1/meson.build
>>>>> index 1a1c71591039..f76b37f5af50 100644
>>>>> --- a/src/ipa/rkisp1/meson.build
>>>>> +++ b/src/ipa/rkisp1/meson.build
>>>>> @@ -6,7 +6,7 @@ mod = shared_module(ipa_name,
>>>>>                      ['rkisp1.cpp', libcamera_generated_ipa_headers],
>>>>>                      name_prefix : '',
>>>>>                      include_directories : [ipa_includes, libipa_includes],
>>>>> -                    dependencies : libcamera_dep,
>>>>> +                    dependencies : libcamera_private,
>>>>>                      link_with : libipa,
>>>>>                      install : true,
>>>>>                      install_dir : ipa_install_dir)
>>>>> diff --git a/src/ipa/vimc/meson.build b/src/ipa/vimc/meson.build
>>>>> index a35825ae25a6..ecbeee136451 100644
>>>>> --- a/src/ipa/vimc/meson.build
>>>>> +++ b/src/ipa/vimc/meson.build
>>>>> @@ -6,7 +6,7 @@ mod = shared_module(ipa_name,
>>>>>                      ['vimc.cpp', libcamera_generated_ipa_headers],
>>>>>                      name_prefix : '',
>>>>>                      include_directories : [ipa_includes, libipa_includes],
>>>>> -                    dependencies : libcamera_dep,
>>>>> +                    dependencies : libcamera_private,
>>>>>                      link_with : libipa,
>>>>>                      install : true,
>>>>>                      install_dir : ipa_install_dir)
>>>>> diff --git a/src/libcamera/base/meson.build b/src/libcamera/base/meson.build
>>>>> index a8b04cfc8a5f..871721571e98 100644
>>>>> --- a/src/libcamera/base/meson.build
>>>>> +++ b/src/libcamera/base/meson.build
>>>>> @@ -21,10 +21,15 @@ libcamera_base_deps = [
>>>>>      dependency('threads'),
>>>>>  ]
>>>>>
>>>>> +# Internal components must use the libcamera_base_private dependency to enable
>>>>> +# the use of headers which must not be exposed to the libcamera public api.
>>>>> +libcamera_base_args = [ '-DLIBCAMERA_BASE_PRIVATE' ]
>>>>> +
>>>>>  libcamera_base_lib = shared_library('libcamera-base',
>>>>>                                      [libcamera_base_sources, libcamera_base_headers],
>>>>>                                      name_prefix : '',
>>>>>                                      install : true,
>>>>> +                                    cpp_args : libcamera_base_args,
>>>>>                                      include_directories : libcamera_includes,
>>>>>                                      dependencies : libcamera_base_deps)
>>>>>
>>>>> @@ -39,3 +44,6 @@ pkg_mod.generate(libcamera_base_lib,
>>>>>                   version : '1.0',
>>>>>                   description : 'Camera support base utility library',
>>>>>                   subdirs : 'libcamera')
>>>>> +
>>>>> +libcamera_base_private = declare_dependency(dependencies : libcamera_base,
>>>>> +                                            compile_args : libcamera_base_args)
>>>>> diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
>>>>> index 1f163cfe1225..64c7475f1a2e 100644
>>>>> --- a/src/libcamera/meson.build
>>>>> +++ b/src/libcamera/meson.build
>>>>> @@ -115,7 +115,7 @@ libcamera_deps = [
>>>>>      libgnutls,
>>>>>      liblttng,
>>>>>      libudev,
>>>>> -    libcamera_base,
>>>>> +    libcamera_base_private,
>>>>>  ]
>>>>>
>>>>>  # We add '/' to the build_rpath as a 'safe' path to act as a boolean flag.
>>>>> @@ -143,9 +143,15 @@ libcamera_dep = declare_dependency(sources : [
>>>>>                                         libcamera_generated_ipa_headers,
>>>>>                                     ],
>>>>>                                     include_directories : libcamera_includes,
>>>>> -                                   dependencies: libcamera_base,
>>>>> +                                   dependencies : libcamera_base,
>>>>>                                     link_with : libcamera)
>>>>>
>>>>> +# Internal dependancy for components and plugins which can use Private APIs
>>>>> +libcamera_private = declare_dependency(dependencies : [
>>>>> +                                           libcamera_dep,
>>>>> +                                           libcamera_base_private,
>>>>> +                                       ])
>>>>> +
>>>>>  pkg_mod = import('pkgconfig')
>>>>>  pkg_mod.generate(libcamera,
>>>>>                   libraries : libcamera_base_lib,
>>>>> diff --git a/src/libcamera/proxy/worker/meson.build b/src/libcamera/proxy/worker/meson.build
>>>>> index 28fe5f1fd6b2..70c8760a3d42 100644
>>>>> --- a/src/libcamera/proxy/worker/meson.build
>>>>> +++ b/src/libcamera/proxy/worker/meson.build
>>>>> @@ -21,7 +21,7 @@ foreach mojom : ipa_mojoms
>>>>>                         [worker, libcamera_generated_ipa_headers],
>>>>>                         install : true,
>>>>>                         install_dir : proxy_install_dir,
>>>>> -                       dependencies : libcamera_dep)
>>>>> +                       dependencies : libcamera_private)
>>>>>  endforeach
>>>>>
>>>>>  config_h.set('IPA_PROXY_DIR',
>>>>> diff --git a/src/v4l2/meson.build b/src/v4l2/meson.build
>>>>> index 0accac194be4..f78497b6799b 100644
>>>>> --- a/src/v4l2/meson.build
>>>>> +++ b/src/v4l2/meson.build
>>>>> @@ -31,5 +31,5 @@ v4l2_compat = shared_library('v4l2-compat',
>>>>>                               v4l2_compat_sources,
>>>>>                               name_prefix : '',
>>>>>                               install : true,
>>>>> -                             dependencies : [libcamera_dep, libdl],
>>>>> +                             dependencies : [libcamera_private, libdl],
>>>>>                               cpp_args : v4l2_compat_cpp_args)
>>>>> diff --git a/test/camera/meson.build b/test/camera/meson.build
>>>>> index 9cb95affffab..002a87b594e0 100644
>>>>> --- a/test/camera/meson.build
>>>>> +++ b/test/camera/meson.build
>>>>> @@ -12,7 +12,7 @@ camera_tests = [
>>>>>
>>>>>  foreach t : camera_tests
>>>>>      exe = executable(t[0], t[1],
>>>>> -                     dependencies : libcamera_dep,
>>>>> +                     dependencies : libcamera_private,
>>>>>                       link_with : test_libraries,
>>>>>                       include_directories : test_includes_internal)
>>>>>      test(t[0], exe, suite : 'camera', is_parallel : false)
>>>>> diff --git a/test/ipa/meson.build b/test/ipa/meson.build
>>>>> index e8a041b5bbd2..7938633e54ab 100644
>>>>> --- a/test/ipa/meson.build
>>>>> +++ b/test/ipa/meson.build
>>>>> @@ -7,7 +7,7 @@ ipa_test = [
>>>>>
>>>>>  foreach t : ipa_test
>>>>>      exe = executable(t[0], [t[1], libcamera_generated_ipa_headers],
>>>>> -                     dependencies : libcamera_dep,
>>>>> +                     dependencies : libcamera_private,
>>>>>                       link_with : [libipa, test_libraries],
>>>>>                       include_directories : [libipa_includes, test_includes_internal])
>>>>>
>>>>> diff --git a/test/ipc/meson.build b/test/ipc/meson.build
>>>>> index ad47b2feb718..2a6cd7fb8433 100644
>>>>> --- a/test/ipc/meson.build
>>>>> +++ b/test/ipc/meson.build
>>>>> @@ -7,7 +7,7 @@ ipc_tests = [
>>>>>
>>>>>  foreach t : ipc_tests
>>>>>      exe = executable(t[0], t[1],
>>>>> -                     dependencies : libcamera_dep,
>>>>> +                     dependencies : libcamera_private,
>>>>>                       link_with : test_libraries,
>>>>>                       include_directories : test_includes_internal)
>>>>>
>>>>> diff --git a/test/libtest/meson.build b/test/libtest/meson.build
>>>>> index 542335ea5e7c..351629f3ce73 100644
>>>>> --- a/test/libtest/meson.build
>>>>> +++ b/test/libtest/meson.build
>>>>> @@ -18,7 +18,7 @@ test_includes_internal = [
>>>>>  ]
>>>>>
>>>>>  libtest = static_library('libtest', libtest_sources,
>>>>> -                         dependencies : libcamera_dep,
>>>>> +                         dependencies : libcamera_private,
>>>>>                           include_directories : test_includes_internal)
>>>>>
>>>>>  test_libraries = [libtest]
>>>>> diff --git a/test/log/meson.build b/test/log/meson.build
>>>>> index 8cd664e04a00..ac87841a24e1 100644
>>>>> --- a/test/log/meson.build
>>>>> +++ b/test/log/meson.build
>>>>> @@ -7,7 +7,7 @@ log_test = [
>>>>>
>>>>>  foreach t : log_test
>>>>>      exe = executable(t[0], t[1],
>>>>> -                     dependencies : libcamera_dep,
>>>>> +                     dependencies : libcamera_private,
>>>>>                       link_with : test_libraries,
>>>>>                       include_directories : test_includes_internal)
>>>>>
>>>>> diff --git a/test/media_device/meson.build b/test/media_device/meson.build
>>>>> index 1dfcdd8bd744..83dfe8f11d2f 100644
>>>>> --- a/test/media_device/meson.build
>>>>> +++ b/test/media_device/meson.build
>>>>> @@ -11,12 +11,12 @@ media_device_tests = [
>>>>>  ]
>>>>>
>>>>>  lib_mdev_test = static_library('lib_mdev_test', lib_mdev_test_sources,
>>>>> -                               dependencies : libcamera_dep,
>>>>> +                               dependencies : libcamera_private,
>>>>>                                 include_directories : test_includes_internal)
>>>>>
>>>>>  foreach t : media_device_tests
>>>>>      exe = executable(t[0], t[1],
>>>>> -                     dependencies : libcamera_dep,
>>>>> +                     dependencies : libcamera_private,
>>>>>                       link_with : [test_libraries, lib_mdev_test],
>>>>>                       include_directories : test_includes_internal)
>>>>>
>>>>> diff --git a/test/meson.build b/test/meson.build
>>>>> index 045ad2a2d7c9..b8615e0fd3e6 100644
>>>>> --- a/test/meson.build
>>>>> +++ b/test/meson.build
>>>>> @@ -64,7 +64,7 @@ endforeach
>>>>>
>>>>>  foreach t : internal_tests
>>>>>      exe = executable(t[0], t[1],
>>>>> -                     dependencies : libcamera_dep,
>>>>> +                     dependencies : libcamera_private,
>>>>>                       link_with : test_libraries,
>>>>>                       include_directories : test_includes_internal)
>>>>>
>>>>> diff --git a/test/pipeline/ipu3/meson.build b/test/pipeline/ipu3/meson.build
>>>>> index d062ecd269f2..16701080ca2b 100644
>>>>> --- a/test/pipeline/ipu3/meson.build
>>>>> +++ b/test/pipeline/ipu3/meson.build
>>>>> @@ -6,7 +6,7 @@ ipu3_test = [
>>>>>
>>>>>  foreach t : ipu3_test
>>>>>      exe = executable(t[0], t[1],
>>>>> -                     dependencies : libcamera_dep,
>>>>> +                     dependencies : libcamera_private,
>>>>>                       link_with : test_libraries,
>>>>>                       include_directories : test_includes_internal)
>>>>>
>>>>> diff --git a/test/pipeline/rkisp1/meson.build b/test/pipeline/rkisp1/meson.build
>>>>> index ece147b054e4..364b5711a0f9 100644
>>>>> --- a/test/pipeline/rkisp1/meson.build
>>>>> +++ b/test/pipeline/rkisp1/meson.build
>>>>> @@ -6,7 +6,7 @@ rkisp1_test = [
>>>>>
>>>>>  foreach t : rkisp1_test
>>>>>      exe = executable(t[0], t[1],
>>>>> -                     dependencies : libcamera_dep,
>>>>> +                     dependencies : libcamera_private,
>>>>>                       link_with : test_libraries,
>>>>>                       include_directories : test_includes_internal)
>>>>>
>>>>> diff --git a/test/process/meson.build b/test/process/meson.build
>>>>> index d2272d509db3..af86b277db63 100644
>>>>> --- a/test/process/meson.build
>>>>> +++ b/test/process/meson.build
>>>>> @@ -6,7 +6,7 @@ process_tests = [
>>>>>
>>>>>  foreach t : process_tests
>>>>>      exe = executable(t[0], t[1],
>>>>> -                     dependencies : libcamera_dep,
>>>>> +                     dependencies : libcamera_private,
>>>>>                       link_with : test_libraries,
>>>>>                       include_directories : test_includes_internal)
>>>>>
>>>>> diff --git a/test/serialization/generated_serializer/meson.build b/test/serialization/generated_serializer/meson.build
>>>>> index 2460e0b114b3..9fb9cd1db968 100644
>>>>> --- a/test/serialization/generated_serializer/meson.build
>>>>> +++ b/test/serialization/generated_serializer/meson.build
>>>>> @@ -8,7 +8,7 @@ exe = executable('generated_serializer_test',
>>>>>                       generated_test_header,
>>>>>                       generated_test_serializer,
>>>>>                   ],
>>>>> -                 dependencies : libcamera_dep,
>>>>> +                 dependencies : libcamera_private,
>>>>>                   link_with : test_libraries,
>>>>>                   include_directories : [
>>>>>                       test_includes_internal,
>>>>> diff --git a/test/serialization/meson.build b/test/serialization/meson.build
>>>>> index 60ebf3255b28..5446e4907f33 100644
>>>>> --- a/test/serialization/meson.build
>>>>> +++ b/test/serialization/meson.build
>>>>> @@ -9,7 +9,7 @@ serialization_tests = [
>>>>>
>>>>>  foreach t : serialization_tests
>>>>>      exe = executable(t[0], [t[1], 'serialization_test.cpp'],
>>>>> -                     dependencies : libcamera_dep,
>>>>> +                     dependencies : libcamera_private,
>>>>>                       link_with : test_libraries,
>>>>>                       include_directories : test_includes_internal)
>>>>>      test(t[0], exe, suite : 'serialization', is_parallel : true)
>>>>> diff --git a/test/v4l2_subdevice/meson.build b/test/v4l2_subdevice/meson.build
>>>>> index 40d39766af9b..d82be3c60b75 100644
>>>>> --- a/test/v4l2_subdevice/meson.build
>>>>> +++ b/test/v4l2_subdevice/meson.build
>>>>> @@ -7,7 +7,7 @@ v4l2_subdevice_tests = [
>>>>>
>>>>>  foreach t : v4l2_subdevice_tests
>>>>>      exe = executable(t[0], [t[1], 'v4l2_subdevice_test.cpp'],
>>>>> -        dependencies : libcamera_dep,
>>>>> +        dependencies : libcamera_private,
>>>>>          link_with : test_libraries,
>>>>>          include_directories : test_includes_internal)
>>>>>      test(t[0], exe, suite : 'v4l2_subdevice', is_parallel : false)
>>>>> diff --git a/test/v4l2_videodevice/meson.build b/test/v4l2_videodevice/meson.build
>>>>> index e733518c0185..643f82edce5e 100644
>>>>> --- a/test/v4l2_videodevice/meson.build
>>>>> +++ b/test/v4l2_videodevice/meson.build
>>>>> @@ -16,7 +16,7 @@ v4l2_videodevice_tests = [
>>>>>
>>>>>  foreach t : v4l2_videodevice_tests
>>>>>      exe = executable(t[0], [t[1], 'v4l2_videodevice_test.cpp'],
>>>>> -                     dependencies : libcamera_dep,
>>>>> +                     dependencies : libcamera_private,
>>>>>                       link_with : test_libraries,
>>>>>                       include_directories : test_includes_internal)
>>>>>      test(t[0], exe, suite : 'v4l2_videodevice', is_parallel : false)
>>>>> --
>>>>> 2.30.2
>>>>>

Patch
diff mbox series

diff --git a/include/libcamera/base/event_dispatcher.h b/include/libcamera/base/event_dispatcher.h
index 045df27fff16..825af7a33919 100644
--- a/include/libcamera/base/event_dispatcher.h
+++ b/include/libcamera/base/event_dispatcher.h
@@ -9,6 +9,8 @@ 
 
 #include <vector>
 
+#include <libcamera/base/private.h>
+
 namespace libcamera {
 
 class EventNotifier;
diff --git a/include/libcamera/base/event_dispatcher_poll.h b/include/libcamera/base/event_dispatcher_poll.h
index ae2a3f04e4b9..88835902980c 100644
--- a/include/libcamera/base/event_dispatcher_poll.h
+++ b/include/libcamera/base/event_dispatcher_poll.h
@@ -13,6 +13,8 @@ 
 
 #include <libcamera/base/event_dispatcher.h>
 
+#include <libcamera/base/private.h>
+
 struct pollfd;
 
 namespace libcamera {
diff --git a/include/libcamera/base/event_notifier.h b/include/libcamera/base/event_notifier.h
index 8a6419f23004..6bb4e5143aa6 100644
--- a/include/libcamera/base/event_notifier.h
+++ b/include/libcamera/base/event_notifier.h
@@ -8,6 +8,7 @@ 
 #define __LIBCAMERA_INTERNAL_EVENT_NOTIFIER_H__
 
 #include <libcamera/base/object.h>
+#include <libcamera/base/private.h>
 #include <libcamera/base/signal.h>
 
 namespace libcamera {
diff --git a/include/libcamera/base/file.h b/include/libcamera/base/file.h
index e8e4b76e1a4e..cecbb254591f 100644
--- a/include/libcamera/base/file.h
+++ b/include/libcamera/base/file.h
@@ -12,6 +12,7 @@ 
 #include <sys/types.h>
 
 #include <libcamera/base/class.h>
+#include <libcamera/base/private.h>
 
 #include <libcamera/span.h>
 
diff --git a/include/libcamera/base/log.h b/include/libcamera/base/log.h
index b93c947ae7db..70582cd47902 100644
--- a/include/libcamera/base/log.h
+++ b/include/libcamera/base/log.h
@@ -11,6 +11,7 @@ 
 #include <sstream>
 
 #include <libcamera/base/class.h>
+#include <libcamera/base/private.h>
 #include <libcamera/base/utils.h>
 
 namespace libcamera {
diff --git a/include/libcamera/base/meson.build b/include/libcamera/base/meson.build
index 83c664affc88..aaac324d7149 100644
--- a/include/libcamera/base/meson.build
+++ b/include/libcamera/base/meson.build
@@ -12,6 +12,7 @@  libcamera_base_headers = files([
     'log.h',
     'message.h',
     'object.h',
+    'private.h',
     'semaphore.h',
     'signal.h',
     'thread.h',
diff --git a/include/libcamera/base/private.h b/include/libcamera/base/private.h
new file mode 100644
index 000000000000..b54ad076688e
--- /dev/null
+++ b/include/libcamera/base/private.h
@@ -0,0 +1,22 @@ 
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2021, Google Inc.
+ *
+ * private.h - Private Header Validation
+ *
+ * A selection of internal libcamera headers are installed as part
+ * of the libcamera package to allow sharing of a select subset of
+ * internal functionality with IPA module developers only.
+ *
+ * This functionality is not considered part of the public libcamera
+ * API, and can therefore potentially face ABI instabilities which
+ * should not be exposed to applications. IPA modules however should be
+ * versioned and more closely matched to the libcamera installation.
+ *
+ * Components which include this file can not be included in any file
+ * which forms part of the libcamera API.
+ */
+
+#ifndef LIBCAMERA_BASE_PRIVATE
+#error "Private headers must not be included in the libcamera API"
+#endif
diff --git a/include/libcamera/base/semaphore.h b/include/libcamera/base/semaphore.h
index c8e62e3ee68b..d8146eb8060b 100644
--- a/include/libcamera/base/semaphore.h
+++ b/include/libcamera/base/semaphore.h
@@ -9,6 +9,7 @@ 
 
 #include <condition_variable>
 
+#include <libcamera/base/private.h>
 #include <libcamera/base/thread.h>
 
 namespace libcamera {
diff --git a/include/libcamera/base/thread.h b/include/libcamera/base/thread.h
index 2ed18d49c978..b30ed12715a2 100644
--- a/include/libcamera/base/thread.h
+++ b/include/libcamera/base/thread.h
@@ -13,6 +13,7 @@ 
 #include <thread>
 
 #include <libcamera/base/message.h>
+#include <libcamera/base/private.h>
 #include <libcamera/base/signal.h>
 #include <libcamera/base/utils.h>
 
diff --git a/include/libcamera/base/timer.h b/include/libcamera/base/timer.h
index e79e85f1ef0d..f762e8767d97 100644
--- a/include/libcamera/base/timer.h
+++ b/include/libcamera/base/timer.h
@@ -11,6 +11,7 @@ 
 #include <stdint.h>
 
 #include <libcamera/base/object.h>
+#include <libcamera/base/private.h>
 #include <libcamera/base/signal.h>
 
 namespace libcamera {
diff --git a/include/libcamera/base/utils.h b/include/libcamera/base/utils.h
index d1aaff65211a..07685045aa05 100644
--- a/include/libcamera/base/utils.h
+++ b/include/libcamera/base/utils.h
@@ -19,6 +19,8 @@ 
 #include <utility>
 #include <vector>
 
+#include <libcamera/base/private.h>
+
 #ifndef __DOXYGEN__
 
 /* uClibc and uClibc-ng don't provide O_TMPFILE */
diff --git a/src/android/meson.build b/src/android/meson.build
index bd58ef964c2a..7d1e7e85f16e 100644
--- a/src/android/meson.build
+++ b/src/android/meson.build
@@ -4,7 +4,7 @@  android_deps = [
     dependency('libexif', required : get_option('android')),
     dependency('libjpeg', required : get_option('android')),
     dependency('yaml-0.1', required : get_option('android')),
-    libcamera_dep,
+    libcamera_private,
 ]
 
 android_enabled = true
diff --git a/src/ipa/ipu3/meson.build b/src/ipa/ipu3/meson.build
index 0d843846acde..b63641908710 100644
--- a/src/ipa/ipu3/meson.build
+++ b/src/ipa/ipu3/meson.build
@@ -12,7 +12,7 @@  mod = shared_module(ipa_name,
                     [ipu3_ipa_sources, libcamera_generated_ipa_headers],
                     name_prefix : '',
                     include_directories : [ipa_includes, libipa_includes],
-                    dependencies : libcamera_dep,
+                    dependencies : libcamera_private,
                     link_with : libipa,
                     install : true,
                     install_dir : ipa_install_dir)
diff --git a/src/ipa/libipa/meson.build b/src/ipa/libipa/meson.build
index 038fc49060ef..ca541a5aafd7 100644
--- a/src/ipa/libipa/meson.build
+++ b/src/ipa/libipa/meson.build
@@ -14,4 +14,4 @@  libipa_includes = include_directories('..')
 
 libipa = static_library('ipa', [libipa_sources, libipa_headers],
                         include_directories : ipa_includes,
-                        dependencies : libcamera_dep)
+                        dependencies : libcamera_private)
diff --git a/src/ipa/raspberrypi/meson.build b/src/ipa/raspberrypi/meson.build
index 230356d3ce3a..d7203aa042cd 100644
--- a/src/ipa/raspberrypi/meson.build
+++ b/src/ipa/raspberrypi/meson.build
@@ -3,7 +3,7 @@ 
 ipa_name = 'ipa_rpi'
 
 rpi_ipa_deps = [
-    libcamera_dep,
+    libcamera_private,
     dependency('boost'),
     libatomic,
 ]
diff --git a/src/ipa/rkisp1/meson.build b/src/ipa/rkisp1/meson.build
index 1a1c71591039..f76b37f5af50 100644
--- a/src/ipa/rkisp1/meson.build
+++ b/src/ipa/rkisp1/meson.build
@@ -6,7 +6,7 @@  mod = shared_module(ipa_name,
                     ['rkisp1.cpp', libcamera_generated_ipa_headers],
                     name_prefix : '',
                     include_directories : [ipa_includes, libipa_includes],
-                    dependencies : libcamera_dep,
+                    dependencies : libcamera_private,
                     link_with : libipa,
                     install : true,
                     install_dir : ipa_install_dir)
diff --git a/src/ipa/vimc/meson.build b/src/ipa/vimc/meson.build
index a35825ae25a6..ecbeee136451 100644
--- a/src/ipa/vimc/meson.build
+++ b/src/ipa/vimc/meson.build
@@ -6,7 +6,7 @@  mod = shared_module(ipa_name,
                     ['vimc.cpp', libcamera_generated_ipa_headers],
                     name_prefix : '',
                     include_directories : [ipa_includes, libipa_includes],
-                    dependencies : libcamera_dep,
+                    dependencies : libcamera_private,
                     link_with : libipa,
                     install : true,
                     install_dir : ipa_install_dir)
diff --git a/src/libcamera/base/meson.build b/src/libcamera/base/meson.build
index a8b04cfc8a5f..871721571e98 100644
--- a/src/libcamera/base/meson.build
+++ b/src/libcamera/base/meson.build
@@ -21,10 +21,15 @@  libcamera_base_deps = [
     dependency('threads'),
 ]
 
+# Internal components must use the libcamera_base_private dependency to enable
+# the use of headers which must not be exposed to the libcamera public api.
+libcamera_base_args = [ '-DLIBCAMERA_BASE_PRIVATE' ]
+
 libcamera_base_lib = shared_library('libcamera-base',
                                     [libcamera_base_sources, libcamera_base_headers],
                                     name_prefix : '',
                                     install : true,
+                                    cpp_args : libcamera_base_args,
                                     include_directories : libcamera_includes,
                                     dependencies : libcamera_base_deps)
 
@@ -39,3 +44,6 @@  pkg_mod.generate(libcamera_base_lib,
                  version : '1.0',
                  description : 'Camera support base utility library',
                  subdirs : 'libcamera')
+
+libcamera_base_private = declare_dependency(dependencies : libcamera_base,
+                                            compile_args : libcamera_base_args)
diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
index 1f163cfe1225..64c7475f1a2e 100644
--- a/src/libcamera/meson.build
+++ b/src/libcamera/meson.build
@@ -115,7 +115,7 @@  libcamera_deps = [
     libgnutls,
     liblttng,
     libudev,
-    libcamera_base,
+    libcamera_base_private,
 ]
 
 # We add '/' to the build_rpath as a 'safe' path to act as a boolean flag.
@@ -143,9 +143,15 @@  libcamera_dep = declare_dependency(sources : [
                                        libcamera_generated_ipa_headers,
                                    ],
                                    include_directories : libcamera_includes,
-                                   dependencies: libcamera_base,
+                                   dependencies : libcamera_base,
                                    link_with : libcamera)
 
+# Internal dependancy for components and plugins which can use Private APIs
+libcamera_private = declare_dependency(dependencies : [
+                                           libcamera_dep,
+                                           libcamera_base_private,
+                                       ])
+
 pkg_mod = import('pkgconfig')
 pkg_mod.generate(libcamera,
                  libraries : libcamera_base_lib,
diff --git a/src/libcamera/proxy/worker/meson.build b/src/libcamera/proxy/worker/meson.build
index 28fe5f1fd6b2..70c8760a3d42 100644
--- a/src/libcamera/proxy/worker/meson.build
+++ b/src/libcamera/proxy/worker/meson.build
@@ -21,7 +21,7 @@  foreach mojom : ipa_mojoms
                        [worker, libcamera_generated_ipa_headers],
                        install : true,
                        install_dir : proxy_install_dir,
-                       dependencies : libcamera_dep)
+                       dependencies : libcamera_private)
 endforeach
 
 config_h.set('IPA_PROXY_DIR',
diff --git a/src/v4l2/meson.build b/src/v4l2/meson.build
index 0accac194be4..f78497b6799b 100644
--- a/src/v4l2/meson.build
+++ b/src/v4l2/meson.build
@@ -31,5 +31,5 @@  v4l2_compat = shared_library('v4l2-compat',
                              v4l2_compat_sources,
                              name_prefix : '',
                              install : true,
-                             dependencies : [libcamera_dep, libdl],
+                             dependencies : [libcamera_private, libdl],
                              cpp_args : v4l2_compat_cpp_args)
diff --git a/test/camera/meson.build b/test/camera/meson.build
index 9cb95affffab..002a87b594e0 100644
--- a/test/camera/meson.build
+++ b/test/camera/meson.build
@@ -12,7 +12,7 @@  camera_tests = [
 
 foreach t : camera_tests
     exe = executable(t[0], t[1],
-                     dependencies : libcamera_dep,
+                     dependencies : libcamera_private,
                      link_with : test_libraries,
                      include_directories : test_includes_internal)
     test(t[0], exe, suite : 'camera', is_parallel : false)
diff --git a/test/ipa/meson.build b/test/ipa/meson.build
index e8a041b5bbd2..7938633e54ab 100644
--- a/test/ipa/meson.build
+++ b/test/ipa/meson.build
@@ -7,7 +7,7 @@  ipa_test = [
 
 foreach t : ipa_test
     exe = executable(t[0], [t[1], libcamera_generated_ipa_headers],
-                     dependencies : libcamera_dep,
+                     dependencies : libcamera_private,
                      link_with : [libipa, test_libraries],
                      include_directories : [libipa_includes, test_includes_internal])
 
diff --git a/test/ipc/meson.build b/test/ipc/meson.build
index ad47b2feb718..2a6cd7fb8433 100644
--- a/test/ipc/meson.build
+++ b/test/ipc/meson.build
@@ -7,7 +7,7 @@  ipc_tests = [
 
 foreach t : ipc_tests
     exe = executable(t[0], t[1],
-                     dependencies : libcamera_dep,
+                     dependencies : libcamera_private,
                      link_with : test_libraries,
                      include_directories : test_includes_internal)
 
diff --git a/test/libtest/meson.build b/test/libtest/meson.build
index 542335ea5e7c..351629f3ce73 100644
--- a/test/libtest/meson.build
+++ b/test/libtest/meson.build
@@ -18,7 +18,7 @@  test_includes_internal = [
 ]
 
 libtest = static_library('libtest', libtest_sources,
-                         dependencies : libcamera_dep,
+                         dependencies : libcamera_private,
                          include_directories : test_includes_internal)
 
 test_libraries = [libtest]
diff --git a/test/log/meson.build b/test/log/meson.build
index 8cd664e04a00..ac87841a24e1 100644
--- a/test/log/meson.build
+++ b/test/log/meson.build
@@ -7,7 +7,7 @@  log_test = [
 
 foreach t : log_test
     exe = executable(t[0], t[1],
-                     dependencies : libcamera_dep,
+                     dependencies : libcamera_private,
                      link_with : test_libraries,
                      include_directories : test_includes_internal)
 
diff --git a/test/media_device/meson.build b/test/media_device/meson.build
index 1dfcdd8bd744..83dfe8f11d2f 100644
--- a/test/media_device/meson.build
+++ b/test/media_device/meson.build
@@ -11,12 +11,12 @@  media_device_tests = [
 ]
 
 lib_mdev_test = static_library('lib_mdev_test', lib_mdev_test_sources,
-                               dependencies : libcamera_dep,
+                               dependencies : libcamera_private,
                                include_directories : test_includes_internal)
 
 foreach t : media_device_tests
     exe = executable(t[0], t[1],
-                     dependencies : libcamera_dep,
+                     dependencies : libcamera_private,
                      link_with : [test_libraries, lib_mdev_test],
                      include_directories : test_includes_internal)
 
diff --git a/test/meson.build b/test/meson.build
index 045ad2a2d7c9..b8615e0fd3e6 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -64,7 +64,7 @@  endforeach
 
 foreach t : internal_tests
     exe = executable(t[0], t[1],
-                     dependencies : libcamera_dep,
+                     dependencies : libcamera_private,
                      link_with : test_libraries,
                      include_directories : test_includes_internal)
 
diff --git a/test/pipeline/ipu3/meson.build b/test/pipeline/ipu3/meson.build
index d062ecd269f2..16701080ca2b 100644
--- a/test/pipeline/ipu3/meson.build
+++ b/test/pipeline/ipu3/meson.build
@@ -6,7 +6,7 @@  ipu3_test = [
 
 foreach t : ipu3_test
     exe = executable(t[0], t[1],
-                     dependencies : libcamera_dep,
+                     dependencies : libcamera_private,
                      link_with : test_libraries,
                      include_directories : test_includes_internal)
 
diff --git a/test/pipeline/rkisp1/meson.build b/test/pipeline/rkisp1/meson.build
index ece147b054e4..364b5711a0f9 100644
--- a/test/pipeline/rkisp1/meson.build
+++ b/test/pipeline/rkisp1/meson.build
@@ -6,7 +6,7 @@  rkisp1_test = [
 
 foreach t : rkisp1_test
     exe = executable(t[0], t[1],
-                     dependencies : libcamera_dep,
+                     dependencies : libcamera_private,
                      link_with : test_libraries,
                      include_directories : test_includes_internal)
 
diff --git a/test/process/meson.build b/test/process/meson.build
index d2272d509db3..af86b277db63 100644
--- a/test/process/meson.build
+++ b/test/process/meson.build
@@ -6,7 +6,7 @@  process_tests = [
 
 foreach t : process_tests
     exe = executable(t[0], t[1],
-                     dependencies : libcamera_dep,
+                     dependencies : libcamera_private,
                      link_with : test_libraries,
                      include_directories : test_includes_internal)
 
diff --git a/test/serialization/generated_serializer/meson.build b/test/serialization/generated_serializer/meson.build
index 2460e0b114b3..9fb9cd1db968 100644
--- a/test/serialization/generated_serializer/meson.build
+++ b/test/serialization/generated_serializer/meson.build
@@ -8,7 +8,7 @@  exe = executable('generated_serializer_test',
                      generated_test_header,
                      generated_test_serializer,
                  ],
-                 dependencies : libcamera_dep,
+                 dependencies : libcamera_private,
                  link_with : test_libraries,
                  include_directories : [
                      test_includes_internal,
diff --git a/test/serialization/meson.build b/test/serialization/meson.build
index 60ebf3255b28..5446e4907f33 100644
--- a/test/serialization/meson.build
+++ b/test/serialization/meson.build
@@ -9,7 +9,7 @@  serialization_tests = [
 
 foreach t : serialization_tests
     exe = executable(t[0], [t[1], 'serialization_test.cpp'],
-                     dependencies : libcamera_dep,
+                     dependencies : libcamera_private,
                      link_with : test_libraries,
                      include_directories : test_includes_internal)
     test(t[0], exe, suite : 'serialization', is_parallel : true)
diff --git a/test/v4l2_subdevice/meson.build b/test/v4l2_subdevice/meson.build
index 40d39766af9b..d82be3c60b75 100644
--- a/test/v4l2_subdevice/meson.build
+++ b/test/v4l2_subdevice/meson.build
@@ -7,7 +7,7 @@  v4l2_subdevice_tests = [
 
 foreach t : v4l2_subdevice_tests
     exe = executable(t[0], [t[1], 'v4l2_subdevice_test.cpp'],
-        dependencies : libcamera_dep,
+        dependencies : libcamera_private,
         link_with : test_libraries,
         include_directories : test_includes_internal)
     test(t[0], exe, suite : 'v4l2_subdevice', is_parallel : false)
diff --git a/test/v4l2_videodevice/meson.build b/test/v4l2_videodevice/meson.build
index e733518c0185..643f82edce5e 100644
--- a/test/v4l2_videodevice/meson.build
+++ b/test/v4l2_videodevice/meson.build
@@ -16,7 +16,7 @@  v4l2_videodevice_tests = [
 
 foreach t : v4l2_videodevice_tests
     exe = executable(t[0], [t[1], 'v4l2_videodevice_test.cpp'],
-                     dependencies : libcamera_dep,
+                     dependencies : libcamera_private,
                      link_with : test_libraries,
                      include_directories : test_includes_internal)
     test(t[0], exe, suite : 'v4l2_videodevice', is_parallel : false)