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

Проблема: чтобы собрать 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, как это было у меня, но его можно безболезненно удалить (что я и сделал, и вроде бы всё работает).

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

Комментарии (3)


  1. loginmen
    06.11.2022 15:56

    Зато UE займет добрую сотню другую гигов места на харде))

    А сколько по времени и места заняло? Хотя бы примерно знать порядок


    1. Prikalel Автор
      07.11.2022 15:50
      +1

      Если все зависимости уже стоят, то довольно быстро. За 15 минут, даже меньше, scons полностью соберет движок.

      Папка GODOT со всеми зависимостями весит 16,8 ГБ. $HOME/GODOT/godot, куда помешаются сурсы движка и сам билд весит 9,7 ГБ.

      Одним словом, намного дешевле, чем требует UE.)


  1. stalker320
    07.11.2022 17:50

    Круто, автор. Довольно полезный туториал. Если когда-нибудь ещё посмотрю в сторону, и тем более, поставлю адекватно любой debian, то обязательно использую данную инструкцию. Плюсую в карму, буду ждать новые публикации.