Инструмент sfdk для работы с пакетами из командной строки
В комплекте SDK для современной разработки под ОС Аврора поставляется IDE на основе QtCreator, который поддерживает работу только с проектами на основе систем сборки qmake и CMake. Для других систем сборки (Meson, Autotools и другие) предлагается использовать утилиту sfdk, входящую в состав SDK.
sfdk — это утилита интерфейса командной строки SDK. С её помощью можно управлять параметрами SDK, выполнять сборку и тестирование. Она позволяет настроить стороннюю IDE, которая поддерживает выбранную систему сборки, для разработки приложений для ОС Аврора. Также утилита может применяться и в системах CI/CD.
В данной статье описывается использование утилиты на всех этапах разработки: сборка, запуск, работа с зависимостями, управление spec-файлом, управление устройствами. Для примера используются приложение на основе CMake и библиотека на основе GNU Automake. Для других систем сборки алгоритм будет аналогичным.
- Подготовка
- Сборка qmake-приложения
- Запуск приложения на эмуляторе
- Запуск приложения на устройстве
- Работа с зависимыми пакетами
- Изменение кода с помощью Аврора IDE и без неё
- Написание удобных для разработчиков spec-файлов RPM
- Объявление зависимостей
- Валидация пакетов
- Дополнительная информация
Подготовка
Для начала работы потребуется Аврора SDK. (См. установку по ссылке). В статье использование команд sfdk демонстрируется на примере проектов:
- приложение
ApplicationTemplate
на основе qmake; - и библиотека
automakesample
на основе Automake;
доступные по ссылкам из публичных репозиториев.
Утилита sfdk
располагается в директории <AuroraSDK_DIR>/bin.
Далее в статье предполагается, что на ЭВМ разработчика в оболочке настроен псевдоним, с помощью
которого будет доступен вызов sfdk
без указания полного пути.
Пример настройки псевдонима. Команды в данной инструкции приводятся для Unix-совместимого терминала. В Linux и macOS можно использовать стандартный терминал, в Windows необходимо использовать Git Bash.
alias sfdk=~/AuroraOS/bin/sfdk
Вызов sfdk
должен осуществляться из директории рабочего пространства, которая была указана
при установке Аврора SDK.
Для получения списка установленных инструментов сборки используется команда sfdk tools list
:
$ sfdk tools list
AuroraOS-5.1.2.10-base предоставлено SDK,последнее
├── AuroraOS-5.1.2.10-base-aarch64 предоставлено SDK,последнее
│ └── AuroraOS-5.1.2.10-base-aarch64.default снимок
├── AuroraOS-5.1.2.10-base-armv7hl предоставлено SDK,последнее
│ └── AuroraOS-5.1.2.10-base-armv7hl.default снимок
└── AuroraOS-5.1.2.10-base-x86_64 предоставлено SDK,последнее
└── AuroraOS-5.1.2.10-base-x86_64.default снимок
Из вывода команды необходимо выбрать название нужного комплекта для сборки.
Большинство команд утилиты требует задание комплекта и мобильного устройства/эмулятора.
Если их не указать, будет выведено соответствующее сообщение об ошибке.
Чтобы не указывать их каждый раз при работе с утилитой, существует команда sfdk config
.
Она позволяет сохранять параметры, необходимые для других команд sfdk
.
В следующем разделе будет продемонстрирована сборка приложения ApplicationTemplate
для эмулятора.
Для этого потребуется соответствующий комплект.
Общий формат команды:
sfdk config target=AuroraOS-<номер_релиза>-base-<архитектура>
Комплекты armv7hl и aarch64 используются для мобильных устройств, x86_64 — для эмулятора.
Пример:
sfdk config target=AuroraOS-5.1.2.10-base-x86_64
Сборка qmake-приложения
На этапе подготовки был получен проект приложения.
Его сборку можно выполнить в формате теневой сборки, когда каталог сборки находится на одном уровне
файловой системы с каталогом исходных файлов, аналогично тому, как это делается автоматически
при работе с IDE.
Для этого нужно выполнить команду sfdk build
:
mkdir ApplicationTemplate.build.x86_64 && cd ApplicationTemplate.build.x86_64
sfdk build ../ApplicationTemplate
Примечание.
В рамках статьи предполагается, что если в проекте имеются зависимости для сборки, которые
отсутствуют по умолчанию в поставке Аврора SDK, то они объявлены
в spec-файле
RPM для автоматической установки во время сборки пакета.
Если необходимо установить дополнительные зависимости вручную, это можно можно сделать
с помощью команды sfdk tools package-install
.
После успешного завершения сборки RPM-пакеты будут находиться в каталоге RPMS. Для повторной фазы сборки можно отдельно использовать команды следующего вида:
sfdk qmake ../ApplicationTemplate [qmake-options...]
sfdk make [make-options...]
sfdk build-shell <arbitrary-build-command> [options...]
sfdk make-install
sfdk package
Подобно команде sfdk qmake
, команда sfdk cmake
существует для проектов на основе CMake.
Вместе с sfdk make
эти команды позволяют запускать rpmbuild
таким образом,
что выполняется только соответствующая часть раздела %build
spec-файла.
После сборки пакет следует подписать:
sfdk engine exec rpmsign-external sign -k path/to/.auroraos-regular-keys/regular_key.pem -c path/to/.auroraos-regular-keys/regular_cert.pem RPMS/*
Запуск приложения на эмуляторе
Развёртывание приложения допускается только в виде RPM-пакетов. Следующие инструкции относятся только к указанному случаю.
Для определения имени устройства, соответствующего эмулятору, следует перечислить доступные устройства:
$ sfdk device list
#0 "Aurora OS эмулятор 5.1.2.10-base"
эмулятор автоопределённое defaultuser@127.0.0.1:2223
закрытый ключ: ~/AuroraOS/vmshare/ssh/private_keys/sdk
Далее необходимо настроить sfdk
для использования устройства, соответствующего эмулятору.
По аналогии с выбором комплекта:
sfdk config device="Aurora OS эмулятор <номер_релиза>-base"
Пример:
sfdk config device="Aurora OS эмулятор 5.1.2.10-base"
Для развёртывания приложений используется команда sfdk deploy
.
sfdk deploy --sdk
После успешного развёртывания значок приложения появится в меню. Таким образом, Аврора-приложение было успешно собрано и установлено вручную.
Запуск приложения из командной строки:
sfdk device exec /usr/bin/ru.auroraos.ApplicationTemplate
Запуск отладчика выполняется командой:
sfdk debug /usr/bin/ru.auroraos.ApplicationTemplate
Следует отметить, что обе команды выше запускают приложение вне песочницы.
Развёртывание вручную
Если автоматическое развёртывание не соответствуют конкретным потребностям пакета, то для передачи
RPM-пакетов на устройство или эмулятор используется опция команды --manual
:
sfdk deploy --manual RPMS/ru.auroraos.ApplicationTemplate-1.0-1.x86_64.rpm
В этом случае RPM копируются в каталог ~/RPMS на устройстве. Затем с помощью командной строки на устройстве следует развернуть RPM-пакет любым удобным способом.
$ sfdk device exec
(device) $ sdk-deploy-rpm RPMS/ru.auroraos.ApplicationTemplate-1.0-1.x86_64.rpm
Передать RPM-пакеты на устройство можно и с помощью других инструментов.
Например, можно использовать scp
:
scp -P 2223 -i ~/AuroraOS/vmshare/ssh/private_keys/sdk \
path/to/package.rpm defaultuser@127.0.0.1:
Запуск приложения на устройстве
По аналогии с запуском на эмуляторе, нужно выбрать устройство из списка зарегистрированных устройств. Если желаемое устройство отсутствует в списке, нужно выполнить его регистрацию. В настоящее время это возможно сделать только в настройках Аврора IDE.
$ sfdk device list
#0 "Aurora OS эмулятор 5.1.2.10-base"
эмулятор автоопределённое defaultuser@127.0.0.1:2223
закрытый ключ: ~/AuroraOS/vmshare/ssh/private_keys/sdk
#1 "Fplus Pro R570E"
hardware-device user-defined defaultuser@192.168.2.15:22
private-key: ~/.ssh/id_fplus_r570e
$ sfdk config device="Fplus Pro R570E"
В то время как эмуляторы ОС Аврора имеют архитектуру x86_64, большинство аппаратных устройств ОС Аврора имеют архитектуру ARM. Поэтому необходима другая сборка приложения. Для пересборки под устройство сперва следует выбрать подходящий под архитектуру устройства комплект сборки.
sfdk config target=AuroraOS-<номер_релиза>-base-<архитектура>
Пример:
sfdk config target=AuroraOS-5.1.2.10-base-armv7hl
Нужно создать каталог сборки для этой цели и собрать приложение.
mkdir ApplicationTemplate.build.armv7hl && ApplicationTemplate.build.armv7hl
sfdk build ../ApplicationTemplate
И выполнить команду sfdk deploy
в новом каталоге сборки:
sfdk deploy --sdk
В результате приложение появилось в списке установленных приложений и готово к запуску:
sfdk device exec /usr/bin/ru.auroraos.ApplicationTemplate
Развёртывание вручную идентично продемонстрированному ранее для эмулятора.
Примечание.
sudo
не установлен на аппаратных средствах по умолчанию, права суперпользователя присваиваются
с помощью команды devel-su
.
Работа с зависимыми пакетами
Если разработка проекта ведётся для нескольких зависимых друг от друга пакетов, то необходимо
убедиться, что обновлённые версии требуемых пакетов доступны в комплекте сборки.
Для этого необходимо указать параметры конфигурации sfdk
: output-prefix
и search-output-dir
(первая команда на самом деле использует вторую внутри себя).
В примере ниже настраивается конфигурация для результирующих RPM-пакетов таким образом, чтобы
использовался общий выходной каталог, а sfdk
при разрешении зависимостей на этапе сборки будет
учитывать существующие в этом каталоге пакеты.
mkdir ~/RPMS
sfdk config --global --push output-prefix ~/RPMS
Справка sfdk --help-building
содержит больше информации о том, как объединить эти действия
с параметром конфигурации task
для получения выходных каталогов для каждой задачи.
Далее в примерах будет использоваться эмулятор, поэтому нужно вернуться к комплекту для архитектуры x86_64, если ранее она была переключена на цель ARM.
sfdk config target=AuroraOS-5.1.2.10-base-x86_64
В качестве зависимости будет использоваться библиотека automakesample
(см. {#prepare}).
В отличие от проектов на основе qmake или CMake, проекты на основе Automake (Autotools)
редко упаковываются таким образом, чтобы можно было выполнять теневую сборку
с помощью sfdk
.
Но конфигурация данной библиотеки позволяет это осуществить.
С информацией об ограничениях теневых сборок можно ознакомиться из sfdk --help-building
.
git clone https://github.com/sailfishos/automakesample
mkdir automakesample.build.x86_64 && cd automakesample.build.x86_64
sfdk build ../automakesample
Далее необходимо изменить приложение, добавив зависимость сборки от библиотеки.
Следует отредактировать main.cpp и добавить следующий код:
#include <automakesample.h>
#include <iostream>
...
std::cout << automakesample::greetings() << std::endl;
Далее необходимо отредактировать CMakeLists.txt, чтобы библиотека automakesample
находилась
и использовалась с помощью pkg-config
(см. в примере, как это делается для sailfishapp
),
и добавить BuildRequires: pkgconfig(automakesample)
в rpm/ru.auroraos.ApplicationTemplate.spec.
Сборка обновлённого приложения:
cd ApplicationTemplate.x86_64
sfdk build ../ApplicationTemplate
В результате в выводе сборки должно появиться следующее сообщение:
The following 2 NEW packages are going to be installed:
automakesample 0.1-1
automakesample-devel 0.1-1
Нужно развернуть приложение и библиотеку (но не пакет разработки) в эмуляторе и запустить приложение. В выводе консоли после запуска приложения должно появиться приветствие.
$ sfdk deploy --all "-*-devel"
$ sfdk device exec /usr/bin/automakesample
Hello, World!
Изменение кода с помощью Аврора IDE и без неё
Для успешной загрузки проектов для ОС Аврора и включения в них расширенных функций редактирования кода, на стороне среды разработки для конкретного типа проектов должен существовать определённый уровень интеграции с Аврора SDK. Это необходимо, потому что пути к файловой системе, задействованные во время сборки, не всегда существуют в файловой системе хоста — некоторые действительны только в Build Engine. В Аврора IDE такая интеграция существует для проектов на основе qmake и CMake.
Если редактор кода или инструмент не получает необходимую информацию из системы сборки, используемой в конкретном проекте, следует использовать формат Clang JSON для базы данных компиляции, применяемый в качестве взаимозаменяемого описания проекта, подходящего для загрузки с помощью инструментов. Такой же подход может использоваться для любой среды разработки, способной загружать базы данных компиляции, а не только с Аврора IDE.
Для систем сборки, которые могут использовать make
, Аврора SDK поддерживает
удобное создание баз данных компиляции с помощью команды sfdk compiledb
.
В качестве примера можно взять представленную выше библиотеку на основе Automake. После первоначальной сборки проекта, которая выполнялась ранее, нужно сгенерировать базу данных компиляции и, при условии, что теневая сборка выполнена, скопировать полученный файл в исходный каталог (либо использовать ссылку).
cd automakesample.build.x86_64
sfdk build ../automakesample # не требуется, если команда уже была запущена ранее
sfdk compiledb
cp compile_commands.json ../automakesample/
Теперь проект на основе Automake можно открыть в Аврора IDE. Чтобы открыть файл базы данных компиляции в исходном каталоге, можно использовать путь Файл → Открыть файл или проект.... При этом не следует открывать оригинал в каталоге сборки. После открытия проекта необходимо:
- настроить его для использования комплекта, соответствующего цели сборки,
применяемой для сборки проекта с помощью
sfdk
; - настроить путь к каталогу сборки в разделе Проекты → Настройки сборки.
Для упрощения навигации по задачам сборки проект с этой конфигурацией может быть построен непосредственно из Аврора IDE. В случае проектов приложений также можно будет обновить настройки запуска и запустить проект на устройстве непосредственно из Аврора IDE.
В качестве примера альтернативной среды редактирования можно рассмотреть использование редактора ViM с установленным плагином YouCompleteMe. С плагином YouCompleteMe ViM ищет файл compile_commands.json выше по иерархии файловой системы, начиная с каталога, где находится редактируемый файл. Предполагается, что на данном этапе произведены необходимые настройки, и после открытия файла lib/automakesample.cpp все функции, предоставляемые плагином YouCompleteMe, должны быть доступны.
Написание удобных для разработчиков spec-файлов RPM
Для сохранения возможности полной сборки на месте (однократно) с помощью команды
sfdk build
, в spec-файле не следует указывать ничего специфического.
Необходимо обеспечить максимально удобные для разработчиков
рабочие процессы с инкрементными (и повторными) сборками и задействованными теневыми сборками.
Процедура сборки и установки должна быть полностью реализована с использованием
базовой системы сборки (qmake, CMake, GNU Automake, make, …) без дополнительных шагов,
реализованных на уровне спецификации RPM.
Это также означает, что нельзя использовать макрос %doc
.
Если используется система сборки, отличная от qmake или CMake, и в процедуру сборки пакета
входит шаг, подобный настройке, раздел %build
должен быть написан таким образом,
чтобы этот шаг был пропущен для повторяющихся инкрементных сборок.
Ниже приведены примеры разделов %build
и %install
.
Для qmake:
%build
%qmake ARGS...
make %{?_smp_mflags}
make %{?_smp_mflags} doc
%install
%qmake_install
Для CMake:
%build
%cmake ARGS...
make %{?_smp_mflags}
make %{?_smp_mflags} doc
%install
%make_install
Для GNU Automake, Autoconf и подобных:
%build
if ! test -f Makefile; then
%reconfigure
fi
make %{?_smp_mflags}
make %{?_smp_mflags} doc
%install
%make_install
Объявление зависимостей
Если пакет имеет рабочие зависимости от других пакетов, подобные зависимости должны храниться
в метаданных пакета, чтобы менеджер пакетов мог при установке пакета также установить зависимости.
Управление метаданными происходит в spec-файлах.
Оптимальный способ добавить зависимость — добавить поле Requires
в spec-файл:
Requires: sailfishsilica-qt5 >= 0.10.9
Requires: libsailfishapp-launcher
Во многих случаях в этом нет необходимости: если приложение ссылается на разрешённые библиотеки, зависимости создаются автоматически. Однако этот процесс не является полностью точным, поэтому может потребоваться добавить или удалить зависимости в spec-файле вручную.
Если автоматизированный процесс добавляет нежелательную зависимость,
его следует отключить для одной зависимости с помощью %define __requires_exclude
.
Например, если автоматическая генерация зависимостей добавила нежелательную зависимость
к модулю Python с именем wrongmodule
, можно отключить это с помощью следующей команды:
%define __requires_exclude python3dist.wrongmodule
При необходимости полного отключения автоматической генерации зависимостей для модулей Python можно добавить:
%undefine __pythonapp_requires
Валидация пакетов
Приложения для ОС Аврора версии 4.0.1 и выше обязаны соответствовать
заданным требованиям
и проходить валидацию.
Валидатор запускается средствами sfdk
:
cd ApplicationTemplate
sfdk build
sfdk check
Также есть возможность проверять пакеты, собранные ранее, т. е. без доступа к дереву сборки. Для этого необходимо передать путь к ним:
sfdk config target=AuroraOS-<номер_релиза>-base-<архитектура>
sfdk check ...path/to/ru.auroraos.ApplicationTemplate-1.0-1.<архитектура>.rpm
Пример:
sfdk config target=AuroraOS-5.1.2-base-armv7hl
sfdk check ...path/to/ru.auroraos.ApplicationTemplate-1.0-1.armv7hl.rpm
Дополнительная информация
Руководство использования утилиты можно получить командой sfdk --help
.