Grupo: Alessandro Caetano e Simião Carvalho

Introdução editar

Finalidade editar

Esse plano tem como finalidade definir a Gerência de Configuração durante a manutenção e evolução do Software Unreal Engine. Através das diretrizes aqui definidas será gerênciadas as configurações e mudanças ao longo desse projeto.

Visão Geral editar

A Unreal Engine é um motor de jogo e um conjunto de ferramentas de propósito geral capaz de abstrair o desenvolvimento de jogos na comunicação de componentes pré desenvolvidos.

Seu núcleo é escrito em C++ e é suportado a exportação para diversas plataformas como Microsoft Windows, Linux e Mac OS X em computadores pessoais, e os consoles Dreamcast, Xbox, Xbox 360, Xbox One,PlayStation 2, PlayStation 3,Playstation 4 e Wii.

Lançado em 1998 nasceu com o propósito de atender à grandes empresas no desenvolvimento de jogos AAA, foi se popularizando ao longo dos anos até em 2015 apesar de não ser um software livre (Licensa) ter seu código aberto.

Escopo editar

Como objetivo desse trabalho é visado a automatização na instalaçao da Unreal Engine em plataformas linux, tendo como produtos:

  • Pacote RPM (Red Hat, Fedora, CentOS)
  • Pacote DEBIAN (Debian, Ubuntu, Mint)

O Programa de Gerenciamento de Configuração editar

Ferramentas, Ambiente e Infra-estrutura editar

Ferramenta Descriçao Versão
Vagrant Ferramenta de virtualização de ambiente 1.8.1
Git Controle de versão 2.8.0
RPMbuild Ferramenta para construção de pacotes .rpm
RPMdevtools Scripts de suporte ao empacotamento .rpm
Build-essential Informações de pactoes essenciais ao empacotamento .deb
Devscripts Scripts de suporte ao empacotamento .deb
Debhelper Conjunto de ferramentas para automação de tarefas de empacotamento .deb
GNU Make Programa de geração de executável a partir do código-fonte 4.1
Clang Interface para o compilador LLVM para C/C++/Objective-C/Objective-C++ 3.5
Mono Provê os softwares necessários para desenvolvimento .NET 3.x
Qt Framework multiplataforma para desenvolvimento de interfaces gráficas em C++ 4.5.0

Contribuições editar

Como iremos contribuir editar

  • Scripts para automatizacao da criacao de um pacote RPM.
  • Scripts para automatizacao da criacao de um pacote Deb.
  • Uma Vagrantfile com o ambiente configurado e com a Unreal Engine compilada e rodando.
  • Merge Request para o Upstream do repositorio da Unreal Engine.

Cronograma editar

Atividade Data Estimada
Preparar Ambiente 29/04
Listar as Dependencias 06/05
Compilar a Unreal Engine 13/05
Verificar se as Dependencias estao Empacotadas 20/05
Empacotar as Dependencias 27/05
Gerar Pacote RPM da Unreal Engine 03/06
Gerar Pacote Deb da Unreal Engine 10/06
Documentar a Utilizacao do Pacote 13/06
Realizar um merge request para o upstream 17/06

Empacotamento RPM editar

Configuração de Ambiente editar

Para a criação do pacote RPM contamos com a experiência do grupo e o tutorial disponibilizado na wiki da disciplina. Para começar, criamos uma máquina virtual utilizando o VirtualBox do CentOs7, para criarmos o Vagrantfile (arquivo de configuração do Vagrant) foi utilizado, o seguinte comando:

vagrant init centos/7 && vagrant up --provider virtualbox

O Vagrantfile gerado foi editado para permitir que as máquinas tenham 6Gb de memória RAM e 4 CPU's para a realização da build, o nosso Vagrantfile pode ser visto abaixo:

VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(2) do |config|
  config.vm.box = "centos/7"
  config.vm.provider "virtualbox" do |v|
    v.memory = 6144
    v.cpus = 4
  end
