Компиляция Unreal Engine 4.14, 4.15 в Debian 8 Jessie

Unreal Engine версии 4.14, вышедший относительно недавно, как всегда, имеет кучу нового функционала, и не имеет большого количества старых багов. В частности бага из версии 4.13, приводящего к тому, что при открытии редактора Widget Blueprint весь Unreal Engine Editor вылетает целиком.

К слову, зато в UE 4.14 есть баг, из-за которого редактор вылетает при открытии редактора анимаций, или редактора скелетных мешей.

В версии 4.15 поправлены все досадные баги, приводившие к вылету редактора в Linux, и добавлены такие замечательные вещи, как типы данных Set и Map в BluePrint’ах (в C++ их можно было использовать и раньше). Первые позволяют создавать набор из произвольных неповторяющихся элементов с быстрым поиском по ним, а вторые – ассоциативный массив с произвольным типом ключей и значений.

Однако, если версию 4.13 можно было без проблем скомпилировать в Debian 8 Jessie, то версии 4.14 и 4.15 для компиляции требует Clang весрии 3.9, который есть только начиная с Debian 9 Stretch, который, на момент написания этого текста, ещё не “заморожен” и является тестовым дистрибутивом.

Итак, что же нужно, чтобы собрать UE4.14 или UE4.15 в Debian Jessie:

1. Создание chroot-окружения с Debian 9 Stretch

Поскольку для сборки нужен clang 3.9, а ему, в свою очередь понадобится ещё целая куча библиотек таких версий, которых нет в Debian Jessie, лучшим вариантом была бы установка Debian Stretch. Однако, ставить новую систему, находящуюся в стадии тестирования, где наверняка что-то сломано, только для того, чтобы скомпилировать UE4.14/4.15, не хочется. Вот если бы можно было установить систему в отдельную папку, и без всяких перезагрузок получить рабочий набор библиотек от 9-го дебиана, это было бы прекрасно!
Умные люди давно придумали для этой цели инструмент debootstrap

Итак, поехали:

1.1 Установим debootstrap:

# apt-get install debootstrap

1.2 Создадим папку, в которой будет жить наш Debian Stretch, и запомним её в bash-переменной, чтобы далее можно было не вспоминать её расположение

# export MY_CHROOT="/root/debian-testing"
# mkdir $MY_CHROOT

1.3 Запустим установку:

# debootstrap --arch amd64 stretch $MY_CHROOT

После этого подождём пока debootstrap скачает и установит пакеты базовой системы. Какое-то время это займёт.

1.4. Пробросим внутрь папки /proc и /dev, без них Mono откажется собирать проект

# mount --bind /proc $MY_CHROOT/proc
# mount --bind /dev $MY_CHROOT/dev

1.5. Установим git, если он ещё не установлен

# apt-get install git

2. Подключим к chroot-окружению репозиторий с Unreal Engine 4

2.1 Если репозиторий Unreal Engine ещё не склонирован, сделаем это:

Да, кстати, доступ к репозиторию Unreal Engine нужно сначала получить, если ещё не получали, для этого нужно действовать в соответствии с данной инструкцией https://www.unrealengine.com/ue4-on-github

(клонируем в домашнюю папку от имени пользователя)

$ cd ~
$ git clone git@github.com:EpicGames/UnrealEngine.git

2.2 Теперь прокинем его внутрь будущего chroot-окружения (если у вас репозиторий в другом месте, то нужно изменить путь ~/UnrealEngine на него):

# mkdir $MY_CHROOT/opt/ue4
# mount --bind ~/UnrealEngine $MY_CHROOT/opt/ue4
# mkdir $MY_CHROOT/opt/ue4

2.3 Теперь “погружаемся” в установленное chroot-окружение:

# chroot $MY_CHROOT/

3. Подготовка к сборке

3.1 Находясь внутри окружения, установим пакеты, которые нам пригодятся, и создадим пользователя:

# apt-get install aptitude mc git sudo
# adduser chuser

3.2 Войдём в пользователя chuser, обновим репозиторий на всякий случай.
Если после checkout репозиторий запустит какие-то скрипты с надписью вроде “updating dependencies“, их нужно прервать (Ctrl+C), так как он попытается установить недостающий софт с помощью sudo, а у нас sudo не настроен.

# su chuser
$ cd /opt/ue4
$ git pull
$ get checkout release

3.4 Выходим опять в пользователя root (не выходя из окружения chroot) и запускаем Setup.sh

$ exit
# ./Setup.sh

Данный скрипт будет устанавливать зависимости и пакеты, необходимые для компиляции UE4.
В ходе установки в какой-то момент появится сообщение:

