Статьи

Документация

Дополнительно

Сборка зависимостей

Зависимости SDK делятся на внутренние, внешние и функциональные. Внутренние зависимости включены в основной код SDK и собираются общей системой сборки. Внешние зависимости необходимо собирать отдельно. Функциональные зависимости - сторонние приложения, используемые для реализации полнофункционального приложения с помощью SDK (например, PostgreSQL, Apache HTTPD).

Репозиторий зависимостей содержит стандартные скрипты сборки для внешних зависимостей, а также их предварительно собранную версию для поддерживаемых платформ.

Стоит обратить внимание, что зависимости зависят друг от друга, потому собирать их необходимо в описанном порядке. Порядок уже описан в прилагающихся makefile.

Далее, описаны значимые особенности процесса ручной сборки зависимостей для различных платформ и архитектур. Для подробностей и способов реализации сборки зависимости в SDK лучший способ - разобрать соответствующий зависимости файл *.mk для целевой платформы.

Список зависимостей

zlib: Базовая библиотека для сжатия. Используется в других зависимостях для Linux и Windows. На других платформах используется реализация в комплекте.

libzip: Библиотека поддержки zip-архивов. Используется во многих форматах файлов, включая APK для Android. Для Android необходима в базовом модуле для работы с файлами из APK.

jpeg: Стандартная библиотека поддержки формата JPEG.

libpng: Стандартная библиотека поддержки формата PNG.

giflib: Библиотека для чтения формата GIF. Не поддерживает запись.

