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

Использование Conan-пакетов для разработки приложений

Технологические ограничения

В настоящий момент Conan-пакеты могут быть использованы только при разработке CMake-приложений для ОС Аврора. Приложения, разрабатываемые с использованием системы сборки qmake, не поддерживаются.

Пакеты, поставляемые в рамках Conan-репозитория, распространяются исключительно в бинарном формате и не поддерживают компиляцию на стороне клиента.

Инструмент копирования зависимостей внутрь RPM-пакета приложения поддерживает установку только библиотек в формате pkg-config.

Содержание:

Подключение Conan-пакетов к CMake-приложению

Для подключения пакетов необходимо выполнить следующие шаги:

  1. Сформировать список используемых пакетов.
  2. Настроить установку пакетов в рамках процесса сборки приложения внутри .spec-файла.
  3. Подключить использование пакетов внутри конфигурации сборочной среды CMake.
  4. Настроить rpath в исполняемом файле для подключения библиотек на мобильном устройстве в момент запуска приложения.
  5. Настроить корректное добавление библиотек в RPM-архив внутри .spec-файла.

Формирование списка пакетов

В приложении необходимо добавить файл с описанием зависимостей. Ввиду особенностей работы QtCreator в Аврора SDK, рекомендуется использовать следующий шаблон в формате .python-файла для описания зависимостей.

Предположим, что приложению необходимо использовать пакет ffmpeg. В данном случае зависимости описываются в файле conanfile.py следующего вида:

from conan import ConanFile

class Application(ConanFile):
    settings = "os", "compiler", "arch", "build_type"
    generators = "PkgConfigDeps"

    requires = (
        "ffmpeg/6.1.1@aurora",
    )

Данный файл настраивает установку Conan-пакетов с целью их дальнейшего использования с помощью pkg-config, который можно интегрировать в другие системы сборки. Для этих целей подключается генератор PkgConfigDeps.

В кортеже requires перечисляются пакеты, используемые приложением. Каждая строка описывает отдельную зависимость. В данном случае строкой ffmpeg/6.1.1@aurora описывается:

  • ffmpeg — название пакета, который будет скачан;
  • 6.6.1 — версия пакета для скачивания;
  • @aurora — имя автора пакета, в данном случае aurora.

Установка зависимостей во время сборки

В .spec-файле приложения необходимо выполнить следующие изменения, чтобы выполнить сборку приложения.

Необходимо добавить строчку в .spec-файл для запуска скрипта rpm/load-conan.sh, устанавливающего Conan:

%{expand:%(bash %{_sourcedir}/load-conan.sh)}

Скрипт load-conan.sh и конфигурационный файл version.config должны быть расположены в каталоге rpm проекта. Актуальную версию скрипта load-conan.sh можно получить из раздела документации репозитория ConanClient. Пример корректной настройки работы с Conan представлен в ветке dev проекта ScreenGrab.

В рамках секции %build необходимо выполнить установку зависимостей перед первым вызовом CMake, в рамках которого генерируются файлы сборочной последовательности. Установку рекомендуется выполнять с помощью следующих команд:

%build
%conan_install
%conan_cmake \
    -DORG_NAME=ru.auroraos \
    -DAPP_NAME=AppName \
    -Gninja

%ninja_build

Макросы ORG_NAME и APP_NAME специфичны для конкретного приложения и могут быть опущены.

В рамках секции %install добавляется установка conan-зависимостей при формировании пакета:

%install
%ninja_install
%conan_deploy_libraries

Также необходимо выполнить корректную модификацию RPM-архива, чтобы он не предоставлял данные библиотеки для других RPM-архивов. Это реализуется путём добавления директив %define __provides_exclude_from и %define __requires_exclude в .spec-файл.

В итоге основные изменения для .spec-файла будут выглядеть следующим образом:

%define __provides_exclude_from ^%{_datadir}/%{name}/lib/.*$
%define __requires_exclude ^(lib1NameFromConan.*|lib2NameFromConan.*)$
%define _cmake_skip_rpath %{nil}
%{expand:%(bash %{_sourcedir}/load-conan.sh)}
%build
%conan_install
%conan_cmake \
    -DORG_NAME=ru.auroraos \
    -DAPP_NAME=ScreenGrab \
    -GNinja
%ninja_build

%install
%ninja_install
%conan_deploy_libraries

Использование Conan-пакетов внутри CMake

Пакет подключается штатными средствами CMake.

  1. Сначала необходимо выполнить подключение пакета PkgConfig, который обеспечивает поиск Conan-пакетов через приложение pkg-config:

    find_package(PkgConfig REQUIRED)
    
  2. Затем для каждого подключаемого пакета необходимо выполнить его подключение. В случае с ffmpeg подключение будет выглядеть следующим образом:

    pkg_check_modules(FFMPEG REQUIRED IMPORTED_TARGET ffmpeg)
    

    Параметр REQUIRED указывает, что эта зависимость является обязательной. Параметр IMPORTED_TARGET позволяет обращаться к пакету как к цели в терминах CMake по имени PkgConfig::FFMPEG.

  3. Данный пакет необходимо подключить к списку каталогов с заголовочными файлами:

    target_include_directories(${PROJECT_NAME} PRIVATE
      $<BUILD_INTERFACE:
      ...
      PkgConfig::FFMPEG
      >
    )
    
  4. Также необходимо выполнить линковку с данными пакетами:

    target_link_libraries(
      ${PROJECT_NAME}
      ...
      PkgConfig::FFMPEG
    )
    

Использование Conan-пакетов с QML-модулями

В случаях, когда Conan-пакет содержит QML-модуль, к обычному алгоритму подключения пакета добавляется ещё один шаг.

Требуется указать в файле с точкой входа в приложение main.cpp путь к модулям. Все поставляемые Conan-пакетами QML-модули устанавливаются по пути /usr/share/<название пакета приложения>/lib/qmlplugins. Поэтому для их подключения потребуется внести следующие правки:

QScopedPointer<QQuickView> view(Aurora::Application::createView());
auto engine = view->engine();
engine->addImportPath(Aurora::Application::pathTo(QStringLiteral("lib/qmlplugins")).toString());

Настройка rpath исполняемого файла в CMake

Согласно требованиям к установочным пакетам в ОС Аврора разделяемые библиотеки приложения должны быть установлены в каталог /usr/share/<название пакета>/lib. Чтобы этот каталог использовался приложением при старте, данный путь должен быть указан в переменной rpath внутри исполняемого файла.

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

%define _cmake_skip_rpath %{nil}

Также внутри CMake-файла необходимо перед определением исполняемого файла настроить значение переменной rpath по умолчанию. Следующая конструкция настраивает корректный путь для любого приложения:

set(CMAKE_SKIP_RPATH FALSE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/share/${PROJECT_NAME}/lib")

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

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