[{"id":25554,"web_url":"https://patchwork.libcamera.org/comment/25554/","msgid":"<b1523dbc-7a6b-20e3-b596-9b6897964be8@ideasonboard.com>","date":"2022-10-24T18:19:24","subject":"Re: [libcamera-devel] [PATCH v2] apps: Share common source between\n\tapplications","submitter":{"id":86,"url":"https://patchwork.libcamera.org/api/people/86/","name":"Umang Jain","email":"umang.jain@ideasonboard.com"},"content":"Hi Laurent,\n\nThank you for the patch\n\nOn 10/21/22 3:40 AM, Laurent Pinchart via libcamera-devel wrote:\n> Multiple source files in the src/apps/cam/ directory are used by cam,\n> qcam and lc-compliance. They are compiled separately for each\n> application. Move them to a new src/apps/common/ directory and compile\n> them in a static library to decrease the number of compilation\n> operations.\n>\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nLooks good to me,\n\nReviewed-by: Umang Jain <umang.jain@ideasonboard.com>\n\n> ---\n> Changes since v1:\n>\n> - Move common code to src/apps/common/\n> ---\n>   src/apps/cam/camera_session.cpp             |  5 ++--\n>   src/apps/cam/camera_session.h               |  2 +-\n>   src/apps/cam/drm.cpp                        |  2 +-\n>   src/apps/cam/file_sink.cpp                  |  5 ++--\n>   src/apps/cam/main.cpp                       |  7 +++---\n>   src/apps/cam/meson.build                    | 14 ++---------\n>   src/apps/cam/sdl_sink.cpp                   |  5 ++--\n>   src/apps/cam/sdl_texture.h                  |  2 +-\n>   src/apps/{cam => common}/dng_writer.cpp     |  0\n>   src/apps/{cam => common}/dng_writer.h       |  0\n>   src/apps/{cam => common}/event_loop.cpp     |  0\n>   src/apps/{cam => common}/event_loop.h       |  0\n>   src/apps/{cam => common}/image.cpp          |  0\n>   src/apps/{cam => common}/image.h            |  0\n>   src/apps/common/meson.build                 | 26 +++++++++++++++++++++\n>   src/apps/{cam => common}/options.cpp        |  0\n>   src/apps/{cam => common}/options.h          |  0\n>   src/apps/{cam => common}/stream_options.cpp |  0\n>   src/apps/{cam => common}/stream_options.h   |  0\n>   src/apps/lc-compliance/main.cpp             |  3 ++-\n>   src/apps/lc-compliance/meson.build          |  3 +--\n>   src/apps/lc-compliance/simple_capture.h     |  2 +-\n>   src/apps/meson.build                        |  2 ++\n>   src/apps/qcam/format_converter.cpp          |  2 +-\n>   src/apps/qcam/main.cpp                      |  5 ++--\n>   src/apps/qcam/main_window.cpp               |  4 ++--\n>   src/apps/qcam/main_window.h                 |  2 +-\n>   src/apps/qcam/meson.build                   | 13 ++---------\n>   src/apps/qcam/viewfinder_gl.cpp             |  2 +-\n>   src/apps/qcam/viewfinder_qt.cpp             |  2 +-\n>   30 files changed, 61 insertions(+), 47 deletions(-)\n>   rename src/apps/{cam => common}/dng_writer.cpp (100%)\n>   rename src/apps/{cam => common}/dng_writer.h (100%)\n>   rename src/apps/{cam => common}/event_loop.cpp (100%)\n>   rename src/apps/{cam => common}/event_loop.h (100%)\n>   rename src/apps/{cam => common}/image.cpp (100%)\n>   rename src/apps/{cam => common}/image.h (100%)\n>   create mode 100644 src/apps/common/meson.build\n>   rename src/apps/{cam => common}/options.cpp (100%)\n>   rename src/apps/{cam => common}/options.h (100%)\n>   rename src/apps/{cam => common}/stream_options.cpp (100%)\n>   rename src/apps/{cam => common}/stream_options.h (100%)\n>\n> diff --git a/src/apps/cam/camera_session.cpp b/src/apps/cam/camera_session.cpp\n> index 6b409c983b86..8fcec6304d66 100644\n> --- a/src/apps/cam/camera_session.cpp\n> +++ b/src/apps/cam/camera_session.cpp\n> @@ -13,9 +13,11 @@\n>   #include <libcamera/control_ids.h>\n>   #include <libcamera/property_ids.h>\n>   \n> +#include \"../common/event_loop.h\"\n> +#include \"../common/stream_options.h\"\n> +\n>   #include \"camera_session.h\"\n>   #include \"capture_script.h\"\n> -#include \"event_loop.h\"\n>   #include \"file_sink.h\"\n>   #ifdef HAVE_KMS\n>   #include \"kms_sink.h\"\n> @@ -24,7 +26,6 @@\n>   #ifdef HAVE_SDL\n>   #include \"sdl_sink.h\"\n>   #endif\n> -#include \"stream_options.h\"\n>   \n>   using namespace libcamera;\n>   \n> diff --git a/src/apps/cam/camera_session.h b/src/apps/cam/camera_session.h\n> index d562caae0794..0bab519f9efd 100644\n> --- a/src/apps/cam/camera_session.h\n> +++ b/src/apps/cam/camera_session.h\n> @@ -21,7 +21,7 @@\n>   #include <libcamera/request.h>\n>   #include <libcamera/stream.h>\n>   \n> -#include \"options.h\"\n> +#include \"../common/options.h\"\n>   \n>   class CaptureScript;\n>   class FrameSink;\n> diff --git a/src/apps/cam/drm.cpp b/src/apps/cam/drm.cpp\n> index 2e4d7985245d..8779a7137f80 100644\n> --- a/src/apps/cam/drm.cpp\n> +++ b/src/apps/cam/drm.cpp\n> @@ -24,7 +24,7 @@\n>   \n>   #include <libdrm/drm_mode.h>\n>   \n> -#include \"event_loop.h\"\n> +#include \"../common/event_loop.h\"\n>   \n>   namespace DRM {\n>   \n> diff --git a/src/apps/cam/file_sink.cpp b/src/apps/cam/file_sink.cpp\n> index 9d60c04e1cf4..4525fbada7c4 100644\n> --- a/src/apps/cam/file_sink.cpp\n> +++ b/src/apps/cam/file_sink.cpp\n> @@ -15,9 +15,10 @@\n>   \n>   #include <libcamera/camera.h>\n>   \n> -#include \"dng_writer.h\"\n> +#include \"../common/dng_writer.h\"\n> +#include \"../common/image.h\"\n> +\n>   #include \"file_sink.h\"\n> -#include \"image.h\"\n>   \n>   using namespace libcamera;\n>   \n> diff --git a/src/apps/cam/main.cpp b/src/apps/cam/main.cpp\n> index d70130e2ab81..5d8a57bc14e5 100644\n> --- a/src/apps/cam/main.cpp\n> +++ b/src/apps/cam/main.cpp\n> @@ -14,11 +14,12 @@\n>   #include <libcamera/libcamera.h>\n>   #include <libcamera/property_ids.h>\n>   \n> +#include \"../common/event_loop.h\"\n> +#include \"../common/options.h\"\n> +#include \"../common/stream_options.h\"\n> +\n>   #include \"camera_session.h\"\n> -#include \"event_loop.h\"\n>   #include \"main.h\"\n> -#include \"options.h\"\n> -#include \"stream_options.h\"\n>   \n>   using namespace libcamera;\n>   \n> diff --git a/src/apps/cam/meson.build b/src/apps/cam/meson.build\n> index 297de64fbdd9..48c834ace71b 100644\n> --- a/src/apps/cam/meson.build\n> +++ b/src/apps/cam/meson.build\n> @@ -10,16 +10,12 @@ cam_enabled = true\n>   cam_sources = files([\n>       'camera_session.cpp',\n>       'capture_script.cpp',\n> -    'event_loop.cpp',\n>       'file_sink.cpp',\n>       'frame_sink.cpp',\n> -    'image.cpp',\n>       'main.cpp',\n> -    'options.cpp',\n> -    'stream_options.cpp',\n>   ])\n>   \n> -cam_cpp_args = []\n> +cam_cpp_args = [apps_cpp_args]\n>   \n>   libdrm = dependency('libdrm', required : false)\n>   libjpeg = dependency('libjpeg', required : false)\n> @@ -49,14 +45,8 @@ if libsdl2.found()\n>       endif\n>   endif\n>   \n> -if libtiff.found()\n> -    cam_cpp_args += ['-DHAVE_TIFF']\n> -    cam_sources += files([\n> -        'dng_writer.cpp',\n> -    ])\n> -endif\n> -\n>   cam  = executable('cam', cam_sources,\n> +                  link_with : apps_lib,\n>                     dependencies : [\n>                         libatomic,\n>                         libcamera_public,\n> diff --git a/src/apps/cam/sdl_sink.cpp b/src/apps/cam/sdl_sink.cpp\n> index ee177227dbca..a2f4abc1ec8c 100644\n> --- a/src/apps/cam/sdl_sink.cpp\n> +++ b/src/apps/cam/sdl_sink.cpp\n> @@ -19,8 +19,9 @@\n>   #include <libcamera/camera.h>\n>   #include <libcamera/formats.h>\n>   \n> -#include \"event_loop.h\"\n> -#include \"image.h\"\n> +#include \"../common/event_loop.h\"\n> +#include \"../common/image.h\"\n> +\n>   #ifdef HAVE_LIBJPEG\n>   #include \"sdl_texture_mjpg.h\"\n>   #endif\n> diff --git a/src/apps/cam/sdl_texture.h b/src/apps/cam/sdl_texture.h\n> index 6ccd85eab390..3993dd46ece7 100644\n> --- a/src/apps/cam/sdl_texture.h\n> +++ b/src/apps/cam/sdl_texture.h\n> @@ -11,7 +11,7 @@\n>   \n>   #include <SDL2/SDL.h>\n>   \n> -#include \"image.h\"\n> +#include \"../common/image.h\"\n>   \n>   class SDLTexture\n>   {\n> diff --git a/src/apps/cam/dng_writer.cpp b/src/apps/common/dng_writer.cpp\n> similarity index 100%\n> rename from src/apps/cam/dng_writer.cpp\n> rename to src/apps/common/dng_writer.cpp\n> diff --git a/src/apps/cam/dng_writer.h b/src/apps/common/dng_writer.h\n> similarity index 100%\n> rename from src/apps/cam/dng_writer.h\n> rename to src/apps/common/dng_writer.h\n> diff --git a/src/apps/cam/event_loop.cpp b/src/apps/common/event_loop.cpp\n> similarity index 100%\n> rename from src/apps/cam/event_loop.cpp\n> rename to src/apps/common/event_loop.cpp\n> diff --git a/src/apps/cam/event_loop.h b/src/apps/common/event_loop.h\n> similarity index 100%\n> rename from src/apps/cam/event_loop.h\n> rename to src/apps/common/event_loop.h\n> diff --git a/src/apps/cam/image.cpp b/src/apps/common/image.cpp\n> similarity index 100%\n> rename from src/apps/cam/image.cpp\n> rename to src/apps/common/image.cpp\n> diff --git a/src/apps/cam/image.h b/src/apps/common/image.h\n> similarity index 100%\n> rename from src/apps/cam/image.h\n> rename to src/apps/common/image.h\n> diff --git a/src/apps/common/meson.build b/src/apps/common/meson.build\n> new file mode 100644\n> index 000000000000..479326cdacbf\n> --- /dev/null\n> +++ b/src/apps/common/meson.build\n> @@ -0,0 +1,26 @@\n> +# SPDX-License-Identifier: CC0-1.0\n> +\n> +apps_sources = files([\n> +    'image.cpp',\n> +    'options.cpp',\n> +    'stream_options.cpp',\n> +])\n> +\n> +apps_cpp_args = []\n> +\n> +if libevent.found()\n> +    apps_sources += files([\n> +        'event_loop.cpp',\n> +    ])\n> +endif\n> +\n> +if libtiff.found()\n> +    apps_cpp_args += ['-DHAVE_TIFF']\n> +    apps_sources += files([\n> +        'dng_writer.cpp',\n> +    ])\n> +endif\n> +\n> +apps_lib = static_library('apps', apps_sources,\n> +                          cpp_args : apps_cpp_args,\n> +                          dependencies : [libcamera_public])\n> diff --git a/src/apps/cam/options.cpp b/src/apps/common/options.cpp\n> similarity index 100%\n> rename from src/apps/cam/options.cpp\n> rename to src/apps/common/options.cpp\n> diff --git a/src/apps/cam/options.h b/src/apps/common/options.h\n> similarity index 100%\n> rename from src/apps/cam/options.h\n> rename to src/apps/common/options.h\n> diff --git a/src/apps/cam/stream_options.cpp b/src/apps/common/stream_options.cpp\n> similarity index 100%\n> rename from src/apps/cam/stream_options.cpp\n> rename to src/apps/common/stream_options.cpp\n> diff --git a/src/apps/cam/stream_options.h b/src/apps/common/stream_options.h\n> similarity index 100%\n> rename from src/apps/cam/stream_options.h\n> rename to src/apps/common/stream_options.h\n> diff --git a/src/apps/lc-compliance/main.cpp b/src/apps/lc-compliance/main.cpp\n> index 7eb52ae4c094..74e0d4df461b 100644\n> --- a/src/apps/lc-compliance/main.cpp\n> +++ b/src/apps/lc-compliance/main.cpp\n> @@ -14,8 +14,9 @@\n>   \n>   #include <libcamera/libcamera.h>\n>   \n> +#include \"../common/options.h\"\n> +\n>   #include \"environment.h\"\n> -#include \"../cam/options.h\"\n>   \n>   using namespace libcamera;\n>   \n> diff --git a/src/apps/lc-compliance/meson.build b/src/apps/lc-compliance/meson.build\n> index 05d622be0a40..51d9075ac30b 100644\n> --- a/src/apps/lc-compliance/meson.build\n> +++ b/src/apps/lc-compliance/meson.build\n> @@ -11,8 +11,6 @@ endif\n>   lc_compliance_enabled = true\n>   \n>   lc_compliance_sources = files([\n> -    '../cam/event_loop.cpp',\n> -    '../cam/options.cpp',\n>       'environment.cpp',\n>       'main.cpp',\n>       'simple_capture.cpp',\n> @@ -21,6 +19,7 @@ lc_compliance_sources = files([\n>   \n>   lc_compliance  = executable('lc-compliance', lc_compliance_sources,\n>                               cpp_args : [ '-fexceptions' ],\n> +                            link_with : apps_lib,\n>                               dependencies : [\n>                                   libatomic,\n>                                   libcamera_public,\n> diff --git a/src/apps/lc-compliance/simple_capture.h b/src/apps/lc-compliance/simple_capture.h\n> index 9d31f7cb2e53..fd9d2a97fd8d 100644\n> --- a/src/apps/lc-compliance/simple_capture.h\n> +++ b/src/apps/lc-compliance/simple_capture.h\n> @@ -11,7 +11,7 @@\n>   \n>   #include <libcamera/libcamera.h>\n>   \n> -#include \"../cam/event_loop.h\"\n> +#include \"../common/event_loop.h\"\n>   \n>   class SimpleCapture\n>   {\n> diff --git a/src/apps/meson.build b/src/apps/meson.build\n> index b722a8f110d8..099876356bd1 100644\n> --- a/src/apps/meson.build\n> +++ b/src/apps/meson.build\n> @@ -12,6 +12,8 @@ endif\n>   \n>   libtiff = dependency('libtiff-4', required : false)\n>   \n> +subdir('common')\n> +\n>   subdir('lc-compliance')\n>   \n>   subdir('cam')\n> diff --git a/src/apps/qcam/format_converter.cpp b/src/apps/qcam/format_converter.cpp\n> index 9331da0ce7a3..de76b32c7ffd 100644\n> --- a/src/apps/qcam/format_converter.cpp\n> +++ b/src/apps/qcam/format_converter.cpp\n> @@ -14,7 +14,7 @@\n>   \n>   #include <libcamera/formats.h>\n>   \n> -#include \"../cam/image.h\"\n> +#include \"../common/image.h\"\n>   \n>   #define RGBSHIFT\t\t8\n>   #ifndef MAX\n> diff --git a/src/apps/qcam/main.cpp b/src/apps/qcam/main.cpp\n> index d3f01a85f1fb..36cb93a53701 100644\n> --- a/src/apps/qcam/main.cpp\n> +++ b/src/apps/qcam/main.cpp\n> @@ -13,8 +13,9 @@\n>   \n>   #include <libcamera/camera_manager.h>\n>   \n> -#include \"../cam/options.h\"\n> -#include \"../cam/stream_options.h\"\n> +#include \"../common/options.h\"\n> +#include \"../common/stream_options.h\"\n> +\n>   #include \"main_window.h\"\n>   #include \"message_handler.h\"\n>   \n> diff --git a/src/apps/qcam/main_window.cpp b/src/apps/qcam/main_window.cpp\n> index f553ccb01805..fb2db4aad511 100644\n> --- a/src/apps/qcam/main_window.cpp\n> +++ b/src/apps/qcam/main_window.cpp\n> @@ -26,8 +26,8 @@\n>   #include <QToolButton>\n>   #include <QtDebug>\n>   \n> -#include \"../cam/dng_writer.h\"\n> -#include \"../cam/image.h\"\n> +#include \"../common/dng_writer.h\"\n> +#include \"../common/image.h\"\n>   \n>   #include \"cam_select_dialog.h\"\n>   #ifndef QT_NO_OPENGL\n> diff --git a/src/apps/qcam/main_window.h b/src/apps/qcam/main_window.h\n> index 95b64124336f..2e3e1b5c83c2 100644\n> --- a/src/apps/qcam/main_window.h\n> +++ b/src/apps/qcam/main_window.h\n> @@ -27,7 +27,7 @@\n>   #include <QQueue>\n>   #include <QTimer>\n>   \n> -#include \"../cam/stream_options.h\"\n> +#include \"../common/stream_options.h\"\n>   \n>   #include \"viewfinder.h\"\n>   \n> diff --git a/src/apps/qcam/meson.build b/src/apps/qcam/meson.build\n> index e298101e2c43..eb0712d91351 100644\n> --- a/src/apps/qcam/meson.build\n> +++ b/src/apps/qcam/meson.build\n> @@ -15,9 +15,6 @@ endif\n>   qcam_enabled = true\n>   \n>   qcam_sources = files([\n> -    '../cam/image.cpp',\n> -    '../cam/options.cpp',\n> -    '../cam/stream_options.cpp',\n>       'cam_select_dialog.cpp',\n>       'format_converter.cpp',\n>       'main.cpp',\n> @@ -36,14 +33,7 @@ qcam_resources = files([\n>       'assets/feathericons/feathericons.qrc',\n>   ])\n>   \n> -qt5_cpp_args = ['-DQT_NO_KEYWORDS']\n> -\n> -if libtiff.found()\n> -    qt5_cpp_args += ['-DHAVE_TIFF']\n> -    qcam_sources += files([\n> -        '../cam/dng_writer.cpp',\n> -    ])\n> -endif\n> +qt5_cpp_args = [apps_cpp_args, '-DQT_NO_KEYWORDS']\n>   \n>   if cxx.has_header_symbol('QOpenGLWidget', 'QOpenGLWidget',\n>                            dependencies : qt5_dep, args : '-fPIC')\n> @@ -73,6 +63,7 @@ resources = qt5.preprocess(moc_headers: qcam_moc_headers,\n>   \n>   qcam  = executable('qcam', qcam_sources, resources,\n>                      install : true,\n> +                   link_with : apps_lib,\n>                      dependencies : [\n>                          libatomic,\n>                          libcamera_public,\n> diff --git a/src/apps/qcam/viewfinder_gl.cpp b/src/apps/qcam/viewfinder_gl.cpp\n> index 38ddad58e09e..f83b99ad6272 100644\n> --- a/src/apps/qcam/viewfinder_gl.cpp\n> +++ b/src/apps/qcam/viewfinder_gl.cpp\n> @@ -16,7 +16,7 @@\n>   \n>   #include <libcamera/formats.h>\n>   \n> -#include \"../cam/image.h\"\n> +#include \"../common/image.h\"\n>   \n>   static const QList<libcamera::PixelFormat> supportedFormats{\n>   \t/* YUV - packed (single plane) */\n> diff --git a/src/apps/qcam/viewfinder_qt.cpp b/src/apps/qcam/viewfinder_qt.cpp\n> index c20fd6bc8fc2..a7482bea6afd 100644\n> --- a/src/apps/qcam/viewfinder_qt.cpp\n> +++ b/src/apps/qcam/viewfinder_qt.cpp\n> @@ -20,7 +20,7 @@\n>   #include <QPainter>\n>   #include <QtDebug>\n>   \n> -#include \"../cam/image.h\"\n> +#include \"../common/image.h\"\n>   \n>   #include \"format_converter.h\"\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id D2F60BDB16\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 24 Oct 2022 18:19:32 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 20C4762F22;\n\tMon, 24 Oct 2022 20:19:32 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 06C6A62EC6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 24 Oct 2022 20:19:31 +0200 (CEST)","from [192.168.1.103] (unknown [103.238.109.19])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id BB3AC113C;\n\tMon, 24 Oct 2022 20:19:29 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1666635572;\n\tbh=jZDxoWGYdLdv6shdeFDru66Bor8T+XxcIG4xAwT8YAs=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:\n\tFrom;\n\tb=sSCKCk2Lwf12sxQYL+Hvh9cWifHQEJ4nzcipxHtATaNr7kZCEmMh7o6i8795J3VQe\n\tyapuXYGBX5kW5oQq4DOZhhGiNtxwVCVMQwBzW+DnQoPik9di1XUHsbC6nySUQaIqXI\n\trMVPAnGIXMym6QIQffnY44ug/Dtet9XaFURTUQHrYrlbmShJC2BTMZ+I/JjTMG1DJO\n\twmC5dyZnjQONvZtvDGzW4s7i30wsCU2pfSRHkfiDR6ye4Ozp+CYzAipqWzy+wTPHhd\n\tMTvc685+fsaF8FCIkfSHfSW/7zCJyybGhyYVGz3Pz9Zp0++mASB9MWP8x1wCzWdXsV\n\tHXft52l7v+z5w==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1666635570;\n\tbh=jZDxoWGYdLdv6shdeFDru66Bor8T+XxcIG4xAwT8YAs=;\n\th=Date:Subject:To:References:From:In-Reply-To:From;\n\tb=NwpMFzH2M2NF0/emDSFdSUnk55d5voADf23hTpKQ/8jlhYJFj6p3PxX84hfZfpHVz\n\tOnxnFJpMBlpQSJjYiuknqvEhVbEADMDTmsGViO552XLcluT7xC2BO9ey5zgDhXMeeC\n\t+XVfk/R0nJ+jVUhCCFf6t34MHFP/hhqUsbINjlg8="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"NwpMFzH2\"; dkim-atps=neutral","Message-ID":"<b1523dbc-7a6b-20e3-b596-9b6897964be8@ideasonboard.com>","Date":"Mon, 24 Oct 2022 23:49:24 +0530","MIME-Version":"1.0","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101\n\tThunderbird/102.2.1","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20221020221026.28777-1-laurent.pinchart@ideasonboard.com>","Content-Language":"en-US","In-Reply-To":"<20221020221026.28777-1-laurent.pinchart@ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","Subject":"Re: [libcamera-devel] [PATCH v2] apps: Share common source between\n\tapplications","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","From":"Umang Jain via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Umang Jain <umang.jain@ideasonboard.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":25555,"web_url":"https://patchwork.libcamera.org/comment/25555/","msgid":"<166664141696.2560709.3143620718766319307@Monstersaurus>","date":"2022-10-24T19:56:56","subject":"Re: [libcamera-devel] [PATCH v2] apps: Share common source between\n\tapplications","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Laurent Pinchart via libcamera-devel (2022-10-20 23:10:26)\n> Multiple source files in the src/apps/cam/ directory are used by cam,\n> qcam and lc-compliance. They are compiled separately for each\n> application. Move them to a new src/apps/common/ directory and compile\n> them in a static library to decrease the number of compilation\n> operations.\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n> Changes since v1:\n> \n> - Move common code to src/apps/common/\n> ---\n>  src/apps/cam/camera_session.cpp             |  5 ++--\n>  src/apps/cam/camera_session.h               |  2 +-\n>  src/apps/cam/drm.cpp                        |  2 +-\n>  src/apps/cam/file_sink.cpp                  |  5 ++--\n>  src/apps/cam/main.cpp                       |  7 +++---\n>  src/apps/cam/meson.build                    | 14 ++---------\n>  src/apps/cam/sdl_sink.cpp                   |  5 ++--\n>  src/apps/cam/sdl_texture.h                  |  2 +-\n>  src/apps/{cam => common}/dng_writer.cpp     |  0\n>  src/apps/{cam => common}/dng_writer.h       |  0\n>  src/apps/{cam => common}/event_loop.cpp     |  0\n>  src/apps/{cam => common}/event_loop.h       |  0\n>  src/apps/{cam => common}/image.cpp          |  0\n>  src/apps/{cam => common}/image.h            |  0\n>  src/apps/common/meson.build                 | 26 +++++++++++++++++++++\n>  src/apps/{cam => common}/options.cpp        |  0\n>  src/apps/{cam => common}/options.h          |  0\n>  src/apps/{cam => common}/stream_options.cpp |  0\n>  src/apps/{cam => common}/stream_options.h   |  0\n>  src/apps/lc-compliance/main.cpp             |  3 ++-\n>  src/apps/lc-compliance/meson.build          |  3 +--\n>  src/apps/lc-compliance/simple_capture.h     |  2 +-\n>  src/apps/meson.build                        |  2 ++\n>  src/apps/qcam/format_converter.cpp          |  2 +-\n>  src/apps/qcam/main.cpp                      |  5 ++--\n>  src/apps/qcam/main_window.cpp               |  4 ++--\n>  src/apps/qcam/main_window.h                 |  2 +-\n>  src/apps/qcam/meson.build                   | 13 ++---------\n>  src/apps/qcam/viewfinder_gl.cpp             |  2 +-\n>  src/apps/qcam/viewfinder_qt.cpp             |  2 +-\n>  30 files changed, 61 insertions(+), 47 deletions(-)\n>  rename src/apps/{cam => common}/dng_writer.cpp (100%)\n>  rename src/apps/{cam => common}/dng_writer.h (100%)\n>  rename src/apps/{cam => common}/event_loop.cpp (100%)\n>  rename src/apps/{cam => common}/event_loop.h (100%)\n>  rename src/apps/{cam => common}/image.cpp (100%)\n>  rename src/apps/{cam => common}/image.h (100%)\n>  create mode 100644 src/apps/common/meson.build\n>  rename src/apps/{cam => common}/options.cpp (100%)\n>  rename src/apps/{cam => common}/options.h (100%)\n>  rename src/apps/{cam => common}/stream_options.cpp (100%)\n>  rename src/apps/{cam => common}/stream_options.h (100%)\n> \n> diff --git a/src/apps/cam/camera_session.cpp b/src/apps/cam/camera_session.cpp\n> index 6b409c983b86..8fcec6304d66 100644\n> --- a/src/apps/cam/camera_session.cpp\n> +++ b/src/apps/cam/camera_session.cpp\n> @@ -13,9 +13,11 @@\n>  #include <libcamera/control_ids.h>\n>  #include <libcamera/property_ids.h>\n>  \n> +#include \"../common/event_loop.h\"\n> +#include \"../common/stream_options.h\"\n> +\n\nI still dislike the includes from a relative parent path.\n\nIs it possible to fix with the dependency or static library apps_lib\nobject? Or just something you didn't want to do?\n\n\nAnyway, with or without that, grouping this makes sense.\n\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n>  #include \"camera_session.h\"\n>  #include \"capture_script.h\"\n> -#include \"event_loop.h\"\n>  #include \"file_sink.h\"\n>  #ifdef HAVE_KMS\n>  #include \"kms_sink.h\"\n> @@ -24,7 +26,6 @@\n>  #ifdef HAVE_SDL\n>  #include \"sdl_sink.h\"\n>  #endif\n> -#include \"stream_options.h\"\n>  \n>  using namespace libcamera;\n>  \n> diff --git a/src/apps/cam/camera_session.h b/src/apps/cam/camera_session.h\n> index d562caae0794..0bab519f9efd 100644\n> --- a/src/apps/cam/camera_session.h\n> +++ b/src/apps/cam/camera_session.h\n> @@ -21,7 +21,7 @@\n>  #include <libcamera/request.h>\n>  #include <libcamera/stream.h>\n>  \n> -#include \"options.h\"\n> +#include \"../common/options.h\"\n>  \n>  class CaptureScript;\n>  class FrameSink;\n> diff --git a/src/apps/cam/drm.cpp b/src/apps/cam/drm.cpp\n> index 2e4d7985245d..8779a7137f80 100644\n> --- a/src/apps/cam/drm.cpp\n> +++ b/src/apps/cam/drm.cpp\n> @@ -24,7 +24,7 @@\n>  \n>  #include <libdrm/drm_mode.h>\n>  \n> -#include \"event_loop.h\"\n> +#include \"../common/event_loop.h\"\n>  \n>  namespace DRM {\n>  \n> diff --git a/src/apps/cam/file_sink.cpp b/src/apps/cam/file_sink.cpp\n> index 9d60c04e1cf4..4525fbada7c4 100644\n> --- a/src/apps/cam/file_sink.cpp\n> +++ b/src/apps/cam/file_sink.cpp\n> @@ -15,9 +15,10 @@\n>  \n>  #include <libcamera/camera.h>\n>  \n> -#include \"dng_writer.h\"\n> +#include \"../common/dng_writer.h\"\n> +#include \"../common/image.h\"\n> +\n>  #include \"file_sink.h\"\n> -#include \"image.h\"\n>  \n>  using namespace libcamera;\n>  \n> diff --git a/src/apps/cam/main.cpp b/src/apps/cam/main.cpp\n> index d70130e2ab81..5d8a57bc14e5 100644\n> --- a/src/apps/cam/main.cpp\n> +++ b/src/apps/cam/main.cpp\n> @@ -14,11 +14,12 @@\n>  #include <libcamera/libcamera.h>\n>  #include <libcamera/property_ids.h>\n>  \n> +#include \"../common/event_loop.h\"\n> +#include \"../common/options.h\"\n> +#include \"../common/stream_options.h\"\n> +\n>  #include \"camera_session.h\"\n> -#include \"event_loop.h\"\n>  #include \"main.h\"\n> -#include \"options.h\"\n> -#include \"stream_options.h\"\n>  \n>  using namespace libcamera;\n>  \n> diff --git a/src/apps/cam/meson.build b/src/apps/cam/meson.build\n> index 297de64fbdd9..48c834ace71b 100644\n> --- a/src/apps/cam/meson.build\n> +++ b/src/apps/cam/meson.build\n> @@ -10,16 +10,12 @@ cam_enabled = true\n>  cam_sources = files([\n>      'camera_session.cpp',\n>      'capture_script.cpp',\n> -    'event_loop.cpp',\n>      'file_sink.cpp',\n>      'frame_sink.cpp',\n> -    'image.cpp',\n>      'main.cpp',\n> -    'options.cpp',\n> -    'stream_options.cpp',\n>  ])\n>  \n> -cam_cpp_args = []\n> +cam_cpp_args = [apps_cpp_args]\n>  \n>  libdrm = dependency('libdrm', required : false)\n>  libjpeg = dependency('libjpeg', required : false)\n> @@ -49,14 +45,8 @@ if libsdl2.found()\n>      endif\n>  endif\n>  \n> -if libtiff.found()\n> -    cam_cpp_args += ['-DHAVE_TIFF']\n> -    cam_sources += files([\n> -        'dng_writer.cpp',\n> -    ])\n> -endif\n> -\n>  cam  = executable('cam', cam_sources,\n> +                  link_with : apps_lib,\n>                    dependencies : [\n>                        libatomic,\n>                        libcamera_public,\n> diff --git a/src/apps/cam/sdl_sink.cpp b/src/apps/cam/sdl_sink.cpp\n> index ee177227dbca..a2f4abc1ec8c 100644\n> --- a/src/apps/cam/sdl_sink.cpp\n> +++ b/src/apps/cam/sdl_sink.cpp\n> @@ -19,8 +19,9 @@\n>  #include <libcamera/camera.h>\n>  #include <libcamera/formats.h>\n>  \n> -#include \"event_loop.h\"\n> -#include \"image.h\"\n> +#include \"../common/event_loop.h\"\n> +#include \"../common/image.h\"\n> +\n>  #ifdef HAVE_LIBJPEG\n>  #include \"sdl_texture_mjpg.h\"\n>  #endif\n> diff --git a/src/apps/cam/sdl_texture.h b/src/apps/cam/sdl_texture.h\n> index 6ccd85eab390..3993dd46ece7 100644\n> --- a/src/apps/cam/sdl_texture.h\n> +++ b/src/apps/cam/sdl_texture.h\n> @@ -11,7 +11,7 @@\n>  \n>  #include <SDL2/SDL.h>\n>  \n> -#include \"image.h\"\n> +#include \"../common/image.h\"\n>  \n>  class SDLTexture\n>  {\n> diff --git a/src/apps/cam/dng_writer.cpp b/src/apps/common/dng_writer.cpp\n> similarity index 100%\n> rename from src/apps/cam/dng_writer.cpp\n> rename to src/apps/common/dng_writer.cpp\n> diff --git a/src/apps/cam/dng_writer.h b/src/apps/common/dng_writer.h\n> similarity index 100%\n> rename from src/apps/cam/dng_writer.h\n> rename to src/apps/common/dng_writer.h\n> diff --git a/src/apps/cam/event_loop.cpp b/src/apps/common/event_loop.cpp\n> similarity index 100%\n> rename from src/apps/cam/event_loop.cpp\n> rename to src/apps/common/event_loop.cpp\n> diff --git a/src/apps/cam/event_loop.h b/src/apps/common/event_loop.h\n> similarity index 100%\n> rename from src/apps/cam/event_loop.h\n> rename to src/apps/common/event_loop.h\n> diff --git a/src/apps/cam/image.cpp b/src/apps/common/image.cpp\n> similarity index 100%\n> rename from src/apps/cam/image.cpp\n> rename to src/apps/common/image.cpp\n> diff --git a/src/apps/cam/image.h b/src/apps/common/image.h\n> similarity index 100%\n> rename from src/apps/cam/image.h\n> rename to src/apps/common/image.h\n> diff --git a/src/apps/common/meson.build b/src/apps/common/meson.build\n> new file mode 100644\n> index 000000000000..479326cdacbf\n> --- /dev/null\n> +++ b/src/apps/common/meson.build\n> @@ -0,0 +1,26 @@\n> +# SPDX-License-Identifier: CC0-1.0\n> +\n> +apps_sources = files([\n> +    'image.cpp',\n> +    'options.cpp',\n> +    'stream_options.cpp',\n> +])\n> +\n> +apps_cpp_args = []\n> +\n> +if libevent.found()\n> +    apps_sources += files([\n> +        'event_loop.cpp',\n> +    ])\n> +endif\n> +\n> +if libtiff.found()\n> +    apps_cpp_args += ['-DHAVE_TIFF']\n> +    apps_sources += files([\n> +        'dng_writer.cpp',\n> +    ])\n> +endif\n> +\n> +apps_lib = static_library('apps', apps_sources,\n> +                          cpp_args : apps_cpp_args,\n> +                          dependencies : [libcamera_public])\n> diff --git a/src/apps/cam/options.cpp b/src/apps/common/options.cpp\n> similarity index 100%\n> rename from src/apps/cam/options.cpp\n> rename to src/apps/common/options.cpp\n> diff --git a/src/apps/cam/options.h b/src/apps/common/options.h\n> similarity index 100%\n> rename from src/apps/cam/options.h\n> rename to src/apps/common/options.h\n> diff --git a/src/apps/cam/stream_options.cpp b/src/apps/common/stream_options.cpp\n> similarity index 100%\n> rename from src/apps/cam/stream_options.cpp\n> rename to src/apps/common/stream_options.cpp\n> diff --git a/src/apps/cam/stream_options.h b/src/apps/common/stream_options.h\n> similarity index 100%\n> rename from src/apps/cam/stream_options.h\n> rename to src/apps/common/stream_options.h\n> diff --git a/src/apps/lc-compliance/main.cpp b/src/apps/lc-compliance/main.cpp\n> index 7eb52ae4c094..74e0d4df461b 100644\n> --- a/src/apps/lc-compliance/main.cpp\n> +++ b/src/apps/lc-compliance/main.cpp\n> @@ -14,8 +14,9 @@\n>  \n>  #include <libcamera/libcamera.h>\n>  \n> +#include \"../common/options.h\"\n> +\n>  #include \"environment.h\"\n> -#include \"../cam/options.h\"\n>  \n>  using namespace libcamera;\n>  \n> diff --git a/src/apps/lc-compliance/meson.build b/src/apps/lc-compliance/meson.build\n> index 05d622be0a40..51d9075ac30b 100644\n> --- a/src/apps/lc-compliance/meson.build\n> +++ b/src/apps/lc-compliance/meson.build\n> @@ -11,8 +11,6 @@ endif\n>  lc_compliance_enabled = true\n>  \n>  lc_compliance_sources = files([\n> -    '../cam/event_loop.cpp',\n> -    '../cam/options.cpp',\n>      'environment.cpp',\n>      'main.cpp',\n>      'simple_capture.cpp',\n> @@ -21,6 +19,7 @@ lc_compliance_sources = files([\n>  \n>  lc_compliance  = executable('lc-compliance', lc_compliance_sources,\n>                              cpp_args : [ '-fexceptions' ],\n> +                            link_with : apps_lib,\n>                              dependencies : [\n>                                  libatomic,\n>                                  libcamera_public,\n> diff --git a/src/apps/lc-compliance/simple_capture.h b/src/apps/lc-compliance/simple_capture.h\n> index 9d31f7cb2e53..fd9d2a97fd8d 100644\n> --- a/src/apps/lc-compliance/simple_capture.h\n> +++ b/src/apps/lc-compliance/simple_capture.h\n> @@ -11,7 +11,7 @@\n>  \n>  #include <libcamera/libcamera.h>\n>  \n> -#include \"../cam/event_loop.h\"\n> +#include \"../common/event_loop.h\"\n>  \n>  class SimpleCapture\n>  {\n> diff --git a/src/apps/meson.build b/src/apps/meson.build\n> index b722a8f110d8..099876356bd1 100644\n> --- a/src/apps/meson.build\n> +++ b/src/apps/meson.build\n> @@ -12,6 +12,8 @@ endif\n>  \n>  libtiff = dependency('libtiff-4', required : false)\n>  \n> +subdir('common')\n> +\n>  subdir('lc-compliance')\n>  \n>  subdir('cam')\n> diff --git a/src/apps/qcam/format_converter.cpp b/src/apps/qcam/format_converter.cpp\n> index 9331da0ce7a3..de76b32c7ffd 100644\n> --- a/src/apps/qcam/format_converter.cpp\n> +++ b/src/apps/qcam/format_converter.cpp\n> @@ -14,7 +14,7 @@\n>  \n>  #include <libcamera/formats.h>\n>  \n> -#include \"../cam/image.h\"\n> +#include \"../common/image.h\"\n>  \n>  #define RGBSHIFT               8\n>  #ifndef MAX\n> diff --git a/src/apps/qcam/main.cpp b/src/apps/qcam/main.cpp\n> index d3f01a85f1fb..36cb93a53701 100644\n> --- a/src/apps/qcam/main.cpp\n> +++ b/src/apps/qcam/main.cpp\n> @@ -13,8 +13,9 @@\n>  \n>  #include <libcamera/camera_manager.h>\n>  \n> -#include \"../cam/options.h\"\n> -#include \"../cam/stream_options.h\"\n> +#include \"../common/options.h\"\n> +#include \"../common/stream_options.h\"\n> +\n>  #include \"main_window.h\"\n>  #include \"message_handler.h\"\n>  \n> diff --git a/src/apps/qcam/main_window.cpp b/src/apps/qcam/main_window.cpp\n> index f553ccb01805..fb2db4aad511 100644\n> --- a/src/apps/qcam/main_window.cpp\n> +++ b/src/apps/qcam/main_window.cpp\n> @@ -26,8 +26,8 @@\n>  #include <QToolButton>\n>  #include <QtDebug>\n>  \n> -#include \"../cam/dng_writer.h\"\n> -#include \"../cam/image.h\"\n> +#include \"../common/dng_writer.h\"\n> +#include \"../common/image.h\"\n>  \n>  #include \"cam_select_dialog.h\"\n>  #ifndef QT_NO_OPENGL\n> diff --git a/src/apps/qcam/main_window.h b/src/apps/qcam/main_window.h\n> index 95b64124336f..2e3e1b5c83c2 100644\n> --- a/src/apps/qcam/main_window.h\n> +++ b/src/apps/qcam/main_window.h\n> @@ -27,7 +27,7 @@\n>  #include <QQueue>\n>  #include <QTimer>\n>  \n> -#include \"../cam/stream_options.h\"\n> +#include \"../common/stream_options.h\"\n>  \n>  #include \"viewfinder.h\"\n>  \n> diff --git a/src/apps/qcam/meson.build b/src/apps/qcam/meson.build\n> index e298101e2c43..eb0712d91351 100644\n> --- a/src/apps/qcam/meson.build\n> +++ b/src/apps/qcam/meson.build\n> @@ -15,9 +15,6 @@ endif\n>  qcam_enabled = true\n>  \n>  qcam_sources = files([\n> -    '../cam/image.cpp',\n> -    '../cam/options.cpp',\n> -    '../cam/stream_options.cpp',\n>      'cam_select_dialog.cpp',\n>      'format_converter.cpp',\n>      'main.cpp',\n> @@ -36,14 +33,7 @@ qcam_resources = files([\n>      'assets/feathericons/feathericons.qrc',\n>  ])\n>  \n> -qt5_cpp_args = ['-DQT_NO_KEYWORDS']\n> -\n> -if libtiff.found()\n> -    qt5_cpp_args += ['-DHAVE_TIFF']\n> -    qcam_sources += files([\n> -        '../cam/dng_writer.cpp',\n> -    ])\n> -endif\n> +qt5_cpp_args = [apps_cpp_args, '-DQT_NO_KEYWORDS']\n>  \n>  if cxx.has_header_symbol('QOpenGLWidget', 'QOpenGLWidget',\n>                           dependencies : qt5_dep, args : '-fPIC')\n> @@ -73,6 +63,7 @@ resources = qt5.preprocess(moc_headers: qcam_moc_headers,\n>  \n>  qcam  = executable('qcam', qcam_sources, resources,\n>                     install : true,\n> +                   link_with : apps_lib,\n>                     dependencies : [\n>                         libatomic,\n>                         libcamera_public,\n> diff --git a/src/apps/qcam/viewfinder_gl.cpp b/src/apps/qcam/viewfinder_gl.cpp\n> index 38ddad58e09e..f83b99ad6272 100644\n> --- a/src/apps/qcam/viewfinder_gl.cpp\n> +++ b/src/apps/qcam/viewfinder_gl.cpp\n> @@ -16,7 +16,7 @@\n>  \n>  #include <libcamera/formats.h>\n>  \n> -#include \"../cam/image.h\"\n> +#include \"../common/image.h\"\n>  \n>  static const QList<libcamera::PixelFormat> supportedFormats{\n>         /* YUV - packed (single plane) */\n> diff --git a/src/apps/qcam/viewfinder_qt.cpp b/src/apps/qcam/viewfinder_qt.cpp\n> index c20fd6bc8fc2..a7482bea6afd 100644\n> --- a/src/apps/qcam/viewfinder_qt.cpp\n> +++ b/src/apps/qcam/viewfinder_qt.cpp\n> @@ -20,7 +20,7 @@\n>  #include <QPainter>\n>  #include <QtDebug>\n>  \n> -#include \"../cam/image.h\"\n> +#include \"../common/image.h\"\n>  \n>  #include \"format_converter.h\"\n>  \n> -- \n> Regards,\n> \n> Laurent Pinchart\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 8ED1EBD16B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 24 Oct 2022 19:57:02 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id D799462F22;\n\tMon, 24 Oct 2022 21:57:01 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 79DE162EC6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 24 Oct 2022 21:57:00 +0200 (CEST)","from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id B1EB71752;\n\tMon, 24 Oct 2022 21:56:59 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1666641421;\n\tbh=7zLALsaV5QX7To7hKt/QT4/hCW45dwfQlaCCvYPRMlg=;\n\th=In-Reply-To:References:To:Date:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:\n\tFrom;\n\tb=qnlFcQOqOFQ0LJ5Of4SWFJPFVjTyqomzWiIbqQVoYi8MgmatLsWrecWmTnEE6pGgx\n\thvn1EDLMWpx4b82QElEbqzr9wcg6OHJ9zUDk9XtlvAn4S2sEMGapb10i7dSGpHnoLS\n\t/gzU39SS5x75OwYdpmlGyW7Ev9Afvkh+zS0JTloIan4eqECRkIFlIsreGNa86PIoAk\n\ttF7WN2AxNwnNVemUw6h8r/oXUsSmReJp7EbFDROqUONxueiDGdL5BSkwR8N3J1m4my\n\t/kHxqYyQDR1bQD0HI41ZWsRD5N1Y9RVEpPNmgoP1tDNMFrrK2bZY6dwQg9dD1akgOs\n\t1sxIhYQV1X+Uw==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1666641419;\n\tbh=7zLALsaV5QX7To7hKt/QT4/hCW45dwfQlaCCvYPRMlg=;\n\th=In-Reply-To:References:Subject:From:To:Date:From;\n\tb=tt76OkzCUcH0mCB9V1v85Y5ThNyXLE34omOfee4wsJsPSu/MFShcQyJDz+2dL08Ey\n\t+uMmw64C8OgmP0nQZcpAvGir2t2hzp5EIOVuv9wP/M85/tpkiJpjhQUco7l2hR9zBl\n\tg7U6EEb+LgGXt0aXBhk8Ec/NBoTehTItkDxbhRUk="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"tt76OkzC\"; dkim-atps=neutral","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20221020221026.28777-1-laurent.pinchart@ideasonboard.com>","References":"<20221020221026.28777-1-laurent.pinchart@ideasonboard.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Mon, 24 Oct 2022 20:56:56 +0100","Message-ID":"<166664141696.2560709.3143620718766319307@Monstersaurus>","User-Agent":"alot/0.10","Subject":"Re: [libcamera-devel] [PATCH v2] apps: Share common source between\n\tapplications","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","From":"Kieran Bingham via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":25556,"web_url":"https://patchwork.libcamera.org/comment/25556/","msgid":"<Y1bxdm1PRDz4yWbI@pendragon.ideasonboard.com>","date":"2022-10-24T20:11:34","subject":"Re: [libcamera-devel] [PATCH v2] apps: Share common source between\n\tapplications","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Kieran,\n\nOn Mon, Oct 24, 2022 at 08:56:56PM +0100, Kieran Bingham wrote:\n> Quoting Laurent Pinchart via libcamera-devel (2022-10-20 23:10:26)\n> > Multiple source files in the src/apps/cam/ directory are used by cam,\n> > qcam and lc-compliance. They are compiled separately for each\n> > application. Move them to a new src/apps/common/ directory and compile\n> > them in a static library to decrease the number of compilation\n> > operations.\n> > \n> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > ---\n> > Changes since v1:\n> > \n> > - Move common code to src/apps/common/\n> > ---\n> >  src/apps/cam/camera_session.cpp             |  5 ++--\n> >  src/apps/cam/camera_session.h               |  2 +-\n> >  src/apps/cam/drm.cpp                        |  2 +-\n> >  src/apps/cam/file_sink.cpp                  |  5 ++--\n> >  src/apps/cam/main.cpp                       |  7 +++---\n> >  src/apps/cam/meson.build                    | 14 ++---------\n> >  src/apps/cam/sdl_sink.cpp                   |  5 ++--\n> >  src/apps/cam/sdl_texture.h                  |  2 +-\n> >  src/apps/{cam => common}/dng_writer.cpp     |  0\n> >  src/apps/{cam => common}/dng_writer.h       |  0\n> >  src/apps/{cam => common}/event_loop.cpp     |  0\n> >  src/apps/{cam => common}/event_loop.h       |  0\n> >  src/apps/{cam => common}/image.cpp          |  0\n> >  src/apps/{cam => common}/image.h            |  0\n> >  src/apps/common/meson.build                 | 26 +++++++++++++++++++++\n> >  src/apps/{cam => common}/options.cpp        |  0\n> >  src/apps/{cam => common}/options.h          |  0\n> >  src/apps/{cam => common}/stream_options.cpp |  0\n> >  src/apps/{cam => common}/stream_options.h   |  0\n> >  src/apps/lc-compliance/main.cpp             |  3 ++-\n> >  src/apps/lc-compliance/meson.build          |  3 +--\n> >  src/apps/lc-compliance/simple_capture.h     |  2 +-\n> >  src/apps/meson.build                        |  2 ++\n> >  src/apps/qcam/format_converter.cpp          |  2 +-\n> >  src/apps/qcam/main.cpp                      |  5 ++--\n> >  src/apps/qcam/main_window.cpp               |  4 ++--\n> >  src/apps/qcam/main_window.h                 |  2 +-\n> >  src/apps/qcam/meson.build                   | 13 ++---------\n> >  src/apps/qcam/viewfinder_gl.cpp             |  2 +-\n> >  src/apps/qcam/viewfinder_qt.cpp             |  2 +-\n> >  30 files changed, 61 insertions(+), 47 deletions(-)\n> >  rename src/apps/{cam => common}/dng_writer.cpp (100%)\n> >  rename src/apps/{cam => common}/dng_writer.h (100%)\n> >  rename src/apps/{cam => common}/event_loop.cpp (100%)\n> >  rename src/apps/{cam => common}/event_loop.h (100%)\n> >  rename src/apps/{cam => common}/image.cpp (100%)\n> >  rename src/apps/{cam => common}/image.h (100%)\n> >  create mode 100644 src/apps/common/meson.build\n> >  rename src/apps/{cam => common}/options.cpp (100%)\n> >  rename src/apps/{cam => common}/options.h (100%)\n> >  rename src/apps/{cam => common}/stream_options.cpp (100%)\n> >  rename src/apps/{cam => common}/stream_options.h (100%)\n> > \n> > diff --git a/src/apps/cam/camera_session.cpp b/src/apps/cam/camera_session.cpp\n> > index 6b409c983b86..8fcec6304d66 100644\n> > --- a/src/apps/cam/camera_session.cpp\n> > +++ b/src/apps/cam/camera_session.cpp\n> > @@ -13,9 +13,11 @@\n> >  #include <libcamera/control_ids.h>\n> >  #include <libcamera/property_ids.h>\n> >  \n> > +#include \"../common/event_loop.h\"\n> > +#include \"../common/stream_options.h\"\n> > +\n> \n> I still dislike the includes from a relative parent path.\n> \n> Is it possible to fix with the dependency or static library apps_lib\n> object? Or just something you didn't want to do?\n\nI thought about it. It would involve -I, #include <...>, and the risk of\nconflict with system includes. I think it's still a good idea, but I\ndidn't want to explore that rabbit hole right now. If someone wants to\nsend a patch on top, I'll be happy to review it :-)\n\n> Anyway, with or without that, grouping this makes sense.\n> \n> \n> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> \n> >  #include \"camera_session.h\"\n> >  #include \"capture_script.h\"\n> > -#include \"event_loop.h\"\n> >  #include \"file_sink.h\"\n> >  #ifdef HAVE_KMS\n> >  #include \"kms_sink.h\"\n> > @@ -24,7 +26,6 @@\n> >  #ifdef HAVE_SDL\n> >  #include \"sdl_sink.h\"\n> >  #endif\n> > -#include \"stream_options.h\"\n> >  \n> >  using namespace libcamera;\n> >  \n> > diff --git a/src/apps/cam/camera_session.h b/src/apps/cam/camera_session.h\n> > index d562caae0794..0bab519f9efd 100644\n> > --- a/src/apps/cam/camera_session.h\n> > +++ b/src/apps/cam/camera_session.h\n> > @@ -21,7 +21,7 @@\n> >  #include <libcamera/request.h>\n> >  #include <libcamera/stream.h>\n> >  \n> > -#include \"options.h\"\n> > +#include \"../common/options.h\"\n> >  \n> >  class CaptureScript;\n> >  class FrameSink;\n> > diff --git a/src/apps/cam/drm.cpp b/src/apps/cam/drm.cpp\n> > index 2e4d7985245d..8779a7137f80 100644\n> > --- a/src/apps/cam/drm.cpp\n> > +++ b/src/apps/cam/drm.cpp\n> > @@ -24,7 +24,7 @@\n> >  \n> >  #include <libdrm/drm_mode.h>\n> >  \n> > -#include \"event_loop.h\"\n> > +#include \"../common/event_loop.h\"\n> >  \n> >  namespace DRM {\n> >  \n> > diff --git a/src/apps/cam/file_sink.cpp b/src/apps/cam/file_sink.cpp\n> > index 9d60c04e1cf4..4525fbada7c4 100644\n> > --- a/src/apps/cam/file_sink.cpp\n> > +++ b/src/apps/cam/file_sink.cpp\n> > @@ -15,9 +15,10 @@\n> >  \n> >  #include <libcamera/camera.h>\n> >  \n> > -#include \"dng_writer.h\"\n> > +#include \"../common/dng_writer.h\"\n> > +#include \"../common/image.h\"\n> > +\n> >  #include \"file_sink.h\"\n> > -#include \"image.h\"\n> >  \n> >  using namespace libcamera;\n> >  \n> > diff --git a/src/apps/cam/main.cpp b/src/apps/cam/main.cpp\n> > index d70130e2ab81..5d8a57bc14e5 100644\n> > --- a/src/apps/cam/main.cpp\n> > +++ b/src/apps/cam/main.cpp\n> > @@ -14,11 +14,12 @@\n> >  #include <libcamera/libcamera.h>\n> >  #include <libcamera/property_ids.h>\n> >  \n> > +#include \"../common/event_loop.h\"\n> > +#include \"../common/options.h\"\n> > +#include \"../common/stream_options.h\"\n> > +\n> >  #include \"camera_session.h\"\n> > -#include \"event_loop.h\"\n> >  #include \"main.h\"\n> > -#include \"options.h\"\n> > -#include \"stream_options.h\"\n> >  \n> >  using namespace libcamera;\n> >  \n> > diff --git a/src/apps/cam/meson.build b/src/apps/cam/meson.build\n> > index 297de64fbdd9..48c834ace71b 100644\n> > --- a/src/apps/cam/meson.build\n> > +++ b/src/apps/cam/meson.build\n> > @@ -10,16 +10,12 @@ cam_enabled = true\n> >  cam_sources = files([\n> >      'camera_session.cpp',\n> >      'capture_script.cpp',\n> > -    'event_loop.cpp',\n> >      'file_sink.cpp',\n> >      'frame_sink.cpp',\n> > -    'image.cpp',\n> >      'main.cpp',\n> > -    'options.cpp',\n> > -    'stream_options.cpp',\n> >  ])\n> >  \n> > -cam_cpp_args = []\n> > +cam_cpp_args = [apps_cpp_args]\n> >  \n> >  libdrm = dependency('libdrm', required : false)\n> >  libjpeg = dependency('libjpeg', required : false)\n> > @@ -49,14 +45,8 @@ if libsdl2.found()\n> >      endif\n> >  endif\n> >  \n> > -if libtiff.found()\n> > -    cam_cpp_args += ['-DHAVE_TIFF']\n> > -    cam_sources += files([\n> > -        'dng_writer.cpp',\n> > -    ])\n> > -endif\n> > -\n> >  cam  = executable('cam', cam_sources,\n> > +                  link_with : apps_lib,\n> >                    dependencies : [\n> >                        libatomic,\n> >                        libcamera_public,\n> > diff --git a/src/apps/cam/sdl_sink.cpp b/src/apps/cam/sdl_sink.cpp\n> > index ee177227dbca..a2f4abc1ec8c 100644\n> > --- a/src/apps/cam/sdl_sink.cpp\n> > +++ b/src/apps/cam/sdl_sink.cpp\n> > @@ -19,8 +19,9 @@\n> >  #include <libcamera/camera.h>\n> >  #include <libcamera/formats.h>\n> >  \n> > -#include \"event_loop.h\"\n> > -#include \"image.h\"\n> > +#include \"../common/event_loop.h\"\n> > +#include \"../common/image.h\"\n> > +\n> >  #ifdef HAVE_LIBJPEG\n> >  #include \"sdl_texture_mjpg.h\"\n> >  #endif\n> > diff --git a/src/apps/cam/sdl_texture.h b/src/apps/cam/sdl_texture.h\n> > index 6ccd85eab390..3993dd46ece7 100644\n> > --- a/src/apps/cam/sdl_texture.h\n> > +++ b/src/apps/cam/sdl_texture.h\n> > @@ -11,7 +11,7 @@\n> >  \n> >  #include <SDL2/SDL.h>\n> >  \n> > -#include \"image.h\"\n> > +#include \"../common/image.h\"\n> >  \n> >  class SDLTexture\n> >  {\n> > diff --git a/src/apps/cam/dng_writer.cpp b/src/apps/common/dng_writer.cpp\n> > similarity index 100%\n> > rename from src/apps/cam/dng_writer.cpp\n> > rename to src/apps/common/dng_writer.cpp\n> > diff --git a/src/apps/cam/dng_writer.h b/src/apps/common/dng_writer.h\n> > similarity index 100%\n> > rename from src/apps/cam/dng_writer.h\n> > rename to src/apps/common/dng_writer.h\n> > diff --git a/src/apps/cam/event_loop.cpp b/src/apps/common/event_loop.cpp\n> > similarity index 100%\n> > rename from src/apps/cam/event_loop.cpp\n> > rename to src/apps/common/event_loop.cpp\n> > diff --git a/src/apps/cam/event_loop.h b/src/apps/common/event_loop.h\n> > similarity index 100%\n> > rename from src/apps/cam/event_loop.h\n> > rename to src/apps/common/event_loop.h\n> > diff --git a/src/apps/cam/image.cpp b/src/apps/common/image.cpp\n> > similarity index 100%\n> > rename from src/apps/cam/image.cpp\n> > rename to src/apps/common/image.cpp\n> > diff --git a/src/apps/cam/image.h b/src/apps/common/image.h\n> > similarity index 100%\n> > rename from src/apps/cam/image.h\n> > rename to src/apps/common/image.h\n> > diff --git a/src/apps/common/meson.build b/src/apps/common/meson.build\n> > new file mode 100644\n> > index 000000000000..479326cdacbf\n> > --- /dev/null\n> > +++ b/src/apps/common/meson.build\n> > @@ -0,0 +1,26 @@\n> > +# SPDX-License-Identifier: CC0-1.0\n> > +\n> > +apps_sources = files([\n> > +    'image.cpp',\n> > +    'options.cpp',\n> > +    'stream_options.cpp',\n> > +])\n> > +\n> > +apps_cpp_args = []\n> > +\n> > +if libevent.found()\n> > +    apps_sources += files([\n> > +        'event_loop.cpp',\n> > +    ])\n> > +endif\n> > +\n> > +if libtiff.found()\n> > +    apps_cpp_args += ['-DHAVE_TIFF']\n> > +    apps_sources += files([\n> > +        'dng_writer.cpp',\n> > +    ])\n> > +endif\n> > +\n> > +apps_lib = static_library('apps', apps_sources,\n> > +                          cpp_args : apps_cpp_args,\n> > +                          dependencies : [libcamera_public])\n> > diff --git a/src/apps/cam/options.cpp b/src/apps/common/options.cpp\n> > similarity index 100%\n> > rename from src/apps/cam/options.cpp\n> > rename to src/apps/common/options.cpp\n> > diff --git a/src/apps/cam/options.h b/src/apps/common/options.h\n> > similarity index 100%\n> > rename from src/apps/cam/options.h\n> > rename to src/apps/common/options.h\n> > diff --git a/src/apps/cam/stream_options.cpp b/src/apps/common/stream_options.cpp\n> > similarity index 100%\n> > rename from src/apps/cam/stream_options.cpp\n> > rename to src/apps/common/stream_options.cpp\n> > diff --git a/src/apps/cam/stream_options.h b/src/apps/common/stream_options.h\n> > similarity index 100%\n> > rename from src/apps/cam/stream_options.h\n> > rename to src/apps/common/stream_options.h\n> > diff --git a/src/apps/lc-compliance/main.cpp b/src/apps/lc-compliance/main.cpp\n> > index 7eb52ae4c094..74e0d4df461b 100644\n> > --- a/src/apps/lc-compliance/main.cpp\n> > +++ b/src/apps/lc-compliance/main.cpp\n> > @@ -14,8 +14,9 @@\n> >  \n> >  #include <libcamera/libcamera.h>\n> >  \n> > +#include \"../common/options.h\"\n> > +\n> >  #include \"environment.h\"\n> > -#include \"../cam/options.h\"\n> >  \n> >  using namespace libcamera;\n> >  \n> > diff --git a/src/apps/lc-compliance/meson.build b/src/apps/lc-compliance/meson.build\n> > index 05d622be0a40..51d9075ac30b 100644\n> > --- a/src/apps/lc-compliance/meson.build\n> > +++ b/src/apps/lc-compliance/meson.build\n> > @@ -11,8 +11,6 @@ endif\n> >  lc_compliance_enabled = true\n> >  \n> >  lc_compliance_sources = files([\n> > -    '../cam/event_loop.cpp',\n> > -    '../cam/options.cpp',\n> >      'environment.cpp',\n> >      'main.cpp',\n> >      'simple_capture.cpp',\n> > @@ -21,6 +19,7 @@ lc_compliance_sources = files([\n> >  \n> >  lc_compliance  = executable('lc-compliance', lc_compliance_sources,\n> >                              cpp_args : [ '-fexceptions' ],\n> > +                            link_with : apps_lib,\n> >                              dependencies : [\n> >                                  libatomic,\n> >                                  libcamera_public,\n> > diff --git a/src/apps/lc-compliance/simple_capture.h b/src/apps/lc-compliance/simple_capture.h\n> > index 9d31f7cb2e53..fd9d2a97fd8d 100644\n> > --- a/src/apps/lc-compliance/simple_capture.h\n> > +++ b/src/apps/lc-compliance/simple_capture.h\n> > @@ -11,7 +11,7 @@\n> >  \n> >  #include <libcamera/libcamera.h>\n> >  \n> > -#include \"../cam/event_loop.h\"\n> > +#include \"../common/event_loop.h\"\n> >  \n> >  class SimpleCapture\n> >  {\n> > diff --git a/src/apps/meson.build b/src/apps/meson.build\n> > index b722a8f110d8..099876356bd1 100644\n> > --- a/src/apps/meson.build\n> > +++ b/src/apps/meson.build\n> > @@ -12,6 +12,8 @@ endif\n> >  \n> >  libtiff = dependency('libtiff-4', required : false)\n> >  \n> > +subdir('common')\n> > +\n> >  subdir('lc-compliance')\n> >  \n> >  subdir('cam')\n> > diff --git a/src/apps/qcam/format_converter.cpp b/src/apps/qcam/format_converter.cpp\n> > index 9331da0ce7a3..de76b32c7ffd 100644\n> > --- a/src/apps/qcam/format_converter.cpp\n> > +++ b/src/apps/qcam/format_converter.cpp\n> > @@ -14,7 +14,7 @@\n> >  \n> >  #include <libcamera/formats.h>\n> >  \n> > -#include \"../cam/image.h\"\n> > +#include \"../common/image.h\"\n> >  \n> >  #define RGBSHIFT               8\n> >  #ifndef MAX\n> > diff --git a/src/apps/qcam/main.cpp b/src/apps/qcam/main.cpp\n> > index d3f01a85f1fb..36cb93a53701 100644\n> > --- a/src/apps/qcam/main.cpp\n> > +++ b/src/apps/qcam/main.cpp\n> > @@ -13,8 +13,9 @@\n> >  \n> >  #include <libcamera/camera_manager.h>\n> >  \n> > -#include \"../cam/options.h\"\n> > -#include \"../cam/stream_options.h\"\n> > +#include \"../common/options.h\"\n> > +#include \"../common/stream_options.h\"\n> > +\n> >  #include \"main_window.h\"\n> >  #include \"message_handler.h\"\n> >  \n> > diff --git a/src/apps/qcam/main_window.cpp b/src/apps/qcam/main_window.cpp\n> > index f553ccb01805..fb2db4aad511 100644\n> > --- a/src/apps/qcam/main_window.cpp\n> > +++ b/src/apps/qcam/main_window.cpp\n> > @@ -26,8 +26,8 @@\n> >  #include <QToolButton>\n> >  #include <QtDebug>\n> >  \n> > -#include \"../cam/dng_writer.h\"\n> > -#include \"../cam/image.h\"\n> > +#include \"../common/dng_writer.h\"\n> > +#include \"../common/image.h\"\n> >  \n> >  #include \"cam_select_dialog.h\"\n> >  #ifndef QT_NO_OPENGL\n> > diff --git a/src/apps/qcam/main_window.h b/src/apps/qcam/main_window.h\n> > index 95b64124336f..2e3e1b5c83c2 100644\n> > --- a/src/apps/qcam/main_window.h\n> > +++ b/src/apps/qcam/main_window.h\n> > @@ -27,7 +27,7 @@\n> >  #include <QQueue>\n> >  #include <QTimer>\n> >  \n> > -#include \"../cam/stream_options.h\"\n> > +#include \"../common/stream_options.h\"\n> >  \n> >  #include \"viewfinder.h\"\n> >  \n> > diff --git a/src/apps/qcam/meson.build b/src/apps/qcam/meson.build\n> > index e298101e2c43..eb0712d91351 100644\n> > --- a/src/apps/qcam/meson.build\n> > +++ b/src/apps/qcam/meson.build\n> > @@ -15,9 +15,6 @@ endif\n> >  qcam_enabled = true\n> >  \n> >  qcam_sources = files([\n> > -    '../cam/image.cpp',\n> > -    '../cam/options.cpp',\n> > -    '../cam/stream_options.cpp',\n> >      'cam_select_dialog.cpp',\n> >      'format_converter.cpp',\n> >      'main.cpp',\n> > @@ -36,14 +33,7 @@ qcam_resources = files([\n> >      'assets/feathericons/feathericons.qrc',\n> >  ])\n> >  \n> > -qt5_cpp_args = ['-DQT_NO_KEYWORDS']\n> > -\n> > -if libtiff.found()\n> > -    qt5_cpp_args += ['-DHAVE_TIFF']\n> > -    qcam_sources += files([\n> > -        '../cam/dng_writer.cpp',\n> > -    ])\n> > -endif\n> > +qt5_cpp_args = [apps_cpp_args, '-DQT_NO_KEYWORDS']\n> >  \n> >  if cxx.has_header_symbol('QOpenGLWidget', 'QOpenGLWidget',\n> >                           dependencies : qt5_dep, args : '-fPIC')\n> > @@ -73,6 +63,7 @@ resources = qt5.preprocess(moc_headers: qcam_moc_headers,\n> >  \n> >  qcam  = executable('qcam', qcam_sources, resources,\n> >                     install : true,\n> > +                   link_with : apps_lib,\n> >                     dependencies : [\n> >                         libatomic,\n> >                         libcamera_public,\n> > diff --git a/src/apps/qcam/viewfinder_gl.cpp b/src/apps/qcam/viewfinder_gl.cpp\n> > index 38ddad58e09e..f83b99ad6272 100644\n> > --- a/src/apps/qcam/viewfinder_gl.cpp\n> > +++ b/src/apps/qcam/viewfinder_gl.cpp\n> > @@ -16,7 +16,7 @@\n> >  \n> >  #include <libcamera/formats.h>\n> >  \n> > -#include \"../cam/image.h\"\n> > +#include \"../common/image.h\"\n> >  \n> >  static const QList<libcamera::PixelFormat> supportedFormats{\n> >         /* YUV - packed (single plane) */\n> > diff --git a/src/apps/qcam/viewfinder_qt.cpp b/src/apps/qcam/viewfinder_qt.cpp\n> > index c20fd6bc8fc2..a7482bea6afd 100644\n> > --- a/src/apps/qcam/viewfinder_qt.cpp\n> > +++ b/src/apps/qcam/viewfinder_qt.cpp\n> > @@ -20,7 +20,7 @@\n> >  #include <QPainter>\n> >  #include <QtDebug>\n> >  \n> > -#include \"../cam/image.h\"\n> > +#include \"../common/image.h\"\n> >  \n> >  #include \"format_converter.h\"\n> >","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 35A02BDB16\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 24 Oct 2022 20:12:02 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 6A55462F23;\n\tMon, 24 Oct 2022 22:12:01 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 72AD062EC6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 24 Oct 2022 22:12:00 +0200 (CEST)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id D93591401;\n\tMon, 24 Oct 2022 22:11:59 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1666642321;\n\tbh=0GHr/lkU7R9UrGZoYFBkMRPmLBaZjikyFVjkWH4IzgM=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=PnwjvFxYMr/l4PDtrviDzOeb5eUF8XCB40Fn43yZ2GhvlqJatEfbhjHrTC30N9aaN\n\t2KxXoIc4/GUALYBOv0dTcKZJLf3pV93oHy5N8hIToEINVVy271b2KCS+wrva0iFUVT\n\to6DjHouNH+/KmP24Y1qW7Fp8SCKWwuuD0ppp9X53CQuEMPXHX2Vlz0sZm4HNPZTu7z\n\th48T/PsqjSmU7sk7gy31Yq6XssBSwVySATzQy2l8ZeAbMYV5lPtGWDcrFDbWu+cp4W\n\tBjq687ILH0OYM4ksmuQuo8h+Unq7nnLomz9R4qrpy0dY7db7RNTB0NeDAIQ3akqvmr\n\tZCpJu1tvJHcOw==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1666642320;\n\tbh=0GHr/lkU7R9UrGZoYFBkMRPmLBaZjikyFVjkWH4IzgM=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=YidWBCrDz4TFhvmakrKkiZagb+aXgfqcSgzroENDTxNgSWfOdvbJ3rE6yT6suJOVT\n\t7X/3fIiNaohZFcS3a8il5GIETL7ypY12kmikuJl4/xSd0ivrLQaIaryAKNYVa8hSqq\n\t0v3J5ZlFb5+vtbSdZ8gbAHw18i/TzIRoty19F5yc="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"YidWBCrD\"; dkim-atps=neutral","Date":"Mon, 24 Oct 2022 23:11:34 +0300","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Message-ID":"<Y1bxdm1PRDz4yWbI@pendragon.ideasonboard.com>","References":"<20221020221026.28777-1-laurent.pinchart@ideasonboard.com>\n\t<166664141696.2560709.3143620718766319307@Monstersaurus>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<166664141696.2560709.3143620718766319307@Monstersaurus>","Subject":"Re: [libcamera-devel] [PATCH v2] apps: Share common source between\n\tapplications","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","From":"Laurent Pinchart via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":25557,"web_url":"https://patchwork.libcamera.org/comment/25557/","msgid":"<166664616017.2942859.14497666270268966958@Monstersaurus>","date":"2022-10-24T21:16:00","subject":"Re: [libcamera-devel] [PATCH v2] apps: Share common source between\n\tapplications","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Laurent Pinchart (2022-10-24 21:11:34)\n> Hi Kieran,\n> \n> On Mon, Oct 24, 2022 at 08:56:56PM +0100, Kieran Bingham wrote:\n> > Quoting Laurent Pinchart via libcamera-devel (2022-10-20 23:10:26)\n> > > Multiple source files in the src/apps/cam/ directory are used by cam,\n> > > qcam and lc-compliance. They are compiled separately for each\n> > > application. Move them to a new src/apps/common/ directory and compile\n> > > them in a static library to decrease the number of compilation\n> > > operations.\n> > > \n> > > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > > ---\n> > > Changes since v1:\n> > > \n> > > - Move common code to src/apps/common/\n> > > ---\n> > >  src/apps/cam/camera_session.cpp             |  5 ++--\n> > >  src/apps/cam/camera_session.h               |  2 +-\n> > >  src/apps/cam/drm.cpp                        |  2 +-\n> > >  src/apps/cam/file_sink.cpp                  |  5 ++--\n> > >  src/apps/cam/main.cpp                       |  7 +++---\n> > >  src/apps/cam/meson.build                    | 14 ++---------\n> > >  src/apps/cam/sdl_sink.cpp                   |  5 ++--\n> > >  src/apps/cam/sdl_texture.h                  |  2 +-\n> > >  src/apps/{cam => common}/dng_writer.cpp     |  0\n> > >  src/apps/{cam => common}/dng_writer.h       |  0\n> > >  src/apps/{cam => common}/event_loop.cpp     |  0\n> > >  src/apps/{cam => common}/event_loop.h       |  0\n> > >  src/apps/{cam => common}/image.cpp          |  0\n> > >  src/apps/{cam => common}/image.h            |  0\n> > >  src/apps/common/meson.build                 | 26 +++++++++++++++++++++\n> > >  src/apps/{cam => common}/options.cpp        |  0\n> > >  src/apps/{cam => common}/options.h          |  0\n> > >  src/apps/{cam => common}/stream_options.cpp |  0\n> > >  src/apps/{cam => common}/stream_options.h   |  0\n> > >  src/apps/lc-compliance/main.cpp             |  3 ++-\n> > >  src/apps/lc-compliance/meson.build          |  3 +--\n> > >  src/apps/lc-compliance/simple_capture.h     |  2 +-\n> > >  src/apps/meson.build                        |  2 ++\n> > >  src/apps/qcam/format_converter.cpp          |  2 +-\n> > >  src/apps/qcam/main.cpp                      |  5 ++--\n> > >  src/apps/qcam/main_window.cpp               |  4 ++--\n> > >  src/apps/qcam/main_window.h                 |  2 +-\n> > >  src/apps/qcam/meson.build                   | 13 ++---------\n> > >  src/apps/qcam/viewfinder_gl.cpp             |  2 +-\n> > >  src/apps/qcam/viewfinder_qt.cpp             |  2 +-\n> > >  30 files changed, 61 insertions(+), 47 deletions(-)\n> > >  rename src/apps/{cam => common}/dng_writer.cpp (100%)\n> > >  rename src/apps/{cam => common}/dng_writer.h (100%)\n> > >  rename src/apps/{cam => common}/event_loop.cpp (100%)\n> > >  rename src/apps/{cam => common}/event_loop.h (100%)\n> > >  rename src/apps/{cam => common}/image.cpp (100%)\n> > >  rename src/apps/{cam => common}/image.h (100%)\n> > >  create mode 100644 src/apps/common/meson.build\n> > >  rename src/apps/{cam => common}/options.cpp (100%)\n> > >  rename src/apps/{cam => common}/options.h (100%)\n> > >  rename src/apps/{cam => common}/stream_options.cpp (100%)\n> > >  rename src/apps/{cam => common}/stream_options.h (100%)\n> > > \n> > > diff --git a/src/apps/cam/camera_session.cpp b/src/apps/cam/camera_session.cpp\n> > > index 6b409c983b86..8fcec6304d66 100644\n> > > --- a/src/apps/cam/camera_session.cpp\n> > > +++ b/src/apps/cam/camera_session.cpp\n> > > @@ -13,9 +13,11 @@\n> > >  #include <libcamera/control_ids.h>\n> > >  #include <libcamera/property_ids.h>\n> > >  \n> > > +#include \"../common/event_loop.h\"\n> > > +#include \"../common/stream_options.h\"\n> > > +\n> > \n> > I still dislike the includes from a relative parent path.\n> > \n> > Is it possible to fix with the dependency or static library apps_lib\n> > object? Or just something you didn't want to do?\n> \n> I thought about it. It would involve -I, #include <...>, and the risk of\n\nit was -iquote I was actually thinking about, but it seems like meson\ndoesn't really support it.\n\nWe could put it directly in the args, but I'm not sure that's practical\neither.\n\n> conflict with system includes. I think it's still a good idea, but I\n> didn't want to explore that rabbit hole right now. If someone wants to\n> send a patch on top, I'll be happy to review it :-)\n\nMaybe if meson ever actually implemented something like suggested in\n[0], but I'll not hold my breath.\n\n(I.e. if this were possible, but it won't work...)\n\n# https://mesonbuild.com/Reference-manual_functions.html#arguments27\napps_inc = include_directories(['common'], is_system: false)\nor\n# https://github.com/mesonbuild/meson/issues/9219#issuecomment-1289622872\napps_inc = include_directories(['common'], is_quote: true)\n\n...\n\n apps_lib = static_library('apps', apps_sources,\n                           cpp_args : apps_cpp_args,\n+                          includes : apps_inc,\n                           dependencies : [libcamera_public])\n\n\n lc_compliance  = executable('lc-compliance', lc_compliance_sources,\n                             cpp_args : [ '-fexceptions' ],\n                             dependencies : [\n+                                apps_\n                                 libatomic,\n                                 libcamera_public,\n...\n\n\n[0] https://github.com/mesonbuild/meson/issues/9219\n\nMaybe proposing 'is_quote' as an option to include_directories might be\ninteresting, but that's not going to change this patch anytime soon.\n\n--\nKieran\n\n\n> \n> > Anyway, with or without that, grouping this makes sense.\n> > \n> > \n> > Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> >","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 429C1BD16B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 24 Oct 2022 21:16:05 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 9310A62F23;\n\tMon, 24 Oct 2022 23:16:04 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 53AC962EC6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 24 Oct 2022 23:16:03 +0200 (CEST)","from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id BBE951401;\n\tMon, 24 Oct 2022 23:16:02 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1666646164;\n\tbh=Bnv8DMUvDHcEa2//FQid/DvRLruavJmNlnDC9a06tyU=;\n\th=In-Reply-To:References:To:Date:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=l8KJOA+dG5Ysp9fL8QFQqdZsj+APUobsedhRc1z1/SL9+cqw2CaSRjOT1hdCbUTGj\n\t+CDcvwkIih+R8t76g14HXJPjUxkRXfYBJNKMpjQ8HZussEkMduGU780pEWus8mp6E4\n\tL+lVLDQhT9RN32wFJhN2ehEooKMdROk1Nvyz68EmAgCEhtQmamI27JUel4O/onrT3c\n\tDSZx7M11/loA0rp/UXfWebJK537VQ7b85DkbfamgvDpUzNp0QDSoQVRH/LcDrJNNrN\n\tWi1ll40SPi330PxPnmaSj5muVVfOjcaaZoyGa1w/5hvQ9/h9GcXq7X19pdUZerVpaR\n\twjnRpxSvYbtQQ==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1666646162;\n\tbh=Bnv8DMUvDHcEa2//FQid/DvRLruavJmNlnDC9a06tyU=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=c8d0+QtvJjTkoSX5DfUUDnAmTcTQmiYSgVyHYjpS/o8QeTVLtwt/k0vY9jkZn/uh7\n\txDd4lL+PUIjMO5BAxjXsIzq641xen0Mc5iu35Ony7UwqATYYCw5Pcb1ElVFfzmLaH6\n\t/a6v+BTIWGpO6Y8vxzmS1JH7LWMfMNkkuRUtl4FM="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"c8d0+Qtv\"; dkim-atps=neutral","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<Y1bxdm1PRDz4yWbI@pendragon.ideasonboard.com>","References":"<20221020221026.28777-1-laurent.pinchart@ideasonboard.com>\n\t<166664141696.2560709.3143620718766319307@Monstersaurus>\n\t<Y1bxdm1PRDz4yWbI@pendragon.ideasonboard.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Date":"Mon, 24 Oct 2022 22:16:00 +0100","Message-ID":"<166664616017.2942859.14497666270268966958@Monstersaurus>","User-Agent":"alot/0.10","Subject":"Re: [libcamera-devel] [PATCH v2] apps: Share common source between\n\tapplications","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","From":"Kieran Bingham via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":25558,"web_url":"https://patchwork.libcamera.org/comment/25558/","msgid":"<Y1cfgxu5VhmGPPQf@pendragon.ideasonboard.com>","date":"2022-10-24T23:28:03","subject":"Re: [libcamera-devel] [PATCH v2] apps: Share common source between\n\tapplications","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Kieran,\n\nOn Mon, Oct 24, 2022 at 10:16:00PM +0100, Kieran Bingham wrote:\n> Quoting Laurent Pinchart (2022-10-24 21:11:34)\n> > On Mon, Oct 24, 2022 at 08:56:56PM +0100, Kieran Bingham wrote:\n> > > Quoting Laurent Pinchart via libcamera-devel (2022-10-20 23:10:26)\n> > > > Multiple source files in the src/apps/cam/ directory are used by cam,\n> > > > qcam and lc-compliance. They are compiled separately for each\n> > > > application. Move them to a new src/apps/common/ directory and compile\n> > > > them in a static library to decrease the number of compilation\n> > > > operations.\n> > > > \n> > > > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > > > ---\n> > > > Changes since v1:\n> > > > \n> > > > - Move common code to src/apps/common/\n> > > > ---\n> > > >  src/apps/cam/camera_session.cpp             |  5 ++--\n> > > >  src/apps/cam/camera_session.h               |  2 +-\n> > > >  src/apps/cam/drm.cpp                        |  2 +-\n> > > >  src/apps/cam/file_sink.cpp                  |  5 ++--\n> > > >  src/apps/cam/main.cpp                       |  7 +++---\n> > > >  src/apps/cam/meson.build                    | 14 ++---------\n> > > >  src/apps/cam/sdl_sink.cpp                   |  5 ++--\n> > > >  src/apps/cam/sdl_texture.h                  |  2 +-\n> > > >  src/apps/{cam => common}/dng_writer.cpp     |  0\n> > > >  src/apps/{cam => common}/dng_writer.h       |  0\n> > > >  src/apps/{cam => common}/event_loop.cpp     |  0\n> > > >  src/apps/{cam => common}/event_loop.h       |  0\n> > > >  src/apps/{cam => common}/image.cpp          |  0\n> > > >  src/apps/{cam => common}/image.h            |  0\n> > > >  src/apps/common/meson.build                 | 26 +++++++++++++++++++++\n> > > >  src/apps/{cam => common}/options.cpp        |  0\n> > > >  src/apps/{cam => common}/options.h          |  0\n> > > >  src/apps/{cam => common}/stream_options.cpp |  0\n> > > >  src/apps/{cam => common}/stream_options.h   |  0\n> > > >  src/apps/lc-compliance/main.cpp             |  3 ++-\n> > > >  src/apps/lc-compliance/meson.build          |  3 +--\n> > > >  src/apps/lc-compliance/simple_capture.h     |  2 +-\n> > > >  src/apps/meson.build                        |  2 ++\n> > > >  src/apps/qcam/format_converter.cpp          |  2 +-\n> > > >  src/apps/qcam/main.cpp                      |  5 ++--\n> > > >  src/apps/qcam/main_window.cpp               |  4 ++--\n> > > >  src/apps/qcam/main_window.h                 |  2 +-\n> > > >  src/apps/qcam/meson.build                   | 13 ++---------\n> > > >  src/apps/qcam/viewfinder_gl.cpp             |  2 +-\n> > > >  src/apps/qcam/viewfinder_qt.cpp             |  2 +-\n> > > >  30 files changed, 61 insertions(+), 47 deletions(-)\n> > > >  rename src/apps/{cam => common}/dng_writer.cpp (100%)\n> > > >  rename src/apps/{cam => common}/dng_writer.h (100%)\n> > > >  rename src/apps/{cam => common}/event_loop.cpp (100%)\n> > > >  rename src/apps/{cam => common}/event_loop.h (100%)\n> > > >  rename src/apps/{cam => common}/image.cpp (100%)\n> > > >  rename src/apps/{cam => common}/image.h (100%)\n> > > >  create mode 100644 src/apps/common/meson.build\n> > > >  rename src/apps/{cam => common}/options.cpp (100%)\n> > > >  rename src/apps/{cam => common}/options.h (100%)\n> > > >  rename src/apps/{cam => common}/stream_options.cpp (100%)\n> > > >  rename src/apps/{cam => common}/stream_options.h (100%)\n> > > > \n> > > > diff --git a/src/apps/cam/camera_session.cpp b/src/apps/cam/camera_session.cpp\n> > > > index 6b409c983b86..8fcec6304d66 100644\n> > > > --- a/src/apps/cam/camera_session.cpp\n> > > > +++ b/src/apps/cam/camera_session.cpp\n> > > > @@ -13,9 +13,11 @@\n> > > >  #include <libcamera/control_ids.h>\n> > > >  #include <libcamera/property_ids.h>\n> > > >  \n> > > > +#include \"../common/event_loop.h\"\n> > > > +#include \"../common/stream_options.h\"\n> > > > +\n> > > \n> > > I still dislike the includes from a relative parent path.\n> > > \n> > > Is it possible to fix with the dependency or static library apps_lib\n> > > object? Or just something you didn't want to do?\n> > \n> > I thought about it. It would involve -I, #include <...>, and the risk of\n> \n> it was -iquote I was actually thinking about, but it seems like meson\n> doesn't really support it.\n> \n> We could put it directly in the args, but I'm not sure that's practical\n> either.\n\nIt's not very nice indeed.\n\n> > conflict with system includes. I think it's still a good idea, but I\n> > didn't want to explore that rabbit hole right now. If someone wants to\n> > send a patch on top, I'll be happy to review it :-)\n> \n> Maybe if meson ever actually implemented something like suggested in\n> [0], but I'll not hold my breath.\n\nI have a feeling of déjà vu. I'm pretty sure I've discussed -iquote on\nthe meson IRC channel a while ago. I'm not entirely sure why, but I\nbelieve it was due to a conflict with system includes, and that may be\nwhat caused the internal rework of the libcamera headers directories\nhierarchy.\n\n> (I.e. if this were possible, but it won't work...)\n> \n> # https://mesonbuild.com/Reference-manual_functions.html#arguments27\n> apps_inc = include_directories(['common'], is_system: false)\n> or\n> # https://github.com/mesonbuild/meson/issues/9219#issuecomment-1289622872\n> apps_inc = include_directories(['common'], is_quote: true)\n> \n> ...\n> \n>  apps_lib = static_library('apps', apps_sources,\n>                            cpp_args : apps_cpp_args,\n> +                          includes : apps_inc,\n>                            dependencies : [libcamera_public])\n> \n> \n>  lc_compliance  = executable('lc-compliance', lc_compliance_sources,\n>                              cpp_args : [ '-fexceptions' ],\n>                              dependencies : [\n> +                                apps_\n>                                  libatomic,\n>                                  libcamera_public,\n> ...\n\nDoes it propagate the include directory to lc_compliance ? I thought\nthat would only use it to compile the static library. You can use\ndeclare_dependency() to bundle a library and an include directory (and\nother things) as a dependency. It won't solve the -iquote issue though.\n\n> [0] https://github.com/mesonbuild/meson/issues/9219\n> \n> Maybe proposing 'is_quote' as an option to include_directories might be\n> interesting, but that's not going to change this patch anytime soon.\n\nIndeed :-)\n\n> > > Anyway, with or without that, grouping this makes sense.\n> > > \n> > > \n> > > Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id A630BBDB16\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 24 Oct 2022 23:28:32 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 9233262F25;\n\tTue, 25 Oct 2022 01:28:31 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 3E65E62EAE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 25 Oct 2022 01:28:29 +0200 (CEST)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 87778D3C;\n\tTue, 25 Oct 2022 01:28:28 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1666654111;\n\tbh=FllJvUs8BkXyO8HCHIpMkSHtVmqz5CcAQNMACQM68Dg=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=P8u3dfEli1FiFHzn6TvqJHpPAjukW1NiY2CC2aboeuW+u/CcD2MawP9pOSziLnA85\n\tjMdDvg6Ksh68OrAPSrPPKLF1uf4hsUx71VneHEZaiKhnfYZiNlaA8egEP4DF2WHenC\n\tyqK9I75KL+IP43bOkcgp2CrJGFX8/CdNUloj0EGCe5n8a3DmjLBOMw7B6GhN107lBd\n\tvZ1IilO7elGJIvgPkycpOOPZCfXTJjBMpuu0yaTKgOWVnKCZeqQMpUz1zvIKhHUFcS\n\t8Ko/KU714CxXtPUjijfyeC6lY9sgEqyoWcI0v3reoMWnDotK8fXKuD9ofvwJ/FgSqb\n\t8GHt/y6Fw0ROw==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1666654108;\n\tbh=FllJvUs8BkXyO8HCHIpMkSHtVmqz5CcAQNMACQM68Dg=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=Nt+LtAco84WsUQz6w+3XzmsEht/pJQBFLVCvP+u/5COpAFoMCGwyQ7aIj30tMRBtr\n\tSNMYBmMwDvkKRfCI/VM0W7c5DQDgnJ9ePQS+vZDsUTuT/uxk1NxpEYfoWo2ALTjEcd\n\tkioun2LngKmvdCpGjsrjqvR0c48tCtp+q9yiOnVE="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"Nt+LtAco\"; dkim-atps=neutral","Date":"Tue, 25 Oct 2022 02:28:03 +0300","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Message-ID":"<Y1cfgxu5VhmGPPQf@pendragon.ideasonboard.com>","References":"<20221020221026.28777-1-laurent.pinchart@ideasonboard.com>\n\t<166664141696.2560709.3143620718766319307@Monstersaurus>\n\t<Y1bxdm1PRDz4yWbI@pendragon.ideasonboard.com>\n\t<166664616017.2942859.14497666270268966958@Monstersaurus>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<166664616017.2942859.14497666270268966958@Monstersaurus>","Subject":"Re: [libcamera-devel] [PATCH v2] apps: Share common source between\n\tapplications","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","From":"Laurent Pinchart via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":25594,"web_url":"https://patchwork.libcamera.org/comment/25594/","msgid":"<CAOgh=FxYcEHZ_yhD2boL9iyZ3sM-xcSsmy3q9mGsn1p6VVY=WA@mail.gmail.com>","date":"2022-10-26T11:00:56","subject":"Re: [libcamera-devel] [PATCH v2] apps: Share common source between\n\tapplications","submitter":{"id":101,"url":"https://patchwork.libcamera.org/api/people/101/","name":"Eric Curtin","email":"ecurtin@redhat.com"},"content":"On Thu, 20 Oct 2022 at 23:11, Laurent Pinchart via libcamera-devel\n<libcamera-devel@lists.libcamera.org> wrote:\n>\n> Multiple source files in the src/apps/cam/ directory are used by cam,\n> qcam and lc-compliance. They are compiled separately for each\n> application. Move them to a new src/apps/common/ directory and compile\n> them in a static library to decrease the number of compilation\n> operations.\n>\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nLooks good to me, it's nicer than before\n\nReviewed-by: Eric Curtin <ecurtin@redhat.com>\n\n> ---\n> Changes since v1:\n>\n> - Move common code to src/apps/common/\n> ---\n>  src/apps/cam/camera_session.cpp             |  5 ++--\n>  src/apps/cam/camera_session.h               |  2 +-\n>  src/apps/cam/drm.cpp                        |  2 +-\n>  src/apps/cam/file_sink.cpp                  |  5 ++--\n>  src/apps/cam/main.cpp                       |  7 +++---\n>  src/apps/cam/meson.build                    | 14 ++---------\n>  src/apps/cam/sdl_sink.cpp                   |  5 ++--\n>  src/apps/cam/sdl_texture.h                  |  2 +-\n>  src/apps/{cam => common}/dng_writer.cpp     |  0\n>  src/apps/{cam => common}/dng_writer.h       |  0\n>  src/apps/{cam => common}/event_loop.cpp     |  0\n>  src/apps/{cam => common}/event_loop.h       |  0\n>  src/apps/{cam => common}/image.cpp          |  0\n>  src/apps/{cam => common}/image.h            |  0\n>  src/apps/common/meson.build                 | 26 +++++++++++++++++++++\n>  src/apps/{cam => common}/options.cpp        |  0\n>  src/apps/{cam => common}/options.h          |  0\n>  src/apps/{cam => common}/stream_options.cpp |  0\n>  src/apps/{cam => common}/stream_options.h   |  0\n>  src/apps/lc-compliance/main.cpp             |  3 ++-\n>  src/apps/lc-compliance/meson.build          |  3 +--\n>  src/apps/lc-compliance/simple_capture.h     |  2 +-\n>  src/apps/meson.build                        |  2 ++\n>  src/apps/qcam/format_converter.cpp          |  2 +-\n>  src/apps/qcam/main.cpp                      |  5 ++--\n>  src/apps/qcam/main_window.cpp               |  4 ++--\n>  src/apps/qcam/main_window.h                 |  2 +-\n>  src/apps/qcam/meson.build                   | 13 ++---------\n>  src/apps/qcam/viewfinder_gl.cpp             |  2 +-\n>  src/apps/qcam/viewfinder_qt.cpp             |  2 +-\n>  30 files changed, 61 insertions(+), 47 deletions(-)\n>  rename src/apps/{cam => common}/dng_writer.cpp (100%)\n>  rename src/apps/{cam => common}/dng_writer.h (100%)\n>  rename src/apps/{cam => common}/event_loop.cpp (100%)\n>  rename src/apps/{cam => common}/event_loop.h (100%)\n>  rename src/apps/{cam => common}/image.cpp (100%)\n>  rename src/apps/{cam => common}/image.h (100%)\n>  create mode 100644 src/apps/common/meson.build\n>  rename src/apps/{cam => common}/options.cpp (100%)\n>  rename src/apps/{cam => common}/options.h (100%)\n>  rename src/apps/{cam => common}/stream_options.cpp (100%)\n>  rename src/apps/{cam => common}/stream_options.h (100%)\n>\n> diff --git a/src/apps/cam/camera_session.cpp b/src/apps/cam/camera_session.cpp\n> index 6b409c983b86..8fcec6304d66 100644\n> --- a/src/apps/cam/camera_session.cpp\n> +++ b/src/apps/cam/camera_session.cpp\n> @@ -13,9 +13,11 @@\n>  #include <libcamera/control_ids.h>\n>  #include <libcamera/property_ids.h>\n>\n> +#include \"../common/event_loop.h\"\n> +#include \"../common/stream_options.h\"\n> +\n>  #include \"camera_session.h\"\n>  #include \"capture_script.h\"\n> -#include \"event_loop.h\"\n>  #include \"file_sink.h\"\n>  #ifdef HAVE_KMS\n>  #include \"kms_sink.h\"\n> @@ -24,7 +26,6 @@\n>  #ifdef HAVE_SDL\n>  #include \"sdl_sink.h\"\n>  #endif\n> -#include \"stream_options.h\"\n>\n>  using namespace libcamera;\n>\n> diff --git a/src/apps/cam/camera_session.h b/src/apps/cam/camera_session.h\n> index d562caae0794..0bab519f9efd 100644\n> --- a/src/apps/cam/camera_session.h\n> +++ b/src/apps/cam/camera_session.h\n> @@ -21,7 +21,7 @@\n>  #include <libcamera/request.h>\n>  #include <libcamera/stream.h>\n>\n> -#include \"options.h\"\n> +#include \"../common/options.h\"\n>\n>  class CaptureScript;\n>  class FrameSink;\n> diff --git a/src/apps/cam/drm.cpp b/src/apps/cam/drm.cpp\n> index 2e4d7985245d..8779a7137f80 100644\n> --- a/src/apps/cam/drm.cpp\n> +++ b/src/apps/cam/drm.cpp\n> @@ -24,7 +24,7 @@\n>\n>  #include <libdrm/drm_mode.h>\n>\n> -#include \"event_loop.h\"\n> +#include \"../common/event_loop.h\"\n>\n>  namespace DRM {\n>\n> diff --git a/src/apps/cam/file_sink.cpp b/src/apps/cam/file_sink.cpp\n> index 9d60c04e1cf4..4525fbada7c4 100644\n> --- a/src/apps/cam/file_sink.cpp\n> +++ b/src/apps/cam/file_sink.cpp\n> @@ -15,9 +15,10 @@\n>\n>  #include <libcamera/camera.h>\n>\n> -#include \"dng_writer.h\"\n> +#include \"../common/dng_writer.h\"\n> +#include \"../common/image.h\"\n> +\n>  #include \"file_sink.h\"\n> -#include \"image.h\"\n>\n>  using namespace libcamera;\n>\n> diff --git a/src/apps/cam/main.cpp b/src/apps/cam/main.cpp\n> index d70130e2ab81..5d8a57bc14e5 100644\n> --- a/src/apps/cam/main.cpp\n> +++ b/src/apps/cam/main.cpp\n> @@ -14,11 +14,12 @@\n>  #include <libcamera/libcamera.h>\n>  #include <libcamera/property_ids.h>\n>\n> +#include \"../common/event_loop.h\"\n> +#include \"../common/options.h\"\n> +#include \"../common/stream_options.h\"\n> +\n>  #include \"camera_session.h\"\n> -#include \"event_loop.h\"\n>  #include \"main.h\"\n> -#include \"options.h\"\n> -#include \"stream_options.h\"\n>\n>  using namespace libcamera;\n>\n> diff --git a/src/apps/cam/meson.build b/src/apps/cam/meson.build\n> index 297de64fbdd9..48c834ace71b 100644\n> --- a/src/apps/cam/meson.build\n> +++ b/src/apps/cam/meson.build\n> @@ -10,16 +10,12 @@ cam_enabled = true\n>  cam_sources = files([\n>      'camera_session.cpp',\n>      'capture_script.cpp',\n> -    'event_loop.cpp',\n>      'file_sink.cpp',\n>      'frame_sink.cpp',\n> -    'image.cpp',\n>      'main.cpp',\n> -    'options.cpp',\n> -    'stream_options.cpp',\n>  ])\n>\n> -cam_cpp_args = []\n> +cam_cpp_args = [apps_cpp_args]\n>\n>  libdrm = dependency('libdrm', required : false)\n>  libjpeg = dependency('libjpeg', required : false)\n> @@ -49,14 +45,8 @@ if libsdl2.found()\n>      endif\n>  endif\n>\n> -if libtiff.found()\n> -    cam_cpp_args += ['-DHAVE_TIFF']\n> -    cam_sources += files([\n> -        'dng_writer.cpp',\n> -    ])\n> -endif\n> -\n>  cam  = executable('cam', cam_sources,\n> +                  link_with : apps_lib,\n>                    dependencies : [\n>                        libatomic,\n>                        libcamera_public,\n> diff --git a/src/apps/cam/sdl_sink.cpp b/src/apps/cam/sdl_sink.cpp\n> index ee177227dbca..a2f4abc1ec8c 100644\n> --- a/src/apps/cam/sdl_sink.cpp\n> +++ b/src/apps/cam/sdl_sink.cpp\n> @@ -19,8 +19,9 @@\n>  #include <libcamera/camera.h>\n>  #include <libcamera/formats.h>\n>\n> -#include \"event_loop.h\"\n> -#include \"image.h\"\n> +#include \"../common/event_loop.h\"\n> +#include \"../common/image.h\"\n> +\n>  #ifdef HAVE_LIBJPEG\n>  #include \"sdl_texture_mjpg.h\"\n>  #endif\n> diff --git a/src/apps/cam/sdl_texture.h b/src/apps/cam/sdl_texture.h\n> index 6ccd85eab390..3993dd46ece7 100644\n> --- a/src/apps/cam/sdl_texture.h\n> +++ b/src/apps/cam/sdl_texture.h\n> @@ -11,7 +11,7 @@\n>\n>  #include <SDL2/SDL.h>\n>\n> -#include \"image.h\"\n> +#include \"../common/image.h\"\n>\n>  class SDLTexture\n>  {\n> diff --git a/src/apps/cam/dng_writer.cpp b/src/apps/common/dng_writer.cpp\n> similarity index 100%\n> rename from src/apps/cam/dng_writer.cpp\n> rename to src/apps/common/dng_writer.cpp\n> diff --git a/src/apps/cam/dng_writer.h b/src/apps/common/dng_writer.h\n> similarity index 100%\n> rename from src/apps/cam/dng_writer.h\n> rename to src/apps/common/dng_writer.h\n> diff --git a/src/apps/cam/event_loop.cpp b/src/apps/common/event_loop.cpp\n> similarity index 100%\n> rename from src/apps/cam/event_loop.cpp\n> rename to src/apps/common/event_loop.cpp\n> diff --git a/src/apps/cam/event_loop.h b/src/apps/common/event_loop.h\n> similarity index 100%\n> rename from src/apps/cam/event_loop.h\n> rename to src/apps/common/event_loop.h\n> diff --git a/src/apps/cam/image.cpp b/src/apps/common/image.cpp\n> similarity index 100%\n> rename from src/apps/cam/image.cpp\n> rename to src/apps/common/image.cpp\n> diff --git a/src/apps/cam/image.h b/src/apps/common/image.h\n> similarity index 100%\n> rename from src/apps/cam/image.h\n> rename to src/apps/common/image.h\n> diff --git a/src/apps/common/meson.build b/src/apps/common/meson.build\n> new file mode 100644\n> index 000000000000..479326cdacbf\n> --- /dev/null\n> +++ b/src/apps/common/meson.build\n> @@ -0,0 +1,26 @@\n> +# SPDX-License-Identifier: CC0-1.0\n> +\n> +apps_sources = files([\n> +    'image.cpp',\n> +    'options.cpp',\n> +    'stream_options.cpp',\n> +])\n> +\n> +apps_cpp_args = []\n> +\n> +if libevent.found()\n> +    apps_sources += files([\n> +        'event_loop.cpp',\n> +    ])\n> +endif\n> +\n> +if libtiff.found()\n> +    apps_cpp_args += ['-DHAVE_TIFF']\n> +    apps_sources += files([\n> +        'dng_writer.cpp',\n> +    ])\n> +endif\n> +\n> +apps_lib = static_library('apps', apps_sources,\n> +                          cpp_args : apps_cpp_args,\n> +                          dependencies : [libcamera_public])\n> diff --git a/src/apps/cam/options.cpp b/src/apps/common/options.cpp\n> similarity index 100%\n> rename from src/apps/cam/options.cpp\n> rename to src/apps/common/options.cpp\n> diff --git a/src/apps/cam/options.h b/src/apps/common/options.h\n> similarity index 100%\n> rename from src/apps/cam/options.h\n> rename to src/apps/common/options.h\n> diff --git a/src/apps/cam/stream_options.cpp b/src/apps/common/stream_options.cpp\n> similarity index 100%\n> rename from src/apps/cam/stream_options.cpp\n> rename to src/apps/common/stream_options.cpp\n> diff --git a/src/apps/cam/stream_options.h b/src/apps/common/stream_options.h\n> similarity index 100%\n> rename from src/apps/cam/stream_options.h\n> rename to src/apps/common/stream_options.h\n> diff --git a/src/apps/lc-compliance/main.cpp b/src/apps/lc-compliance/main.cpp\n> index 7eb52ae4c094..74e0d4df461b 100644\n> --- a/src/apps/lc-compliance/main.cpp\n> +++ b/src/apps/lc-compliance/main.cpp\n> @@ -14,8 +14,9 @@\n>\n>  #include <libcamera/libcamera.h>\n>\n> +#include \"../common/options.h\"\n> +\n>  #include \"environment.h\"\n> -#include \"../cam/options.h\"\n>\n>  using namespace libcamera;\n>\n> diff --git a/src/apps/lc-compliance/meson.build b/src/apps/lc-compliance/meson.build\n> index 05d622be0a40..51d9075ac30b 100644\n> --- a/src/apps/lc-compliance/meson.build\n> +++ b/src/apps/lc-compliance/meson.build\n> @@ -11,8 +11,6 @@ endif\n>  lc_compliance_enabled = true\n>\n>  lc_compliance_sources = files([\n> -    '../cam/event_loop.cpp',\n> -    '../cam/options.cpp',\n>      'environment.cpp',\n>      'main.cpp',\n>      'simple_capture.cpp',\n> @@ -21,6 +19,7 @@ lc_compliance_sources = files([\n>\n>  lc_compliance  = executable('lc-compliance', lc_compliance_sources,\n>                              cpp_args : [ '-fexceptions' ],\n> +                            link_with : apps_lib,\n>                              dependencies : [\n>                                  libatomic,\n>                                  libcamera_public,\n> diff --git a/src/apps/lc-compliance/simple_capture.h b/src/apps/lc-compliance/simple_capture.h\n> index 9d31f7cb2e53..fd9d2a97fd8d 100644\n> --- a/src/apps/lc-compliance/simple_capture.h\n> +++ b/src/apps/lc-compliance/simple_capture.h\n> @@ -11,7 +11,7 @@\n>\n>  #include <libcamera/libcamera.h>\n>\n> -#include \"../cam/event_loop.h\"\n> +#include \"../common/event_loop.h\"\n>\n>  class SimpleCapture\n>  {\n> diff --git a/src/apps/meson.build b/src/apps/meson.build\n> index b722a8f110d8..099876356bd1 100644\n> --- a/src/apps/meson.build\n> +++ b/src/apps/meson.build\n> @@ -12,6 +12,8 @@ endif\n>\n>  libtiff = dependency('libtiff-4', required : false)\n>\n> +subdir('common')\n> +\n>  subdir('lc-compliance')\n>\n>  subdir('cam')\n> diff --git a/src/apps/qcam/format_converter.cpp b/src/apps/qcam/format_converter.cpp\n> index 9331da0ce7a3..de76b32c7ffd 100644\n> --- a/src/apps/qcam/format_converter.cpp\n> +++ b/src/apps/qcam/format_converter.cpp\n> @@ -14,7 +14,7 @@\n>\n>  #include <libcamera/formats.h>\n>\n> -#include \"../cam/image.h\"\n> +#include \"../common/image.h\"\n>\n>  #define RGBSHIFT               8\n>  #ifndef MAX\n> diff --git a/src/apps/qcam/main.cpp b/src/apps/qcam/main.cpp\n> index d3f01a85f1fb..36cb93a53701 100644\n> --- a/src/apps/qcam/main.cpp\n> +++ b/src/apps/qcam/main.cpp\n> @@ -13,8 +13,9 @@\n>\n>  #include <libcamera/camera_manager.h>\n>\n> -#include \"../cam/options.h\"\n> -#include \"../cam/stream_options.h\"\n> +#include \"../common/options.h\"\n> +#include \"../common/stream_options.h\"\n> +\n>  #include \"main_window.h\"\n>  #include \"message_handler.h\"\n>\n> diff --git a/src/apps/qcam/main_window.cpp b/src/apps/qcam/main_window.cpp\n> index f553ccb01805..fb2db4aad511 100644\n> --- a/src/apps/qcam/main_window.cpp\n> +++ b/src/apps/qcam/main_window.cpp\n> @@ -26,8 +26,8 @@\n>  #include <QToolButton>\n>  #include <QtDebug>\n>\n> -#include \"../cam/dng_writer.h\"\n> -#include \"../cam/image.h\"\n> +#include \"../common/dng_writer.h\"\n> +#include \"../common/image.h\"\n>\n>  #include \"cam_select_dialog.h\"\n>  #ifndef QT_NO_OPENGL\n> diff --git a/src/apps/qcam/main_window.h b/src/apps/qcam/main_window.h\n> index 95b64124336f..2e3e1b5c83c2 100644\n> --- a/src/apps/qcam/main_window.h\n> +++ b/src/apps/qcam/main_window.h\n> @@ -27,7 +27,7 @@\n>  #include <QQueue>\n>  #include <QTimer>\n>\n> -#include \"../cam/stream_options.h\"\n> +#include \"../common/stream_options.h\"\n>\n>  #include \"viewfinder.h\"\n>\n> diff --git a/src/apps/qcam/meson.build b/src/apps/qcam/meson.build\n> index e298101e2c43..eb0712d91351 100644\n> --- a/src/apps/qcam/meson.build\n> +++ b/src/apps/qcam/meson.build\n> @@ -15,9 +15,6 @@ endif\n>  qcam_enabled = true\n>\n>  qcam_sources = files([\n> -    '../cam/image.cpp',\n> -    '../cam/options.cpp',\n> -    '../cam/stream_options.cpp',\n>      'cam_select_dialog.cpp',\n>      'format_converter.cpp',\n>      'main.cpp',\n> @@ -36,14 +33,7 @@ qcam_resources = files([\n>      'assets/feathericons/feathericons.qrc',\n>  ])\n>\n> -qt5_cpp_args = ['-DQT_NO_KEYWORDS']\n> -\n> -if libtiff.found()\n> -    qt5_cpp_args += ['-DHAVE_TIFF']\n> -    qcam_sources += files([\n> -        '../cam/dng_writer.cpp',\n> -    ])\n> -endif\n> +qt5_cpp_args = [apps_cpp_args, '-DQT_NO_KEYWORDS']\n>\n>  if cxx.has_header_symbol('QOpenGLWidget', 'QOpenGLWidget',\n>                           dependencies : qt5_dep, args : '-fPIC')\n> @@ -73,6 +63,7 @@ resources = qt5.preprocess(moc_headers: qcam_moc_headers,\n>\n>  qcam  = executable('qcam', qcam_sources, resources,\n>                     install : true,\n> +                   link_with : apps_lib,\n>                     dependencies : [\n>                         libatomic,\n>                         libcamera_public,\n> diff --git a/src/apps/qcam/viewfinder_gl.cpp b/src/apps/qcam/viewfinder_gl.cpp\n> index 38ddad58e09e..f83b99ad6272 100644\n> --- a/src/apps/qcam/viewfinder_gl.cpp\n> +++ b/src/apps/qcam/viewfinder_gl.cpp\n> @@ -16,7 +16,7 @@\n>\n>  #include <libcamera/formats.h>\n>\n> -#include \"../cam/image.h\"\n> +#include \"../common/image.h\"\n>\n>  static const QList<libcamera::PixelFormat> supportedFormats{\n>         /* YUV - packed (single plane) */\n> diff --git a/src/apps/qcam/viewfinder_qt.cpp b/src/apps/qcam/viewfinder_qt.cpp\n> index c20fd6bc8fc2..a7482bea6afd 100644\n> --- a/src/apps/qcam/viewfinder_qt.cpp\n> +++ b/src/apps/qcam/viewfinder_qt.cpp\n> @@ -20,7 +20,7 @@\n>  #include <QPainter>\n>  #include <QtDebug>\n>\n> -#include \"../cam/image.h\"\n> +#include \"../common/image.h\"\n>\n>  #include \"format_converter.h\"\n>\n> --\n> Regards,\n>\n> Laurent Pinchart\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 5E843BD16B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 26 Oct 2022 11:01:18 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 8FF7B62F44;\n\tWed, 26 Oct 2022 13:01:17 +0200 (CEST)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.133.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 8F5DC61F4B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 26 Oct 2022 13:01:15 +0200 (CEST)","from mail-vs1-f69.google.com (mail-vs1-f69.google.com\n\t[209.85.217.69]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id\n\tus-mta-110-ZkFJZSb4N-KJmhhDZ4wItw-1; Wed, 26 Oct 2022 07:01:13 -0400","by mail-vs1-f69.google.com with SMTP id\n\tv188-20020a6761c5000000b003aa40da25bdso790451vsb.22\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 26 Oct 2022 04:01:13 -0700 (PDT)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1666782077;\n\tbh=3v1WXM2ofU/V4rU20fJt/z9K/blx08PDP0SZDmyQoE0=;\n\th=References:In-Reply-To:Date:To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=JvmlCaWeWYZ/+zjZ+xGumA7lzN4+pYj6b2ZzRQ4sB8XiER2Rt1vzUF9mll2qns6hz\n\t0FG9M0OeyrN1w48pcLCufwlc61n78y83JolANnUVcTkmxEL6HXHD3La3cmCFaiMlyv\n\tAjnbk8PtmY/l+SR1KG1wE1eY4p1S9v67F8C1SQiH4PAGl910TKtrUTg3g6VtYomHDz\n\tj2iwSFuf8MtHIVQBcywV1/s7BlLIOqVhPLLXf9HnjQfqJhEoInvWjuV612Xr6t8JIq\n\t5rE/RJNdGuJVaifQVIext6mpBkxHXna5zmclP56W2Ggls/GKJS8iKq+91k33uajDiE\n\t5S9FvcbelUwvQ==","v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1666782074;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:cc:mime-version:mime-version:content-type:content-type:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=Uc0M253U/+ZfJDieJaDoI5Ki13HOBi/c2WS3QQjd2FY=;\n\tb=G9expx/8AutwcWSrb7imvsO6TrweytFMexZp9VoZwYu9wCyIn/Ff+LpNopFFDz4QPj2HTQ\n\tPNDN/vmFPXJbd79XY3nvri8AuBrO/OGuPerzZ+74ZhMBoyFXDWq7uqz7A8h2xWiwZdrWn0\n\trs3xiqAokdIMnnJ16fxuA41w+E8fMJc="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=redhat.com\n\theader.i=@redhat.com header.b=\"G9expx/8\"; \n\tdkim-atps=neutral","X-MC-Unique":"ZkFJZSb4N-KJmhhDZ4wItw-1","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:x-gm-message-state:from:to:cc:subject:date:message-id\n\t:reply-to;\n\tbh=Uc0M253U/+ZfJDieJaDoI5Ki13HOBi/c2WS3QQjd2FY=;\n\tb=34r2y8SKz0+HphaJUQ4RLmXTSPEbXkqf1QFAU6G+tyqET0i93qpqOCi55xCpeh4v9P\n\tDefaRpZzbmHjYk+WWOxntZJrqgwR1HP7DgY5iqLss+DBQDhwakdlq3XkQKiUE05NlRGB\n\t2IqQI/KJkKiX8nX/27SKUc0pb01vjK4nwTN/k5TiRkwlkd95lHV54oocqD9hQ54QUzy+\n\t/FPoRKxtWR7Vl/gho3Ne6kicRQsveQt7jFdVzu8C2rHqt+dt7X7djk1O8HaKQzRdL6II\n\tS8IPkdZjjL0l/JYYN6gCTdPXEd2hhNzC30as99d+U6AdsgeWfw9sAfgtR9oUxgj4RpN0\n\tWnKw==","X-Gm-Message-State":"ACrzQf39H+Ygn1p37aYSO6oqfgelILKVDwq9AYNaS3cm3nk5Aw8OI+iZ\n\tKXakJM/KUtL6pq3PurukqRrXaWP06mThEOdOBYD89OAOjIGa63sikE6gyP3nsjTWHOYthrQRBXO\n\tOrca5P/0Rsp1MVxjcyMUToEN1mYfeZH6HA7g6IqaXPOHvLtGPYg==","X-Received":["by 2002:a67:eac1:0:b0:3a6:eeaf:bb10 with SMTP id\n\ts1-20020a67eac1000000b003a6eeafbb10mr27338006vso.13.1666782072477; \n\tWed, 26 Oct 2022 04:01:12 -0700 (PDT)","by 2002:a67:eac1:0:b0:3a6:eeaf:bb10 with SMTP id\n\ts1-20020a67eac1000000b003a6eeafbb10mr27337976vso.13.1666782071867;\n\tWed, 26 Oct 2022 04:01:11 -0700 (PDT)"],"X-Google-Smtp-Source":"AMsMyM6lRnCCwoUR9fUVdRbKeyTZ3jlHzTTdDc5j9sQhzhHCg7Ri8tJ7Y/YaRSHpfJYUvU42a0tkaaN5I5hsPj9bW/o=","MIME-Version":"1.0","References":"<20221020221026.28777-1-laurent.pinchart@ideasonboard.com>","In-Reply-To":"<20221020221026.28777-1-laurent.pinchart@ideasonboard.com>","Date":"Wed, 26 Oct 2022 12:00:56 +0100","Message-ID":"<CAOgh=FxYcEHZ_yhD2boL9iyZ3sM-xcSsmy3q9mGsn1p6VVY=WA@mail.gmail.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","X-Mimecast-Spam-Score":"0","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain; charset=\"UTF-8\"","Subject":"Re: [libcamera-devel] [PATCH v2] apps: Share common source between\n\tapplications","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","From":"Eric Curtin via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Eric Curtin <ecurtin@redhat.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]