end

Logo após, configuramos o ambiente para o empacotamento com os pacotes necessários:

 sudo yum install rpmbuild rpmdevtools git vim yum-utils
 sudo yum groupinstall Compatibility Libraries Development Tools Graphics Creation Tools Office Suite and Productivity

Com isto temos o ambiente do CentOs minimamente preparado, agora devemos fazer os passos necessários para a construção da UnrealEngine, já que este software requer que algumas versões bem específicas de alguns pacotes sejam instalados, para a realização destas instalações o primeiro passo é instalar o nux e o habilitar o respositório do epel-release no seu sistema:

sudo yum install epel-release 
sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm

Logo após adicionamos o repositório do JKnife, um dos contribuidores do projeto UnrealEngine, para a nossa lista de repositórios:

wget http://copr.fedoraproject.org/coprs/jknife/ue4deps/repo/epel-7/jknife-ue4deps-epel-7.repo
sudo cp jknife-ue4deps-epel-7.repo /etc/yum.repos.d/jknife-ue4deps-epel-7.repo

O últimos passo é adicionar o repositório e a chave GPG do mono no nosso sistema:

sudo rpm --import "http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF"
sudo yum-config-manager --add-repo http://download.mono-project.com/repo/centos/

Agora realizamos a instalação dos dependencias de build:

sudo yum install mono-core mono-devel dos2unix cmake gtk3-devel clang

Agora podemos clonar o repositório com o código oficial da UnrealEngine:

git clone https://github.com/EpicGames/UnrealEngine -b release

Procedimentos de empacotamento editar

Criamos o tarball do código da UnrealEngine:

cd UnrealEngine
git archive --format=tar.gz --prefix=unrealengine-<versao>-<release>/ <branch/tag> > unrealengine-<versao>-<release>.tar.gz

Desta forma o tarball foi criado, agora precisamos criar a estrutura necessária para o empacotamento:

rpmdev-setuptree

Este comando irá criar a seguinte estrutura de pastas na sua home:

 ├── rpmbuild
   ├── BUILD
   ├── BUILDROOT
   ├── RPMS
   ├── SOURCES
   ├── SPECS
   └── SRPMS

Agora temos que copiar o tarball para a pasta SOURCES dentro da estrutura de diretórios previamente criada:

cp UnrealEngine/unrealengine-<versao>-<release>.tar.gz rpmbuild/SOURCES

E criarmos o arquivo spec dentro da pasta SPECS:

touch rpmbuild/SPECS/unrealengine.spec

Para o empacotamento da UnrealEngine o specfile ficou da seguitne forma:

%define debug_package %{nil}

Name: UnrealEngine
Version: 4.11.2
Release: 1
Summary: UnrealEngine
Group: Application/Tools
License: Unreal Engine License
URL: https://unrealengine.com
Source0: %{name}-%{version}.tar.gz
BuildRequires: libstdc++ libstdc++-devel libstdc++-static libicu libicu-devel mono-core mono-devel dos2unix cmake gcc-c++ gtk3-devel clang qt qt-creator
Requires: icu libicu-devel libicu qt qt-creator

%description
Unreal Engine 4 is a complete suite of game development tools made by game developers, for game developers. From 2D mobile games to console blockbusters and VR, Unreal Engine 4 gives you everything you need to start, ship, grow and stand out from the crowd.

%prep
#Initial setup and removing previous builds
%setup -q

%build
#Checking dependencies for linux (Excluding Windows)
./Setup.sh

#Changing AutomationTools versions
find Engine/Source/Programs/AutomationTool -name "*Automation.csproj" -exec sed -i "s/ToolsVersion=\"11.0\"/ToolsVersion=\"4.0\"/g" "{}" \;

#Generating Makefiles
./GenerateProjectFiles.sh

