Создание spec-файла
spec-файл содержит набор инструкций, которые использует rpmbuild
для сборки RPM
пакетов.
Для корректной установки и работы приложений на устройствах под управлением ОС Аврора spec-файл
должен соответствовать требованиям.
При создании собственного spec-файла можно ориентироваться на пример проекта по умолчанию. При этом стоит предусмотреть следующие детали:
- Общая информация о приложении
- Зависимости приложения
- Команды сборки и установки
- Файлы приложения
- Библиотеки
- Пакеты conan
Общая информация о приложении
В секции Name
следует указать имя пакета, которое состоит из названия организации и названия
приложения, разделённых точкой точно так же, как при указании таргета
в pro-файле или CMakeLists.txt.
Название пакета должно соответствовать требованиям.
Пример: Name: ru.myOrganization.MyApp
.
Краткое описание приложения следует задать в секции Summary
, более подробное описание —
в секции Description
.
Сайт организации, разработавшей приложение, указывается отдельно в секции URL
.
Summary: Моё приложение для ОС Аврора
URL: https://auroraos.ru
%description
Короткое описание моего приложения для ОС Аврора
Номера версии и релиза приложения должны указываться в секциях Version
и Release
.
Version: 0.1
Release: 1
Для приложения также следует указать тип лицензии, по которой оно распространяется, например,
License: BSD-3-Clause
.
В секции Source
необходимо указать имя файла с архивом приложения, которое содержит название
и версию приложения: Source: %{name}-%{version}.tar.bz2
.
Архивов с исходным кодом может быть несколько,
тогда к Source
добавляется индекс: Source0
, Source1
и т. д.
Зависимости приложения
Добавление динамических библиотек в зависимости сборки осуществляется с помощью директивы
BuildRequires
, в зависимости запуска приложения — Requires
.
Минимальный список необходимых зависимостей для нативного Qt-приложения для ОС Аврора выглядит
следующим образом:
Requires: sailfishsilica-qt5 >= 0.10.9
BuildRequires: pkgconfig(auroraapp)
BuildRequires: pkgconfig(Qt5Core)
BuildRequires: pkgconfig(Qt5Qml)
BuildRequires: pkgconfig(Qt5Quick)
В нём подключаются базовые модули Qt, библиотека auroraapp и qml-модуль Silica.
Другие Qt-модули и сторонние библиотеки могут подключаться аналогично:
BuildRequires: pkgconfig(Qt5Multimedia)
BuildRequires: pkgconfig(streamcamera)
BuildRequires: pkgconfig(streamcamera-qt5)
Requires: sailfish-components-webview-qt5
Requires: sailfish-components-webview-qt5-popups
Requires: sailfish-components-webview-qt5-pickers
Подключаемые библиотеки должны быть из списка разрешённых библиотек или API, разработанных для ОС Аврора.
Если в проекте используются системы сборки CMake и Ninja, то необходимо подключить следующие зависимости сборки:
BuildRequires: cmake
BuildRequires: ninja
Полный пример spec-файла со сборкой средствами CMake.
Команды сборки и установки
Если в проекте используется система сборки qmake, то вариант его сборки и установки по умолчанию выглядит следующим образом:
%prep
%autosetup
%build
%qmake5
%make_build
%install
%make_install
Если в проекте используются системы сборки CMake и Ninja, то вариант его сборки и установки выглядит следующим образом:
%prep
%autosetup
%build
%cmake -GNinja
%ninja_build
%install
%ninja_install
Полный пример spec-файла со сборкой средствами cmake.
Файлы приложения
В секции %files
перечисляются файлы и каталоги приложения и пути их установки.
Макрос %defattr
позволяет
устанавливать атрибуты доступа по умолчанию для файлов и каталогов.
Бинарный файл проекта должен быть установлен по правилам
валидатора следующим образом:
%defattr(-,root,root,-)
%{_bindir}/%{name}
desktop-файл обязательно должен быть установлен
в каталог %{_datadir}/applications
, иконки — в каталог %{_datadir}/icons/hicolor/*/apps/
, все
остальные файлы рекомендуется размещать в %{_datadir}/%{name}
.
Пример размещения файлов для проекта по умолчанию:
%files
%defattr(-,root,root,-)
%{_bindir}/%{name}
%defattr(644,root,root,-)
%{_datadir}/%{name}
%{_datadir}/applications/%{name}.desktop
%{_datadir}/icons/hicolor/*/apps/%{name}.png
Если проект для ОС Аврора собирается на Linux, то макрос %defattr
можно не использовать, так как
права для файлов приложения будут определены корректно.
Если же проект собирается на macOS или Windows, то права для файлов обзательно нужно определить
с помощью %defattr
, иначе возникнет ошибка при валидации.
Если добавляется новый каталог в корень проекта, то путь для его установки можно также указать
в секции %files
.
Пример для WebViewAPI:
%{_datadir}/%{name}/html/*
Это действие не обязательно, в большинстве случаев достаточно указать путь для установки
в pro-файле или CMakeLists.txt, а в spec-файле
ограничиться командой %{_datadir}/%{name}
.
Путь для установки файла или каталога необходимо указать в spec-файле, если он отличается
от стандартного пути для ресурсов %{_datadir}/%{name}
.
Например, можно переместить конфигурационный файл, как в примере ApplicationDirectories:
%{_datadir}/common/ru.auroraos/ApplicationDirectories/config
Бинарные файлы и прочие файлы библиотек можно размещать в %{_libdir}
и %{_libexecdir}
.
Пример TrifleVPN:
%files
%defattr(-,root,root,-)
%{_libexecdir}/%{name}/provider
%{_libdir}/connman/plugins-vpn/triflevpn.so
%{_bindir}/%{name}
%defattr(644,root,root,-)
%{_datadir}/sailfish-vpn/triflevpn/
%{_libdir}/qt5/qml/ru/auroraos/TrifleVPNSystemSettings/*
%{_datadir}/%{name}
%{_datadir}/applications/%{name}.desktop
%{_datadir}/icons/hicolor/*/apps/%{name}.png
Библиотеки
Если пакет предоставляет в своём составе библиотеку, то должны быть определены
макросы %__requires_exclude
и %__provides_exclude_from
, чтобы генератор
зависимостей не сканировал определённые файлы или каталоги на предмет зависимостей.
Это делается для того, чтобы данный проект не предоставлял собственные библиотеки для других
RPM-архивов.
Пример определения макросов для примера
StreamCamera:
%define __provides_exclude_from ^%{_datadir}/.*$
%define __requires_exclude ^(libavcodec.*|libavdevice.*|libavfilter.*|libavformat.*|libavutil.*|libswresample.*|libswscale.*)$
Если для сборки библиотеки требуется указать дополнительные параметры, это может задаваться
в секции %build
.
Пример работы с библиотеками
в BleScanner:
%build
mkdir -p $RPM_BUILD_DIR/libs/simpleble \
$RPM_BUILD_DIR/libs/simplebluez \
$RPM_BUILD_DIR/libs/simpledbus
%cmake -S$RPM_SOURCE_DIR/../libs/simplebluez \
-B$RPM_BUILD_DIR/libs/simplebluez \
-DBUILD_SHARED_LIBS=OFF \
-DCMAKE_INSTALL_PREFIX:PATH=$RPM_BUILD_DIR;
%make_build -C $RPM_BUILD_DIR/libs/simplebluez
%cmake -S$RPM_SOURCE_DIR/../libs/simpleble \
-B$RPM_BUILD_DIR/libs/simpleble \
-DCMAKE_INSTALL_PREFIX:PATH=$RPM_BUILD_DIR \
-DBUILD_SHARED_LIBS=OFF;
%make_build -C $RPM_BUILD_DIR/libs/simpleble
%cmake -S$RPM_SOURCE_DIR/../libs/simpledbus \
-B$RPM_BUILD_DIR/libs/simpledbus \
-DCMAKE_INSTALL_PREFIX:PATH=$RPM_BUILD_DIR \
-DBUILD_SHARED_LIBS=OFF;
%make_build -C $RPM_BUILD_DIR/libs/simpledbus
cd $RPM_BUILD_DIR
%qmake5
%make_build
%install
%make_install
Пакеты conan
conan-пакеты могут быть использованы только при разработке CMake-приложений для ОС Аврора. Приложения, разрабатываемые с использованием системы сборки qmake, не поддерживаются.
Если нужно добавить в зависимости пакеты conan, то следует в списке зависимостей необходимо указать зависимость от conan:
BuildRequires: conan
Затем в рамках секции %build
необходимо выполнить установку зависимостей перед
первым вызовом CMake, в рамках которого генерируются файлы сборочной
последовательности. Установку рекомендуется выполнять с помощью следующих
команд:
CONAN_LIB_DIR="%{_builddir}/conan-libs/"
%{set_build_flags}
conan-install-if-modified --source-folder="%{_sourcedir}/.." --output-folder="$CONAN_LIB_DIR" -vwarning
PKG_CONFIG_PATH="$CONAN_LIB_DIR":$PKG_CONFIG_PATH
export PKG_CONFIG_PATH
Переменная CONAN_LIB_DIR
указывает путь к каталогу с устанавливаемыми файлами.
Данный каталог будет располагаться в сборочном каталоге приложения.
Команде conan-install-if-modified
передаются следующие аргументы:
--source-folder="%{_sourcedir}/.."
указывает на каталог с исходными кодами приложения, в котором находится файлconanfile.txt
.--output-folder="$CONAN_LIB_DIR"
указывает путь к каталогу для установки зависимостей.-vwarning
указывает желаемый уровень вывода сообщений. Уровень сообщений по умолчанию предоставляет больше информации, но провоцирует среду разработки сообщать о наличии проблем во время сборки.- Также в команде можно задать любые другие параметры, которые она передаст в conan.
Затем происходит формирование переменной окружения PKG_CONFIG_PATH
, в которой
указывается путь к установленным библиотекам.
Данная переменная затем будет использована внутри конфигурации системы сборки для поиска зависимостей.
Таким образом, секция %build
будет выглядеть следующим образом:
CONAN_LIB_DIR="%{_builddir}/conan-libs/"
%{set_build_flags}
conan-install-if-modified --source-folder="%{_sourcedir}/.." --output-folder="$CONAN_LIB_DIR" -vwarning
PKG_CONFIG_PATH="$CONAN_LIB_DIR:$PKG_CONFIG_PATH"
export PKG_CONFIG_PATH
%cmake
%make_build
В начале spec-файла нужно добавить следующую строчку, чтобы разделяемые библиотеки приложения были
установлены в каталог /usr/share/<название пакета>/lib
, и данный путь был указан внутри rpath
исполняемого файла:
%define _cmake_skip_rpath %{nil}
В рамках секции %install
необходимо поместить все разделяемые библиотеки в целевой каталог.
Следующие команды создают данный каталог и копируют в него файлы разделяемых библиотек, которые
были явно связаны с исполняемым файлом.
Если необходимо перенести больше данных, то эту секцию необходимо модифицировать.
CONAN_LIB_DIR="%{_builddir}/conan-libs/"
SHARED_LIBRARIES="%{buildroot}/%{_datadir}/%{name}/lib"
mkdir -p "$SHARED_LIBRARIES"
conan-deploy-libraries "%{buildroot}/%{_bindir}/%{name}" "$CONAN_LIB_DIR" "$SHARED_LIBRARIES"
Также необходимо выполнить корректную модификацию RPM-архива, чтобы он не предоставлял данные библиотеки для других RPM-архивов. Это реализуется путём добавления следующих директив в .spec-файл:
%define __provides_exclude_from ^%{_datadir}/%{name}/lib/.*$
%define __requires_exclude ^(libavcodec.*|libavdevice.*|libavfilter.*|libavformat.*|libavutil.*|libswresample.*|libswscale.*)$