Документация
ОС Аврора 5.1.5

Создание spec-файла

spec-файл содержит набор инструкций, которые использует rpmbuild для сборки RPM пакетов. Для корректной установки и работы приложений на устройствах под управлением ОС Аврора spec-файл должен соответствовать требованиям.

При создании собственного spec-файла можно ориентироваться на пример проекта по умолчанию. При этом стоит предусмотреть следующие детали:

Общая информация о приложении

В секции 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.*)$

Мы используем cookies для персонализации сайта и его более удобного использования. Вы можете запретить cookies в настройках браузера.

Пожалуйста ознакомьтесь с политикой использования cookies.