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

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

Сборка

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

Компиляция

Put the library’s source code at libs/LIBNAME (replacing LIBNAME by the library’s name), because this is where clickable will look for it by default. If the dependency source code is available as a git repository, it is a good idea to add it as a git submodule. Otherwise add a script to download the sources.

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"

Most build arguments are project specific. Therefore, study the library’s build instructions and also look for option settings in its CMakeLists.txt .

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.

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

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

A pre-built library is usually only available as a shared object that needs to be linked dynamically. Furthermore, it may contain components that you don’t need, resulting in a bloated app. It may even miss something that you could achieve by compiling it yourself. Sometimes, a library is available in the Ubuntu Repositories, but is not installable for the architecture you need (likely armhf or arm64). In this case you have to compile the library as described above.

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

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

Clickable will install the specified package automatically for the target architecture inside the build container. An example can be found in Guitar Tools“ clickable.json.

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})

The find_package command usually defines the path to the include directory as SOMELIBRARY_INCLUDE_DIRS and the library’s binaries as SOMELIBRARY_LIBS (check on the library’s documentation on what their CMake configuration provides exactly). Use them with the include_directories and target_link_libraries commands. See the Camera Scanner ImageProcessing CMakeLists.txt for a real world example.

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

Размещение

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

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

Find the path to the shared object files. For libraries built via clickable, they are located somewhere in the library’s install dir, which is located inside the library’s build dir by default (e.g. build/arm-linux-gnueabihf/opencv/install). For pre-built libraries run clickable run "find / -name 'libSomething.so'" (replacing libSomething.so by the file your are looking for). This should print the path to the file (along with some error messages you can ignore). In general, /usr/lib is a good bet when looking for the shared object files.

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/$ARCH_TRIPLET/libqmapboxgl.so*"
     - "/usr/lib/$ARCH_TRIPLET/libSoundTouch.so.*"

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

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

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