Работа с библиотеками и зависимыми файлами C++ с помощью Clickable#

Если работа приложения зависит от библиотеки, по умолчанию не установленной в Ubuntu Touch, то приложение должно взять его из click-пакета. В этой статье рассказывается, как с помощью Clickable создать такой пакет.

Сборка#

Иногда в наличии есть уже готовые библиотеки, что позволяет пропустить этап сборки. Однако рекомендуется компилировать файлы зависимостей, так как это дает больше контроля над всем процессом и может привести к лучшим результатам (например, лучшая производительность или меньшие размеры пакетов).

Компиляция#

Скопируйте исходный код библиотеки в папку libs/LIBNAME. Эта папка по умолчанию установлена в clickable. Если исходный код нужных библиотек есть в репозиториях git, можно добавить эту библиотечку как модуль git. В противном случае придётся добавить скрипт для скачивания исходных кодов.

Add a libraries section to your clickable.yaml, like this:

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

If the library does not contain a CMake configuration, you need to use the qmake or custom builder instead.

Дополнительно настройте процесс компиляции - добавьте опцию 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`` (если используется CMake). По умолчанию, директория для сборки build/LIBNAME/ARCHITECTURE. Поэтому сборки для разных архитектур могут существовать параллельно.

To actually build the library for all architectures run clickable build --libs --arch armhf, clickable build --libs --arch arm64 and clickable build --libs --arch amd64. Don’t forget to mention this step in your README, so that others can reproduce the build process.

See how Teleports clickable.yaml uses the libraries feature to build its dependency tdlib.

Предустановленные библиотеки#

Если Вы скомпилировали библиотеку, как описано выше, пропустите этот шаг.

Предустановленная библиотека обычно доступна только как общий объект, который необходимо динамически связывать. Кроме того, она может содержать лишние компоненты, что приводит к увеличению размера программы. Также в системе могу быть старые версии библиотек, где отсутствую необходимые функции. Иногда библиотека доступна в репозиториях Ubuntu, но ее нельзя установить для требуемой архитектуры (например, для архитектуры armhf). В этом случае нужно скомпилировать библиотеку, как описано выше.

Если библиотека есть в официальных репозиториях Ubuntu, можно добавить ее в список файлов зависимостей:

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

Clickable автоматически установит указанный пакет внутри контейнера сборки для нужной архитектуры. Пример можно посмотреть в приложении `Guitar Tools' - вот его json-файл-<https://github.com/t-mon/guitar-tools/blob/master/clickable.json#L4>`_.

If the library can be found in a PPA, you can add the PPA to the clickable.yaml, too. For example:

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

В противном случае нужно будет добавить скрипт для скачивания предустановленной библиотеки.

Использование#

Сначала нужно указать директорию, где компилятор будет искать файлы заголовков. Далее нужно связать библиотеку и бинарный файл приложения (если это только не библиотека заголовков, где весь исходный код находится в файлах заголовков).

Если библиотека содержит файл конфигурации CMake, можно использовать команду find_package , которая предоставляет вам цель для линковки или переменные указывающие на бинарные файлы библиотеки и include каталоги. Дополнительные строки в файле CMakeLists.txt могут выглядеть следующим образом:

find_package(SOMELIBRARY REQUIRED)

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

Команда find_package определяет путь к каталогу include как SOMELIBRARY_INCLUDE_DIRS, а готовые бинарные файлы библиотеки как SOMELIBRARY_LIBS. Мы используем эти переменные с командами include_directories и target_link_libraries. Пример того, как это работает можно посмотреть в файле Camera Scanner ImageProcessing CMakeLists.txt <https://github.com/jonnius/camera-scanner/blob/master/plugins/ImageProcessing/CMakeLists.txt#L23> _ .

На этом этапе вы уже должны иметь возможность протестировать рабочий стол в режиме clickable desktop.

Размещение#

Если Вы связали библиотеку статически, то этот шаг можно пропустить, так как бинарный файл библиотеки уже находится внутри бинарного файла приложения.

Узнайте, какие общие файлы объектов (* .so) нужно отправить. Это можно сделать, запустив приложение на своем устройстве через clickable && clickable logs. Должно появиться сообщение об ошибке, сообщающее, какой общий файл объекта отсутствует.

Найдите путь к файлам общих объектов. Если библиотека создана с помощью clickable, то эти файлы находятся в каталоге установки библиотеки. По умолчанию, папка находится внутри каталога сборки библиотеки (например, build/arm-linux-gnueabihf/opencv/install). Для готовых библиотек запустите команду clickable run "find / -name 'libSomething.so'" (заменив libSomething.so на файл, который ищете). Это выведет на экранпуть к файлу (вместе с некоторыми сообщениями об ошибках, которые можно игнорировать). В общем, при поиске файлов общих объектов лучше всего использовать /usr/lib.

To get the files into the click package, add the install_lib key to your clickable.yaml:

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

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

В зависимости от библиотеки, может быть потребуется отправить некоторые дополнительные данные. В этом случае обратитесь к файлу readme для библиотеки или инструкциям по установке.

Нужно настроить всё для сборки и установки click-пакета на устройстве, подключенном к компьютеру, запустив clickable.