RGBender
Plano de Gerenciamento de Configuração de Software
[editar | editar código-fonte]Introdução
[editar | editar código-fonte]Esse plano determina as diretrizes do trabalho que será efetuado durante a disciplina de Gerencia de Configuração de Software 2017.1(UnB), Grupo 15.
Repositório
[editar | editar código-fonte]Relatos
[editar | editar código-fonte]Contexto
[editar | editar código-fonte]RGBender é um jogo que será desenvolvido em C++ com a biblioteca SDL2 durante a disciplina de jogos eletrônicos.
O jogo pode ser resumido de tal forma:
Protagonista viaja no tempo após pichar um símbolo e vai parar na renascença. Ele decide entrar para à história do mundo da arte como um grande pichador.
Objetivos
[editar | editar código-fonte]- Garantir a portabilidade do jogo empacotando-o para Windows, macOS e Linux.
- Padronizar o ambiente dos desenvolvedores do jogo.
- Garantir a integridade das builds (Integração contínua)
Envolvidos
[editar | editar código-fonte]Nome | Papel |
---|---|
Matheus de Sousa Bernardo | Gerente de configuração |
Lucas Brilhante | Gerente de configuração |
Gustavo Lopes | Desenvolvedor |
Harrison Pedro | Desenvolvedor |
Felipe Osório | Desenvolvedor |
Ferramentas
[editar | editar código-fonte]Objetivo | Ferramenta | Status |
---|---|---|
Empacotamento Mac | dmg | Funcionando |
Empacotamento Linux | Debian Package | Incompleto |
Empacotamento Windows | Desconhecida | Pendente |
Ambiente | Ruby Script | Funcionando |
Integração Contínua | Travis CI | Funcionando |
Compilação | Cmake | Funcionando |
Resultados
[editar | editar código-fonte]Integração continua
[editar | editar código-fonte]Para a implantação da integração continua foi utilizado o tutorial padrão da ferramenta Travis CI:
https://docs.travis-ci.com/user/for-beginners
Os passos seguidos foram basicamente:
- Conseguir permição no repositório
- Adicionar arquivo de configuração para o repositório
- Logar no travis com a conta do Github
- Clicar no projeto e esperar buildar
- Adicionar tag de build no README do repositório
Arquivo de configuração do projeto RGBender:
sudo: required
dist: trusty
language: cpp
install:
- sudo apt-get update
- sudo apt-get install cmake libsdl2-2.0-0 libsdl2-dev libsdl2-image-2.0-0 libsdl2-image-dev libsdl2-ttf-2.0-0 libsdl2-ttf-dev libsdl2-mixer-2.0-0 libsdl2-mixer-dev -y
compiler:
- g++
script:
- cmake .
- make
O link para a build: https://travis-ci.org/lucasBrilhante/RGBender
Ambiente
[editar | editar código-fonte]A padronização do ambiente dos desenvolvedores será feita rodando um script ruby, nesse script assumindo que o git e o ruby estão instalados é feita o download do cmake, sdl2 e plugins necessários e sua instalação a partir do gerenciador de pacotes do seu sistema, essa versão funciona para sistema que utilizam o apt-get, o yum e o Homebrew. Depois de instalados esses pacotes é feito o clone do repositório.
Rode com o comando $ ruby nomedoscript.rb
if(system 'apt-get help')
system 'sudo apt-get install cmake'
system 'sudo apt-cache search libsdl2'
system 'sudo apt-get install libsdl2-dev'
system 'sudo apt-cache search libsdl2-image'
system 'sudo apt-get install libsdl2-image-dev'
system 'sudo apt-cache search libsdl2-mixer'
system 'sudo apt-get install libsdl2-mixer-dev'
system 'sudo apt-cache search libsdl2-ttf'
system 'sudo apt-get install libsdl2-ttf-dev'
elsif (system 'yum help')
system 'sudo yum install cmake'
system 'sudo yum search SDL2-devel'
system 'sudo yum install SDL2-devel'
system 'sudo yum search SDL2_image-devel'
system 'sudo yum install SDL2_image-devel'
system 'sudo yum search SDL2_mixer-devel'
system 'sudo yum install SDL2_mixer-devel'
system 'sudo yum search SDL2_ttf-devel'
system 'sudo yum install SDL2_ttf-devel'
elsif (system 'brew -v')
system 'brew install cmake'
system 'brew install sdl2'
system 'brew install sdl2_image'
system 'brew install sdl2_mixer'
system 'brew install sdl2_ttf'
end
system 'git clone https://github.com/osbixaodaunb/RGBender.git'
Empacotamento
[editar | editar código-fonte]Debian
[editar | editar código-fonte]Para baixar o Pacote instalador do Rgbender para distribuições debian utilize o link https://drive.google.com/file/d/0B9eS-hz60PwiUEM4Nzd3anFpdjg/view?usp=sharing
O empacotamento para o Distribuições debian a princípio foi feita com os tutoriais oficiais do Debian e então com videos no youtube, porem todos falharam. O arquivo .deb gerado só instalava arquivos no doc/
Após falhar com o comando dh_make e debuild, passamos para uma abordagem mais fácil que é utilizar o comando dpkg --build <arquivo>.
Para tal foi pego um template e modificado os arquivos de acordo com as necessidades do projeto.
Arquivos de configuração:
control:
Package: rgbender
Version: 0.1
Architecture: amd64
Maintainer: Lucas Brilhante <lbrilhante82@gmail.com>
Installed-Size: 5800
Depends: libc6, libsdl2-2.0-0, libsdl2-image-2.0-0, libsdl2-ttf-2.0-0, libsdl2-mixer-2.0-0
Homepage: https://github.com/osbixaodaunb/RGBender/
Priority: optional
Section: misc
Description: Top down shooting boss fight game
Game developed in the instroduction to game dev by students - UNB.
changelog
rgbender (0.1-1) unstable; urgency=medium
* Initial release
* Boss fight, shooting, different incs
* Joystick implemented
* First stage with animations
* Menu completed
-- Lucas Brilhante <lbrilhante82@gmail.com> Mon, 19 Jun 2017 12:42:34 -0300
license
MIT License
Copyright (c) 2017 OsbixaoDaUnb
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Após editar estes arquivo de configuração rodamos o comando dpkg --build rgbender, que gerará um arquivo .deb
Porém, quando for rodar em um pc limpo será necessário instalar as dependencias na mão. Rodar então:
$ sudo apt-get install libsdl2-2.0-0 libsdl2-ttf-2.0-0 libsdl2-image-2.0-0 libsdl2-mixer-2.0-0
MacOS
[editar | editar código-fonte]Para baixar o pacote instalador do MacOs utilize o link https://drive.google.com/file/d/0Bwp43A17qMEhUVNlS2VFcEs3YkE/view
O empacotamento para sistemas MacOS começou com problemas para compilar com o CMakeLists.txt atual, de forma que as duas primeiras linhas foram modificadas para utilizar a versão 2.8.0 e foi retirado a linha onde o project era setado. É necessário maior investigação do porque esse cmake não está funcional no MacOS Versão 10.12.5. Passados esse problemas iniciais começamos com a abordagem de criar um .app
A estrutura básica de app para MacOS:
MyApp.app/
Contents/
Info.plist
MacOS/
Resources/
Criamos esse diretório especial e criamos os arquivos necessários, o próximo passo foi colocar o executável do jogo dentro da pasta MacOS como manda a documentação da apple, depois configuramos o Info.plist que é simplesmente um arquivo XML com meta-dados.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleGetInfoString</key>
<string>RGBender</string>
<key>CFBundleExecutable</key>
<string>rgbender</string>
<key>CFBundleIdentifier</key>
<string>osbixaodaunb</string>
<key>CFBundleName</key>
<string>RGBender</string>
<key>CFBundleIconFile</key>
<string>foo.icns</string>
<key>CFBundleShortVersionString</key>
<string>0.01</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>IFMajorVersion</key>
<integer>0</integer>
<key>IFMinorVersion</key>
<integer>1</integer>
</dict>
</plist>
Nesse arquivo o mais importante é as chaves CFBundleExecutable que diz qual o executável, CFBundleName que é o nome do app e CFBundleIconFile que é o arquivo para o ícone do app. Depois de ter o executável e o Info.plist em tese é só rodar porém o MacOS tem sua espécie de DLL Hell pois o nosso app utiliza bibliotecas .dylib e para adicionar essas referencias a essas bibliotecas é algo nada trivial. Basicamente você tem que copiar todas as dylibs que o executável carrega e copia-las para dentro do app bundle e depois mudar o executável para procurar pelas bibliotecas no local correto. Existe um projeto de código aberto que facilita todo esse processo. Assim executando o comando abaixo por meio dessa ferramenta esse processo é facilitado.
dylibbundler -od -b -x ./HelloWorld.app/Contents/MacOS/helloworld -d ./HelloWorld.app/Contents/libs/
Novamente em tese era apenas rodar porém ao rodar nenhum asset estava sendo encontrado e com isso o que foi feito foi copiar a pasta assets para a MacOS e criar um script shell e transforma o mesmo em um exec.
- Copiar a assets para dentro do bundle e dentro da pasta MacOS assim ficando no mesmo nível do executavel
- Renomear o antigo exectuavel rgbender para _rgbender
- Criar um script shell com o nome do antigo executavel para colocar o terminal no nível correto e executar com o comando ./_rgbender
#!/bin/bash cd "$(dirname "$0")" ./_rgbender
- Transformar em exec
- Para esse script virar um exec ele foi criado com touch "rgbender"
- chmod +x "rgbender"
Agora basta clicar duas vezes em cima do RGBender e o jogo é executado de forma correta. O segundo passo que foi tomado foi a criacao de um .dmg para faciltiar a distribuicao desse arquivo. Para criar esse arquivo foi utilizado a ferramenta hdiutil.
hdiutil create -srcfolder RGBender.app mydmg.dmg
Com esse comando a ferramenta cria um .dmg que tem o nosso .app dentro dele bastando o usuário ao abrir esse .dmg arrastar para o diretório Applications.
Para automatizar todo esse processo foi criado um shell script, esse shell script é rodado pelo seguintes comandos make e depois make macos isso ocorre pois foi criado um target especifico no cmake para o processo de empacotamento para MacOS.
file="RGBender.dmg"
if [ -f "$file" ]
then
rm "$file"
fi
rm -r RGBender.app; mkdir RGBender.app
cd RGBender.app
mkdir Contents
cd Contents
mkdir MacOS
mkdir Resources
touch Info.plist
cd MacOS
cp ../../../rgbender .
dylibbundler -od -b -x ./rgbender -d ../libs
cp -R ../../../assets ./assets
mv rgbender _rgbender
touch "rgbender"
echo "#!/bin/bash
cd \"\$(dirname \"\$0\")\"
./_rgbender" > rgbender
chmod +x "rgbender"
hdiutil create -srcfolder ../../../RGBender.app ../../../RGBender.dmg
Compilação
[editar | editar código-fonte]Utilizamos o CMAKE para automatizar o processo de compilação.
cmake_minimum_required(VERSION 2.8.0)
# Set directory folders
set (PROJECT_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/inc")
set (PROJECT_SRC_DIR "${PROJECT_SOURCE_DIR}/src")
set (PROJECT_ASSETS_DIR "${PROJECT_SOURCE_DIR}/assets")
# Gets the list of files inside the src directory
file(GLOB_RECURSE SOURCES "${PROJECT_SRC_DIR}/*.cpp"
"${PROJECT_SRC_DIR}/*.c")
# Include Headers
include_directories("${PROJECT_INCLUDE_DIR}")
#### Compilation ####
# Compilation Flags
set(COMPILE_FLAGS "")
if (${CMAKE_CXX_COMPILER_ID} STREQUAL Clang)
set(COMPILE_FLAGS "${COMPILE_FLAGS} -std=c++11 -W -Wall -pedantic -std=c++11 -Wshadow -O2 -g -Wno-reorder")
elseif (${CMAKE_CXX_COMPILER_ID} STREQUAL GNU)
set(COMPILE_FLAGS "${COMPILE_FLAGS} -std=c++11 -W -Wall -pedantic -std=c++11 -Wshadow -O2 -g -Wno-reorder")
elseif (${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
set(COMPILE_FLAGS "${COMPILE_FLAGS} /Wall")
endif()
# Cmake compilation flags redefinition
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILE_FLAGS}")
#### Dependencies ####
# Add engine
set (PROJECT_ENGINE_DIR "${PROJECT_SOURCE_DIR}/engine")
add_subdirectory(${PROJECT_ENGINE_DIR})
include_directories(${ENGINE_INCLUDE_DIR})
#### Executable ####
add_executable(rgbender ${SOURCES})
target_link_libraries(rgbender
engine
SDL2 SDL2_image SDL2_ttf SDL2_mixer z)
#### Custom Commands ####
# Copy assets folder to build
add_custom_command(TARGET rgbender POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
${PROJECT_ASSETS_DIR} ${CMAKE_BINARY_DIR}/assets)
add_custom_target(macos)
add_custom_command(TARGET macos POST_BUILD COMMAND /bin/sh macos_packaging.sh)