Compilação
Este guia completo mostra como compilar, executar e gerenciar o build dos 16 jogos em C++. 🔨
🎯 Visão Geral
O projeto usa CMake como sistema de build, que oferece:
Detecção automática de dependências
Build multiplataforma (Linux, macOS, Windows)
Gerenciamento de assets (imagens, sons, fonts)
Targets individuais para cada jogo
Comandos simplificados de execução
⚡ Compilação Rápida
Primeiro Build
# Configurar e compilar tudo
./setup.sh
# Ou manualmente:
mkdir build && cd build
cmake ..
make all_games
Builds Subsequentes
cd build
make all_games
🎮 Compilação por Jogo
Jogos Disponíveis
# Listar todos os targets disponíveis
make help | grep -E "(tetris|snake|arkanoid)"
# Targets dos jogos:
tetris, doodle_jump, arkanoid, snake, minesweeper
fifteen_puzzle, racing, outrun, xonix, bejeweled
netwalk, mahjong, tron, chess, volleyball, asteroids
Compilar Jogo Específico
# Compilar apenas o Tetris
make tetris
# Compilar Snake
make snake
# Compilar Arkanoid
make arkanoid
Executar Jogos
# Método 1: Target CMake (recomendado)
make run_tetris
make run_snake
make run_arkanoid
# Método 2: Executar diretamente
cd games/tetris && ./tetris
cd games/snake && ./snake
# Método 3: A partir do build/
./games/tetris/tetris
./games/snake/snake
🔧 Opções de Build
Tipos de Build
Debug (Padrão)
cmake .. -DCMAKE_BUILD_TYPE=Debug
make all_games
# Características:
# - Símbolos de debug incluídos
# - Otimizações desabilitadas
# - Assertions habilitadas
# - Executáveis maiores
Release
cmake .. -DCMAKE_BUILD_TYPE=Release
make all_games
# Características:
# - Máxima otimização (-O3)
# - Sem símbolos de debug
# - Executáveis menores
# - Melhor performance
RelWithDebInfo
cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo
make all_games
# Características:
# - Otimizado + símbolos debug
# - Bom para profiling
# - Compromisso entre debug e performance
Compilação Paralela
# Usar todos os cores disponíveis
make -j$(nproc) # Linux/macOS
make -j%NUMBER_OF_PROCESSORS% # Windows
# Ou definir permanentemente
export MAKEFLAGS="-j$(nproc)"
make all_games
Compilação Verbose
# Ver comandos completos de compilação
make VERBOSE=1
# Ou configurar permanentemente
cmake .. -DCMAKE_VERBOSE_MAKEFILE=ON
make
🎛️ Configurações Avançadas
Compilador Específico
# Usar GCC específico
cmake .. -DCMAKE_CXX_COMPILER=g++-9
# Usar Clang
cmake .. -DCMAKE_CXX_COMPILER=clang++
# Windows - Visual Studio
cmake .. -G "Visual Studio 16 2019"
Flags de Compilação Customizadas
# Adicionar flags extras
cmake .. -DCMAKE_CXX_FLAGS="-Wall -Wextra -Wpedantic"
# Debug com sanitizers
cmake .. -DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_CXX_FLAGS="-fsanitize=address -fsanitize=undefined"
Configurar SFML Manualmente
# Se SFML não for encontrado automaticamente
cmake .. -DSFML_ROOT=/usr/local/SFML
# Ou especificar bibliotecas
cmake .. -DSFML_LIBRARIES="sfml-system;sfml-window;sfml-graphics;sfml-audio"
📁 Estrutura de Build
Diretórios Gerados
build/
├── CMakeCache.txt # Cache do CMake
├── CMakeFiles/ # Arquivos internos do CMake
├── Makefile # Makefile principal
├── games/ # Executáveis e assets
│ ├── tetris/
│ │ ├── tetris # Executável
│ │ └── images/ # Assets copiados
│ ├── snake/
│ │ ├── snake
│ │ └── images/
│ └── ... (para cada jogo)
└── cmake_install.cmake # Script de instalação
Assets Automaticamente Gerenciados
O CMake copia automaticamente:
images/ → build/games/<jogo>/images/
fonts/ → build/games/<jogo>/fonts/
files/ → build/games/<jogo>/files/
🚀 Scripts Úteis
Build Script Personalizado
# Criar script de build personalizado
cat > quick_build.sh << 'EOF'
#!/bin/bash
GAME="$1"
BUILD_TYPE="${2:-Debug}"
if [ -z "$GAME" ]; then
echo "Uso: $0 <jogo> [Debug|Release]"
echo "Jogos: tetris, snake, arkanoid, etc."
echo "Exemplo: $0 tetris Release"
exit 1
fi
echo "🔨 Compilando $GAME em modo $BUILD_TYPE..."
# Criar/limpar build se necessário
if [ ! -d "build" ]; then
mkdir build
fi
cd build
# Configurar se necessário
if [ ! -f "CMakeCache.txt" ] || [ "$BUILD_TYPE" != "$(cat CMakeCache.txt | grep CMAKE_BUILD_TYPE | cut -d'=' -f2)" ]; then
echo "⚙️ Configurando CMake..."
cmake .. -DCMAKE_BUILD_TYPE="$BUILD_TYPE"
fi
# Compilar jogo específico
echo "🔧 Compilando..."
make "$GAME" -j$(nproc)
if [ $? -eq 0 ]; then
echo "✅ $GAME compilado com sucesso!"
echo "🎮 Para executar: make run_$GAME"
else
echo "❌ Erro na compilação!"
exit 1
fi
EOF
chmod +x quick_build.sh
# Usar o script
./quick_build.sh tetris Debug
./quick_build.sh snake Release
Clean Build Script
# Script para limpeza completa
cat > clean_build.sh << 'EOF'
#!/bin/bash
echo "🧹 Limpando build anterior..."
rm -rf build
echo "📁 Criando diretório build..."
mkdir build
cd build
echo "⚙️ Configurando CMake..."
cmake ..
echo "🔨 Compilando todos os jogos..."
make all_games -j$(nproc)
echo "✅ Build limpo concluído!"
EOF
chmod +x clean_build.sh
./clean_build.sh
🐛 Debug e Profiling
Compilar para Debug
# Build com informações de debug
cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="-g3 -O0"
make tetris
# Executar com GDB
gdb ./games/tetris/tetris
# Compilar com símbolos de debug
cmake .. -DCMAKE_BUILD_TYPE=Debug
make tetris
# Executar com Valgrind
valgrind --tool=memcheck --leak-check=full ./games/tetris/tetris
# Compilar otimizado com símbolos
cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo
make tetris
# Profiling com perf (Linux)
perf record ./games/tetris/tetris
perf report
🔍 Troubleshooting de Compilação
Erro: SFML não encontrado
# Verificar instalação
pkg-config --exists sfml-all
pkg-config --modversion sfml-all
# Limpar cache e reconfigurar
rm CMakeCache.txt
cmake .. -DSFML_ROOT=/usr/local
Erro: Compilador não suporta C++17
# Verificar versão do compilador
g++ --version
# Usar compilador mais novo
cmake .. -DCMAKE_CXX_COMPILER=g++-9
Erro: Assets não encontrados
# Verificar se assets foram copiados
ls build/games/tetris/images/
# Recompilar para forçar cópia
make clean
make tetris
Erro: "make: command not found"
# Linux - instalar build-essential
sudo apt install build-essential
# macOS - instalar Xcode Command Line Tools
xcode-select --install
# Windows - usar cmake --build
cmake --build . --target all_games
📊 Monitoramento de Build
Tempo de Compilação
# Medir tempo total
time make all_games
# Medir por jogo
time make tetris
Uso de Recursos
# Monitor durante build
htop # Em outro terminal
# Compilação com limite de CPU
make -j2 all_games # Usar apenas 2 cores
Tamanho dos Executáveis
# Ver tamanho de todos os jogos
du -sh games/*/
# Detalhes de um jogo específico
ls -lah games/tetris/tetris
file games/tetris/tetris
🎯 Comandos de Referência Rápida
# Setup inicial
./setup.sh
# Compilar tudo
make all_games
# Compilar jogo específico
make <nome_do_jogo>
# Executar jogo
make run_<nome_do_jogo>
# Limpar e reconstruir
rm -rf build && mkdir build && cd build && cmake .. && make all_games
# Build otimizado
cmake .. -DCMAKE_BUILD_TYPE=Release && make all_games
# Build paralelo
make -j$(nproc) all_games
# Ver comandos disponíveis
make help
22 June 2025