Недавно для популярного пакета для работы с мультимедиа устройствами (в основном, с камерами) появилась возможность сборки через meson. В данной статье мы рассмотрим как это осуществить. Собирать будем в Ubuntu 22, но подойдёт и любой другой популярный современный дистрибутив. Создадим базовый каталог v4l-utilsFromGit, который будет содержать в себе три подкаталога: каталог v4l-utils с исходными кодами, каталог build с промежуточными результатами сборки и каталог build_artifacts с результатами сборки (исполняемыми файлами).  Проведем инициализацию. Во время этого шага meson проверит конфигурацию нашей системы, удостоверится что для сборки есть необходимые средства (компилятор и т.п.) meson setup build/ v4l-utils/ $ meson setup build/ v4l-utils/ The Meson build system Version: 0.63.2 Source dir: /home/q/v4l-utilsFromGit/v4l-utils Build dir: /home/q/v4l-utilsFromGit/build Build type: native build Project name: v4l-utils Project version: 1.25.0 C compiler for the host machine: cc (gcc 12.2.0 "cc (Ubuntu 12.2.0-3ubuntu1) 12.2.0") C linker for the host machine: cc ld.bfd 2.39 C++ compiler for the host machine: c++ (gcc 12.2.0 "c++ (Ubuntu 12.2.0-3ubuntu1) 12.2.0") C++ linker for the host machine: c++ ld.bfd 2.39 Host machine cpu family: x86_64 Host machine cpu: x86_64 Compiler for C supports link arguments -m32: NO Compiler for C supports arguments -fvisibility=hidden: YES Compiler for C supports function attribute visibility:default: YES Program bash found: YES (/usr/bin/bash) Program clang found: NO Program doxygen found: NO Program grep found: YES (/usr/bin/grep) Program perl found: YES (/usr/bin/perl) Did not find pkg-config by name 'pkg-config' Found Pkg-config: NO Did not find CMake 'cmake' Found CMake: NO Run-time dependency alsa found: NO (tried pkgconfig and cmake) Run-time dependency gl found: NO (tried pkgconfig and system) Run-time dependency glu found: NO (tried pkgconfig and cmake) Run-time dependency json-c found: NO (tried pkgconfig and cmake) Library dl found: YES Library elf found: NO Library m found: YES Library rt found: YES qmake found: NO need ['>= 5', '< 6'] Run-time dependency qt5 (modules: Core, Gui, OpenGL, Widgets) found: NO (tried pkgconfig and config-tool) Run-time dependency libbpf found: NO (tried pkgconfig and cmake) sdl2-config found: NO Run-time dependency sdl2 found: NO (tried pkgconfig and config-tool) Has header "SDL2/SDL.h" : NO Run-time dependency sdl2_image found: NO (tried pkgconfig and cmake) Has header "SDL2/SDL_image.h" : NO Run-time dependency threads found: YES Run-time dependency x11 found: NO (tried pkgconfig and cmake) Run-time dependency xmlrpc found: NO (tried pkgconfig and cmake) Checking for function "fork" : YES Has header "linux/i2c-dev.h" : YES Checking for function "klogctl" : YES Checking for function "secure_getenv" : YES Checking for function "__secure_getenv" : NO Has header "sys/klog.h" : YES Header "execinfo.h" has symbol "backtrace" : YES Checking for function "argp_parse" : YES Checking for function "strerrorname_np" : YES Run-time dependency iconv found: YES Has header "gconv.h" : YES Library JIS found: YES Library JISX0213 found: YES Run-time dependency libjpeg found: NO (tried pkgconfig and cmake) Run-time dependency systemd found: NO (tried pkgconfig and cmake) Run-time dependency libudev found: NO (tried pkgconfig and cmake) Run-time dependency udev found: NO (tried pkgconfig and cmake) Program git found: YES (/usr/bin/git) Program msgfmt found: NO v4l-utils/libdvbv5-po/meson.build:2: WARNING: Gettext not found, all translation (po) targets will be ignored. v4l-utils/v4l-utils-po/meson.build:2: WARNING: Gettext not found, all translation (po) targets will be ignored. Configuring cec-gen-dummy.stamp with command Configuring config.h using configuration Configuring cec-ctl.1 using configuration Configuring cec-follower.1 using configuration Configuring ir-ctl.1 using configuration Configuring ir-keytable.1 using configuration Configuring rc_keymap.5 using configuration Configuring v4l2-ctl.1 using configuration Configuring cec-compliance.1 using configuration Configuring v4l2-compliance.1 using configuration Configuring v4l-utils.spec using configuration Build targets in project: 42 NOTICE: Future-deprecated features used: 0.60.0: {'install_subdir with empty directory'} v4l-utils 1.25.0 Dependencies ALSA              : NO GL                : NO GLU               : NO JSON-C            : NO Qt5               : NO without QtGL SDL               : NO X11               : NO gconv             : YES iconv             : YES libjpeg           : NO libudev           : NO threads           : YES Directories udevdir           : /lib/udev Libraries libdvbv5          : NO v4l-plugins       : YES v4l-wrappers      : YES Applications BPF IR decoders   : NO qv4l2             : NO qvidcap           : NO v4l-utils         : YES v4l2-compliance   : YES with libv4l v4l2-compliance-32: NO v4l2-ctl          : YES with libv4l v4l2-ctl-32       : NO v4l2-tracer       : NO Found ninja-1.11.0 at /usr/bin/ninja Посмотрим на текущую конфигурацию (какие настройки доступны и какие из них применены) meson configure build/ Далее зададим некоторые опции. Если оставить shared как подразумевает оригинальный INSTALL.md, то при попытке запуска собранного приложения вылетит ошибка v4l2-ctl: error while loading shared libraries: libv4l2.so.0: cannot open shared object file: No such file or directory Напишите в комментариях как собрать работающее приложение с опцией shared. А пока что переключим на static чтобы всё работало. meson configure build/ -Ddefault_library=static Вновь посмотрим на текущую конфигурацию, проверим изменение shared на static. meson configure build/ Далее запустим сборку. Результат сборки будет помещён по пути destdir. meson install --destdir ../build_artifacts/ -C build/ Можно проверить, что утилита запускается ~/v4l-utilsFromGit/build_artifacts/usr/local/bin/v4l2-ctl --help