Компиляция 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.
В ходе установки в какой-то момент появится сообщение:

Package libmono-corlib4.0-cil is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
However the following packages replace it:
  mono-devel

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

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

# apt-get install mono-devel

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

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

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

    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
       "

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

# ./Setup.sh

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

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

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

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

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

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

$ make

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

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

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

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

# exit
# exit

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

# umount $MY_CHROOT/opt/ue

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

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

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

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

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

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) Параллельно передаёт всю выдачу в консоль, что позволяет не только сохранять выдачу редактора в файл, но и видеть её в реальном времени при запуске его из терминала.


5 комментариев

  • Ответить Роман |

    После ввода команды из пункта 2.1 терминал выдаёт сообщение «bash: git: команда не найдена»

    • Ответить mihanentalpo |

      Значит у тебя не установлен git, забыл о нём упомянуть, так как у меня он всегда есть 🙂
      # apt-get install git

    • Ответить mihanentalpo |

      Кстати, вместо версии 4.14 рекомендую ставить 4.15. Она правда пока не полностью оттестирована, но в ней зато отсутствует досадный баг, из-за которого, при открытии редактора анимаций и скелетных мешей, редактор вылетал.
      Для этого в пункте 3.2 вместо последней строчки «git checkout release» нужно написать «git checkout 4.15»

  • Ответить Роман |

    Не уверен, но в пункте 2.1 ссылка на репозиторий кажется не работает.
    Добавте в инструкцию, что для скачивания закрытых репозиториев нужна регистрация как у Epic Games, так и на GitHub. Причём, в своём профиле Epic Games нужно указать свой ник на GitHub и только тогда можно будет скачивать исходный код программы.
    В статье этого нет, поэтому новичку будет трудно сориентироваться.

    Не пойму, но что-то у меня идёт не так:
    В пункте 3.2.:
    После ввода команды «git pull» выводится следующее сообщение:
    fatal: Not a git repository (or any of the parent directories): .git

    • Ответить mihanentalpo |

      Проверил пункт 2.1 запустив команду git clone git@github.com:EpicGames/UnrealEngine.git, всё успешно клонируется, следовательно ссылка работает.
      На счёт того, что нужно запросить доступ у Epic’а, спасибо, забыл об этом этапе, добавлю.
      сообщение fatal: Not a git repository означает, что git pull запущен не из папки репозитория а откуда-то из другого места.
      Попробуй перед запуском git pull выполнить ls -la и посмотреть, есть ли в выдаче папка «.git». Если нет — значит ты запускаешь git pull не из репозитория а откуда-то из другого места.

Оставить комментарий