# apt-get install mono-devel

на чём установка прервётся.
Суть данного сообщения в том, что пакет libmono-corlib4.0-cil отсутствует в репозитории Debian Stretch (кстати он есть в Debian Jessie но там зато нет много чего ещё). При этом, указано, что есть пакет, который его заменяет – mono-devel.

3.5 Установим вручную пакет mono-devel:

# cp ./Engine/Build/BatchFiles/Linux/Setup.sh ./Engine/Build/BatchFiles/Linux/Setup.sh.bak
# nano ./Engine/Build/BatchFiles/Linux/Setup.sh

Теперь нужно открыть основной файл Setup.sh и стереть в нём упоминание о пакете libmono-corlib4.0-cil, так как даже после установки mono-devel он не оставит надежды установить именно libmono-corlib4.0-cil.
Основной файл Setup.sh лежит в репозитории UnrealEngine в папке Engine/Build/BatchFiles/Linux, и именено его вызывает файл Setup.sh, запускаемый из корня репозитория.
3.6. Итак, создадим копию и откроем оригинал:

    if [[ "$VERSION_ID" < 16.04 ]]; then
     DEPS="mono-xbuild \
       mono-dmcs \
       libmono-microsoft-build-tasks-v4.0-4.0-cil \
       libmono-system-data-datasetextensions4.0-cil 
       libmono-system-web-extensions4.0-cil 
       libmono-system-management4.0-cil
       libmono-system-xml-linq4.0-cil
       libmono-corlib4.0-cil 
       libmono-windowsbase4.0-cil
       libmono-system-io-compression4.0-cil
       libmono-system-io-compression-filesystem4.0-cil
       mono-devel
       clang-3.5
       "

3.7 Находим в файле строчку с упоминанием libmono-corlib4.0-cil, выглядеть этот кусок будет примерно так:

# ./Setup.sh

Безжалостно удаляем строчку с libmono-corlib4.0-cil, после чего заново запускаем Setup.sh и ждём уже до конца установки всех зависимостей.

# chroot -hR chuser /opt/ue4
# su chuser
$ ./GenerateProjectFiles.sh

Если в процессе установки появится вопрос “The following file(s) have been modified” со списком изменённых файлов, нужно отвечать “y”, кроме случаев, когда вы эти файлы меняли самостоятельно и изменения надо сохранить.

4. Компиляция

4.1 Сгенерируем файлы проектов, необходимые для компиляции UE4:

Заново установим права для пользователя chuser, войдем в него, и запустим генератор файлов для сборки:

$ make

4.2 По окончании генерации файлов, запустим сборку:

# exit
# exit

Она может продлиться достаточно долго, хотя это зависит от мощности вашего ПК.

Когда сборка наконец закончится, останется подготовить всё для работы из вашей основной системы Debian Jessie.

5. Подготовка к работе и запуск

5.1 Выйдем из пользователя chuser и из chroot-окружения, но при этом останемся пользователем root:

# umount $MY_CHROOT/opt/ue

5.2. Отмонтируем папку /opt/ue4 из chroot-окружения:

# chown -hR user:user /home/user/UnrealEngine

5.3 Вернём все права на папку вашему пользователю (всё ещё предположим что его зовут user):

# exit
$ cd ~/UnrealEngine/Engine/Binaries/Linux
$ ./UE4Editor

5.4 Выйдем из root, и запустим наконец редактор UE4:

#!/bin/bash
cd ~/UnrealEngine/Engine/Binaries/Linux/
stdbuf -o 0 ./UE4Editor $1 | tee ~/.UE4Editor.log

Готово! Можно работать!

6. Последний штрих

Для удобства можно создать небольшой bash-скрипт для запуска скрипт UE4Editor.sh,
содержимое у него должно быть такое:

#!/bin/bash
cd ~/UnrealEngine/Engine/Binaries/Linux/
stdbuf -o 0 ./UE4Editor $1 | tee ~/.UE4Editor.log

Этот скрипт делает 3 полезные вещи:
1) Запускает редактор передавая ему имя файла проекта, таким образом, можно назначить скрипт UE4Editor.sh на открытие файлов *.uproject, либо просто вызывать из консоли UE4Editor.sh ~/projects/MyGame/MyGame.uproject
2) Сохраняет вывод скрипта в файле ~/.UE4Editor.log что поможет, если редактор почему-то вылетает, и нужно посмотреть его предсмертные сообщения
3) Параллельно передаёт всю выдачу в консоль, что позволяет не только сохранять выдачу редактора в файл, но и видеть её в реальном времени при запуске его из терминала.


So, what do you think ?