libwebp (https://developers.google.com/speed/webp/download): Стандартная библиотека поддержки формата WebP.

brotli: Библиотека алгоритма сжатия Brotli

uidna: Библиотека, заменяющая libidna2 для поддержки интернационализированных URL. Основана на коде ICU. Использование libidna2 будет нарушать лицензионные требования.

libbacktrace: Библиотека для платформонезависимой развёртки стека вызовов. Используется средствами отладки SDK. Является необходимой при использовании musl в качестве стандартной библиотеки Linux (модуль stappler_backtrace обязателен к подключению).

freetype: Стандартная библиотека работы с файлами шрифтов

mbedtls: Вариант криптографической библиотеки. Не поддерживает ГОСТ-шифрование.

openssl: Вариант криптографической библиотеки. См. OpenSSL

openssl-gost-engine: Библиотека поддержки алгоритмов ГОСТ для OpenSSL.

curl: Библиотека для реализации сетевых вызовов. Собирается в нескольких вариантах в зависимости от криптографической библиотеки. Функциональность в стандартной сборке ограничена до протоколов HTTP и SMTP, для уменьшения размера.

WAMR: Минимальная машина исполнения WebAssembly. См. WebAssembly

SQLite: Встраиваемая БД.

nghttp3: Поддержка протокола HTTP/3

Общие принципы сборки

Для работы SDK необходимы заголовки и файлы библиотек зависимостей. На текущий момент SDK использует статически собранные зависимости, включаемые в финальный исполняемый файл или динамическую библиотеку. Это позволяет гарантировать стабильную работу SDK с конкретными версиями библиотек. Пользователь SDK может использовать собственную сборку зависимостей, в том числе, при необходимости, в виде динамических библиотек, входящих в состав системы либо поставляемого пакета.

При сборке зависимости располагаются следующим образом:

<ОС>/<Архитектура> либо <ОС>/<Вариант>/<Архитектура>, если отладочная и поставляемая версии библиотек для платформы отличаются (например, на Windows).

Внутри директории архитектуры:

  • /include - заголовочные файлы
  • /lib - файлы библиотек
  • /lib/pkgconfig - файлы описания библиотек для их связи друг с другом (создаются во время сборки, не хранятся в репозитории)
  • /bin - исполняемые файлы (создаются во время сборки, не поставляются в предсобранном виде)
  • /share - дополнительные разделяемые данные

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

Для загрузки исходного кода зависимостей необходимо выполнить make в корневой директории репозитория зависимостей

Для ручной сборки зависимостей в качестве отправной точки стоит использовать имеющиеся скрипты сборки. Чтобы полностью повторить сборку, нужно удалить директории архитектур и запустить make в директории платформы. Это также создаст дополнительные файлы, необходимые для связи библиотек друг с другом во время сборки. После автоматической сборки зависимостей можно приступать к модификациям, требующим ручного управления.

Пересборка

Для пересборки сперва необходимо загрузить необходимые версии зависимостей

cd ~/libstappler-root/deps
make

Для Windows:

cd ~/libstappler-root/deps
make && make xwin

После загрузки - собрать версии под нужную платформу и архитектуру, например, для Linux на X86_64

cd ~/libstappler-root/deps/linux
make clean && make x86_64

Комментарии для платформ

Далее, прокомментированы некоторые принятые решения для сборки конкретных библиотек на конкретных платформах.

Linux

См. общую информацию о поддержке Linux.

Для сборки требуются:

  • make - стандартный сборщик (рекомендуется версия от 4.3)
  • cmake - сборщик cmake (рекомендуется версия от 3.20.0)
  • sed - редактор потоков данных
  • git - управление репозиториями
  • gcc/lcc - компилятор для целевой платформы со всеми требуемыми зависимостями

Brotli

Библиотека некорректно выставляет зависимости в своих файлах конфигурации. Необходимо исправить, добавив в зависимоcти библиотек кодирования и декодирования базовую библиотеку:

sed -i -e 's/ -lbrotlidec/ -lbrotlidec -lbrotlicommon/g' libbrotlidec.pc
sed -i -e 's/ -lbrotlienc/ -lbrotlienc -lbrotlicommon/g' libbrotlienc.pc

SQLite

Для sqlite: используется вариант сборки амальгамированной версии библиотеки напрямую с помощью целевого компилятора.

OpenSSL

Стандартная сборка OpenSSL использует директорию lib64 вместо lib, что нуждается в замене. Также, для использования OpenSSL в виде статической библиотеки при сборке других зависимостей, необходимо описать зависимость от библиотеки libpthread. Конкретно, заменить строку в файле следующим образом:

sed -i -e 's/ -lssl/ -lssl -lpthread/g' $(PREFIX)/lib/pkgconfig/libssl.pc

SDK также добавляет библиотеку libgost как зависимость openssl для статического подключения ГОСТ-шифров. При использовании самостоятельно собранной динамической библиотеки openssl-gost-engine так делать не нужно. Вместо этого, путь указывается в конфигурации.

openssl-gost-engine

Стандартный файл сборки не предполагает возможность сборки статической библиотеки. В составе SDK есть альтернативный файл сборки этого проекта, который можно использовать для статической сборки. Найти его можно по адресу replacements/openssl-gost-engine/CMakeLists.txt

libcurl

Libcurl собирается в нескольких версиях, в зависимости от используемой криптобиблиотеки. Сборка ведётся с явным указанием необходимых функций, чтобы обеспечить предсказуемое поведение библиотеки. Список для конфигурации можно найти в файле linux/curl.mk. Для версии openssl также собирается поддержка HTTP/3.

Для libcurl используется встроенный набор корневых сертификатов. К базовому набору добавлены отечественные корневые сертификаты, поставляемые по ГосУслугами. Готовый набор сертификатов доступен в составе SDK по адресу replacements/curl/cacert.pem.

libzip

Libzip собирается в нескольких версиях, в зависимости от используемой криптобиблиотеки

WAMR

WAMR поставляется в форме статической библиотеки в двух версиях: отладочной и выпускаемой. Отладочная версия включает в себя код, необходимый для отладки кода WebAssembly путём удалённого подключения отладчика (модифицированной версии lldb).

Также, для WAMR доступен режим предварительной компиляции под целевую платформу, но он не является частью зависимостей SDK. Для сборки компилятора воспользуйтесь документацией проекта. Предварительная компиляция не поддерживается на платформе e2k.

Android

См. общую информацию о поддержке Android.

zlib

Используется системная версия этой библиотеки, зависимость не собирается.

Brotli

Библиотека некорректно выставляет зависимости в своих файлах конфигурации. Необходимо исправить, добавив в зависимоcти библиотек кодирования и декодирования базовую библиотеку:

sed -i -e 's/ -lbrotlidec/ -lbrotlidec -lbrotlicommon/g' libbrotlidec.pc
sed -i -e 's/ -lbrotlienc/ -lbrotlienc -lbrotlicommon/g' libbrotlienc.pc

SQLite

Для sqlite: используется вариант сборки амальгамированной версии библиотеки напрямую с помощью целевого компилятора.

OpenSSL

Необходимо вручную указать имя скрипта сборки OpenSSL для каждой отдельной архитектуры. Соответствия такие:

  • x86 - android-x86;
  • x86_64 - android-x86_64;
  • arm64-v8a - android-arm64;
  • armeabi-v7a - android-arm.

Также, важно отключить автозагрузку файла конфигурации флагом no-autoload-config, и добавить параметр -fPIC.

openssl-gost-engine

Стандартный файл сборки не предполагает возможность сборки статической библиотеки. В составе SDK есть альтернативный файл сборки этого проекта, который можно использовать для статической сборки. Найти его можно по адресу replacements/openssl-gost-engine/CMakeLists.txt.

Для сборки необходимо указывать конфигурацию сборки OpenSSL, её соотвествия для архитектур описаны выше.

libcurl

Libcurl собирается в нескольких версиях, в зависимости от используемой криптобиблиотеки. Сборка ведётся с явным указанием необходимых функций, чтобы обеспечить предсказуемое поведение библиотеки. Список для конфигурации можно найти в файле android/curl.mk. Для версии openssl также собирается поддержка HTTP/3.

Для libcurl используется встроенный набор корневых сертификатов. К базовому набору добавлены отечественные корневые сертификаты, поставляемые по ГосУслугами. Готовый набор сертификатов доступен в составе SDK по адресу replacements/curl/cacert.pem. Для Android также отключен встроенный путь для поиска сертификатов, поскольку он фактически не доступен приложению.

libzip

Libzip собирается в нескольких версиях, в зависимости от используемой криптобиблиотеки

WAMR

WAMR поставляется в форме статической библиотеки в двух версиях: отладочной и выпускаемой. Отладочная версия включает в себя код, необходимый для отладки кода WebAssembly путём удалённого подключения отладчика (модифицированной версии lldb).

WAMR для всех архитектур Android поддерживает режим интерпретации и предкомпиляции. Для каждой архитектуры необходимо указывать архитектуру сборки в переменной WAMR_BUILD_TARGET. Таблица соответствий: • x86 - X86_32; • x86_64 - X86_64; • arm64-v8a - AARCH64; • armeabi-v7a - ARMV7.

Windows

См. общую информацию о поддержке Windows.

Для сборки зависимостей необходимы дополнительные модификации заголовочных файлов и средств сборки.

В системе необходимо заменить заголовочные файлы, отвечающие за встроенные функции компилятора (интринсики). Альтернативные заголовки размещены в директории windows/replacements/include.

Необходимо заменить средство windres из стандартного набора средств разработки. Замена реализована в виде скриптового файла windows/replacements/bin/x86_64-windows-windres.

Для платформы Windows необходимо собирать отдельно отладочные и поставляемые версии библиотек. Их необходимо предварительно связывать с отладочными и поставляемыми версии в Windows SDK.

Общее правило для сборки: отключить включение в библиотеку стандартных библиотек, после чего подключить необходимые для сборки библиотеки вручную (конкретно -lkernel32 -loldnames).

Для компиляции и линковки нужно указывать компилятору целевую платформу с помощью --target=x86_64-windows-msvc -D_MT -msse2.

Для сборки configure указывается целевая и исходная система с помощью --host=x86_64-windows.

Для сборки cmake необходимо указывать следующие опции: -DCMAKE_RC_COMPILER=$(CC) -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_POLICY_DEFAULT_CMP0091=NEW. Для поставляемой версии: -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded -DCMAKE_BUILD_TYPE=Release. Для отладочной -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDebug -DCMAKE_BUILD_TYPE=Debug.

Brotli

Библиотека некорректно выставляет зависимости в своих файлах конфигурации. Необходимо исправить, добавив в зависимоcти библиотек кодирования и декодирования базовую библиотеку:

sed -i -e 's/ -lbrotlidec/ -lbrotlidec -lbrotlicommon/g' libbrotlidec.pc
sed -i -e 's/ -lbrotlienc/ -lbrotlienc -lbrotlicommon/g' libbrotlienc.pc

SQLite

Для sqlite: используется вариант сборки амальгамированной версии библиотеки напрямую с помощью целевого компилятора.

MbedTLS

Необходимо добавить опции компилятора, чтобы включить необходимые встроенные функции компилятора: -maes -mpclmul -include wmmintrin.h.

OpenSSL

Для сборки OpenSSL используется собственная конфигурация, описанная в файле windows/replacements/openssl/49-xwin-clang.conf. Имя новой конфигурации - mingw-xwin-clang-x64.

Необходимо добавить опции компилятора, чтобы включить необходимые встроенные функции компилятора: -include intrin.h.

Также, важно отключить автозагрузку файла конфигурации флагом no-autoload-config.

openssl-gost-engine

Стандартный файл сборки не предполагает возможность сборки статической библиотеки. В составе SDK есть альтернативный файл сборки этого проекта, который можно использовать для статической сборки. Найти его можно по адресу replacements/openssl-gost-engine/CMakeLists.txt.

libcurl

Libcurl собирается в нескольких версиях, в зависимости от используемой криптобиблиотеки. Сборка ведётся с явным указанием необходимых функций, чтобы обеспечить предсказуемое поведение библиотеки. Список для конфигурации можно найти в файле windows/curl.mk. Для версии openssl также собирается поддержка HTTP/3.

Для libcurl используется встроенный набор корневых сертификатов. К базовому набору добавлены отечественные корневые сертификаты, поставляемые по ГосУслугами. Готовый набор сертификатов доступен в составе SDK по адресу replacements/curl/cacert.pem. Для Android также отключен встроенный путь для поиска сертификатов, поскольку он фактически не доступен приложению.

Для успешной сборки необходимо явно включить дополнительный файл флагом компилятора: -include time.h.

Libcurl использует системные вызовы для интернационализации доменных имён, сборка libuidna не требуется. Однако, системная криптография для сетевых соединений не используется, поскольку не работает с ГОСТ-протоколами.

libzip

Libzip собирается в нескольких версиях, в зависимости от используемой криптобиблиотеки

WAMR

WAMR поставляется в форме статической библиотеки в двух версиях: отладочной и выпускаемой. Отладочная версия включает в себя код, необходимый для отладки кода WebAssembly путём удалённого подключения отладчика (модифицированной версии lldb).. Таким образом, фактически, собирается четыре версии этой библиотеки для возможности отлаживать код WebAssembly без сборки полностью отладочной версии.

Для успешной сборки необходимо применить патч replacements/wamr/0002-Windows-clang-fixes.patch. Патч добавляет поддержку компиляции с помощью clang на Windows и собирает необходимый файл для вызова базовых функций на основе принятых в Windows соглашений о вызове функций.

Также, нужно обратить внимание, что проект WAMR на текущий момент не поддерживает многопоточную работу скриптов в Windows. Эти функции необходимо отключить явно, поскольку система сборки не может определить функции на основе компилятора.

Дополнительные флаги сборки включают -D_CRT_USE_BUILTIN_OFFSETOF -Dgetcwd=_getcwd для использования встроенной в компилятор функции offsetof вместо библиотечной в WinAPI и для подмены имени функции getcwd на принятое в Windows имя.