Использование Conan-пакетов для разработки приложений
Технологические ограничения
В настоящий момент Conan-пакеты могут быть использованы только при разработке CMake-приложений для ОС Аврора. Приложения, разрабатываемые с использованием системы сборки qmake, не поддерживаются.
Пакеты, поставляемые в рамках Conan-репозитория, распространяются исключительно в бинарном формате и не поддерживают компиляцию на стороне клиента.
Инструмент копирования зависимостей внутрь RPM-пакета приложения поддерживает установку только библиотек в формате pkg-config.
Содержание:
- Подключение Conan-пакетов к CMake-приложению
- Формирование списка пакетов
- Установка зависимостей во время сборки
- Использование Conan-пакетов внутри CMake
- Использование Conan-пакетов с QML-модулями
- Настройка rpath исполняемого файла в CMake
Подключение Conan-пакетов к CMake-приложению
Для подключения пакетов необходимо выполнить следующие шаги:
- Сформировать список используемых пакетов.
- Настроить установку пакетов в рамках процесса сборки приложения внутри .spec-файла.
- Подключить использование пакетов внутри конфигурации сборочной среды CMake.
- Настроить
rpathв исполняемом файле для подключения библиотек на мобильном устройстве в момент запуска приложения. - Настроить корректное добавление библиотек в 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.
-
Сначала необходимо выполнить подключение пакета PkgConfig, который обеспечивает поиск Conan-пакетов через приложение pkg-config:
find_package(PkgConfig REQUIRED) -
Затем для каждого подключаемого пакета необходимо выполнить его подключение. В случае с ffmpeg подключение будет выглядеть следующим образом:
pkg_check_modules(FFMPEG REQUIRED IMPORTED_TARGET ffmpeg)Параметр
REQUIREDуказывает, что эта зависимость является обязательной. ПараметрIMPORTED_TARGETпозволяет обращаться к пакету как к цели в терминах CMake по имениPkgConfig::FFMPEG. -
Данный пакет необходимо подключить к списку каталогов с заголовочными файлами:
target_include_directories(${PROJECT_NAME} PRIVATE $<BUILD_INTERFACE: ... PkgConfig::FFMPEG > ) -
Также необходимо выполнить линковку с данными пакетами:
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")