Re: [v4l-utils] [PATCH v8 3/6] Add support for meson building

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Laurent,

Thanks for keeping this work alive.

On 2023-02-12 02:51:34 +0200, Laurent Pinchart wrote:
> From: Ariel D'Alessandro <ariel.dalessandro@xxxxxxxxxxxxx>
> 
> Supports building libraries and tools found in contrib/, lib/ and
> utils/ directories, along with the implemented gettext translations.
> 
> Co-developed-by: Ezequiel Garcia <ezequiel@xxxxxxxxxxxxx>
> Signed-off-by: Ezequiel Garcia <ezequiel@xxxxxxxxxxxxx>
> Acked-by: Kieran Bingham <kieran.bingham+renesas@xxxxxxxxxxxxxxxx>
> Reviewed-by: Kieran Bingham <kieran.bingham+renesas@xxxxxxxxxxxxxxxx>
> Acked-by: Gregor Jasny <gjasny@xxxxxxxxxxxxxx>
> [Gregor: Control symbol visibility]
> Signed-off-by: Gregor Jasny <gjasny@xxxxxxxxxxxxxx>
> Tested-by: Gregor Jasny <gjasny@xxxxxxxxxxxxxx>
> Signed-off-by: Ariel D'Alessandro <ariel.dalessandro@xxxxxxxxxxxxx>
> Signed-off-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx>

Reviewed-by: Niklas Söderlund <niklas.soderlund@xxxxxxxxxxxx>

