Опікування залежностями C++ через Clickable

Якщо програма залежна від бібліотеки, яка стандартно не встановлена в Ubuntu Touch, її потрібно додати до click-пакунку програми. У цій настанові описано як це робиться з Clickable.

Створення

Іноді бібліотеки вже готові, дозволяючи пропустити крок побудови (створення). Однак рекомендується компіляція таких залежностей — так буде більше контролю над усім процесом і, можливо, надасть кращі результати (наприклад, кращу продуктивність або менші розміри пакунків).

Компіляція

Скопіюйте джерельний код бібліотеки до libs/LIBNAME (замінивши LIBNAME назвою бібліотеки), оскільки саме тут він типово буде доступний для пошуку clickable. Якщо є залежність коду від git-репозиторію, було б добре додати його як git submodule. Або додайте скрипт для завантаження джерел.

Додайте libraries section до свого clickable.yaml, як тут:

 builder: "cmake"
 libraries:
   LIBNAME:
     builder: "cmake"

Якщо у бібліотеці немає налаштувань CMake, для компіляції потрібно використовувати qmake або custom.

Додатково можна налаштувати компіляцію, додавши build_args в такий спосіб:

 builder: "cmake"
 libraries:
   LIBNAME:
     builder: "cmake"
     build_args:
     - "-DBUILD_EXAMPLES=OFF"
     - "-DBUILD_DOCS=OFF"
     - "-DBUILD_TESTS=OFF"
     - "-DBUILD_SHARED_LIBS=OFF"

Більшість аргументів компіляції залежать від проєктів. Тому спочатку вивчіть настанови компілятора бібліотеки і зверніть увагу на налаштування option у файлі CMakeLists.txt бібліотеки.

Для компіляції бібліотеки для усіх архітектур виконайте clickable build --libs --arch armhf, clickable build --libs --arch arm64 та clickable build --libs --arch amd64. Не забудьте згадати це крок у своєму README — це допоможе іншим повторити процес компіляції.

Перегляньте як Teleports clickable.yaml використовує властивості бібліотеки для побудови залежностей з tdlib.

Наперед скомпільовано

Якщо скомпілюєте бібліотеку як описано вище, пропустіть цей крок.

Скомпільована наперед бібліотека доступна зазвичай лише як спільний об’єкт, який повинен зв’язуватися динамічно. Крім того, вона може містити компоненти, які Вам не потрібні, через що програма буде завеликою. Вона також може навіть не мати необхідних функцій. Іноді бібліотека доступна у репозиторіях Ubuntu, але не може бути встановлена у необхідній архітектурі (напр. armhf чи arm64). У цьому випадку Вам потрібно скомпілювати бібліотеку як було описано вище.

Якщо ця бібліотека доступна у репозиторіях Ubuntu, її можна додати у список залежностей у такий спосіб:

 builder: "cmake"
 dependencies_target:
 - "libsomething-dev"

Clickable встановить вказаний пакет для цільової архітектури автоматично всередині скомпільованого контейнера. Приклад можна знайти у Guitar Tools“ clickable.json.

Якщо бібліотеку можна знайти у PPA, можна також до clickable.yaml додати PPA. Наприклад:

 builder: "cmake"
 dependencies_ppa:
 - "ppa:someone/libsomething"
 dependencies_target:
 - "libsomething-dev"

Або додайте скрипт для завантаження скомпільованої наперед бібліотеки.

Використання

По-перше, потрібно вказати каталог, в якому можна знайти заголовки для їх додавання до джерельного коду програми. По-друге, потрібно зв’язати двійкову бібліотеку з двійковою програмою.

У випадку, якщо бібліотека містить файл налаштувань CMake, можна використовувати команду find_package, яка надасть цільовий об’єкт для зв’язку (link) або змінні, які вказуватимуть на двійкові бібліотеки та додаткові (include) каталоги. Додаткові рядки Вашого CMakeLists.txt можуть виглядати таким чином:

find_package(SOMELIBRARY REQUIRED)

include_directories(${SOMELIBRARY_INCLUDE_DIRS})
target_link_libraries(mytarget ${SOMELIBRARY_LIBS})

Команда find_package зазвичай визначає шлях до каталогу включення як SOMELIBRARY_INCLUDE_DIRS та двійкові файли бібліотеки як SOMELIBRARY_LIBS (перевірте документацію бібліотеки, що саме надає конфігурація CMake). Використовуйте їх з командами include_directories та target_link_libraries. Реальні приклади можна переглянути тут: Camera Scanner ImageProcessing CMakeLists.txt.

Тепер Ви повинні мати можливість перевірити режим робочого столу Clickable, виконавши clickable desktop.

Розгортання

Якщо Ви зв’язали бібліотеку статично, можете цей крок пропустити, оскільки двійкові файли бібліотеки вже всередині Вашої двійкової програми.

Дізнайтеся, які файли спільних об’єктів (*.so) потрібно доставити. Ви можете це зробити, запустивши програму на своєму пристрої за допомогою clickable && clickable logs. Ви повинні побачити повідомлення з помилкою про відсутній файл спільного об’єкта.

Знайдіть шлях до файлів спільних об’єктів. Для бібліотек, створених за допомогою clickable, вони знаходяться десь в каталозі інсталяції бібліотеки, який за замовчуванням знаходиться в каталозі збірки бібліотеки (наприклад, build/arm-linux-gnueabihf/opencv/install). Для попередньо скомпільованих бібліотек запустіть clickable run «find / -name “libSomething.so”» (замінивши libSomething.so на файл, який ви шукаєте). Це повинно вивести шлях до файлу (разом з деякими повідомленнями про помилки, які ви можете проігнорувати). Як правило, /usr/lib є хорошим варіантом для пошуку файлів спільних об’єктів.

Щоб отримати файли до пакета click, додайте ключ install_lib до свого clickable.yaml:

 builder: "cmake"
 libraries:
   LIBNAME:
     builder: "cmake"
     install_lib:
     - "$LIBNAME_LIB_INSTALL_DIR/usr/lib/$ARCH_TRIPLET/libqmapboxgl.so*"
     - "/usr/lib/$ARCH_TRIPLET/libSoundTouch.so.*"

Рядки зверху містять два приклади. Перший для встановлення бібліотеки, зібраної з Clickable. Зірочка у .so* допомагає перехопити символьні посилання разом з бібліотекою, що допоможе вказати на поточну версію.

Залежно від бібліотеки, можливо буде потрібно надіслати додаткові дані. Для цього перегляньте readme бібліотеки або настанови інсталятора.

Вам буде потрібно виконати налаштування для компіляції та встановлення Вашого click-пакунку на під’єднаний до комп’ютера пристрій, виконавши clickable.