#Compiling libs and generating binaries
make UE4Client SlateViewer ShaderCompileWorker UnrealLightmass UnrealPak UE4Editor
%install
#Creating installation folders
mkdir -p %{buildroot}%{_bindir}
mkdir -p %{buildroot}%{_libdir}/UnrealEngine

#Installing necessary libs on usr/lib/UnrealEngine
find %{_builddir}/UnrealEngine-4.11.2 -regex "\S*\/Engine\/Binaries\/Linux\/lib\S*" -exec install -m644 {} %{buildroot}%{_libdir}/UnrealEngine \;
find %{_builddir}/UnrealEngine-4.11.2 -regex "\S*\/ThirdParty\/ICU\/\S*\/Linux\S*\/\S*.so.53" -exec install -m644 {}  %{buildroot}%{_libdir}/UnrealEngine \;
install -m644 %{_builddir}/UnrealEngine-4.11.2/Engine/Source/ThirdParty/nvTextureTools/nvTextureTools-2.0.8/lib/Linux/x86_64-unknown-linux-gnu/* %{buildroot}%{_libdir}/UnrealEngine

#exporting new library paths
mkdir -p  %{buildroot}%{_sysconfdir}/ld.so.conf.d/
cat > %{buildroot}%{_sysconfdir}/ld.so.conf.d/UnrealEngine-x86_64.conf << EOF
%{_libdir}/UnrealEngine
EOF

#Installing binaries with execute permissions
install -m755 %{_builddir}/UnrealEngine-4.11.2/Engine/Binaries/Linux/UE4Editor %{buildroot}%{_bindir}
install -m755 %{_builddir}/UnrealEngine-4.11.2/Engine/Binaries/Linux/SlateViewer %{buildroot}%{_bindir}
install -m755 %{_builddir}/UnrealEngine-4.11.2/Engine/Binaries/Linux/ShaderCompileWorker %{buildroot}%{_bindir}
install -m755 %{_builddir}/UnrealEngine-4.11.2/Engine/Binaries/Linux/UnrealLightmass %{buildroot}%{_bindir}
install -m755 %{_builddir}/UnrealEngine-4.11.2/Engine/Binaries/Linux/UnrealPak %{buildroot}%{_bindir}
install -m755 %{_builddir}/UnrealEngine-4.11.2/Engine/Binaries/Linux/UE4Client %{buildroot}%{_bindir}

%post
%{_sbindir}/ldconfig

%files
#Creating doc files
%doc
#Locations for binary files
%{_bindir}/UE4Editor
%{_bindir}/SlateViewer
%{_bindir}/ShaderCompileWorker
%{_bindir}/UnrealLightmass
%{_bindir}/UnrealPak
%{_bindir}/UE4Client

#Location for lib files
%{_sysconfdir}/ld.so.conf.d/UnrealEngine-x86_64.conf
%{_libdir}
%changelog

Neste script são feitos os seguintes passos:

  1. Baixadas todas as dependencias de build.
  2. Gerados os Makefiles para sua distribuição.
  3. O código fonte é compilado.
  4. Os binários são copiados para /usr/bin/ .
  5. As bibliotecas são copiadas para /usr/lib/UnrealEngine
  6. Um novo path para as bibliotecas é adicionado em /etc/ld.so.conf.d/ que vai adicionar a pasta em /usr/lib/UnrealEngine no path para seu sistema.

O pacote é gerado com o comando:

rpmbuild -ba SPECS/unrealengine.spec

O processo de compilar e gerar o pacote leva em torno de 5 a 6 horas no meu computador (Intel(R) Core(TM) i7-3630QM CPU @ 2.40GHz, 8Gb RAM DDR3), então caso esteja demorando não se assuste e vá tomar um café.Depois que a mensagem de sucesso aparecer, podemos instalar o pacote com:

sudo yum install rpmbuild/RPMS/unrealengine-4.11.2-1.rpm

Para utilizar o editor da engine chamar no terminal:

UE4Editor