05 марта 2026 № 1 (2026)

ROSARIUM

газета советского программиста

Meson

Быстрая и простая система сборки нового поколения.

На этой странице

Meson — современная система сборки, известная простотой синтаксиса и скоростью. Использует Ninja как бэкенд по умолчанию.

Признаки Meson

В исходниках есть:

  • meson.build в корне
  • Возможно, meson_options.txt с опциями

Стандартная сборка

%build
%meson
%meson_build

%install
%meson_install

Макросы подробно

%meson

%meson [опции]

Раскрывается примерно в:

meson setup \
    --buildtype=plain \
    --prefix=/usr \
    --libdir=/usr/lib64 \
    --libexecdir=/usr/libexec \
    --bindir=/usr/bin \
    --sbindir=/usr/sbin \
    --includedir=/usr/include \
    --datadir=/usr/share \
    --mandir=/usr/share/man \
    --infodir=/usr/share/info \
    --localedir=/usr/share/locale \
    --sysconfdir=/etc \
    --localstatedir=/var \
    --sharedstatedir=/var/lib \
    --auto-features=enabled \
    [ваши опции] \
    %{_vpath_builddir}

С опциями:

%meson \
    -Dfeature=enabled \
    -Dtests=true \
    -Ddocs=false

%meson_build

%meson_build [цели]

Собирает проект с помощью Ninja.

%meson_install

%meson_install

Устанавливает в buildroot.

Полный пример SPEC

Name:           myapp
Version:        1.0.0
Release:        1%{?dist}
Summary:        My Meson-based application
License:        LGPL-2.1-or-later
URL:            https://gitlab.gnome.org/user/myapp
Source0:        %{url}/-/archive/v%{version}/%{name}-%{version}.tar.bz2

BuildRequires:  meson >= 0.60
BuildRequires:  gcc
BuildRequires:  pkgconfig(glib-2.0) >= 2.70
BuildRequires:  pkgconfig(gtk4)
BuildRequires:  gettext

Requires:       hicolor-icon-theme

%description
My application built with Meson.

%prep
%autosetup

%build
%meson
%meson_build

%install
%meson_install
%find_lang %{name}

%check
%meson_test

%files -f %{name}.lang
%license COPYING
%doc README.md NEWS
%{_bindir}/myapp
%{_datadir}/applications/myapp.desktop
%{_datadir}/icons/hicolor/*/apps/myapp.png
%{_datadir}/glib-2.0/schemas/org.example.myapp.gschema.xml
%{_datadir}/metainfo/myapp.metainfo.xml

%changelog
* Mon Feb 03 2025 Your Name <your@email.com> - 1.0.0-1
- Initial package

Опции Meson

Просмотр доступных опций

meson configure
# Или из исходников
cat meson_options.txt

Включение/отключение возможностей

Meson использует три состояния для features:

%meson \
    -Dfeature=enabled \    # Обязательно включить
    -Dother=disabled \     # Обязательно отключить
    -Dauto=auto            # Автоопределение

По умолчанию RPM-макрос включает --auto-features=enabled, что означает: если зависимость найдена — feature включается.

Типичные опции

%meson \
    -Dtests=true \
    -Ddocs=false \
    -Dman=true \
    -Dsystemd=true \
    -Dgtk_doc=false

Опции с массивами

%meson \
    -Dbackends=['x11','wayland']

Тестирование

Макрос %meson_test

%check
%meson_test

Раскрывается в:

meson test -C %{_vpath_builddir} --no-rebuild --print-errorlogs

С дополнительными опциями

%check
%meson_test --timeout-multiplier 2

Пропуск тестов

%check
%meson_test --no-suite slow

Субпроекты и wrap

Meson поддерживает субпроекты (bundled-зависимости) через subprojects/:

%prep
%autosetup

# Удалить bundled-библиотеки, использовать системные
rm -rf subprojects/zlib
rm -rf subprojects/libfoo.wrap

%build
%meson -Dwrap_mode=nofallback
%meson_build

-Dwrap_mode=nofallback — не использовать субпроекты, если системная библиотека найдена.

Introspection и доступные опции

# Посмотреть все опции
meson configure builddir/

# Посмотреть конкретную опцию
meson configure builddir/ | grep feature

# Изменить опцию (для отладки)
meson configure builddir/ -Dfeature=disabled

Особенности GNOME-проектов

Многие GNOME-проекты используют Meson:

BuildRequires:  meson
BuildRequires:  pkgconfig(glib-2.0)
BuildRequires:  pkgconfig(gtk4)
BuildRequires:  pkgconfig(libadwaita-1)
BuildRequires:  desktop-file-utils
BuildRequires:  appstream
BuildRequires:  gettext

%install
%meson_install
%find_lang %{name}

%check
appstream-util validate-relax --nonet %{buildroot}%{_datadir}/metainfo/*.xml
desktop-file-validate %{buildroot}%{_datadir}/applications/*.desktop

Кросс-компиляция

Для cross-файла:

%build
%meson --cross-file=%{SOURCE1}
%meson_build

Типичные проблемы

«Dependency X not found»

meson.build:10:0: ERROR: Dependency "gtk4" not found

Найти и добавить BuildRequires:

dnf provides 'pkgconfig(gtk4)'
# gtk4-devel

«Option X does not exist»

Опечатка в имени опции или устаревшая опция:

meson configure | grep -i option

«Program not found: ninja»

sudo dnf install ninja-build

Конфликт версий Meson

BuildRequires:  meson >= 0.60

Отладка Meson

Подробный вывод

%build
%meson
%meson_build -v

Посмотреть конфигурацию

cat %{_vpath_builddir}/meson-logs/meson-log.txt

Пересборка с изменёнными опциями

meson configure %{_vpath_builddir} -Dfeature=true
ninja -C %{_vpath_builddir}

Сравнение с CMake

АспектMesonCMake
СинтаксисПростой, Python-подобныйСложнее
БэкендNinja (по умолчанию)Make/Ninja
СкоростьБыстрееМедленнее
Featuresenabled/disabled/autoON/OFF
СубпроектыwrapFetchContent

Проверьте понимание

  1. Какой файл указывает на использование Meson?
  2. Чем отличаются состояния enabled, disabled, auto для опций?
  3. Как запустить тесты Meson-проекта?
  4. Как отключить использование bundled-библиотек?
  5. Как узнать, какие опции поддерживает проект?

Далее: Python: setuptools и wheel