> ---
> Changes since v7:
> 
> - Make v4l2gl conditional on dep_gl and dep_libudev
> - Fix udev dependency handling
> - Add comment about switching to install_emptydir()
> - Use meson's native dependency('iconv') when possible
> - Properly test for visibility support
> - Add v4l2-tracer
> - Add v4l-wrappers option
> - Simplify check for libdvbv5 option
> - Drop unused variables dep_v4l1compat and dep_v4l2convert
> - Push handling of have_qt5_opengl and have_fork in subdirs
> - Add summary
> - White space fixes
> 
> Changes since v6:
> 
> - Generate v4l-utils.spec
> 
> Changes since v5:
> 
> - Drop unneeded bpf option check
> - Avoid double-quoting strings
> - Use external_program object directly without calling path()
> - Specify check kwarg to run_command()
> - Replace deprecated get_cross_property() with get_external_property()
> - Fix SDL dependency fallback check
> - Set the default build type to debugoptimized
> ---
>  .gitignore                                    |   1 +
>  INSTALL.meson.md                              | 142 +++++++
>  README.md                                     |  83 +++-
>  contrib/cobalt-ctl/meson.build                |   8 +
>  contrib/decode_tm6000/meson.build             |  14 +
>  contrib/gconv/meson.build                     |  44 ++
>  contrib/meson.build                           |  13 +
>  contrib/rds-saa6588/meson.build               |   7 +
>  contrib/test/meson.build                      | 143 +++++++
>  contrib/xc3028-firmware/meson.build           |  11 +
>  lib/libdvbv5/meson.build                      | 156 +++++++
>  lib/libv4l-mplane/meson.build                 |  23 +
>  lib/libv4l1/meson.build                       |  64 +++
>  lib/libv4l2/meson.build                       |  73 ++++
>  lib/libv4l2rds/meson.build                    |  37 ++
>  lib/libv4lconvert/meson.build                 | 117 ++++++
>  lib/meson.build                               |  11 +
>  libdvbv5-po/meson.build                       |   3 +
>  meson.build                                   | 396 ++++++++++++++++++
>  meson_options.txt                             |  46 ++
>  utils/cec-compliance/meson.build              |  23 +
>  utils/cec-ctl/meson.build                     |  18 +
>  utils/cec-follower/meson.build                |  19 +
>  utils/cx18-ctl/meson.build                    |   8 +
>  utils/dvb/meson.build                         |  70 ++++
>  utils/gen_media_bus_format_codes.sh           |   7 +
>  utils/gen_media_bus_format_names.sh           |   7 +
>  utils/ir-ctl/meson.build                      |  23 +
>  utils/ivtv-ctl/meson.build                    |  13 +
>  .../bpf_protocols/clang_sys_includes.sh       |   9 +
>  utils/keytable/bpf_protocols/meson.build      |  31 ++
>  utils/keytable/meson.build                    |  85 ++++
>  utils/keytable/rc_keymaps/meson.build         | 150 +++++++
>  utils/libcecutil/meson.build                  |  45 ++
>  utils/libmedia_dev/meson.build                |  14 +
>  utils/libv4l2util/meson.build                 |  16 +
>  utils/media-ctl/meson.build                   |  43 ++
>  utils/meson.build                             |  43 ++
>  utils/qv4l2/meson.build                       |  79 ++++
>  utils/qvidcap/meson.build                     |  87 ++++
>  utils/rds-ctl/meson.build                     |  17 +
>  utils/v4l2-compliance/meson.build             |  63 +++
>  utils/v4l2-ctl/meson.build                    |  75 ++++
>  utils/v4l2-dbg/meson.build                    |  20 +
>  utils/v4l2-sysfs-path/meson.build             |  14 +
>  utils/v4l2-tracer/media-info.cpp              |   1 +
>  utils/v4l2-tracer/meson.build                 | 133 ++++++
>  utils/v4l2-tracer/v4l2-info.cpp               |   1 +
>  v4l-utils-po/meson.build                      |   3 +
>  49 files changed, 2493 insertions(+), 16 deletions(-)
>  create mode 100644 INSTALL.meson.md
>  create mode 100644 contrib/cobalt-ctl/meson.build
>  create mode 100644 contrib/decode_tm6000/meson.build
>  create mode 100644 contrib/gconv/meson.build
>  create mode 100644 contrib/meson.build
>  create mode 100644 contrib/rds-saa6588/meson.build
>  create mode 100644 contrib/test/meson.build
>  create mode 100644 contrib/xc3028-firmware/meson.build
>  create mode 100644 lib/libdvbv5/meson.build
>  create mode 100644 lib/libv4l-mplane/meson.build
>  create mode 100644 lib/libv4l1/meson.build
>  create mode 100644 lib/libv4l2/meson.build
>  create mode 100644 lib/libv4l2rds/meson.build
>  create mode 100644 lib/libv4lconvert/meson.build
>  create mode 100644 lib/meson.build
>  create mode 100644 libdvbv5-po/meson.build
>  create mode 100644 meson.build
>  create mode 100644 meson_options.txt
>  create mode 100644 utils/cec-compliance/meson.build
>  create mode 100644 utils/cec-ctl/meson.build
>  create mode 100644 utils/cec-follower/meson.build
>  create mode 100644 utils/cx18-ctl/meson.build
>  create mode 100644 utils/dvb/meson.build
>  create mode 100755 utils/gen_media_bus_format_codes.sh
>  create mode 100755 utils/gen_media_bus_format_names.sh
>  create mode 100644 utils/ir-ctl/meson.build
>  create mode 100644 utils/ivtv-ctl/meson.build
>  create mode 100755 utils/keytable/bpf_protocols/clang_sys_includes.sh
>  create mode 100644 utils/keytable/bpf_protocols/meson.build
>  create mode 100644 utils/keytable/meson.build
>  create mode 100644 utils/keytable/rc_keymaps/meson.build
>  create mode 100644 utils/libcecutil/meson.build
>  create mode 100644 utils/libmedia_dev/meson.build
>  create mode 100644 utils/libv4l2util/meson.build
>  create mode 100644 utils/media-ctl/meson.build
>  create mode 100644 utils/meson.build
>  create mode 100644 utils/qv4l2/meson.build
>  create mode 100644 utils/qvidcap/meson.build
>  create mode 100644 utils/rds-ctl/meson.build
>  create mode 100644 utils/v4l2-compliance/meson.build
>  create mode 100644 utils/v4l2-ctl/meson.build
>  create mode 100644 utils/v4l2-dbg/meson.build
>  create mode 100644 utils/v4l2-sysfs-path/meson.build
>  create mode 120000 utils/v4l2-tracer/media-info.cpp
>  create mode 100644 utils/v4l2-tracer/meson.build
>  create mode 120000 utils/v4l2-tracer/v4l2-info.cpp
>  create mode 100644 v4l-utils-po/meson.build
> 
> diff --git a/.gitignore b/.gitignore
> index f899ecfcc72c..7c900fe5a004 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -61,3 +61,4 @@ v4l-utils-po/en@quot.header
>  v4l-utils-po/insert-header.sin
>  v4l-utils-po/quot.sed
>  v4l-utils-po/remove-potcdate.sin
> +build/
> diff --git a/INSTALL.meson.md b/INSTALL.meson.md
> new file mode 100644
> index 000000000000..ec6f9226605d
> --- /dev/null
> +++ b/INSTALL.meson.md
> @@ -0,0 +1,142 @@
> +# Installation
> +
> +## Requirements
> +
> +* meson and a C and C++ compiler
> +* optionally libjpeg v6 or later
> +* optionally Qt5 for building qv4l2
> +
> +## Basic installation
> +
> +v4l-utils can be built and installed using meson as follows:
> +
> +```
> +meson build/
> +ninja -C build/
> +sudo ninja -C build/ install
> +```
> +
> +## Configuration
> +
> +You can get a summary of possible configurations running:
> +
> +```
> +meson configure build/
> +```
> +
> +To change the options values use the `-D` option:
> +
> +```
> +meson configure -Doption=newvalue
> +```
> +
> +After configuration you need to start the build process with:
> +
> +```
> +ninja -C build/
> +```
> +
> +More info about meson options:
> +[https://mesonbuild.com/Build-options.html](https://mesonbuild.com/Build-options.html)
> +
> +## Installing
> +
> +If you need to install to a different directory than the install prefix, use
> +the `DESTDIR` environment variable:
> +
> +```
> +DESTDIR=/path/to/staging/area ninja -C build/ install
> +```
> +
> +## Static builds
> +
> +Meson provides a built-in option to set the default library type:
> +
> +```
> +Core options     Default Value  Possible Values         Description
> +------------     -------------  ---------------         -----------
> +default_library  shared         [shared, static, both]  Default library type
> +```
> +
> +As previously described, it can be set as follows during the configuration step:
> +
> +```
> +meson configure -Ddefault_library=static
> +```
> +
> +Note that this will just build static libraries, but linking to dependencies and
> +system libraries dynamically.
> +
> +*Fully static* builds are not supported yet and would require custom
> +configuration and setting proper flags. By the time of this writing, there's an
> +ongoing issue in meson to add this feature, see
> +https://github.com/mesonbuild/meson/issues/7621
> +
> +## Cross Compiling
> +
> +Meson supports cross-compilation by specifying a number of binary paths and
> +settings in a file and passing this file to `meson` or `meson configure` with
> +the `--cross-file` parameter.
> +
> +Below are a few example of cross files, but keep in mind that you will likely
> +have to alter them for your system.
> +
> +32-bit build on x86 linux:
> +
> +```
> +[binaries]
> +c = '/usr/bin/gcc'
> +cpp = '/usr/bin/g++'
> +ar = '/usr/bin/gcc-ar'
> +strip = '/usr/bin/strip'
> +pkgconfig = '/usr/bin/pkg-config-32'
> +llvm-config = '/usr/bin/llvm-config32'
> +
> +[properties]
> +c_args = ['-m32']
> +c_link_args = ['-m32']
> +cpp_args = ['-m32']
> +cpp_link_args = ['-m32']
> +
> +[host_machine]
> +system = 'linux'
> +cpu_family = 'x86'
> +cpu = 'i686'
> +endian = 'little'
> +```
> +
> +64-bit build on ARM linux:
> +
> +```
> +[binaries]
> +c = '/usr/bin/aarch64-linux-gnu-gcc'
> +cpp = '/usr/bin/aarch64-linux-gnu-g++'
> +ar = '/usr/bin/aarch64-linux-gnu-gcc-ar'
> +strip = '/usr/bin/aarch64-linux-gnu-strip'
> +pkgconfig = '/usr/bin/aarch64-linux-gnu-pkg-config'
> +exe_wrapper = '/usr/bin/qemu-aarch64-static'
> +
> +[host_machine]
> +system = 'linux'
> +cpu_family = 'aarch64'
> +cpu = 'aarch64'
> +endian = 'little'
> +```
> +
> +64-bit build on x86 windows:
> +
> +```
> +[binaries]
> +c = '/usr/bin/x86_64-w64-mingw32-gcc'
> +cpp = '/usr/bin/x86_64-w64-mingw32-g++'
> +ar = '/usr/bin/x86_64-w64-mingw32-ar'
> +strip = '/usr/bin/x86_64-w64-mingw32-strip'
> +pkgconfig = '/usr/bin/x86_64-w64-mingw32-pkg-config'
> +exe_wrapper = 'wine'
> +
> +[host_machine]
> +system = 'windows'
> +cpu_family = 'x86_64'
> +cpu = 'i686'
> +endian = 'little'
> +```
> diff --git a/README.md b/README.md
> index e351d8022d2b..b11b7fe2ee80 100644
> --- a/README.md
> +++ b/README.md
> @@ -18,6 +18,10 @@ There is also a wiki page for the v4l-utils:
>  
>  ## Building
>  
> +Temporarily, both meson and autotools build systems are supported in parallel.
> +*NOTE*: Packagers should be aware that autotools support will be dropped soon,
> +to be fully replaced by meson.
> +
>  A number of packages is required to fully build v4l-utils. The first step is to
>  install those packages. The package names are different on each distro.
>  
> @@ -25,15 +29,15 @@ On Debian and derivated distributions, you need to install the following
>  packages with `apt-get` or `aptitude`:
>  
>  ```
> -debhelper dh-autoreconf autotools-dev autoconf-archive doxygen graphviz
> -libasound2-dev libtool libjpeg-dev qtbase5-dev qt5-default libqt5opengl5-dev
> -libudev-dev libx11-dev pkg-config udev make gcc git
> +debhelper dh-autoreconf doxygen graphviz libasound2-dev libtool libjpeg-dev
> +qtbase5-dev qt5-default libqt5opengl5-dev libudev-dev libx11-dev pkg-config
> +udev gcc git
>  ```
>  
>  On Fedora, the package list for a minimal install with `dnf` or `yum` is:
>  
>  ```
> -git automake autoconf libtool make gcc gcc-c++ which perl gettext-devel
> +git libtool gcc gcc-c++ which perl gettext-devel
>  ```
>  
>  (git is only requiried if you're cloning from the main git repository at
> @@ -50,7 +54,46 @@ mesa-libGLU-devel
>  The v4l2-tracer also needs the json-c library. On Debian: `libjson-c-dev' ; on
>  Fedora: `json-c-devel`.
>  
> -After downloading and installing the needed packages, you should run:
> +### Meson build
> +
> +Extra packages required for meson:
> +
> +```
> +# On Debian/Ubuntu
> +apt-get install meson ninja-build
> +
> +# On Fedora
> +dnf install meson ninja-build
> +```
> +
> +After downloading and installing the needed packages on your distribution, you
> +should run:
> +
> +```
> +meson build/
> +ninja -C build/
> +```
> +
> +And, to install on your system:
> +
> +```
> +sudo ninja -C build/ install
> +```
> +
> +### Autotools build
> +
> +Extra packages required for autotools:
> +
> +```
> +# On Debian/Ubuntu
> +apt-get install autotools-dev autoconf-archive make
> +
> +# On Fedora
> +dnf install automake autoconf make
> +```
> +
> +After downloading and installing the needed packages on your distribution, you
> +should run:
>  
>  ```
>  ./bootstrap.sh
> @@ -78,7 +121,15 @@ Japanese DVB tables via iconv. This is meant to be used when the iconv itself
>  doesn't come with the *ARIB-STD-B24* and *EN300-468-TAB00* tables.
>  
>  That requires not only the gconv package, but it also needs to be manually
> -enabled with `--enable-gconv`.
> +enabled running autoconf with `--enable-gconv` option.
> +
> +In meson, gconv is an auto feature, so it will be auto-enabled in case the
> +dependencies are satisfied. However, the gconv feature can be forced to enabled
> +by running the following command during configuration step:
> +
> +```
> +meson configure -Dgconv=enabled build/
> +```
>  
>  ## Versioning
>  
> @@ -144,7 +195,7 @@ This library is meant to be used by digital TV applications that need to talk
>  with media hardware.
>  
>  Full documentation is provided via Doxygen. It can be built, after configuring
> -the package, with:
> +the package with autotools, running:
>  
>  ```
>  make doxygen-run
> @@ -181,7 +232,7 @@ v4l-utils includes the following utilities:
>  
>  Decodes tm6000 proprietary format streams.
>  
> -Installed by make install under `<prefix>/bin`.
> +Installed under `<prefix>/bin`.
>  
>  ### ir-keytable
>  
> @@ -189,7 +240,7 @@ Dump, Load or Modify ir receiver input tables. The ir tables for remotes which
>  are known by the kernel (and loaded by default depending on dvb card type) can
>  be found under `utils/keytable/keycodes`.
>  
> -v4l-keytable does not get installed by `make install`.
> +v4l-keytable does not get installed during the install step.
>  
>  ### ir-ctl
>  
> @@ -199,25 +250,25 @@ A swiss-knife tool to handle raw IR and to set lirc options.
>  
>  QT v4l2 control panel application.
>  
> -Installed by `make install` under `<prefix>/bin`.
> +Installed under `<prefix>/bin`.
>  
>  ### rds-saa6588
>  
>  Poll i2c RDS receiver [Philips saa6588].
>  
> -rds-saa6588 does not get installed by `make install`.
> +rds-saa6588 does not get installed during the install step.
>  
>  ### v4l2-compliance
>  
>  Tool to test v4l2 API compliance of drivers.
>  
> -Installed by `make install` under `<prefix>/bin`.
> +Installed under `<prefix>/bin`.
>  
>  ### v4l2-ctl
>  
>  Tool to control v4l2 controls from the cmdline.
>  
> -Installed by `make install` under `<prefix>/bin`.
> +Installed under `<prefix>/bin`.
>  
>  ### v4l2-dbg
>  
> @@ -225,13 +276,13 @@ Tool to directly get and set registers of v4l2 devices, this requires a
>  *kernel >= 2.6.29* with the `ADV_DEBUG` option enabled. This tool can only be
>  used by root and is meant for development purposes only!
>  
> -Installed by `make install` under `<prefix>/sbin`.
> +Installed under `<prefix>/sbin`.
>  
>  ### v4l2-sysfs-path
>  
>  *FIXME* add description.
>  
> -Installed by `make install` under `<prefix>/bin`.
> +Installed under `<prefix>/bin`.
>  
>  ### v4l2-tracer
>  
> @@ -244,7 +295,7 @@ Installed by `make install` under `<prefix>/bin`.
>  
>  Xceive XC2028/3028 tuner module firmware manipulation tool.
>  
> -xc3028-firmware does not get installed by `make install`.
> +xc3028-firmware does not get installed during the install step.
>  
>  ## Syncing with Kernel
>  
> diff --git a/contrib/cobalt-ctl/meson.build b/contrib/cobalt-ctl/meson.build
> new file mode 100644
> index 000000000000..f76fcba33b9f
> --- /dev/null
> +++ b/contrib/cobalt-ctl/meson.build
> @@ -0,0 +1,8 @@
> +cobalt_ctl_sources = files(
> +    'cobalt-ctl.c',
> +    's-record.c',
> +)
> +
> +cobalt_ctl = executable('cobalt-ctl',
> +                        cobalt_ctl_sources,
> +                        include_directories : v4l2_utils_incdir)
> diff --git a/contrib/decode_tm6000/meson.build b/contrib/decode_tm6000/meson.build
> new file mode 100644
> index 000000000000..5147278ba561
> --- /dev/null
> +++ b/contrib/decode_tm6000/meson.build
> @@ -0,0 +1,14 @@
> +decode_tm6000_sources = files(
> +    'decode_tm6000.c',
> +)
> +
> +decode_tm6000_deps = [
> +    dep_argp,
> +    dep_libv4l2util,
> +]
> +
> +decode_tm6000 = executable('decode_tm6000',
> +                           decode_tm6000_sources,
> +                           install : true,
> +                           dependencies: decode_tm6000_deps,
> +                           include_directories : v4l2_utils_incdir)
> diff --git a/contrib/gconv/meson.build b/contrib/gconv/meson.build
> new file mode 100644
> index 000000000000..e95278fde671
> --- /dev/null
> +++ b/contrib/gconv/meson.build
> @@ -0,0 +1,44 @@
> +gconv_install_dir = get_option('libdir') / 'gconv'
> +
> +arib_std_b24_sources = files(
> +    'arib-std-b24.c',
> +    'jis0201.h',
> +    'jis0208.h',
> +    'jisx0213.h',
> +)
> +
> +arib_std_b24_deps = [
> +    dep_jis,
> +    dep_jisx0213,
> +]
> +
> +arib_std_b24 = shared_module('ARIB-STD-B24',
> +                             arib_std_b24_sources,
> +                             name_prefix : '',
> +                             dependencies : arib_std_b24_deps,
> +                             install : true,
> +                             install_dir : gconv_install_dir,
> +                             include_directories : v4l2_utils_incdir)
> +
> +dep_arib_std_b24 = declare_dependency(link_with : arib_std_b24)
> +
> +en300_468_tab00_sources = files(
> +    'en300-468-tab00.c',
> +)
> +
> +en300_468_tab00_deps = [
> +    dep_jis,
> +    dep_jisx0213,
> +]
> +
> +en300_468_tab00 = shared_module('EN300-468-TAB00',
> +                                en300_468_tab00_sources,
> +                                name_prefix : '',
> +                                dependencies : en300_468_tab00_deps,
> +                                install : true,
> +                                install_dir : gconv_install_dir,
> +                                include_directories : v4l2_utils_incdir)
> +
> +dep_en300_468_tab00 = declare_dependency(link_with : en300_468_tab00)
> +
> +install_data('gconv-modules', install_dir : gconv_install_dir)
> diff --git a/contrib/meson.build b/contrib/meson.build
> new file mode 100644
> index 000000000000..e3aa05ac72fb
> --- /dev/null
> +++ b/contrib/meson.build
> @@ -0,0 +1,13 @@
> +if host_machine.system() == 'linux'
> +    subdir('test')
> +    subdir('xc3028-firmware')
> +    if have_i2c_dev
> +        subdir('rds-saa6588')
> +    endif
> +endif
> +
> +subdir('decode_tm6000')
> +
> +if have_gconv
> +    subdir('gconv', if_found : [dep_jis, dep_jisx0213])
> +endif
> diff --git a/contrib/rds-saa6588/meson.build b/contrib/rds-saa6588/meson.build
> new file mode 100644
> index 000000000000..037d2e20fc60
> --- /dev/null
> +++ b/contrib/rds-saa6588/meson.build
> @@ -0,0 +1,7 @@
> +rds_saa6588_sources = files(
> +    'rds-saa6588.c',
> +)
> +
> +rds_saa6588 = executable('rds-saa6588',
> +                         rds_saa6588_sources,
> +                         include_directories : v4l2_utils_incdir)
> diff --git a/contrib/test/meson.build b/contrib/test/meson.build
> new file mode 100644
> index 000000000000..29b51df640e0
> --- /dev/null
> +++ b/contrib/test/meson.build
> @@ -0,0 +1,143 @@
> +ioctl_test_sources = files(
> +    'ioctl-test.c',
> +    'ioctl-test.h',
> +    'ioctl_32.h',
> +    'ioctl_64.h',
> +)
> +
> +ioctl_test = executable('ioctl-test',
> +                        ioctl_test_sources,
> +                        include_directories : v4l2_utils_incdir)
> +
> +sliced_vbi_test_sources = files(
> +    'sliced-vbi-test.c',
> +)
> +
> +sliced_vbi_test = executable('sliced-vbi-test',
> +                             sliced_vbi_test_sources,
> +                             include_directories : v4l2_utils_incdir)
> +
> +sliced_vbi_detect_sources = files(
> +    'sliced-vbi-detect.c',
> +)
> +
> +sliced_vbi_detect = executable('sliced-vbi-detect',
> +                               sliced_vbi_detect_sources,
> +                               include_directories : v4l2_utils_incdir)
> +
> +v4l2grab_sources = files(
> +    'v4l2grab.c',
> +
> +)
> +
> +v4l2grab_deps = [
> +    dep_argp,
> +    dep_libv4l2,
> +    dep_libv4lconvert,
> +    dep_threads,
> +]
> +
> +v4l2grab = executable('v4l2grab',
> +                      v4l2grab_sources,
> +                      dependencies : v4l2grab_deps,
> +                      include_directories : v4l2_utils_incdir)
> +
> +driver_test_sources = files(
> +    'driver-test.c',
> +
> +)
> +
> +driver_test_deps = [
> +    dep_libv4l2util,
> +]
> +
> +driver_test = executable('driver-test',
> +                         driver_test_sources,
> +                         dependencies : driver_test_deps,
> +                         include_directories : v4l2_utils_incdir)
> +
> +mc_nextgen_test_sources = files(
> +    'mc_nextgen_test.c',
> +)
> +
> +mc_nextgen_test_deps = [
> +    dep_argp,
> +    dep_libudev,
> +]
> +
> +mc_nextgen_test = executable('mc-nextgen-test',
> +                             mc_nextgen_test_sources,
> +                             dependencies : mc_nextgen_test_deps,
> +                             include_directories : v4l2_utils_incdir)
> +
> +stress_buffer_sources = files(
> +    'stress-buffer.c',
> +)
> +
> +stress_buffer = executable('stress-buffer',
> +                           stress_buffer_sources,
> +                           include_directories : v4l2_utils_incdir)
> +
> +capture_example_sources = files(
> +    'capture-example.c',
> +)
> +
> +capture_example = executable('capture-example',
> +                             capture_example_sources,
> +                             include_directories : v4l2_utils_incdir)
> +
> +if dep_x11.found()
> +    pixfmt_test_sources = files(
> +        'pixfmt-test.c',
> +    )
> +
> +    pixfmt_test_deps = [
> +        dep_x11,
> +    ]
> +
> +    pixfmt_test = executable('pixfmt-test',
> +                             pixfmt_test_sources,
> +                             dependencies : pixfmt_test_deps,
> +                             include_directories : v4l2_utils_incdir)
> +endif
> +
> +if dep_gl.found() and dep_glu.found() and dep_x11.found()
> +    v4l2gl_sources = files(
> +        'v4l2gl.c',
> +    )
> +
> +    v4l2gl_deps = [
> +        dep_gl,
> +        dep_glu,
> +        dep_libv4l2,
> +        dep_libv4lconvert,
> +        dep_x11,
> +    ]
> +
> +    v4l2gl = executable('v4l2gl',
> +                        v4l2gl_sources,
> +                        dependencies : v4l2gl_deps,
> +                        include_directories : v4l2_utils_incdir)
> +endif
> +
> +if dep_jpeg.found() and dep_sdl.found() and dep_sdl_image.found()
> +    sdlcam_sources = files(
> +        'sdlcam.c',
> +    )
> +
> +    sdlcam_deps = [
> +        dep_jpeg,
> +        dep_libdl,
> +        dep_libm,
> +        dep_librt,
> +        dep_libv4l2,
> +        dep_libv4lconvert,
> +        dep_sdl,
> +        dep_sdl_image,
> +    ]
> +
> +    sdlcam = executable('sdlcam',
> +                        sdlcam_sources,
> +                        dependencies : sdlcam_deps,
> +                        include_directories : v4l2_utils_incdir)
> +endif
> diff --git a/contrib/xc3028-firmware/meson.build b/contrib/xc3028-firmware/meson.build
> new file mode 100644
> index 000000000000..802c68586a8f
> --- /dev/null
> +++ b/contrib/xc3028-firmware/meson.build
> @@ -0,0 +1,11 @@
> +xc3028_firmware_sources = files(
> +    'extract_head.h',
> +    'firmware-tool.c',
> +    'standards.c',
> +    'standards.h',
> +    'xc2028-types.h',
> +)
> +
> +xc3028_firmware = executable('xc3028-firmware',
> +                             xc3028_firmware_sources,
> +                             include_directories : v4l2_utils_incdir)
> diff --git a/lib/libdvbv5/meson.build b/lib/libdvbv5/meson.build
> new file mode 100644
> index 000000000000..0b92e4047a81
> --- /dev/null
> +++ b/lib/libdvbv5/meson.build
> @@ -0,0 +1,156 @@
> +libdvbv5_option = get_option('libdvbv5')
> +if libdvbv5_option.disabled() or not dep_libudev.found()
> +    dep_libdvbv5 = dependency('', required : false)
> +    subdir_done()
> +endif
> +
> +libdvbv5_sources = files(
> +    'compat-soname.c',
> +    'countries.c',
> +    'crc32.c',
> +    'descriptors.c',
> +    'descriptors/desc_atsc_service_location.c',
> +    'descriptors/desc_ca.c',
> +    'descriptors/desc_ca_identifier.c',
> +    'descriptors/desc_cable_delivery.c',
> +    'descriptors/desc_event_extended.c',
> +    'descriptors/desc_event_short.c',
> +    'descriptors/desc_extension.c',
> +    'descriptors/desc_frequency_list.c',
> +    'descriptors/desc_hierarchy.c',
> +    'descriptors/desc_isdbt_delivery.c',
> +    'descriptors/desc_language.c',
> +    'descriptors/desc_logical_channel.c',
> +    'descriptors/desc_network_name.c',
> +    'descriptors/desc_partial_reception.c',
> +    'descriptors/desc_registration_id.c',
> +    'descriptors/desc_sat.c',
> +    'descriptors/desc_service.c',
> +    'descriptors/desc_t2_delivery.c',
> +    'descriptors/desc_terrestrial_delivery.c',
> +    'descriptors/desc_ts_info.c',
> +    'dvb-demux.c',
> +    'dvb-dev-local.c',
> +    'dvb-dev-priv.h',
> +    'dvb-dev-remote.c',
> +    'dvb-dev.c',
> +    'dvb-fe-priv.h',
> +    'dvb-fe.c',
> +    'dvb-file.c',
> +    'dvb-legacy-channel-format.c',
> +    'dvb-log.c',
> +    'dvb-sat.c',
> +    'dvb-scan.c',
> +    'dvb-v5-std.c',
> +    'dvb-v5.c',
> +    'dvb-v5.h',
> +    'dvb-vdr-format.c',
> +    'dvb-zap-format.c',
> +    'parse_string.c',
> +    'parse_string.h',
> +    'tables/atsc_eit.c',
> +    'tables/cat.c',
> +    'tables/eit.c',
> +    'tables/header.c',
> +    'tables/mgt.c',
> +    'tables/mpeg_es.c',
> +    'tables/mpeg_pes.c',
> +    'tables/mpeg_ts.c',
> +    'tables/nit.c',
> +    'tables/pat.c',
> +    'tables/pmt.c',
> +    'tables/sdt.c',
> +    'tables/vct.c',
> +)
> +
> +configure_file(
> +    output : 'libdvb-version.h',
> +    input : '../include/libdvbv5/libdvb-version.h.in',
> +    configuration : conf,
> +    install: true,
> +    install_dir: 'include/libdvbv5',
> +)
> +
> +libdvbv5_api = files(
> +    '../include/libdvbv5/atsc_eit.h',
> +    '../include/libdvbv5/atsc_header.h',
> +    '../include/libdvbv5/cat.h',
> +    '../include/libdvbv5/countries.h',
> +    '../include/libdvbv5/crc32.h',
> +    '../include/libdvbv5/desc_atsc_service_location.h',
> +    '../include/libdvbv5/desc_ca.h',
> +    '../include/libdvbv5/desc_ca_identifier.h',
> +    '../include/libdvbv5/desc_cable_delivery.h',
> +    '../include/libdvbv5/desc_event_extended.h',
> +    '../include/libdvbv5/desc_event_short.h',
> +    '../include/libdvbv5/desc_extension.h',
> +    '../include/libdvbv5/desc_frequency_list.h',
> +    '../include/libdvbv5/desc_hierarchy.h',
> +    '../include/libdvbv5/desc_isdbt_delivery.h',
> +    '../include/libdvbv5/desc_language.h',
> +    '../include/libdvbv5/desc_logical_channel.h',
> +    '../include/libdvbv5/desc_network_name.h',
> +    '../include/libdvbv5/desc_partial_reception.h',
> +    '../include/libdvbv5/desc_registration_id.h',
> +    '../include/libdvbv5/desc_sat.h',
> +    '../include/libdvbv5/desc_service.h',
> +    '../include/libdvbv5/desc_t2_delivery.h',
> +    '../include/libdvbv5/desc_terrestrial_delivery.h',
> +    '../include/libdvbv5/desc_ts_info.h',
> +    '../include/libdvbv5/descriptors.h',
> +    '../include/libdvbv5/dvb-demux.h',
> +    '../include/libdvbv5/dvb-dev.h',
> +    '../include/libdvbv5/dvb-fe.h',
> +    '../include/libdvbv5/dvb-file.h',
> +    '../include/libdvbv5/dvb-frontend.h',
> +    '../include/libdvbv5/dvb-log.h',
> +    '../include/libdvbv5/dvb-sat.h',
> +    '../include/libdvbv5/dvb-scan.h',
> +    '../include/libdvbv5/dvb-v5-std.h',
> +    '../include/libdvbv5/eit.h',
> +    '../include/libdvbv5/header.h',
> +    '../include/libdvbv5/mgt.h',
> +    '../include/libdvbv5/mpeg_es.h',
> +    '../include/libdvbv5/mpeg_pes.h',
> +    '../include/libdvbv5/mpeg_ts.h',
> +    '../include/libdvbv5/nit.h',
> +    '../include/libdvbv5/pat.h',
> +    '../include/libdvbv5/pmt.h',
> +    '../include/libdvbv5/sdt.h',
> +    '../include/libdvbv5/vct.h',
> +)
> +
> +install_headers(libdvbv5_api, subdir: 'libdvbv5')
> +
> +libdvbv5_deps = [
> +    dep_iconv,
> +    dep_libm,
> +    dep_librt,
> +    dep_libudev,
> +    dep_threads,
> +]
> +
> +libdvbv5_c_args = [
> +    '-DHAVE_DVBV5_REMOTE',
> +    '-DHAVE_PTHREAD',
> +    '-DLIBDVBV5_DOMAIN="libdvbv5"',
> +]
> +
> +libdvbv5 = library('dvbv5',
> +                   libdvbv5_sources,
> +                   soversion: '0',
> +                   version: '0.0.0',
> +                   install : true,
> +                   dependencies : libdvbv5_deps,
> +                   c_args : libdvbv5_c_args,
> +                   include_directories : v4l2_utils_incdir)
> +
> +dep_libdvbv5 = declare_dependency(link_with : libdvbv5)
> +meson.override_dependency('libdvbv5', dep_libdvbv5)
> +
> +pkg.generate(
> +    libdvbv5,
> +    name : 'libdvbv5',
> +    version : meson.project_version(),
> +    requires_private : 'libudev',
> +    description : 'DVBv5 utility library')
> diff --git a/lib/libv4l-mplane/meson.build b/lib/libv4l-mplane/meson.build
> new file mode 100644
> index 000000000000..0e0e558bf2f8
> --- /dev/null
> +++ b/lib/libv4l-mplane/meson.build
> @@ -0,0 +1,23 @@
> +libv4l_mplane_sources = files(
> +    'libv4l-mplane.c',
> +)
> +
> +libv4l_mplane_deps = [
> +    dep_threads,
> +]
> +
> +libv4l_mplane_c_args = []
> +
> +if have_visibility
> +    libv4l_mplane_c_args += ['-fvisibility=hidden']
> +endif
> +
> +libv4l_mplane = shared_module('v4l-mplane',
> +                              libv4l_mplane_sources,
> +                              install : true,
> +                              install_dir : libv4l2plugindir,
> +                              dependencies : libv4l_mplane_deps,
> +                              c_args : libv4l_mplane_c_args,
> +                              include_directories : v4l2_utils_incdir)
> +
> +dep_libv4l_mplane = declare_dependency(link_with : libv4l_mplane)
> diff --git a/lib/libv4l1/meson.build b/lib/libv4l1/meson.build
> new file mode 100644
> index 000000000000..e1df2fa29b5b
> --- /dev/null
> +++ b/lib/libv4l1/meson.build
> @@ -0,0 +1,64 @@
> +libv4l1_sources = files(
> +    'libv4l1-priv.h',
> +    'libv4l1.c',
> +    'log.c',
> +)
> +
> +libv4l1_api = files(
> +    '../include/libv4l1-videodev.h',
> +    '../include/libv4l1.h',
> +)
> +
> +install_headers(libv4l1_api)
> +
> +libv4l1_deps = [
> +    dep_libv4l2,
> +    dep_threads,
> +]
> +
> +libv4l1_c_args = []
> +
> +if have_visibility
> +    libv4l1_c_args += ['-fvisibility=hidden']
> +endif
> +
> +libv4l1 = library('v4l1',
> +                  libv4l1_sources,
> +                  install : true,
> +                  soversion: '0',
> +                  version: '0.0.0',
> +                  dependencies : libv4l1_deps,
> +                  c_args : libv4l1_c_args,
> +                  include_directories : v4l2_utils_incdir)
> +
> +dep_libv4l1 = declare_dependency(link_with : libv4l1)
> +meson.override_dependency('libv4l1', dep_libv4l1)
> +
> +pkg.generate(
> +    libv4l1,
> +    name : 'libv4l1',
> +    version : meson.project_version(),
> +    requires_private : 'libv4l2',
> +    description : 'v4l1 compatibility library')
> +
> +if not get_option('v4l-wrappers')
> +    subdir_done()
> +endif
> +
> +v4l1compat_sources = files(
> +    'v4l1compat.c',
> +)
> +
> +v4l1compat_deps = [
> +    dep_libv4l1,
> +]
> +
> +libv4l1privdir = get_option('prefix') / get_option('libdir') / get_option('libv4l1subdir')
> +
> +v4l1compat = shared_module('v4l1compat',
> +                           v4l1compat_sources,
> +                           name_prefix : '',
> +                           install : true,
> +                           install_dir : libv4l1privdir,
> +                           dependencies : v4l1compat_deps,
> +                           include_directories : v4l2_utils_incdir)
> diff --git a/lib/libv4l2/meson.build b/lib/libv4l2/meson.build
> new file mode 100644
> index 000000000000..bd6e0e7fb6b9
> --- /dev/null
> +++ b/lib/libv4l2/meson.build
> @@ -0,0 +1,73 @@
> +libv4l2_sources = files(
> +    'libv4l2-priv.h',
> +    'libv4l2.c',
> +    'log.c',
> +)
> +
> +libv4l2_api = files(
> +    '../include/libv4l-plugin.h',
> +    '../include/libv4l2.h',
> +)
> +
> +install_headers(libv4l2_api)
> +
> +libv4l2_deps = [
> +    dep_libdl,
> +    dep_libv4lconvert,
> +    dep_threads,
> +]
> +
> +libv4l2_c_args = []
> +
> +if get_option('v4l-plugins')
> +    libv4l2_sources += files('v4l2-plugin.c')
> +    libv4l2_c_args += [
> +        '-DHAVE_V4L_PLUGINS',
> +        '-DLIBV4L2_PLUGIN_DIR="@0@"'.format(libv4l2plugindir)
> +    ]
> +endif
> +
> +if have_visibility
> +    libv4l2_c_args += ['-fvisibility=hidden']
> +endif
> +
> +libv4l2 = library('v4l2',
> +                  libv4l2_sources,
> +                  soversion: '0',
> +                  version: '0.0.0',
> +                  install : true,
> +                  dependencies : libv4l2_deps,
> +                  c_args : libv4l2_c_args,
> +                  include_directories : v4l2_utils_incdir)
> +
> +dep_libv4l2 = declare_dependency(link_with : libv4l2)
> +meson.override_dependency('libv4l2', dep_libv4l2)
> +
> +pkg.generate(
> +    libv4l2,
> +    name : 'libv4l2',
> +    version : meson.project_version(),
> +    requires_private : 'libv4lconvert',
> +    description : 'v4l2 device access library')
> +
> +if not get_option('v4l-wrappers')
> +    subdir_done()
> +endif
> +
> +v4l2convert_sources = files(
> +    'v4l2convert.c',
> +)
> +
> +v4l2convert_deps = [
> +    dep_libv4l2,
> +]
> +
> +libv4l2privdir = get_option('prefix') / get_option('libdir') / get_option('libv4l2subdir')
> +
> +v4l2convert = shared_module('v4l2convert',
> +                            v4l2convert_sources,
> +                            name_prefix : '',
> +                            install : true,
> +                            install_dir : libv4l2privdir,
> +                            dependencies : v4l2convert_deps,
> +                            include_directories : v4l2_utils_incdir)
> diff --git a/lib/libv4l2rds/meson.build b/lib/libv4l2rds/meson.build
> new file mode 100644
> index 000000000000..338a97f87029
> --- /dev/null
> +++ b/lib/libv4l2rds/meson.build
> @@ -0,0 +1,37 @@
> +libv4l2rds_sources = files(
> +    'libv4l2rds.c',
> +)
> +
> +libv4l2rds_api = files(
> +    '../include/libv4l2rds.h',
> +)
> +
> +install_headers(libv4l2rds_api)
> +
> +libv4l2rds_deps = [
> +    dep_threads,
> +]
> +
> +libv4l2rds_c_args = []
> +
> +if have_visibility
> +    libv4l2rds_c_args += ['-fvisibility=hidden']
> +endif
> +
> +libv4l2rds = library('v4l2rds',
> +                     libv4l2rds_sources,
> +                     soversion: '0',
> +                     version: '0.0.0',
> +                     install : true,
> +                     dependencies : libv4l2rds_deps,
> +                     c_args : libv4l2rds_c_args,
> +                     include_directories : v4l2_utils_incdir)
> +
> +dep_libv4l2rds = declare_dependency(link_with : libv4l2rds)
> +meson.override_dependency('libv4l2rds', dep_libv4l2rds)
> +
> +pkg.generate(
> +    libv4l2rds,
> +    name : 'libv4l2rds',
> +    version : meson.project_version(),
> +    description : 'v4l2 RDS decode library')
> diff --git a/lib/libv4lconvert/meson.build b/lib/libv4lconvert/meson.build
> new file mode 100644
> index 000000000000..3874075575c2
> --- /dev/null
> +++ b/lib/libv4lconvert/meson.build
> @@ -0,0 +1,117 @@
> +libv4lconvert_sources = files(
> +    'bayer.c',
> +    'control/libv4lcontrol-priv.h',
> +    'control/libv4lcontrol.c',
> +    'control/libv4lcontrol.h',
> +    'cpia1.c',
> +    'crop.c',
> +    'flip.c',
> +    'helper-funcs.h',
> +    'jidctflt.c',
> +    'jl2005bcd.c',
> +    'jpeg.c',
> +    'jpgl.c',
> +    'libv4lconvert-priv.h',
> +    'libv4lconvert.c',
> +    'libv4lsyscall-priv.h',
> +    'mr97310a.c',
> +    'nv12_16l16.c',
> +    'pac207.c',
> +    'processing/autogain.c',
> +    'processing/gamma.c',
> +    'processing/libv4lprocessing-priv.h',
> +    'processing/libv4lprocessing.c',
> +    'processing/libv4lprocessing.h',
> +    'processing/whitebalance.c',
> +    'rgbyuv.c',
> +    'se401.c',
> +    'sn9c10x.c',
> +    'sn9c2028-decomp.c',
> +    'sn9c20x.c',
> +    'spca501.c',
> +    'spca561-decompress.c',
> +    'sq905c.c',
> +    'stv0680.c',
> +    'tinyjpeg-internal.h',
> +    'tinyjpeg.c',
> +    'tinyjpeg.h',
> +)
> +
> +libv4lconvert_api = files(
> +    '../include/libv4lconvert.h',
> +)
> +
> +install_headers(libv4lconvert_api)
> +
> +libv4lconvert_deps = [
> +    dep_libm,
> +    dep_librt,
> +]
> +
> +libv4lconvert_priv_libs = [
> +    '-lm',
> +    '-lrt',
> +]
> +
> +libv4lconvertprivdir = get_option('prefix') / get_option('libdir') / get_option('libv4lconvertsubdir')
> +
> +libv4lconvert_c_args = ['-DLIBV4LCONVERT_PRIV_DIR="@0@"'.format(libv4lconvertprivdir)]
> +
> +if dep_jpeg.found()
> +    libv4lconvert_deps += dep_jpeg
> +    libv4lconvert_priv_libs += dep_jpeg_priv_libs
> +    libv4lconvert_sources += files(
> +        'jpeg_memsrcdest.c',
> +        'jpeg_memsrcdest.h'
> +    )
> +    libv4lconvert_c_args += [
> +        '-DHAVE_JPEG',
> +    ]
> +endif
> +
> +if have_fork
> +    libv4lconvert_sources += files(
> +        'helper.c',
> +    )
> +    ov511_decomp_sources = files(
> +        'ov511-decomp.c',
> +    )
> +    ov511_decomp = executable('ov511-decomp',
> +                              ov511_decomp_sources,
> +                              install : true,
> +                              install_dir : libv4lconvertprivdir,
> +                              include_directories : v4l2_utils_incdir)
> +    ov518_decomp_sources = files(
> +        'ov518-decomp.c',
> +    )
> +    ov518_decomp = executable('ov518-decomp',
> +                              ov518_decomp_sources,
> +                              install : true,
> +                              install_dir : libv4lconvertprivdir,
> +                              include_directories : v4l2_utils_incdir)
> +endif
> +
> +if have_visibility
> +    libv4lconvert_c_args += [
> +      '-fvisibility=hidden',
> +      '-DHAVE_LIBV4LCONVERT_HELPERS',
> +    ]
> +endif
> +
> +libv4lconvert = library('v4lconvert',
> +                        libv4lconvert_sources,
> +                        soversion: '0',
> +                        version: '0.0.0',
> +                        install : true,
> +                        dependencies : libv4lconvert_deps,
> +                        c_args : libv4lconvert_c_args,
> +                        include_directories : v4l2_utils_incdir)
> +
> +dep_libv4lconvert = declare_dependency(link_with : libv4lconvert)
> +meson.override_dependency('libv4lconvert', dep_libv4lconvert)
> +
> +pkg.generate(
> +    libv4lconvert,
> +    name : 'libv4lconvert',
> +    version : meson.project_version(),
> +    description : 'v4l format conversion library')
> diff --git a/lib/meson.build b/lib/meson.build
> new file mode 100644
> index 000000000000..47cee16d12b5
> --- /dev/null
> +++ b/lib/meson.build
> @@ -0,0 +1,11 @@
> +libv4l2plugindir = get_option('prefix') / get_option('libdir') / get_option('libv4l2subdir') / 'plugins'
> +
> +subdir('libdvbv5')
> +subdir('libv4lconvert')
> +subdir('libv4l2')
> +subdir('libv4l1')
> +subdir('libv4l2rds')
> +
> +if get_option('v4l-plugins')
> +    subdir('libv4l-mplane')
> +endif
> diff --git a/libdvbv5-po/meson.build b/libdvbv5-po/meson.build
> new file mode 100644
> index 000000000000..e382651ee5d1
> --- /dev/null
> +++ b/libdvbv5-po/meson.build
> @@ -0,0 +1,3 @@
> +i18n.gettext('libdvbv5',
> +    args : i18n_gettext_arguments,
> +)
> diff --git a/meson.build b/meson.build
> new file mode 100644
> index 000000000000..dec5ff7de470
> --- /dev/null
> +++ b/meson.build
> @@ -0,0 +1,396 @@
> +project('v4l-utils', 'c', 'cpp',
> +    version: '1.21.0',
> +    meson_version : '>= 0.57',
> +    default_options : [
> +        'buildtype=debugoptimized',
> +        'warning_level=1',
> +        'c_std=gnu99',
> +        'cpp_std=gnu++11',
> +    ],
> +    license : 'LGPL 2.1+')
> +
> +cc = meson.get_compiler('c')
> +cpp = meson.get_compiler('cpp')
> +have_m32 = cc.has_link_argument('-m32')
> +have_visibility = cc.has_argument('-fvisibility=hidden') and \
> +                  cc.has_function_attribute('visibility:default')
> +
> +sys_root = meson.get_external_property('sys_root', '/')
> +
> +fs = import('fs')
> +i18n = import('i18n')
> +pkg = import('pkgconfig')
> +qt5 = import('qt5')
> +
> +as_version = meson.project_version()
> +ver_arr = as_version.split('.')
> +as_major_version = ver_arr[0]
> +as_minor_version = ver_arr[1]
> +as_patch_version = ver_arr[2]
> +
> +conf = configuration_data()
> +conf.set_quoted('PACKAGE', meson.project_name())
> +conf.set_quoted('PACKAGE_VERSION', as_version)
> +conf.set_quoted('V4L_UTILS_VERSION', as_version)
> +conf.set('MAJOR', as_major_version)
> +conf.set('MINOR', as_minor_version)
> +conf.set('PATCH', as_patch_version)
> +
> +common_arguments = [
> +    '-Wpointer-arith',
> +    '-D_GNU_SOURCE',
> +    '-I.', # Needed for config.h
> +    '-DPROMOTED_MODE_T=int',
> +    '-DENABLE_NLS',
> +]
> +
> +v4l2_utils_incdir_arr = [
> +    'lib' / 'include',
> +]
> +
> +if host_machine.system() == 'linux'
> +    v4l2_utils_incdir_arr += 'include'
> +elif host_machine.system() == 'freebsd'
> +    v4l2_utils_incdir_arr += 'contrib/freebsd/include'
> +endif
> +
> +v4l2_utils_incdir = include_directories(v4l2_utils_incdir_arr)
> +
> +prog_bash = find_program('bash')
> +prog_clang = find_program('clang', required : get_option('bpf'))
> +prog_git = find_program('git')
> +prog_grep = find_program('grep')
> +prog_perl = find_program('perl')
> +
> +dep_alsa = dependency('alsa', required : false)
> +if dep_alsa.found()
> +    conf.set('HAVE_ALSA', 1)
> +endif
> +
> +dep_gl = dependency('gl', required : get_option('qvidcap').enabled() or
> +                                     get_option('qv4l2').enabled())
> +dep_glu = dependency('glu', required : false)
> +
> +dep_jsonc = dependency('json-c', required : get_option('v4l2-tracer'), version : '>=0.15')
> +
> +dep_libdl = cc.find_library('dl')
> +dep_libelf = cc.find_library('elf', required : get_option('bpf'))
> +dep_libm = cc.find_library('m')
> +dep_librt = cc.find_library('rt')
> +dep_qt5 = dependency('qt5', modules: ['Core', 'Gui', 'Widgets', 'OpenGL'],
> +                     required : get_option('qvidcap').enabled() or get_option('qv4l2').enabled())
> +
> +dep_libbpf = dependency('bpf', required : get_option('bpf'), version : '>=0.7')
> +if not dep_libbpf.found()
> +    dep_libbpf = cc.find_library('bpf', has_headers: 'bpf/bpf.h', required : get_option('bpf'))
> +endif
> +
> +dep_sdl = dependency('SDL2', required: false)
> +if not dep_sdl.found()
> +    dep_sdl = cc.find_library('SDL2', has_headers: 'SDL2/SDL.h', required: false)
> +endif
> +
> +dep_sdl_image = dependency('SDL2_image', required: false)
> +if not dep_sdl_image.found()
> +    dep_sdl_image = cc.find_library('SDL2_image', has_headers: 'SDL2/SDL_image.h', required: false)
> +endif
> +
> +dep_threads = dependency('threads')
> +dep_x11 = dependency('x11', required : false)
> +dep_xmlrpc = dependency('xmlrpc', required : false)
> +
> +have_fork = cc.has_function('fork')
> +have_i2c_dev = cc.has_header('linux/i2c-dev.h')
> +
> +if have_visibility
> +    conf.set('HAVE_VISIBILITY', 1)
> +endif
> +
> +if cc.has_function('klogctl')
> +    conf.set('HAVE_KLOGCTL', 1)
> +endif
> +
> +if cc.has_function('secure_getenv')
> +    conf.set('HAVE_SECURE_GETENV', 1)
> +endif
> +
> +if cc.has_function('__secure_getenv')
> +    conf.set('HAVE___SECURE_GETENV', 1)
> +endif
> +
> +if cc.has_header('sys/klog.h')
> +    conf.set('HAVE_SYS_KLOG_H', 1)
> +endif
> +
> +if cc.has_header_symbol('execinfo.h', 'backtrace')
> +    conf.set('HAVE_BACKTRACE', 1)
> +endif
> +
> +if cc.has_function('argp_parse')
> +    dep_argp = dependency('', required : false)
> +else
> +    dep_argp = cc.find_library('argp')
> +endif
> +
> +if cc.has_function('strerrorname_np')
> +    conf.set('HAVE_STRERRORNAME_NP', 1)
> +endif
> +
> +conf.set_quoted('LOCALEDIR', get_option('prefix') / get_option('datadir') / 'locale')
> +
> +# Meson 0.60 handles the iconv dependency natively. For older versions, fall
> +# back to manual checks for the iconv_open function in libc, or finding an
> +# external library otherwise.
> +if meson.version().version_compare('>= 0.60')
> +    dep_iconv = dependency('iconv', required : false)
> +else
> +    if cc.has_function('iconv_open')
> +        dep_iconv = declare_dependency()
> +    else
> +        dep_iconv = cc.find_library('iconv', required : false)
> +    endif
> +endif
> +
> +if dep_iconv.found()
> +    conf.set('HAVE_ICONV', 1)
> +    iconv_const_test = '''#include <iconv.h>
> +size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
> +'''
> +    if cc.compiles(iconv_const_test, dependencies : dep_iconv)
> +        conf.set('ICONV_CONST', '')
> +    else
> +        conf.set('ICONV_CONST', 'const')
> +    endif
> +endif
> +
> +have_gconv = cc.has_header('gconv.h', required : get_option('gconv'))
> +
> +# Detect system gconv directory
> +gconvsysdir = get_option('gconvsysdir')
> +
> +# Generic check: works with most distributions
> +gconv_dirs_generic = [
> +    'lib64',
> +    'usr/lib64',
> +    'usr/local/lib64',
> +    'lib',
> +    'usr/lib',
> +    'usr/local/lib',
> +]
> +
> +if gconvsysdir == ''
> +    foreach dir : gconv_dirs_generic
> +        dir = sys_root / dir / 'gconv'
> +        if fs.is_dir(dir)
> +            gconvsysdir = dir
> +            break
> +        endif
> +    endforeach
> +endif
> +
> +# Debian/Ubuntu-specific check: should be aligned with the debian package
> +gconv_dirs_debian = [
> +    'aarch64-linux-gnu',
> +    'alphaev67-linux-gnu',
> +    'arm-linux-gnueabi',
> +    'arm-linux-gnueabihf',
> +    'i686-kfreebsd-gnu',
> +    'i686-linux-gnu',
> +    'mips-linux-gnu',
> +    'mips64-linux-gnuabi64',
> +    'mips64-linux-gnuabin32',
> +    'mips64el-linux-gnuabi64',
> +    'mips64el-linux-gnuabin32',
> +    'mipsel-linux-gnu',
> +    'mipsisa32r6-linux-gnu',
> +    'mipsisa32r6el-linux-gnu',
> +    'mipsisa64r6-linux-gnuabi64',
> +    'mipsisa64r6-linux-gnuabin32',
> +    'mipsisa64r6el-linux-gnuabi64',
> +    'mipsisa64r6el-linux-gnuabin32',
> +    'powerpc-linux-gnu',
> +    'powerpc64-linux-gnu',
> +    's390-linux-gnu',
> +    'sparc64-linux-gnu',
> +    'sparcv9-linux-gnu',
> +    'x86_64-linux-gnu',
> +    'x86_64-linux-gnux32',
> +]
> +
> +if gconvsysdir == ''
> +    foreach dir : gconv_dirs_debian
> +        dir = sys_root / 'usr' / 'lib' / dir / 'gconv'
> +        if fs.is_dir(dir)
> +            gconvsysdir = dir
> +            break
> +        endif
> +    endforeach
> +endif
> +
> +if gconvsysdir == ''
> +    dep_jis = cc.find_library('JIS', required : get_option('gconv'))
> +    dep_jisx0213 = cc.find_library('JISX0213', required : get_option('gconv'))
> +else
> +    dep_jis = cc.find_library('JIS', required : get_option('gconv'), dirs : gconvsysdir)
> +    dep_jisx0213 = cc.find_library('JISX0213', required : get_option('gconv'), dirs : gconvsysdir)
> +endif
> +
> +dep_jpeg = dependency('libjpeg', required : get_option('jpeg'))
> +if dep_jpeg.found()
> +    dep_jpeg_priv_libs = '-ljpeg'
> +endif
> +
> +systemd_systemdir = get_option('systemdsystemunitdir')
> +if systemd_systemdir == ''
> +    dep_systemd = dependency('systemd', required : false)
> +    if dep_systemd.found()
> +        systemd_systemdir = dep_systemd.get_variable(pkgconfig : 'systemdsystemunitdir')
> +    endif
> +endif
> +if systemd_systemdir == ''
> +    systemd_systemdir = '/lib/systemd/system'
> +endif
> +# Since systemd v239, udevd is not allowed to execute BPF systems calls;
> +# add an override to allow bpf(2) in that case. On earlier versions, the
> +# override will restrict udevd to bpf syscall only and will stop the system
> +# from booting. This is also true on current debian versions.
> +have_udevdsyscallfilter = run_command(prog_grep, '-s', 'SystemCallFilter',
> +                                      systemd_systemdir / 'systemd-udevd.service',
> +                                      check : false).returncode() == 0
> +
> +dep_libudev = dependency('libudev', required : get_option('libdvbv5'))
> +if dep_libudev.found()
> +    conf.set('HAVE_LIBUDEV', 1)
> +endif
> +
> +udevdir = get_option('udevdir')
> +if udevdir == ''
> +    dep_udev = dependency('udev', required : false)
> +    if dep_udev.found()
> +        udevdir = dep_udev.get_variable(pkgconfig : 'udevdir')
> +    endif
> +endif
> +if udevdir == ''
> +    udevdir = '/lib/udev'
> +endif
> +
> +qt5_opengl_test = '''
> +#define GL_GLEXT_PROTOTYPES
> +#define QT_NO_OPENGL_ES_2
> +
> +#include <QGLWidget>
> +#include <QGLShader>
> +#include <QGLShaderProgram>
> +#include <QGLFunctions>
> +
> +#ifndef GL_UNSIGNED_INT_8_8_8_8
> +#error Missing OpenGL Extensions
> +#endif
> +'''
> +have_qt5_opengl = cpp.compiles(qt5_opengl_test,
> +                               dependencies : [dep_gl, dep_qt5],
> +                               args : '-fPIC')
> +if have_qt5_opengl
> +    conf.set('HAVE_QTGL', 1)
> +endif
> +
> +ioctl_posix_test = '''
> +#include <sys/ioctl.h>
> +int ioctl (int, int, ...);
> +'''
> +if cc.compiles(ioctl_posix_test)
> +    conf.set('HAVE_POSIX_IOCTL', 1)
> +endif
> +
> +c_arguments = []
> +cpp_arguments = []
> +
> +c_arguments += common_arguments
> +cpp_arguments += common_arguments
> +
> +add_project_arguments(c_arguments, language : 'c')
> +add_project_arguments(cpp_arguments, language : 'cpp')
> +add_project_link_arguments(cpp_arguments, language : 'cpp')
> +
> +git_sha = run_command(prog_git, '-C', meson.project_source_root(), 'rev-parse', '--short=12', 'HEAD',
> +                      check : true).stdout().strip()
> +conf.set('GIT_SHA', git_sha)
> +git_commit_cnt = run_command(prog_git, '-C', meson.project_source_root(), 'rev-list', '--count', 'HEAD',
> +                             check : true).stdout().strip()
> +conf.set('GIT_COMMIT_CNT', '-' + git_commit_cnt)
> +git_commit_date = run_command(prog_git, '-C', meson.project_source_root(), 'show', '--quiet',
> +                              '--date=format-local:%F %T', '--format=%cd',
> +                              env : ['TZ=UTC'], check : true).stdout().strip()
> +conf.set('GIT_COMMIT_DATE', git_commit_date)
> +
> +man_pages = []
> +
> +i18n_gettext_arguments = ['--directory=' + meson.project_source_root(),
> +                          '--keyword=_', '--keyword=N_', '--keyword=P_:1,2']
> +subdir('libdvbv5-po')
> +subdir('v4l-utils-po')
> +
> +subdir('lib')
> +
> +if get_option('v4l-utils')
> +    subdir('utils')
> +    subdir('contrib')
> +endif
> +
> +configure_file(output : 'config.h', configuration : conf)
> +
> +foreach m : man_pages
> +    configure_file(input : join_paths(m[0], '@0@.@1@.in'.format(m[1], m[2])),
> +                   output : '@0@.@1@'.format(m[1], m[2]),
> +                   install_dir : join_paths(get_option('mandir'), 'man@0@'.format(m[2])),
> +                   configuration : conf)
> +endforeach
> +
> +configure_file(input : 'v4l-utils.spec.in', output : 'v4l-utils.spec',
> +               configuration : conf)
> +
> +summary({
> +            'ALSA' : dep_alsa,
> +            'GL' : dep_gl,
> +            'GLU' : dep_glu,
> +            'JSON-C' : dep_jsonc,
> +            'Qt5' : [
> +                dep_qt5,
> +                have_qt5_opengl ? 'with QtGL' : 'without QtGL',
> +            ],
> +            'SDL' : dep_sdl,
> +            'X11' : dep_x11,
> +            'gconv' : have_gconv,
> +            'iconv' : dep_iconv,
> +            'libjpeg' : dep_jpeg,
> +            'libudev' : dep_libudev,
> +            'threads' : dep_threads,
> +        }, bool_yn : true, section : 'Dependencies')
> +
> +summary({
> +            'udevdir' : udevdir,
> +        }, section : 'Directories')
> +
> +summary({
> +            'libdvbv5' : is_variable('libdvbv5'),
> +            'v4l-plugins' : get_option('v4l-plugins'),
> +            'v4l-wrappers' : get_option('v4l-wrappers'),
> +        }, bool_yn : true, section : 'Libraries')
> +
> +summary({
> +            'BPF IR decoders' : ir_bpf_enabled,
> +            'qv4l2' : is_variable('qv4l2'),
> +            'qvidcap' : is_variable('qvidcap'),
> +            'v4l-utils' : get_option('v4l-utils'),
> +            'v4l2-compliance' : [
> +                is_variable('v4l2_compliance'),
> +                get_option('v4l2-compliance-libv4l') ? 'with libv4l' : 'without libv4l',
> +            ],
> +            'v4l2-compliance-32' : is_variable('v4l2_compliance_32'),
> +            'v4l2-ctl' : [
> +                is_variable('v4l2_ctl'),
> +                get_option('v4l2-ctl-libv4l') ? 'with libv4l' : 'without libv4l',
> +            ],
> +            'v4l2-ctl-32' : is_variable('v4l2_ctl_32'),
> +            'v4l2-tracer' : is_variable('v4l2_tracer'),
> +        }, bool_yn : true, section : 'Applications')
> diff --git a/meson_options.txt b/meson_options.txt
> new file mode 100644
> index 000000000000..6fc57bdee168
> --- /dev/null
> +++ b/meson_options.txt
> @@ -0,0 +1,46 @@
> +# Features
> +option('bpf', type : 'feature', value : 'auto',
> +       description : 'Enable IR BPF decoders')
> +option('gconv', type : 'feature', value : 'auto',
> +       description : 'Enable compilation of gconv modules')
> +option('jpeg', type : 'feature', value : 'auto')
> +option('libdvbv5', type : 'feature', value : 'auto',
> +       description : 'Enable libdvbv5 compilation')
> +option('qv4l2', type : 'feature', value : 'auto',
> +       description : 'Enable qv4l2 compilation')
> +option('qvidcap', type : 'feature', value : 'auto',
> +       description : 'Enable qvidcap compilation')
> +option('v4l2-tracer', type : 'feature', value : 'auto',
> +       description : 'Enable v4l2-tracer compilation')
> +
> +# Options
> +option('v4l-plugins', type : 'boolean',
> +       description : 'V4L plugin support')
> +option('v4l-utils', type : 'boolean',
> +       description : 'Enable v4l-utils compilation')
> +option('v4l-wrappers', type : 'boolean',
> +       description : 'V4L wrappers support')
> +option('v4l2-compliance-32', type : 'boolean', value : false,
> +       description : 'Enable v4l2-compliance-32 compilation (for debugging purposes only)')
> +option('v4l2-compliance-libv4l', type : 'boolean',
> +       description : 'Enable use of libv4l in v4l2-compliance')
> +option('v4l2-ctl-32', type : 'boolean', value : false,
> +       description : 'Enable v4l2-ctl-32 compilation (for debugging purposes only)')
> +option('v4l2-ctl-libv4l', type : 'boolean',
> +       description : 'Enable use of libv4l in v4l2-ctl')
> +option('v4l2-ctl-stream-to', type : 'boolean',
> +       description : 'Enable use of --stream-to in v4l2-ctl')
> +
> +# Directories
> +option('gconvsysdir', type : 'string',
> +       description : 'Set system gconv directory (default is to autodetect)')
> +option('libv4l1subdir', type : 'string', value : 'libv4l',
> +       description : 'Set libv4l1 library subdir')
> +option('libv4l2subdir', type : 'string', value : 'libv4l',
> +       description : 'Set libv4l2 library subdir')
> +option('libv4lconvertsubdir', type : 'string', value : 'libv4l',
> +       description : 'Set libv4lconvert library subdir')
> +option('systemdsystemunitdir', type : 'string',
> +       description : 'Set systemd system unit directory')
> +option('udevdir', type : 'string',
> +       description : 'Set udev directory')
> diff --git a/utils/cec-compliance/meson.build b/utils/cec-compliance/meson.build
> new file mode 100644
> index 000000000000..9cc0017bcccb
> --- /dev/null
> +++ b/utils/cec-compliance/meson.build
> @@ -0,0 +1,23 @@
> +cec_compliance_sources = files(
> +    'cec-compliance.cpp',
> +    'cec-compliance.h',
> +    'cec-test-adapter.cpp',
> +    'cec-test-audio.cpp',
> +    'cec-test-fuzzing.cpp',
> +    'cec-test-power.cpp',
> +    'cec-test-tuner-record-timer.cpp',
> +    'cec-test.cpp',
> +)
> +
> +cec_compliance_deps = [
> +    dep_libcecutil,
> +    dep_librt,
> +]
> +
> +cec_compliance = executable('cec-compliance',
> +                            cec_compliance_sources,
> +                            install : true,
> +                            dependencies : cec_compliance_deps,
> +                            include_directories : v4l2_utils_incdir)
> +
> +man_pages += [[ meson.current_source_dir(), 'cec-compliance', 1 ]]
> diff --git a/utils/cec-ctl/meson.build b/utils/cec-ctl/meson.build
> new file mode 100644
> index 000000000000..059ca20660a9
> --- /dev/null
> +++ b/utils/cec-ctl/meson.build
> @@ -0,0 +1,18 @@
> +cec_ctl_sources = files(
> +    'cec-ctl.cpp',
> +    'cec-ctl.h',
> +    'cec-pin.cpp',
> +)
> +
> +cec_ctl_deps = [
> +    dep_libcecutil,
> +    dep_librt,
> +]
> +
> +cec_ctl = executable('cec-ctl',
> +                     cec_ctl_sources,
> +                     install : true,
> +                     dependencies : cec_ctl_deps,
> +                     include_directories : v4l2_utils_incdir)
> +
> +man_pages += [[ meson.current_source_dir(), 'cec-ctl', 1 ]]
> diff --git a/utils/cec-follower/meson.build b/utils/cec-follower/meson.build
> new file mode 100644
> index 000000000000..2d58fac4e6f0
> --- /dev/null
> +++ b/utils/cec-follower/meson.build
> @@ -0,0 +1,19 @@
> +cec_follower_sources = files(
> +    'cec-follower.cpp',
> +    'cec-follower.h',
> +    'cec-processing.cpp',
> +    'cec-tuner.cpp',
> +)
> +
> +cec_follower_deps = [
> +    dep_libcecutil,
> +    dep_librt,
> +]
> +
> +cec_follower = executable('cec-follower',
> +                          cec_follower_sources,
> +                          install : true,
> +                          dependencies : cec_follower_deps,
> +                          include_directories : v4l2_utils_incdir)
> +
> +man_pages += [[ meson.current_source_dir(), 'cec-follower', 1 ]]
> diff --git a/utils/cx18-ctl/meson.build b/utils/cx18-ctl/meson.build
> new file mode 100644
> index 000000000000..161b91c951f0
> --- /dev/null
> +++ b/utils/cx18-ctl/meson.build
> @@ -0,0 +1,8 @@
> +cx18_ctl_sources = files(
> +    'cx18-ctl.c',
> +)
> +
> +cx18_ctl = executable('cx18-ctl',
> +                      cx18_ctl_sources,
> +                      install : true,
> +                      include_directories : v4l2_utils_incdir)
> diff --git a/utils/dvb/meson.build b/utils/dvb/meson.build
> new file mode 100644
> index 000000000000..871f5a398a06
> --- /dev/null
> +++ b/utils/dvb/meson.build
> @@ -0,0 +1,70 @@
> +dvb_common_deps =  [
> +    dep_argp,
> +    dep_libdvbv5,
> +    dep_libudev,
> +    dep_threads,
> +    dep_xmlrpc,
> +]
> +
> +dvb_fe_tool_sources = files(
> +    'dvb-fe-tool.c',
> +)
> +
> +dvb_fe_tool = executable('dvb-fe-tool',
> +                         dvb_fe_tool_sources,
> +                         install : true,
> +                         dependencies : dvb_common_deps,
> +                         include_directories : v4l2_utils_incdir)
> +
> +man_pages += [[ meson.current_source_dir(), 'dvb-fe-tool', 1 ]]
> +
> +dvbv5_zap_sources = files(
> +    'dvbv5-zap.c',
> +)
> +
> +dvbv5_zap = executable('dvbv5-zap',
> +                       dvbv5_zap_sources,
> +                       install : true,
> +                       dependencies : dvb_common_deps,
> +                       include_directories : v4l2_utils_incdir)
> +
> +man_pages += [[ meson.current_source_dir(), 'dvbv5-zap', 1 ]]
> +
> +dvbv5_scan_sources = files(
> +    'dvbv5-scan.c',
> +)
> +
> +dvbv5_scan = executable('dvbv5-scan',
> +                        dvbv5_scan_sources,
> +                        install : true,
> +                        dependencies : dvb_common_deps,
> +                        include_directories : v4l2_utils_incdir)
> +
> +man_pages += [[ meson.current_source_dir(), 'dvbv5-scan', 1 ]]
> +
> +dvb_format_convert_sources = files(
> +    'dvb-format-convert.c',
> +)
> +
> +dvb_format_convert = executable('dvb-format-convert',
> +                                dvb_format_convert_sources,
> +                                install : true,
> +                                dependencies : dvb_common_deps,
> +                                include_directories : v4l2_utils_incdir)
> +
> +man_pages += [[ meson.current_source_dir(), 'dvb-format-convert', 1 ]]
> +
> +dvbv5_daemon_sources = files(
> +    'dvbv5-daemon.c',
> +)
> +
> +dvbv5_daemon_c_args = [
> +    '-DHAVE_DVBV5_REMOTE',
> +]
> +
> +dvbv5_daemon = executable('dvbv5-daemon',
> +                          dvbv5_daemon_sources,
> +                          install : true,
> +                          dependencies : dvb_common_deps,
> +                          c_args : dvbv5_daemon_c_args,
> +                          include_directories : v4l2_utils_incdir)
> diff --git a/utils/gen_media_bus_format_codes.sh b/utils/gen_media_bus_format_codes.sh
> new file mode 100755
> index 000000000000..4bdcc3b721ee
> --- /dev/null
> +++ b/utils/gen_media_bus_format_codes.sh
> @@ -0,0 +1,7 @@
> +#!/bin/bash
> +
> +src="$1"
> +
> +sed -e \
> +'/#define MEDIA_BUS_FMT/ ! d; s/.*#define //; /FIXED/ d; s/\t.*//; s/.*/ &,/;' \
> +${src}
> diff --git a/utils/gen_media_bus_format_names.sh b/utils/gen_media_bus_format_names.sh
> new file mode 100755
> index 000000000000..3fdc830d1f97
> --- /dev/null
> +++ b/utils/gen_media_bus_format_names.sh
> @@ -0,0 +1,7 @@
> +#!/bin/bash
> +
> +src="$1"
> +
> +sed -e \
> +'/#define MEDIA_BUS_FMT/ ! d; s/.*FMT_//; /FIXED/ d; s/\t.*//; s/.*/{ \"&\", MEDIA_BUS_FMT_& },/;' \
> +${src}
> diff --git a/utils/ir-ctl/meson.build b/utils/ir-ctl/meson.build
> new file mode 100644
> index 000000000000..24d73a15e63b
> --- /dev/null
> +++ b/utils/ir-ctl/meson.build
> @@ -0,0 +1,23 @@
> +ir_ctl_sources = files(
> +    'bpf_encoder.c',
> +    'bpf_encoder.h',
> +    'ir-ctl.c',
> +    'ir-encode.c',
> +    'ir-encode.h',
> +    'keymap.c',
> +    'keymap.h',
> +    'toml.c',
> +    'toml.h',
> +)
> +
> +ir_ctl_deps =  [
> +    dep_argp,
> +]
> +
> +ir_ctl = executable('ir-ctl',
> +                    ir_ctl_sources,
> +                    install : true,
> +                    dependencies : ir_ctl_deps,
> +                    include_directories : v4l2_utils_incdir)
> +
> +man_pages += [[ meson.current_source_dir(), 'ir-ctl', 1 ]]
> diff --git a/utils/ivtv-ctl/meson.build b/utils/ivtv-ctl/meson.build
> new file mode 100644
> index 000000000000..410a8439e296
> --- /dev/null
> +++ b/utils/ivtv-ctl/meson.build
> @@ -0,0 +1,13 @@
> +ivtv_ctl_sources = files(
> +    'ivtv-ctl.c',
> +)
> +
> +ivtv_ctl_deps = [
> +    dep_libm,
> +]
> +
> +ivtv_ctl = executable('ivtv-ctl',
> +                      ivtv_ctl_sources,
> +                      install : true,
> +                      dependencies : ivtv_ctl_deps,
> +                      include_directories : v4l2_utils_incdir)
> diff --git a/utils/keytable/bpf_protocols/clang_sys_includes.sh b/utils/keytable/bpf_protocols/clang_sys_includes.sh
> new file mode 100755
> index 000000000000..9dc4af12ecbb
> --- /dev/null
> +++ b/utils/keytable/bpf_protocols/clang_sys_includes.sh
> @@ -0,0 +1,9 @@
> +#!/bin/sh
> +# Get Clang's default includes on this system, as opposed to those seen by
> +# '-target bpf'. This fixes "missing" files on some architectures/distros,
> +# such as asm/byteorder.h, asm/socket.h, asm/sockios.h, sys/cdefs.h etc.
> +#
> +# Use '-idirafter': Don't interfere with include mechanics except where the
> +# build would have failed anyways.
> +$CLANG -v -E - </dev/null 2>&1 \
> +	| sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }'
> diff --git a/utils/keytable/bpf_protocols/meson.build b/utils/keytable/bpf_protocols/meson.build
> new file mode 100644
> index 000000000000..1e4f0064fdd8
> --- /dev/null
> +++ b/utils/keytable/bpf_protocols/meson.build
> @@ -0,0 +1,31 @@
> +bpf_protocols_files = [
> +    'grundig',
> +    'imon_rsc',
> +    'manchester',
> +    'pulse_distance',
> +    'pulse_length',
> +    'raw',
> +    'rc_mm',
> +    'samsung36',
> +    'xbox-dvd',
> +]
> +
> +clang_sys_includes = run_command('clang_sys_includes.sh',
> +                                 check : true,
> +                                 env : ['CLANG=' + prog_clang.full_path()])
> +
> +foreach file : bpf_protocols_files
> +    output = file + '.o'
> +    input = file + '.c'
> +    custom_target(output,
> +                  output : output,
> +                  input : input,
> +                  command : [
> +                      prog_clang,
> +                      clang_sys_includes.stdout().split(),
> +                      '-D__linux__', '-fno-stack-protector', '-target', 'bpf',
> +                      '-O2', '-c', '@INPUT@', '-o', '@OUTPUT@',
> +                  ],
> +                  install : true,
> +                  install_dir : ir_keytable_system_dir / 'rc_keymaps' / 'protocols')
> +endforeach
> diff --git a/utils/keytable/meson.build b/utils/keytable/meson.build
> new file mode 100644
> index 000000000000..0ca08a183d1d
> --- /dev/null
> +++ b/utils/keytable/meson.build
> @@ -0,0 +1,85 @@
> +ir_keytable_sources = files(
> +    'ir-encode.c',
> +    'ir-encode.h',
> +    'keymap.c',
> +    'keymap.h',
> +    'keytable.c',
> +    'parse.h',
> +    'toml.c',
> +    'toml.h',
> +)
> +
> +ir_keytable_deps = [
> +    dep_argp,
> +]
> +
> +ir_keytable_system_dir = udevdir
> +ir_keytable_user_dir = get_option('sysconfdir') / 'rc_keymaps'
> +
> +ir_keytable_c_args = [
> +    '-DIR_KEYTABLE_SYSTEM_DIR="@0@"'.format(ir_keytable_system_dir),
> +    '-DIR_KEYTABLE_USER_DIR="@0@"'.format(ir_keytable_user_dir),
> +]
> +
> +ir_bpf_enabled = prog_clang.found() and dep_libbpf.found() and dep_libelf.found()
> +
> +if ir_bpf_enabled
> +    ir_keytable_sources += files(
> +        'bpf_load.c',
> +        'bpf_load.h',
> +    )
> +    ir_keytable_deps += [
> +        dep_libbpf,
> +        dep_libelf,
> +    ]
> +    ir_keytable_c_args += [
> +        '-DHAVE_BPF',
> +    ]
> +    subdir('bpf_protocols')
> +endif
> +
> +ir_keytable_incdir = [
> +    utils_common_incdir,
> +    v4l2_utils_incdir,
> +]
> +
> +ir_keytable = executable('ir-keytable',
> +                         sources : ir_keytable_sources,
> +                         install : true,
> +                         dependencies : ir_keytable_deps,
> +                         c_args : ir_keytable_c_args,
> +                         include_directories : ir_keytable_incdir)
> +
> +man_pages += [[ meson.current_source_dir(), 'ir-keytable', 1 ]]
> +man_pages += [[ meson.current_source_dir(), 'rc_keymap', 5 ]]
> +
> +ir_keytable_sysconf_files = files(
> +    'rc_maps.cfg',
> +)
> +install_data(ir_keytable_sysconf_files,
> +             install_dir : get_option('sysconfdir'))
> +
> +subdir('rc_keymaps')
> +install_data(ir_keytable_rc_keymaps,
> +             install_dir : ir_keytable_system_dir / 'rc_keymaps')
> +
> +ir_keytable_udev_rules = files(
> +    '70-infrared.rules',
> +)
> +install_data(ir_keytable_udev_rules,
> +             install_dir : ir_keytable_system_dir / 'rules.d')
> +
> +if have_udevdsyscallfilter
> +    ir_keytable_systemd_files = files(
> +        '50-rc_keymap.conf',
> +    )
> +    install_data(ir_keytable_systemd_files,
> +                 install_dir : systemd_systemdir / 'systemd-udevd.service.d')
> +endif
> +
> +# Install non-existing directory to create empty directory structure
> +# See: https://github.com/mesonbuild/meson/issues/2904
> +# This should be replaced with install_emptydir() when bumping the minimum meson
> +# version to 0.60.0.
> +install_subdir('protocols',
> +               install_dir : ir_keytable_user_dir)
> diff --git a/utils/keytable/rc_keymaps/meson.build b/utils/keytable/rc_keymaps/meson.build
> new file mode 100644
> index 000000000000..9ea0bc776642
> --- /dev/null
> +++ b/utils/keytable/rc_keymaps/meson.build
> @@ -0,0 +1,150 @@
> +ir_keytable_rc_keymaps = files(
> +    'adstech_dvb_t_pci.toml',
> +    'af9005.toml',
> +    'alink_dtu_m.toml',
> +    'allwinner_ba10_tv_box.toml',
> +    'allwinner_i12_a20_tv_box.toml',
> +    'anysee.toml',
> +    'apac_viewcomp.toml',
> +    'astrometa_t2hybrid.toml',
> +    'asus_pc39.toml',
> +    'asus_ps3_100.toml',
> +    'ati_tv_wonder_hd_600.toml',
> +    'ati_x10.toml',
> +    'avermedia.toml',
> +    'avermedia_a16d.toml',
> +    'avermedia_cardbus.toml',
> +    'avermedia_dvbt.toml',
> +    'avermedia_m135a.toml',
> +    'avermedia_m733a_rm_k6.toml',
> +    'avermedia_rm_ks.toml',
> +    'avertv_303.toml',
> +    'az6027.toml',
> +    'azurewave_ad_tu700.toml',
> +    'beelink_gs1.toml',
> +    'behold.toml',
> +    'behold_columbus.toml',
> +    'budget_ci_old.toml',
> +    'cec.toml',
> +    'cinergy.toml',
> +    'cinergy_1400.toml',
> +    'cinergyt2.toml',
> +    'd680_dmb.toml',
> +    'delock_61959.toml',
> +    'dib0700_nec.toml',
> +    'dib0700_rc5.toml',
> +    'dibusb.toml',
> +    'digitalnow_tinytwin.toml',
> +    'digittrade.toml',
> +    'digitv.toml',
> +    'dish_network.toml',
> +    'dm1105_nec.toml',
> +    'dntv_live_dvb_t.toml',
> +    'dntv_live_dvbt_pro.toml',
> +    'dtt200u.toml',
> +    'dvbsky.toml',
> +    'dvico_mce.toml',
> +    'dvico_portable.toml',
> +    'em_terratec.toml',
> +    'encore_enltv.toml',
> +    'encore_enltv2.toml',
> +    'encore_enltv_fm53.toml',
> +    'evga_indtube.toml',
> +    'eztv.toml',
> +    'flydvb.toml',
> +    'flyvideo.toml',
> +    'fusionhdtv_mce.toml',
> +    'gadmei_rm008z.toml',
> +    'geekbox.toml',
> +    'genius_tvgo_a11mce.toml',
> +    'gotview7135.toml',
> +    'haupp.toml',
> +    'hauppauge.toml',
> +    'hisi_poplar.toml',
> +    'hisi_tv_demo.toml',
> +    'imon_mce.toml',
> +    'imon_pad.toml',
> +    'imon_rsc.toml',
> +    'iodata_bctv7e.toml',
> +    'it913x_v1.toml',
> +    'it913x_v2.toml',
> +    'kaiomy.toml',
> +    'khadas.toml',
> +    'khamsin.toml',
> +    'kii_pro.toml',
> +    'kworld_315u.toml',
> +    'kworld_pc150u.toml',
> +    'kworld_plus_tv_analog.toml',
> +    'leadtek_y04g0051.toml',
> +    'lme2510.toml',
> +    'manli.toml',
> +    'mce_keyboard.toml',
> +    'medion_x10.toml',
> +    'medion_x10_digitainer.toml',
> +    'medion_x10_or2x.toml',
> +    'megasky.toml',
> +    'minix_neo.toml',
> +    'msi_digivox_ii.toml',
> +    'msi_digivox_iii.toml',
> +    'msi_tvanywhere.toml',
> +    'msi_tvanywhere_plus.toml',
> +    'nebula.toml',
> +    'nec_terratec_cinergy_xs.toml',
> +    'norwood.toml',
> +    'npgtech.toml',
> +    'odroid.toml',
> +    'opera1.toml',
> +    'pctv_sedna.toml',
> +    'pine64.toml',
> +    'pinnacle310e.toml',
> +    'pinnacle_color.toml',
> +    'pinnacle_grey.toml',
> +    'pinnacle_pctv_hd.toml',
> +    'pixelview.toml',
> +    'pixelview_002t.toml',
> +    'pixelview_mk12.toml',
> +    'pixelview_new.toml',
> +    'powercolor_real_angel.toml',
> +    'proteus_2309.toml',
> +    'purpletv.toml',
> +    'pv951.toml',
> +    'rc6_mce.toml',
> +    'real_audio_220_32_keys.toml',
> +    'reddo.toml',
> +    'samsung_ak59_00125a.toml',
> +    'snapstream_firefly.toml',
> +    'streamzap.toml',
> +    'su3000.toml',
> +    'tanix_tx3mini.toml',
> +    'tanix_tx5max.toml',
> +    'tbs_nec.toml',
> +    'technisat_ts35.toml',
> +    'technisat_usb2.toml',
> +    'terratec_cinergy_c_pci.toml',
> +    'terratec_cinergy_s2_hd.toml',
> +    'terratec_cinergy_xs.toml',
> +    'terratec_slim.toml',
> +    'terratec_slim_2.toml',
> +    'tevii_nec.toml',
> +    'tivo.toml',
> +    'total_media_in_hand.toml',
> +    'total_media_in_hand_02.toml',
> +    'trekstor.toml',
> +    'tt_1500.toml',
> +    'tvwalkertwin.toml',
> +    'twinhan_dtv_cab_ci.toml',
> +    'twinhan_vp1027_dvbs.toml',
> +    'vega_s9x.toml',
> +    'videomate_k100.toml',
> +    'videomate_s350.toml',
> +    'videomate_tv_pvr.toml',
> +    'vp702x.toml',
> +    'wetek_hub.toml',
> +    'wetek_play2.toml',
> +    'winfast.toml',
> +    'winfast_usbii_deluxe.toml',
> +    'wobo_i5.toml',
> +    'x96max.toml',
> +    'xbox_dvd.toml',
> +    'zx_irdec.toml',
> +)
> diff --git a/utils/libcecutil/meson.build b/utils/libcecutil/meson.build
> new file mode 100644
> index 000000000000..ed3aa88ceefb
> --- /dev/null
> +++ b/utils/libcecutil/meson.build
> @@ -0,0 +1,45 @@
> +libcecutil_sources = files(
> +    'cec-htng-funcs.h',
> +    'cec-htng.h',
> +    'cec-info.cpp',
> +    'cec-info.h',
> +    'cec-log.cpp',
> +    'cec-log.h',
> +    'cec-parse.cpp',
> +    'cec-parse.h',
> +)
> +
> +libcecutil_deps = [
> +    dep_libdl,
> +    dep_libv4lconvert,
> +    dep_threads,
> +]
> +
> +libcecutil_incdir = [
> +    utils_common_incdir,
> +    v4l2_utils_incdir,
> +]
> +
> +cec_gen_sources = files(
> +    '../../include/linux/cec.h',
> +    'cec-htng.h',
> +    '../../include/linux/cec-funcs.h',
> +    'cec-htng-funcs.h',
> +)
> +
> +configure_file(
> +    input : 'cec-gen.pl',
> +    output : 'cec-gen-dummy.stamp',
> +    command : [prog_perl, '@INPUT@', cec_gen_sources, 'utils/libcecutil'],
> +)
> +
> +libcecutil = static_library('cecutil',
> +                            libcecutil_sources,
> +                            install : false,
> +                            dependencies : libcecutil_deps,
> +                            include_directories : libcecutil_incdir)
> +
> +dep_libcecutil = declare_dependency(
> +    link_with : libcecutil,
> +    include_directories : '.',
> +)
> diff --git a/utils/libmedia_dev/meson.build b/utils/libmedia_dev/meson.build
> new file mode 100644
> index 000000000000..f97238e63076
> --- /dev/null
> +++ b/utils/libmedia_dev/meson.build
> @@ -0,0 +1,14 @@
> +libmedia_dev_sources = files(
> +    'get_media_devices.c',
> +    'get_media_devices.h',
> +)
> +
> +libmedia_dev = static_library('media_dev',
> +                              libmedia_dev_sources,
> +                              install : false,
> +                              include_directories : v4l2_utils_incdir)
> +
> +dep_libmedia_dev = declare_dependency(
> +    link_with : libmedia_dev,
> +    include_directories : '.',
> +)
> diff --git a/utils/libv4l2util/meson.build b/utils/libv4l2util/meson.build
> new file mode 100644
> index 000000000000..9d1c6e12d1be
> --- /dev/null
> +++ b/utils/libv4l2util/meson.build
> @@ -0,0 +1,16 @@
> +libv4l2util_sources = files(
> +    'frequencies.c',
> +    'libv4l2util.h',
> +    'v4l2_driver.c',
> +    'v4l2_driver.h',
> +)
> +
> +libv4l2util = static_library('v4l2util',
> +                             libv4l2util_sources,
> +                             install : false,
> +                             include_directories : v4l2_utils_incdir)
> +
> +dep_libv4l2util = declare_dependency(
> +    link_with : libv4l2util,
> +    include_directories : '.',
> +)
> diff --git a/utils/media-ctl/meson.build b/utils/media-ctl/meson.build
> new file mode 100644
> index 000000000000..3a7b0c9add4a
> --- /dev/null
> +++ b/utils/media-ctl/meson.build
> @@ -0,0 +1,43 @@
> +libmediactl_sources = files(
> +    'libmediactl.c',
> +    'mediactl-priv.h',
> +)
> +
> +libmediactl_deps = [
> +    dep_libudev,
> +]
> +
> +libmediactl = static_library('mediactl',
> +                             libmediactl_sources,
> +                             dependencies : libmediactl_deps,
> +                             include_directories : v4l2_utils_incdir)
> +
> +dep_libmediactl = declare_dependency(link_with : libmediactl)
> +
> +libv4l2subdev_sources = files('libv4l2subdev.c')
> +libv4l2subdev_sources += media_bus_format_names_h
> +libv4l2subdev_sources += media_bus_format_codes_h
> +
> +libv4l2subdev = static_library('v4l2subdev',
> +                               libv4l2subdev_sources,
> +                               include_directories : v4l2_utils_incdir)
> +
> +dep_libv4l2subdev = declare_dependency(link_with : libv4l2subdev)
> +
> +media_ctl_sources = files(
> +    'media-ctl.c',
> +    'options.c',
> +    'options.h',
> +    'tools.h',
> +)
> +
> +media_ctl_deps = [
> +    dep_libmediactl,
> +    dep_libv4l2subdev,
> +]
> +
> +media_ctl = executable('media-ctl',
> +                       media_ctl_sources,
> +                       dependencies : media_ctl_deps,
> +                       install : true,
> +                       include_directories : v4l2_utils_incdir)
> diff --git a/utils/meson.build b/utils/meson.build
> new file mode 100644
> index 000000000000..25f50191a037
> --- /dev/null
> +++ b/utils/meson.build
> @@ -0,0 +1,43 @@
> +utils_common_incdir = include_directories('common')
> +
> +# Generate targets for media-bus-format-{names,codes}.h
> +foreach x: [ 'names', 'codes' ]
> +    output_file = 'media-bus-format-@0@.h'.format(x)
> +    input_file = 'gen_media_bus_format_@0@.sh'.format(x)
> +    target = custom_target(
> +        output_file,
> +        output : output_file,
> +        input : input_file,
> +        command : [
> +            prog_bash, '@INPUT@', files('..' / 'include' / 'linux' / 'media-bus-format.h'),
> +        ],
> +        capture : true,
> +    )
> +    set_variable(output_file.underscorify(), target)
> +endforeach
> +
> +# Libraries
> +subdir('libcecutil')
> +subdir('libmedia_dev')
> +subdir('libv4l2util')
> +
> +# Utils
> +subdir('cec-ctl')
> +subdir('cec-follower')
> +subdir('cx18-ctl')
> +subdir('dvb', if_found : dep_libdvbv5)
> +subdir('ir-ctl')
> +subdir('ivtv-ctl')
> +subdir('keytable')
> +subdir('media-ctl')
> +subdir('qv4l2')
> +subdir('qvidcap')
> +subdir('rds-ctl')
> +subdir('v4l2-ctl')
> +subdir('v4l2-dbg')
> +subdir('v4l2-sysfs-path')
> +subdir('v4l2-tracer')
> +
> +# Compliance tools
> +subdir('cec-compliance')
> +subdir('v4l2-compliance')
> diff --git a/utils/qv4l2/meson.build b/utils/qv4l2/meson.build
> new file mode 100644
> index 000000000000..54676be85749
> --- /dev/null
> +++ b/utils/qv4l2/meson.build
> @@ -0,0 +1,79 @@
> +if get_option('qv4l2').disabled() or not dep_gl.found() or not dep_qt5.found()
> +    subdir_done()
> +endif
> +
> +qv4l2_sources = files(
> +    'alsa_stream.c',
> +    'alsa_stream.h',
> +    'capture-win-gl.cpp',
> +    'capture-win-gl.h',
> +    'capture-win-qt.cpp',
> +    'capture-win-qt.h',
> +    'capture-win.cpp',
> +    'capture-win.h',
> +    'ctrl-tab.cpp',
> +    'general-tab.cpp',
> +    'general-tab.h',
> +    'qv4l2.cpp',
> +    'qv4l2.h',
> +    'raw2sliced.cpp',
> +    'raw2sliced.h',
> +    'tpg-tab.cpp',
> +    'v4l2-tpg-colors.c',
> +    'v4l2-tpg-core.c',
> +    'vbi-tab.cpp',
> +    'vbi-tab.h',
> +)
> +
> +qv4l2_deps = [
> +    dep_alsa,
> +    dep_gl,
> +    dep_libmedia_dev,
> +    dep_libv4l2,
> +    dep_libv4l2util,
> +    dep_libv4lconvert,
> +    dep_qt5,
> +    dep_threads,
> +]
> +
> +qv4l2_incdir = [
> +    utils_common_incdir,
> +    v4l2_utils_incdir,
> +]
> +
> +qt5_files = qt5.preprocess(
> +    moc_headers : ['qv4l2.h', 'general-tab.h', 'vbi-tab.h', 'capture-win.h'],
> +    qresources : 'qv4l2.qrc',
> +)
> +qv4l2_sources += qt5_files
> +
> +qv4l2 = executable('qv4l2',
> +                   sources : qv4l2_sources,
> +                   install : true,
> +                   dependencies : qv4l2_deps,
> +                   include_directories : qv4l2_incdir)
> +
> +man_pages += [[ meson.current_source_dir(), 'qv4l2', 1 ]]
> +
> +qv4l2_applications_files = files(
> +    'qv4l2.desktop',
> +)
> +
> +install_data('qv4l2.desktop',
> +             install_dir : get_option('datadir') / 'applications')
> +
> +qv4l2_icons_dir = get_option('datadir') / 'icons' / 'hicolor'
> +
> +qv4l2_icons_files = [
> +    ['qv4l2_16x16.png', '16x16',    'qv4l2.png'],
> +    ['qv4l2_24x24.png', '24x24',    'qv4l2.png'],
> +    ['qv4l2_32x32.png', '32x32',    'qv4l2.png'],
> +    ['qv4l2_64x64.png', '64x64',    'qv4l2.png'],
> +    ['qv4l2.svg',       'scalable', 'qv4l2.svg'],
> +]
> +
> +foreach f : qv4l2_icons_files
> +    install_data(f[0],
> +                 rename: f[1] / 'apps' / f[2],
> +                 install_dir : qv4l2_icons_dir)
> +endforeach
> diff --git a/utils/qvidcap/meson.build b/utils/qvidcap/meson.build
> new file mode 100644
> index 000000000000..faae18fbb812
> --- /dev/null
> +++ b/utils/qvidcap/meson.build
> @@ -0,0 +1,87 @@
> +qvidcap_option = get_option('qvidcap')
> +
> +if qvidcap_option.enabled() and not have_qt5_opengl
> +    error('qvidcap enabled but Qt5 is missing OpenGL support')
> +endif
> +
> +if qvidcap_option.disabled() or not dep_gl.found() or not dep_qt5.found() or not have_qt5_opengl
> +    subdir_done()
> +endif
> +
> +qvidcap_sources = files(
> +    'capture.cpp',
> +    'capture.h',
> +    'codec-fwht.c',
> +    'codec-v4l2-fwht.c',
> +    'paint.cpp',
> +    'qvidcap.cpp',
> +    'qvidcap.h',
> +    'v4l-stream.c',
> +    'v4l2-info.cpp',
> +    'v4l2-tpg-colors.c',
> +    'v4l2-tpg-core.c',
> +)
> +
> +qvidcap_deps = [
> +    dep_alsa,
> +    dep_gl,
> +    dep_libmedia_dev,
> +    dep_libv4l2,
> +    dep_libv4l2util,
> +    dep_libv4lconvert,
> +    dep_qt5,
> +    dep_threads,
> +]
> +
> +qvidcap_incdir = [
> +    utils_common_incdir,
> +    v4l2_utils_incdir,
> +]
> +
> +qt5_files = qt5.preprocess(
> +    moc_headers : 'capture.h',
> +    qresources : 'qvidcap.qrc',
> +)
> +qvidcap_sources += qt5_files
> +
> +v4l2_convert_sources = files(
> +    'v4l2-convert.glsl',
> +)
> +
> +configure_file(
> +    input : 'v4l2-convert.pl',
> +    output : 'v4l2-convert.h',
> +    capture : true,
> +    command : [prog_perl, '@INPUT@', v4l2_convert_sources],
> +)
> +
> +qvidcap = executable('qvidcap',
> +                     sources : qvidcap_sources,
> +                     install : true,
> +                     dependencies : qvidcap_deps,
> +                     include_directories : qvidcap_incdir)
> +
> +man_pages += [[ meson.current_source_dir(), 'qvidcap', 1 ]]
> +
> +qvidcap_applications_files = files(
> +    'qvidcap.desktop',
> +)
> +
> +install_data('qvidcap.desktop',
> +             install_dir : get_option('datadir') / 'applications')
> +
> +qvidcap_icons_dir = get_option('datadir') / 'icons' / 'hicolor'
> +
> +qvidcap_icons_files = [
> +    ['qvidcap_16x16.png', '16x16',    'qvidcap.png'],
> +    ['qvidcap_24x24.png', '24x24',    'qvidcap.png'],
> +    ['qvidcap_32x32.png', '32x32',    'qvidcap.png'],
> +    ['qvidcap_64x64.png', '64x64',    'qvidcap.png'],
> +    ['qvidcap.svg',       'scalable', 'qvidcap.svg'],
> +]
> +
> +foreach f : qvidcap_icons_files
> +    install_data(f[0],
> +                 rename: f[1] / 'apps' / f[2],
> +                 install_dir : qvidcap_icons_dir)
> +endforeach
> diff --git a/utils/rds-ctl/meson.build b/utils/rds-ctl/meson.build
> new file mode 100644
> index 000000000000..f94ffb0c50cd
> --- /dev/null
> +++ b/utils/rds-ctl/meson.build
> @@ -0,0 +1,17 @@
> +rds_ctl_sources = files(
> +    'rds-ctl.cpp',
> +    'v4l2-info.cpp',
> +)
> +
> +rds_ctl_deps = [
> +    dep_libv4l2rds,
> +]
> +
> +rds_ctl = executable('rds-ctl',
> +                     rds_ctl_sources,
> +                     install : true,
> +                     dependencies : rds_ctl_deps,
> +                     include_directories : [
> +                         v4l2_utils_incdir,
> +                         utils_common_incdir,
> +                     ])
> diff --git a/utils/v4l2-compliance/meson.build b/utils/v4l2-compliance/meson.build
> new file mode 100644
> index 000000000000..142e9a94bf0e
> --- /dev/null
> +++ b/utils/v4l2-compliance/meson.build
> @@ -0,0 +1,63 @@
> +if not have_fork
> +    subdir_done()
> +endif
> +
> +v4l2_compliance_sources = files(
> +    'media-info.cpp',
> +    'v4l2-compliance.cpp',
> +    'v4l2-compliance.h',
> +    'v4l2-info.cpp',
> +    'v4l2-test-buffers.cpp',
> +    'v4l2-test-codecs.cpp',
> +    'v4l2-test-colors.cpp',
> +    'v4l2-test-controls.cpp',
> +    'v4l2-test-debug.cpp',
> +    'v4l2-test-formats.cpp',
> +    'v4l2-test-input-output.cpp',
> +    'v4l2-test-io-config.cpp',
> +    'v4l2-test-media.cpp',
> +    'v4l2-test-subdevs.cpp',
> +    'v4l2-test-time32-64.cpp',
> +)
> +
> +v4l2_compliance_deps = [
> +    dep_librt,
> +    dep_threads,
> +]
> +
> +v4l2_compliance_cpp_args = []
> +
> +if get_option('v4l2-compliance-libv4l')
> +    v4l2_compliance_deps += [
> +        dep_libv4lconvert,
> +        dep_libv4l2,
> +    ]
> +else
> +    v4l2_compliance_cpp_args += '-DNO_LIBV4L2'
> +endif
> +
> +v4l2_compliance_incdir = [
> +    utils_common_incdir,
> +    v4l2_utils_incdir,
> +]
> +
> +v4l2_compliance = executable('v4l2-compliance',
> +                             v4l2_compliance_sources,
> +                             install : true,
> +                             dependencies : v4l2_compliance_deps,
> +                             cpp_args : v4l2_compliance_cpp_args,
> +                             include_directories : v4l2_compliance_incdir)
> +
> +man_pages += [[ meson.current_source_dir(), 'v4l2-compliance', 1 ]]
> +
> +v4l2_compliance_32_cpp_args = ['-m32', '-DNO_LIBV4L2']
> +v4l2_compliance_32_link_args = ['-m32', '-static']
> +
> +if get_option('v4l2-compliance-32') and have_m32
> +    v4l2_compliance_32 = executable('v4l2-compliance-32',
> +                                    v4l2_compliance_sources,
> +                                    install : true,
> +                                    cpp_args : v4l2_compliance_32_cpp_args,
> +                                    link_args : v4l2_compliance_32_link_args,
> +                                    include_directories : v4l2_compliance_incdir)
> +endif
> diff --git a/utils/v4l2-ctl/meson.build b/utils/v4l2-ctl/meson.build
> new file mode 100644
> index 000000000000..3e366c6c0496
> --- /dev/null
> +++ b/utils/v4l2-ctl/meson.build
> @@ -0,0 +1,75 @@
> +v4l2_ctl_sources = files(
> +    'codec-fwht.c',
> +    'codec-v4l2-fwht.c',
> +    'media-info.cpp',
> +    'v4l-stream.c',
> +    'v4l2-ctl-common.cpp',
> +    'v4l2-ctl-edid.cpp',
> +    'v4l2-ctl-io.cpp',
> +    'v4l2-ctl-meta.cpp',
> +    'v4l2-ctl-misc.cpp',
> +    'v4l2-ctl-modes.cpp',
> +    'v4l2-ctl-overlay.cpp',
> +    'v4l2-ctl-sdr.cpp',
> +    'v4l2-ctl-selection.cpp',
> +    'v4l2-ctl-stds.cpp',
> +    'v4l2-ctl-streaming.cpp',
> +    'v4l2-ctl-subdev.cpp',
> +    'v4l2-ctl-tuner.cpp',
> +    'v4l2-ctl-vbi.cpp',
> +    'v4l2-ctl-vidcap.cpp',
> +    'v4l2-ctl-vidout.cpp',
> +    'v4l2-ctl.cpp',
> +    'v4l2-ctl.h',
> +    'v4l2-info.cpp',
> +    'v4l2-tpg-colors.c',
> +    'v4l2-tpg-core.c',
> +)
> +v4l2_ctl_sources += media_bus_format_names_h
> +
> +v4l2_ctl_deps = [
> +    dep_librt,
> +    dep_threads,
> +]
> +
> +v4l2_ctl_cpp_args = []
> +
> +if get_option('v4l2-ctl-libv4l')
> +    v4l2_ctl_deps += [
> +        dep_libv4l2,
> +        dep_libv4lconvert,
> +    ]
> +else
> +    v4l2_ctl_cpp_args += '-DNO_LIBV4L2'
> +endif
> +
> +if not get_option('v4l2-ctl-stream-to')
> +    v4l2_ctl_cpp_args += '-DNO_STREAM_TO'
> +endif
> +
> +v4l2_ctl_incdir = [
> +    utils_common_incdir,
> +    v4l2_utils_incdir,
> +]
> +
> +v4l2_ctl = executable('v4l2-ctl',
> +                      v4l2_ctl_sources,
> +                      install : true,
> +                      dependencies : v4l2_ctl_deps,
> +                      cpp_args : v4l2_ctl_cpp_args,
> +                      include_directories : v4l2_ctl_incdir)
> +
> +man_pages += [[ meson.current_source_dir(), 'v4l2-ctl', 1 ]]
> +
> +v4l2_ctl_32_c_cpp_args = ['-m32', '-DNO_LIBV4L2']
> +v4l2_ctl_32_link_args = ['-m32', '-static']
> +
> +if get_option('v4l2-ctl-32') and have_m32
> +    v4l2_ctl_32 = executable('v4l2-ctl-32',
> +                             v4l2_ctl_sources,
> +                             install : true,
> +                             c_args : v4l2_ctl_32_c_cpp_args,
> +                             cpp_args : v4l2_ctl_32_c_cpp_args,
> +                             link_args : v4l2_ctl_32_link_args,
> +                             include_directories : v4l2_ctl_incdir)
> +endif
> diff --git a/utils/v4l2-dbg/meson.build b/utils/v4l2-dbg/meson.build
> new file mode 100644
> index 000000000000..c23bf8f35101
> --- /dev/null
> +++ b/utils/v4l2-dbg/meson.build
> @@ -0,0 +1,20 @@
> +v4l2_dbg_sources = files(
> +    'v4l2-dbg-ac97.h',
> +    'v4l2-dbg-bttv.h',
> +    'v4l2-dbg-em28xx.h',
> +    'v4l2-dbg-micron.h',
> +    'v4l2-dbg-saa7134.h',
> +    'v4l2-dbg-tvp5150.h',
> +    'v4l2-dbg.cpp',
> +    'v4l2-dbg.h',
> +    'v4l2-info.cpp',
> +)
> +
> +v4l2_dbg = executable('v4l2-dbg',
> +                      v4l2_dbg_sources,
> +                      install : true,
> +                      install_dir : 'sbin',
> +                      include_directories : [
> +                          v4l2_utils_incdir,
> +                          utils_common_incdir,
> +                      ])
> diff --git a/utils/v4l2-sysfs-path/meson.build b/utils/v4l2-sysfs-path/meson.build
> new file mode 100644
> index 000000000000..5a74af126c82
> --- /dev/null
> +++ b/utils/v4l2-sysfs-path/meson.build
> @@ -0,0 +1,14 @@
> +v4l2_sysfs_path_sources = files(
> +    'v4l2-sysfs-path.c',
> +)
> +
> +v4l2_sysfs_path_deps = [
> +    dep_argp,
> +    dep_libmedia_dev,
> +]
> +
> +v4l2_sysfs_path = executable('v4l2-sysfs-path',
> +                             v4l2_sysfs_path_sources,
> +                             install : true,
> +                             dependencies : v4l2_sysfs_path_deps,
> +                             include_directories : v4l2_utils_incdir)
> diff --git a/utils/v4l2-tracer/media-info.cpp b/utils/v4l2-tracer/media-info.cpp
> new file mode 120000
> index 000000000000..89676ff50494
> --- /dev/null
> +++ b/utils/v4l2-tracer/media-info.cpp
> @@ -0,0 +1 @@
> +../common/media-info.cpp
> \ No newline at end of file
> diff --git a/utils/v4l2-tracer/meson.build b/utils/v4l2-tracer/meson.build
> new file mode 100644
> index 000000000000..dc16526220ca
> --- /dev/null
> +++ b/utils/v4l2-tracer/meson.build
> @@ -0,0 +1,133 @@
> +if not dep_jsonc.found()
> +    subdir_done()
> +endif
> +
> +# Generated sources
> +
> +v4l2_tracer_gen = files('v4l2-tracer-gen.pl')
> +
> +# Don't reorder the inputs The order of the input headers matters
> +v4l2_tracer_gen_inputs = files(
> +    '..' / '..' / 'include' / 'linux' / 'v4l2-controls.h',
> +    '..' / '..' / 'include' / 'linux' / 'videodev2.h',
> +    '..' / '..' / 'include' / 'linux' / 'media.h',
> +    '..' / '..' / 'include' / 'linux' / 'v4l2-common.h',
> +)
> +
> +v4l2_tracer_gen_common_sources = custom_target('v4l2-tracer-gen-common-sources',
> +                                               input : v4l2_tracer_gen_inputs,
> +                                               output : ['v4l2-tracer-info-gen.h'],
> +                                               command : [
> +                                                   v4l2_tracer_gen,
> +                                                  '-o', meson.current_build_dir(),
> +                                                    '-t', 'common',
> +                                                   '@INPUT@',
> +                                               ])
> +
> +v4l2_tracer_gen_retrace_sources = custom_target('v4l2-tracer-gen-retrace-sources',
> +                                                input : v4l2_tracer_gen_inputs,
> +                                                output : ['retrace-gen.cpp', 'retrace-gen.h'],
> +                                                command : [
> +                                                    v4l2_tracer_gen,
> +                                                    '-o', meson.current_build_dir(),
> +                                                    '-t', 'retrace',
> +                                                    '@INPUT@',
> +                                                ])
> +
> +v4l2_tracer_gen_trace_sources = custom_target('v4l2-tracer-gen-trace-sources',
> +                                              input : v4l2_tracer_gen_inputs,
> +                                              output : ['trace-gen.cpp', 'trace-gen.h'],
> +                                              command : [
> +                                                  v4l2_tracer_gen,
> +                                                  '-o', meson.current_build_dir(),
> +                                                  '-t', 'trace',
> +                                                  '@INPUT@',
> +                                              ])
> +
> +# V4L2 tracer library
> +
> +libv4l2tracer_sources = files(
> +    'libv4l2tracer.cpp',
> +    'media-info.cpp',
> +    'trace-helper.cpp',
> +    'trace.cpp',
> +    'v4l2-info.cpp',
> +    'v4l2-tracer-common.cpp',
> +)
> +
> +libv4l2tracer_sources += [
> +    v4l2_tracer_gen_common_sources,
> +    v4l2_tracer_gen_trace_sources,
> +]
> +
> +libv4l2tracer_deps = [
> +    dep_jsonc,
> +    dep_libdl,
> +]
> +
> +libv4l2_tracer_incdir = [
> +    utils_common_incdir,
> +    v4l2_utils_incdir,
> +]
> +
> +libv4l2_tracer_cpp_args = [
> +    # Meson enables large file support unconditionally, which redirects file
> +    # operations to 64-bit versions. This results in some symbols being
> +    # renamed, for instance open() being renamed to open64(). As the library
> +    # needs to provide both 32-bit and 64-bit versions of file operations,
> +    # disable transparent large file support.
> +    '-U_FILE_OFFSET_BITS',
> +    '-D_FILE_OFFSET_BITS=32',
> +    '-D_LARGEFILE64_SOURCE',
> +]
> +
> +libv4l2tracer = shared_module('v4l2tracer',
> +                              libv4l2tracer_sources,
> +                              install : true,
> +                              cpp_args : libv4l2_tracer_cpp_args,
> +                              dependencies : libv4l2tracer_deps,
> +                              include_directories : libv4l2_tracer_incdir)
> +
> +# Command line tool
> +
> +v4l2_tracer_sources = files(
> +    'media-info.cpp',
> +    'retrace-helper.cpp',
> +    'retrace.cpp',
> +    'v4l2-info.cpp',
> +    'v4l2-tracer-common.cpp',
> +    'v4l2-tracer.cpp',
> +)
> +
> +v4l2_tracer_sources += [
> +    v4l2_tracer_gen_common_sources,
> +    v4l2_tracer_gen_retrace_sources,
> +]
> +
> +v4l2_tracer_deps = [
> +    dep_jsonc,
> +    dep_librt,
> +    dep_threads,
> +]
> +
> +v4l2_tracer_cpp_args = [
> +    '-DLIBTRACER_PATH="@0@"'.format(get_option('libdir')),
> +]
> +
> +if have_visibility
> +    v4l2_tracer_cpp_args += ['-fvisibility=hidden']
> +endif
> +
> +v4l2_tracer_incdir = [
> +    utils_common_incdir,
> +    v4l2_utils_incdir,
> +]
> +
> +v4l2_tracer = executable('v4l2-tracer',
> +                         v4l2_tracer_sources,
> +                         install : true,
> +                         dependencies : v4l2_tracer_deps,
> +                         cpp_args : v4l2_tracer_cpp_args,
> +                         include_directories : v4l2_tracer_incdir)
> +
> +man_pages += [[ meson.current_source_dir(), 'v4l2-tracer', 1 ]]
> diff --git a/utils/v4l2-tracer/v4l2-info.cpp b/utils/v4l2-tracer/v4l2-info.cpp
> new file mode 120000
> index 000000000000..c87caf75bbfd
> --- /dev/null
> +++ b/utils/v4l2-tracer/v4l2-info.cpp
> @@ -0,0 +1 @@
> +../common/v4l2-info.cpp
> \ No newline at end of file
> diff --git a/v4l-utils-po/meson.build b/v4l-utils-po/meson.build
> new file mode 100644
> index 000000000000..4fad42eb0b4a
> --- /dev/null
> +++ b/v4l-utils-po/meson.build
> @@ -0,0 +1,3 @@
> +i18n.gettext('v4l-utils',
> +    args : i18n_gettext_arguments,
> +)
> -- 
> Regards,
> 
> Laurent Pinchart
> 

-- 
Kind Regards,
Niklas Söderlund



[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux