Да, название статьи на английском, чтобы любой в интернете мог быстро ее найти.
Проблема: чтобы собрать UE из сурсов, достаточно 2х команд; чтобы собрать 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
, как это было у меня, но его можно безболезненно удалить (что я и сделал, и вроде бы всё работает).
Всем спасибо за внимание. Покупайте пшеничное поле. (с) Великий Прикалёль
Комментарии (3)
stalker320
07.11.2022 17:50Круто, автор. Довольно полезный туториал. Если когда-нибудь ещё посмотрю в сторону, и тем более, поставлю адекватно любой debian, то обязательно использую данную инструкцию. Плюсую в карму, буду ждать новые публикации.
loginmen
Зато UE займет добрую сотню другую гигов места на харде))
А сколько по времени и места заняло? Хотя бы примерно знать порядок
Prikalel Автор
Если все зависимости уже стоят, то довольно быстро. За 15 минут, даже меньше, scons полностью соберет движок.
Папка GODOT со всеми зависимостями весит 16,8 ГБ. $HOME/GODOT/godot, куда помешаются сурсы движка и сам билд весит 9,7 ГБ.
Одним словом, намного дешевле, чем требует UE.)