Установка и запуск
Собранные библиотеки зависимостей
Если по какой-то причине (например, серьёзное несоотвествие версий glibc) предсобранные зависимости не работают, необходимо собрать их вручную для вашей системы.
Linux
См. общую информацию о поддержке Linux.
Далее, установить пакеты дистрибутива
- git
- make
- gcc
- g++
sudo apt-get install git make gcc g++
Android
См. общую информацию о поддержке Android.
Необходимо установить Android NDK.
Для запуска приложения потребуется Android Studio
Windows
См. общую информацию о поддержке Windows.
Необходимо установить:
- Microsoft Visual Studio (только заголовки и библиотеки WinAPI, редакция Community)
- LLVM/Clang
- MSYS2
- из состава msys2: make, xxd (
pacman -S make xxd
) - Добавить адрес установки приложений msys2 в
PATH
.
В такой конфигурации можно работать из любого эмулятора терминала или открытой IDE.
Зависимости
Базы данных
PostgreSQL или PostgresPro версии от 12. SQLite входит в поставку Stappler SDK.
Для Vulkan (графические и вычислительные приложения):
См. Vulkan для полной инструкции
- Стандартная утилита xxd (если нет в стандартной поставке дистрибутива)
- Заголовки Vulkan в системе или Vulkan SDK (Переменная
VULKAN_SDK_PREFIX
) - glslangValidator (входит в Vulkan SDK или пакет glslang/glslang-tools, переменная
GLSLC
) - spirv-link (входит в Vulkan SDK или пакет spirv-tools, переменная
SPIRV_LINK
)
Для WebAssembly
См. WebAssembly для полной инструкции
- WASI SDK (
WASI_SDK ?= /opt/wasi-sdk
) - wit-bindgen, возможна установка из cargo:
cargo install wit-bindgen-cli
(WIT_BINDGEN ?= wit-bindgen
)
Для вебсервера
- Apache HTTPD
- Заголовки в системе (
APACHE_HTTPD_INCLUDE ?= /usr/local/include/apache
)
Установка SDK
git clone --recurse-submodules git@github.com:libstappler/libstappler-root.git
cd libstappler-root
Варианты установки
Из корня репозитория
Основной способ использования SDK - напрямую из корня репозитория libstappler-root. Для этого достаточно просто клонировать репозиторий.
В поставку SDK входят все необходимые компоненты и предсобанные бинарные библиотеки зависимсотей. Для Linux версия glibc и зависимостей могут существенно отличаться, что потребует их пересобрать. Скрипты пересборки (использованные для сборки поставляемых бинартных файлов) также есть в поставке SDK.
Для Windows, MacOS, iOS и Android предсобранные библиотеки, чаще всего, пересборки не требуют.
Такая форма установки предназначена для сборки на встраиваемые системы и системы, требующие кросскомпиляции, в том числе для кросскомпиляции на Windows.
Для Android библиотеки собраны с помощью последней доступной версии NDK с длительной поддержкой (LTS).
Для Windows библиотеки собраны с помощью clang и последней доступной в проекте xwin версии Windows SDK.
Для MacOS и iOS репозиторий содержит проекты для фреймворков XCode, которые необходимо подключить к проекту XCode конечного приложения.
Для Linux, такой вариант установки пригоден для сборки приложений в контейнерах и для "полных" пакетов: AppImage, FlatPak, Snap.
Установка с общим корнем
Для Linux, SDK может устанавливаться напрямую в систему с использованием динамических библиотек ОС вместо предварительно собранных. В таком случае, SDK собирается в набор динамических библиотек, и эти библиотеки будут использоватся конечным приложением.
Для установки используйте:
# из libstappler-root
make
sudo make install <params>
Параметры установки:
- prefix (
/usr/local
): основной префикс установки - libdir (
$prefix/lib
): директория для размещения динамических библиотек - includedir (
$prefix/include
): директория для размещения заголовоков C/C++ - datadir (
$prefix/share
): директория для размещения скриптов сборки INSTALL_WITH_RPATH=1
: использовать rpath при сборке приложений из этой установки SDK (для нестандартной libdir)
После установки в качестве директории сборки STAPPLER_BUILD_ROOT
используйте $datadir/libstappler
, основной сборочный скрипт будет размещён по адресу $datadir/libstappler/universal.mk
.
Сборка SDK с общим корнем пригодна для создания установочных пакетов для различных дистрибутивов Linux.
Для сборки примеров с использованием общего корня, переопределите в окружении переменную STAPPLER_BUILD_ROOT
или используйте переопределение в вызове make:
make STAPPLER_BUILD_ROOT=/usr/local/share/libstappler host
Запуск примеров
Запуск первого примера
cd examples/commandline
make && make install
stappler-build/host/genpasswd
Также, смотрите другие примеры.
Демонстрационно-тестовое приложение графического движка (требует полной установки Vulkan):
cd xenolith/utils/testapp
make && make install
stappler-build/host/testapp
Тесты покрытия (требует полной установки Vulkan и WebAssembly, а также GnuTLS на Linux)
cd tests/common
make && make install
stappler-build/host/testapp
Первое приложение
Структура приложения:
- Makefile - корневой Makefile проекта
- main.cpp - точка входа
- src - директория с исходными кодами
Makefile
# Путь к SDK
STAPPLER_ROOT ?= <путь к libstappler-root>
# Указание перестаривать проект, если этот файл изменился
LOCAL_MAKEFILE := $(lastword $(MAKEFILE_LIST))
# Название исполняемого файла
LOCAL_EXECUTABLE := helloworld
# Пути к наборам модулей
LOCAL_MODULES_PATHS = \
$(STAPPLER_ROOT)/core/stappler-modules.mk
# Используемые модули
LOCAL_MODULES := \
stappler_brotli_lib \
stappler_data
# Пути к исходным кодам
LOCAL_SRCS_DIRS := src
LOCAL_INCLUDES_DIRS := src
# Файл исходного кода, содержащий функцию main
LOCAL_MAIN := main.cpp
# Подключения системы сборки
include $(STAPPLER_ROOT)/build/make/universal.mk
main.cpp
// Для функций чтения командной строки
#include "SPData.h"
namespace stappler::app {
// Выбираем стандартную подсистему памяти для текущего пространства имён
using namespace mem_std;
// Строка при запросе помощи по команде
static constexpr auto HELP_STRING(
R"HelpString(helloworld <options> - my first program
Options are one of:
-h (--help))HelpString");
// Разбор коротких переключателей (-h, -v)
static int parseOptionSwitch(Value &ret, char c, const char *str) {
if (c == 'h') {
ret.setBool(true, "help");
}
// прочитан только один символ
return 1;
}
// Разбор строковых переключателей (--help, -verbose)
static int parseOptionString(Value &ret, const StringView &str, int argc, const char * argv[]) {
if (str == "help") {
ret.setBool(true, "help");
}
// прочитан один параметр
return 1;
}
SP_EXTERN_C int main(int argc, const char *argv[]) {
// читаем параметры командной строки
// возвращает дополнительные параметры и список основных аргументов
Pair<Value, Vector<String>> opts = data::parseCommandLineOptions<Interface, Value>(
argc, argv, &parseOptionSwitch, &parseOptionString);
// проверяем, запрошена ли помощь
if (opts.first.getBool("help")) {
std::cout << HELP_STRING << "\n";
return 0;
}
// выполняем в контексте временного пула памяти
// пример не использует подсистему пулов памяти, но всегда заворачивать выполнение основного
// потока во временный пул памяти - практика, позволяющая избегать ошибок
perform_temporary([&] {
std::cout << "Hello world!" << "\n";
});
return 0;
}
}