Build godot from source on linux with c# support and web export template

от автора

Да, название статьи на английском, чтобы любой в интернете мог быстро ее найти.

Проблема: чтобы собрать UE из сурсов, достаточно команд; чтобы собрать UE докер-образ, достаточно 1 команды. А чтобы собрать godot из сурсов с поддержкой c# на линукс и с возможностью экспортировать проект в web, надо прочитать 5+ статей и потратить кучу времени на понимание оных. Чтобы вы могли не тратить своё время, я собрал всю необходимую информацию в одной статье. Здесь приведены краткие инструкции по сборке godot движка из сурсов на debain 11 (64bit).


1 — Установка нужных зависимостей

Надо поставить кучу всего. Во-первых, скачайте sdk Emscripten и положите исходники в какую-нибудь папку, скажем, $HOME/GODOT/emsdk/. Вам надо будет выполнить несколько команд, чтобы sdk manager загрузил нужный sdk и добавил его в path. Ставьте версию 1.39.9:

mkdir $HOME/GODOT cd $HOME/GODOT git clone https://github.com/emscripten-core/emsdk.git cd emsdk git pull ./emsdk install 1.39.9 ./emsdk activate 1.39.9 source ./emsdk_env.sh

В принципе, можно ставить любую версию 1.39.9+, но дальше нам встретятся сверх-тонкие вещи, которые тестировались именно на этой версии. Помимо этого, надо сохранить путь к созданному файлу конфигурации в переменной окружения:

export EM_CONFIG=`pwd` # где находится файл конфигурации .emscripten cd .. # возвращаемся в каталог $HOME/GODOT

Теперь надо поставить MSBuild версии 16.9. Как сказано тут, самый простой способ — установить .NET 6.0, в котором и есть всё необходимое. Инструкции для конкретного дистрибутива можно найти в обширной документации от microsoft. В моём случае — это инструкции для debian — добавить ключ и установить сам пакет. По идее, после этого вы можете убедиться в том, что sdk установлен, командой:

dotnet --list-sdks # output example: 6.0.402 [/usr/share/dotnet/sdk]

Но и это не всё. Ещё нам понадобится NuGet. Если верить этому посту на stackoverflow, после установки net-core, вы можете поставить его командой:

$ apt install nuget # под sudo, разумеется $ nuget NuGet Version: 2.8.7.0 usage: NuGet <command> [args] [options]  Type 'NuGet help <command>' for help on a specific command.

Ну супер, осталось немного:

apt-get install build-essential scons pkg-config libx11-dev libxcursor-dev libxinerama-dev \         libgl1-mesa-dev libglu-dev libasound2-dev libpulse-dev libudev-dev libxi-dev libxrandr-dev yasm gdb

2 — Подготовить NuGet

А именно скачать и дать ему ключ:

curl -LO https://curl.haxx.se/ca/cacert.pem cert-sync --user cacert.pem rm cacert.pem # удалить, чтобы не засорять систему

3 — Скачиваем ресурсы mono

Mono is an open source implementation of Microsoft’s .NET Framework based on the ECMA standards for C# and the Common Language Runtime.

Нам нужная конкретная версия : 1.62.0.182.

cd $HOME/GODOT git clone https://github.com/mono/mono cd mono git fetch --all --tags git checkout tags/mono-6.12.0.182 # Перейти на нужную версию cd .. export MONO_SOURCE_ROOT=$HOME/mono # путь к mono

Как перейти на указанный tag в git я нашел здесь: https://devconnected.com/how-to-checkout-git-tags/.

4 — Собрать mono сурсы для каждой из платформ

Целевые платформы в нашем случае: это linux, для которого надо собрать сам движок, и web (т.е. html5), для которого надо собрать только шаблоны экспорта. Все команды кратко описаны здесь. Смысл указанного репозитория — собрать ресурсы mono под каждую из указанных платформ. Важный момент: у меня была 64 bit версия компа, поэтому я собирал только 64bit версию движка, и чтобы она успешно собралась, надо править файл $HOME/GODOT/mono/mono/utils/mono-mmap-wasm.c. На 193-194 строках в этом файле используется флаг MAP_32BIT, который в современных машинах не нужен, поэтому эти строки можно удалить. Потом начинаем билдить исходники mono:

# Предполагается, что вы уже скачали  # https://github.com/godotengine/godot-mono-builds.git # Пропатчили файл mono/mono/utils/mono-mmap-wasm.c # находитесь в директории, где склонен godot-mono-builds. # Желательно, чтобы godot-mono-builds лежал в $HOME/GODOT ./patch_mono.py ./patch_emscripten.py ./linux.py configure --target=x86_64 ./linux.py make --target=x86_64 ./bcl.py make --product=desktop ./linux.py copy-bcl --target=x86_64 ./wasm.py configure --target=runtime ./wasm.py make --target=runtime ./bcl.py make --product=wasm ./wasm.py copy-bcl --target=runtime ./reference_assemblies.py install

Чтобы все эти скрипты клали результат не в $HOME/mono-installs, а в, например, $HOME/GODOT/mono-installs, к каждой команде, которая это поддерживает, надо приписать --install-dir=$HOME/GODOT/mono-installs.

Узнать, поддерживает ли команда указанный флаг --install-dir, можно, как всегда, флагом --help, например: ./linux.py --help.

5 — Скачиваем исходники godot

