- Modified `.vscode/settings.json` to use workspace-relative paths for `compileCommands` and `buildDirectory`, enhancing portability across different environments. - Updated task labels in `tasks.json` for clarity, renaming them to reflect their specific CMake operations. - Added new tasks for cleaning builds and running tests, streamlining the development workflow. Benefits: - Improves the development experience by ensuring configurations are adaptable and tasks are clearly defined, facilitating easier project management.
323 lines
8.9 KiB
Bash
Executable File
323 lines
8.9 KiB
Bash
Executable File
#!/bin/bash
|
|
# YAZE Developer Setup Script
|
|
# One-command setup for new developers
|
|
|
|
set -e
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Print functions
|
|
print_header() {
|
|
echo -e "${BLUE}================================${NC}"
|
|
echo -e "${BLUE}$1${NC}"
|
|
echo -e "${BLUE}================================${NC}"
|
|
}
|
|
|
|
print_success() {
|
|
echo -e "${GREEN}✓ $1${NC}"
|
|
}
|
|
|
|
print_warning() {
|
|
echo -e "${YELLOW}⚠ $1${NC}"
|
|
}
|
|
|
|
print_error() {
|
|
echo -e "${RED}✗ $1${NC}"
|
|
}
|
|
|
|
# Detect OS
|
|
detect_os() {
|
|
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
|
|
OS="linux"
|
|
elif [[ "$OSTYPE" == "darwin"* ]]; then
|
|
OS="macos"
|
|
elif [[ "$OSTYPE" == "msys" ]] || [[ "$OSTYPE" == "cygwin" ]]; then
|
|
OS="windows"
|
|
else
|
|
OS="unknown"
|
|
fi
|
|
echo "Detected OS: $OS"
|
|
}
|
|
|
|
# Check prerequisites
|
|
check_prerequisites() {
|
|
print_header "Checking Prerequisites"
|
|
|
|
# Check Git
|
|
if command -v git &> /dev/null; then
|
|
print_success "Git found: $(git --version)"
|
|
else
|
|
print_error "Git not found. Please install Git first."
|
|
exit 1
|
|
fi
|
|
|
|
# Check CMake
|
|
if command -v cmake &> /dev/null; then
|
|
CMAKE_VERSION=$(cmake --version | head -n1 | cut -d' ' -f3)
|
|
print_success "CMake found: $CMAKE_VERSION"
|
|
|
|
# Check version
|
|
CMAKE_MAJOR=$(echo $CMAKE_VERSION | cut -d'.' -f1)
|
|
CMAKE_MINOR=$(echo $CMAKE_VERSION | cut -d'.' -f2)
|
|
if [ "$CMAKE_MAJOR" -lt 3 ] || ([ "$CMAKE_MAJOR" -eq 3 ] && [ "$CMAKE_MINOR" -lt 16 ]); then
|
|
print_error "CMake 3.16+ required. Found: $CMAKE_VERSION"
|
|
exit 1
|
|
fi
|
|
else
|
|
print_error "CMake not found. Please install CMake 3.16+ first."
|
|
exit 1
|
|
fi
|
|
|
|
# Check compiler
|
|
if command -v gcc &> /dev/null; then
|
|
GCC_VERSION=$(gcc --version | head -n1 | cut -d' ' -f4)
|
|
print_success "GCC found: $GCC_VERSION"
|
|
elif command -v clang &> /dev/null; then
|
|
CLANG_VERSION=$(clang --version | head -n1 | cut -d' ' -f4)
|
|
print_success "Clang found: $CLANG_VERSION"
|
|
else
|
|
print_error "No C++ compiler found. Please install GCC 12+ or Clang 14+."
|
|
exit 1
|
|
fi
|
|
|
|
# Check Ninja
|
|
if command -v ninja &> /dev/null; then
|
|
print_success "Ninja found: $(ninja --version)"
|
|
else
|
|
print_warning "Ninja not found. Will use Make instead."
|
|
fi
|
|
}
|
|
|
|
# Install dependencies
|
|
install_dependencies() {
|
|
print_header "Installing Dependencies"
|
|
|
|
case $OS in
|
|
"linux")
|
|
if command -v apt-get &> /dev/null; then
|
|
print_success "Installing dependencies via apt..."
|
|
sudo apt-get update
|
|
sudo apt-get install -y build-essential ninja-build pkg-config ccache \
|
|
libsdl2-dev libyaml-cpp-dev libgtk-3-dev libglew-dev
|
|
elif command -v dnf &> /dev/null; then
|
|
print_success "Installing dependencies via dnf..."
|
|
sudo dnf install -y gcc-c++ ninja-build pkgconfig SDL2-devel yaml-cpp-devel
|
|
elif command -v pacman &> /dev/null; then
|
|
print_success "Installing dependencies via pacman..."
|
|
sudo pacman -S --needed base-devel ninja pkgconfig sdl2 yaml-cpp
|
|
else
|
|
print_warning "Unknown Linux distribution. Please install dependencies manually."
|
|
fi
|
|
;;
|
|
"macos")
|
|
if command -v brew &> /dev/null; then
|
|
print_success "Installing dependencies via Homebrew..."
|
|
brew install cmake ninja pkg-config ccache sdl2 yaml-cpp
|
|
else
|
|
print_warning "Homebrew not found. Please install dependencies manually."
|
|
fi
|
|
;;
|
|
"windows")
|
|
print_warning "Windows detected. Please install dependencies manually:"
|
|
echo "1. Install Visual Studio Build Tools"
|
|
echo "2. Install vcpkg and packages: sdl2, yaml-cpp"
|
|
echo "3. Install Ninja from https://ninja-build.org/"
|
|
;;
|
|
*)
|
|
print_warning "Unknown OS. Please install dependencies manually."
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# Setup repository
|
|
setup_repository() {
|
|
print_header "Setting up Repository"
|
|
|
|
# Check if we're in a git repository
|
|
if [ ! -d ".git" ]; then
|
|
print_error "Not in a git repository. Please run this script from the YAZE root directory."
|
|
exit 1
|
|
fi
|
|
|
|
# Update submodules
|
|
print_success "Updating submodules..."
|
|
git submodule update --init --recursive
|
|
|
|
# Check for uncommitted changes
|
|
if ! git diff-index --quiet HEAD --; then
|
|
print_warning "You have uncommitted changes. Consider committing or stashing them."
|
|
fi
|
|
}
|
|
|
|
# Configure IDE
|
|
configure_ide() {
|
|
print_header "Configuring IDE"
|
|
|
|
# Generate compile_commands.json
|
|
print_success "Generating compile_commands.json..."
|
|
cmake -B build -G Ninja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
|
|
|
|
# Create VS Code settings
|
|
if [ ! -d ".vscode" ]; then
|
|
mkdir -p .vscode
|
|
print_success "Creating VS Code configuration..."
|
|
|
|
cat > .vscode/settings.json << EOF
|
|
{
|
|
"C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools",
|
|
"C_Cpp.default.compileCommands": "\${workspaceFolder}/build/compile_commands.json",
|
|
"C_Cpp.default.intelliSenseMode": "macos-clang-x64",
|
|
"files.associations": {
|
|
"*.h": "c",
|
|
"*.cc": "cpp"
|
|
},
|
|
"cmake.buildDirectory": "\${workspaceFolder}/build",
|
|
"cmake.configureOnOpen": true,
|
|
"cmake.useCMakePresets": "always",
|
|
"cmake.generator": "Ninja Multi-Config",
|
|
"cmake.preferredGenerators": [
|
|
"Ninja Multi-Config",
|
|
"Ninja",
|
|
"Unix Makefiles"
|
|
]
|
|
}
|
|
EOF
|
|
|
|
cat > .vscode/tasks.json << EOF
|
|
{
|
|
"version": "2.0.0",
|
|
"tasks": [
|
|
{
|
|
"label": "CMake: Configure (dev)",
|
|
"type": "shell",
|
|
"command": "cmake",
|
|
"args": ["--preset", "dev"],
|
|
"group": "build",
|
|
"problemMatcher": [],
|
|
"presentation": {
|
|
"echo": true,
|
|
"reveal": "always",
|
|
"focus": false,
|
|
"panel": "shared"
|
|
}
|
|
},
|
|
{
|
|
"label": "CMake: Build (dev)",
|
|
"type": "shell",
|
|
"command": "cmake",
|
|
"args": ["--build", "--preset", "dev"],
|
|
"group": {
|
|
"kind": "build",
|
|
"isDefault": true
|
|
},
|
|
"problemMatcher": ["\$gcc"],
|
|
"presentation": {
|
|
"echo": true,
|
|
"reveal": "always",
|
|
"focus": false,
|
|
"panel": "shared"
|
|
}
|
|
},
|
|
{
|
|
"label": "CMake: Clean Build",
|
|
"type": "shell",
|
|
"command": "cmake",
|
|
"args": ["--build", "--preset", "dev", "--target", "clean"],
|
|
"group": "build",
|
|
"problemMatcher": []
|
|
},
|
|
{
|
|
"label": "CMake: Run Tests",
|
|
"type": "shell",
|
|
"command": "ctest",
|
|
"args": ["--preset", "stable", "--output-on-failure"],
|
|
"group": "test",
|
|
"problemMatcher": []
|
|
}
|
|
]
|
|
}
|
|
EOF
|
|
fi
|
|
}
|
|
|
|
# Run first build
|
|
run_first_build() {
|
|
print_header "Running First Build"
|
|
|
|
# Configure project
|
|
print_success "Configuring project..."
|
|
cmake --preset dev
|
|
|
|
# Build project
|
|
print_success "Building project..."
|
|
cmake --build build
|
|
|
|
# Check if build succeeded
|
|
if [ -f "build/bin/yaze" ] || [ -f "build/bin/yaze.exe" ]; then
|
|
print_success "Build successful! YAZE executable created."
|
|
else
|
|
print_error "Build failed. Check the output above for errors."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Run tests
|
|
run_tests() {
|
|
print_header "Running Tests"
|
|
|
|
print_success "Running test suite..."
|
|
cd build
|
|
ctest --output-on-failure -L stable || print_warning "Some tests failed (this is normal for first setup)"
|
|
cd ..
|
|
}
|
|
|
|
# Print next steps
|
|
print_next_steps() {
|
|
print_header "Setup Complete!"
|
|
|
|
echo -e "${GREEN}✓ YAZE development environment is ready!${NC}"
|
|
echo ""
|
|
echo "Next steps:"
|
|
echo "1. Run the application:"
|
|
echo " ./build/bin/yaze"
|
|
echo ""
|
|
echo "2. Run tests:"
|
|
echo " cd build && ctest"
|
|
echo ""
|
|
echo "3. Format code:"
|
|
echo " cmake --build build --target yaze-format"
|
|
echo ""
|
|
echo "4. Check formatting:"
|
|
echo " cmake --build build --target yaze-format-check"
|
|
echo ""
|
|
echo "5. Read the documentation:"
|
|
echo " docs/BUILD.md"
|
|
echo ""
|
|
echo "Happy coding! 🎮"
|
|
}
|
|
|
|
# Main function
|
|
main() {
|
|
print_header "YAZE Developer Setup"
|
|
echo "This script will set up your YAZE development environment."
|
|
echo ""
|
|
|
|
detect_os
|
|
check_prerequisites
|
|
install_dependencies
|
|
setup_repository
|
|
configure_ide
|
|
run_first_build
|
|
run_tests
|
|
print_next_steps
|
|
}
|
|
|
|
# Run main function
|
|
main "$@"
|
|
|