Нам нужная версия 3.5.1 stable. Клонируем репозиторий в $HOME/GODOT/godot.

6 — Генерируем glue код

Godot для сборки использует «хрен пойми» какой-то glue, если кратко: сначала надо сбилдить его с кое-какими флагами, запустить godot и вот тогда-то этот glue сгенерируется как раз, а уже только потом билдить сам godot. В директории, где лежат исходники:

scons -j15 platform=x11 tools=yes module_mono_enabled=yes mono_glue=no copy_mono_root=yes mono_prefix="$HOME/GODOT/mono-installs/desktop-linux-x86_64-release" sudo cp ~/GODOT/mono-installs/desktop-linux-x86_64-release/lib/libmonosgen-2.0.so.1 /usr/lib/libmonosgen-2.0.so.1 bin/godot.x11.tools.64.mono --generate-mono-glue modules/mono/glue

Первая команда сгенерирует вам недобилд godot, обратите внимание, что если у вас в другом месте лежат сбилденные файлы mono (не в "$HOME/GODOT/mono-installs/desktop-linux-x86_64-release"), то и путь к ним надо указать соответствующий. В папке, куда указывает mono_prefix= должны лежать папки include lib.

Вторая команда из тех, что выше — это просто костыль, который решает проблему, которая, видимо, только у меня произошла. Дело в том, что bin/godot.x11.tools.64.mono искал эту библиотеку и не мог найти, из-за чего падал. Тогда при помощи strace я посмотрел, где он её ищет и скопировал туда.

Третья команда — запуск недобилденного godot, который и сгенерирует файлы glue.

Результат: в папке modules/mono/glue/ будут файлы:

mono_glue.gen.cpp GodotSharp/GodotSharp/Generated GodotSharp/GodotSharpEditor/Generated

7 — Собираем движок

Наконец-то. Не забываем про mono_prefix.

scons -j15 platform=x11 tools=yes target=release_debug use_lto=yes module_mono_enabled=yes copy_mono_root=yes mono_prefix="$HOME/GODOT/mono-installs/desktop-linux-x86_64-release"

А, да и кстати (возможно об этом надо было сказать чуть раньше): scons — это система сборки. А флаг -j15 указывает ей, сколько потоков использовать. Например, если у вас на компьютере 16 ядер, то команда выше будет билдить движок в 15 потоков, а у вас останется 1 ядро, чтобы смотреть ютубчик, пока дело шьётся.

Результат — бинарники в bin папке. Для запуска движка выполнять opt файл (godot.x11.opt.tools.64.mono).

8 — Собираем шаблоны для javascript

Отлично, но мы хотим уметь билдить наши проекты в html. Для этого собираем шаблоны:

scons -j15 platform=javascript tools=no target=release_debug javascript_eval=no module_mono_enabled=yes copy_mono_root=yes mono_prefix="$HOME/GODOT/mono-installs/wasm-runtime-release" scons -j15 platform=javascript tools=no target=release javascript_eval=no module_mono_enabled=yes copy_mono_root=yes mono_prefix="$HOME/GODOT/mono-installs/wasm-runtime-release"

Ключ javascript_eval=no говорит, чтобы godot по возможности в результирующих билдах игры не использовал eval.

Результат — zip-архивы в bin папке.

9 — Скопировать экспорт-шаблоны в нужную папку

Перемещаем шаблоны экспорта в папку, где godot ожидает их увидеть:

mkdir ~/.local/share/godot/templates/3.5.1.stable.mono mv bin/godot.javascript.opt.debug.zip ~/.local/share/godot/templates/3.5.1.stable.mono/webassembly_debug.zip mv bin/godot.javascript.opt.zip       ~/.local/share/godot/templates/3.5.1.stable.mono/webassembly_release.zip

10 — Скопировать BCL в нужные папки

BCL — это Base Class Library. Он билдился на шаге 4 (собрать mono сурсы). Без понятия, что это, но я переместил это дело в папку поближе к экспорт-шаблонам, как это сказано в доках по godot. Просто сделайте так, чтобы по пути ~/.local/share/godot/templates/3.5.1.stable.mono/bcl/wasm/ оказались dll файлы из $HOME/GODOT/mono-installs/wasm-bcl/wasm/. Например:

mkdir ~/.local/share/godot/templates/3.5.1.stable.mono/bcl cp -r $HOME/GODOT/mono-installs/wasm-bcl/wasm/ ~/.local/share/godot/templates/3.5.1.stable.mono/bcl/wasm/

Заключение

Простите, пожалуйста, если что-то в этой инструкции не так. Поймите, это ручная работа и, если тут были опечатки, не судите строго. Я просто хотел сделать маленькую шпору, руководствуясь которой можно было бы поставить godot из сурсов на новый debian 11. Мотив написания этой статьи очевиден: я читал много доков и инструкций и пока читал, фиксировал, что и в каком порядке выполнять. Я проверил, и вроде бы всё работает. Кроме того, я хотел, чтобы $HOME не засорялась всякими файлами, поэтому постарался написать этот туториал, который пытается всё хранить в $HOME/GODOT. Может быть такое, что после всего этого у вас появится каталог $HOME/mono-config, как это было у меня, но его можно безболезненно удалить (что я и сделал, и вроде бы всё работает).

Всем спасибо за внимание. Покупайте пшеничное поле. (с) Великий Прикалёль


ссылка на оригинал статьи https://habr.com/ru/post/697634/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *