Files
yaze/docs/02-build-instructions.md
scawful 2b11338e20 Update version to 0.3.2 and enhance stability across platforms
- Bump project version to 0.3.2 in CMakeLists.txt, vcpkg.json, and relevant headers.
- Increase Windows stack size to 8MB to prevent stack overflow during asset loading.
- Isolate development utilities from CI builds to ensure cleaner release artifacts.
- Implement comprehensive bounds checking and fix segmentation faults in the graphics system.
- Update documentation to reflect new build instructions and stability improvements.
2025-09-29 15:47:14 -04:00

17 KiB

Build Instructions

YAZE uses CMake 3.16+ with modern target-based configuration. The project includes comprehensive Windows support with Visual Studio integration, vcpkg package management, and automated setup scripts.

Quick Start

macOS (Apple Silicon)

cmake --preset debug
cmake --build build

Linux

cmake -B build -DCMAKE_BUILD_TYPE=Debug
cmake --build build
# Automated setup (first time only)
.\scripts\setup-windows-dev.ps1

# Recommended: Use Visual Studio's built-in CMake support
# 1. Open Visual Studio 2022
# 2. Select "Open a local folder" 
# 3. Navigate to the yaze directory
# 4. Visual Studio will detect CMakeLists.txt automatically
# 5. Select configuration (Debug/Release) from the dropdown
# 6. Press F5 to build and run

# Alternative: Command line build
cmake -B build -DCMAKE_BUILD_TYPE=Debug
cmake --build build --config Debug

# Legacy: Generate Visual Studio solution (not recommended)
# python scripts/generate-vs-projects.py  # Less maintainable, use CMake mode instead

Minimal Build (CI/Fast)

cmake -B build -DYAZE_MINIMAL_BUILD=ON
cmake --build build

Dependencies

Required

  • CMake 3.16+
  • C++23 compiler (GCC 13+, Clang 16+, MSVC 2019+)
  • Git with submodule support

Bundled Libraries

  • SDL2, ImGui, Abseil, Asar, GoogleTest
  • Native File Dialog Extended (NFD)
  • All dependencies included in repository

Platform Setup

macOS

# Install Xcode Command Line Tools
xcode-select --install

# Optional: Install Homebrew dependencies (auto-detected)
brew install cmake pkg-config

Linux (Ubuntu/Debian)

sudo apt-get update
sudo apt-get install -y build-essential cmake ninja-build pkg-config \
  libgtk-3-dev libdbus-1-dev

Windows

The project includes comprehensive setup scripts for Windows development:

# Complete development environment setup
.\scripts\setup-windows-dev.ps1

# Generate Visual Studio project files (with proper vcpkg integration)
python scripts/generate-vs-projects.py

# Test CMake configuration
.\scripts\test-cmake-config.ps1

What the setup script installs:

  • Chocolatey package manager
  • CMake 3.16+
  • Git, Ninja, Python 3
  • Visual Studio 2022 detection and verification

Manual Setup Options

Option 1 - Minimal (CI/Fast Builds):

  • Visual Studio 2019+ with C++ CMake tools
  • No additional dependencies needed (all bundled)

Option 2 - Full Development with vcpkg:

  • Visual Studio 2019+ with C++ CMake tools
  • vcpkg package manager for dependency management

vcpkg Integration

Automatic Setup:

# PowerShell
.\scripts\setup-windows-dev.ps1

# Command Prompt
scripts\setup-windows-dev.bat

Manual vcpkg Setup:

git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
.\bootstrap-vcpkg.bat
.\vcpkg.exe integrate install
set VCPKG_ROOT=%CD%

Dependencies (vcpkg.json):

  • sdl2 (graphics/input with Vulkan support)

Note: Abseil and gtest are built from source via CMake rather than through vcpkg to avoid compatibility issues.

Windows Build Commands

Using CMake Presets:

# Debug build (minimal, no tests)
cmake --preset windows-debug
cmake --build build --preset windows-debug

# Development build (includes Google Test)
cmake --preset windows-dev
cmake --build build --preset windows-dev

# Release build (optimized, no tests)
cmake --preset windows-release
cmake --build build --preset windows-release

Using Visual Studio Projects:

# Generate project files (with proper vcpkg integration)
python scripts/generate-vs-projects.py

# Open YAZE.sln in Visual Studio
# Select configuration (Debug/Release) and platform (x64/x86/ARM64)
# Press F5 to build and run

Build Types:

  • windows-debug: Minimal debug build, no Google Test
  • windows-dev: Development build with Google Test and ROM testing
  • windows-release: Optimized release build, no Google Test

Build Targets

Applications

  • yaze: Main GUI editor application
  • z3ed: Command-line interface tool

Libraries

  • yaze_c: C API library for extensions
  • asar-static: 65816 assembler library

Development (Debug Builds Only)

  • yaze_emu: Standalone SNES emulator
  • yaze_test: Comprehensive test suite

Build Configurations

Debug (Full Features)

cmake --preset debug  # macOS
# OR
cmake -B build -DCMAKE_BUILD_TYPE=Debug  # All platforms

Includes: NFD, ImGuiTestEngine, PNG support, emulator, all tools

Minimal (CI/Fast Builds)

cmake -B build -DYAZE_MINIMAL_BUILD=ON

Excludes: Emulator, CLI tools, UI tests, optional dependencies

Release

cmake --preset release  # macOS
# OR  
cmake -B build -DCMAKE_BUILD_TYPE=Release  # All platforms

Testing System

YAZE includes a comprehensive testing system with different test categories designed for various use cases:

Test Categories

Unit Tests

  • Core functionality: AsarWrapper, ROM operations, SNES tiles, palettes
  • Graphics: Compression, tile unpacking, color conversion
  • Zelda3 components: Message system, overworld, object parsing
  • Location: test/unit/

Integration Tests

  • ASAR integration: Assembly compilation and ROM patching
  • Editor integration: Tile16 editor, dungeon editor
  • Location: test/integration/

End-to-End (E2E) Tests

  • ROM-dependent tests: Load, edit, save, reload, verify integrity
  • ZSCustomOverworld upgrade tests: Vanilla → v2 → v3 upgrade paths
  • Location: test/e2e/

Running Tests

Local Development

# Run all tests
./build/test/yaze_test

# Run specific test categories
./build/test/yaze_test --unit
./build/test/yaze_test --integration
./build/test/yaze_test --e2e --rom-path zelda3.sfc

# Run with verbose output
./build/test/yaze_test --verbose

# Get help
./build/test/yaze_test --help

CI/CD Environment

The CI builds use a simplified test executable (yaze_test_ci.cc) that:

  • Excludes ROM-dependent tests (no ROM files available)
  • Excludes E2E tests (require actual ROM files)
  • Focuses on unit tests and core functionality
  • Uses minimal configuration for reliability

ROM-Dependent Tests

These tests require actual ROM files and are only available in local development:

# E2E ROM tests (requires zelda3.sfc)
./build/test/yaze_test --e2e --rom-path zelda3.sfc

# ZSCustomOverworld upgrade tests
./build/test/yaze_test --zscustomoverworld --rom-path zelda3.sfc

Note: ROM-dependent tests are automatically skipped in CI builds and minimal builds.

Test Organization

test/
├── unit/                    # Unit tests (CI-safe)
│   ├── core/               # Core functionality tests
│   ├── gfx/                # Graphics tests
│   └── zelda3/             # Zelda3-specific tests
├── integration/            # Integration tests (CI-safe)
├── e2e/                    # End-to-end tests (ROM-dependent)
│   ├── rom_dependent/      # ROM load/save/edit tests
│   └── zscustomoverworld/  # Upgrade path tests
├── mocks/                  # Mock objects for testing
├── assets/                 # Test assets and ROMs
└── deprecated/             # Outdated tests (moved from emu/)

Test Executables

Development Build (yaze_test.cc)

  • Full argument parsing for AI agents
  • SDL initialization for graphics tests
  • Support for all test categories
  • ROM path configuration
  • Verbose output options

CI Build (yaze_test_ci.cc)

  • Simplified main function
  • No SDL initialization
  • Automatic exclusion of ROM-dependent tests
  • Minimal configuration for reliability
  • Used when YAZE_MINIMAL_BUILD=ON

Test Configuration

CMake Options

# Enable/disable test categories
-DYAZE_ENABLE_ROM_TESTS=ON          # Enable ROM-dependent tests
-DYAZE_ENABLE_UI_TESTS=ON           # Enable ImGui Test Engine
-DYAZE_ENABLE_EXPERIMENTAL_TESTS=ON # Enable experimental tests
-DYAZE_MINIMAL_BUILD=ON             # Use CI test executable

Test Filters

The test system supports Google Test filters for selective execution:

# Run only core tests
./build/test/yaze_test --gtest_filter="*Core*"

# Exclude ROM tests
./build/test/yaze_test --gtest_filter="-*RomTest*"

# Run specific test suite
./build/test/yaze_test --gtest_filter="AsarWrapperTest.*"

IDE Integration

Visual Studio (Windows)

Recommended approach - CMake Mode:

# Setup development environment
.\scripts\setup-windows-dev.ps1

# Open in Visual Studio 2022
# 1. File → Open → Folder
# 2. Navigate to yaze directory
# 3. Visual Studio detects CMakeLists.txt automatically
# 4. Select configuration from toolbar (Debug/Release)
# 5. Press F5 to build and run

Why CMake Mode?

  • No project generation step - CMake files are the source of truth
  • Always in sync - Changes to CMakeLists.txt reflect immediately
  • Better IntelliSense - Direct CMake target understanding
  • Native CMake support - Modern Visual Studio feature
  • Simpler workflow - One less build step to maintain
  • Cross-platform consistency - Same CMake workflow on all platforms

Features:

  • Full IntelliSense support (better than generated projects)
  • Integrated debugging with breakpoint support
  • Automatic vcpkg dependency management (SDL2)
  • Multi-platform support (x64, ARM64)
  • Automatic asset copying via CMake post-build commands
  • CMakeSettings.json for custom configurations

Legacy Solution Generation (Not Recommended): If you must use a .sln file (e.g., for CI integration):

python scripts/generate-vs-projects.py
# Open generated YAZE.sln

Note: This approach requires regeneration when CMakeLists.txt changes and is less maintainable.

VS Code

  1. Install CMake Tools extension
  2. Open project, select "Debug" preset
  3. Language server uses compile_commands.json automatically

CLion

  • Opens CMake projects directly
  • Select Debug configuration

Xcode (macOS)

cmake --preset debug -G Xcode
open build/yaze.xcodeproj

Windows Development Scripts

The project includes several PowerShell and Batch scripts to streamline Windows development:

Setup Scripts

  • setup-windows-dev.ps1: Complete development environment setup
  • setup-windows-dev.bat: Batch version of setup script

What they install:

  • Chocolatey package manager
  • CMake 3.16+
  • Git, Ninja, Python 3
  • Visual Studio 2022 detection

Project Generation Scripts

  • generate-vs-projects.py: Generate Visual Studio project files with proper vcpkg integration
  • generate-vs-projects.bat: Batch version of project generation

Features:

  • Automatic CMake detection and installation
  • Visual Studio 2022 detection
  • Multi-architecture support (x64, ARM64)
  • vcpkg integration
  • CMake compatibility fixes

Testing Scripts

  • test-cmake-config.ps1: Test CMake configuration without full build

Usage:

# Test configuration
.\scripts\test-cmake-config.ps1

# Test with specific architecture
.\scripts\test-cmake-config.ps1 -Architecture x86

# Clean test build
.\scripts\test-cmake-config.ps1 -Clean

Features by Build Type

Feature Debug Release Minimal (CI)
GUI Editor
Native File Dialogs
PNG Support
Emulator
CLI Tools
Test Suite (limited)
UI Testing
ROM Tests

CMake Compatibility

Submodule Compatibility Issues

YAZE includes several submodules (abseil-cpp, SDL) that may have CMake compatibility issues. The project automatically handles these with:

Automatic Policy Management:

  • CMAKE_POLICY_VERSION_MINIMUM=3.5 (handles SDL requirements)
  • CMAKE_POLICY_VERSION_MAXIMUM=3.28 (prevents future issues)
  • CMAKE_WARN_DEPRECATED=OFF (suppresses submodule warnings)
  • ABSL_PROPAGATE_CXX_STD=ON (handles Abseil C++ standard propagation)
  • THREADS_PREFER_PTHREAD_FLAG=OFF (fixes Windows pthread issues)

Manual Configuration (if needed):

cmake -B build \
  -DCMAKE_POLICY_VERSION_MINIMUM=3.5 \
  -DCMAKE_POLICY_VERSION_MAXIMUM=3.28 \
  -DCMAKE_WARN_DEPRECATED=OFF \
  -DABSL_PROPAGATE_CXX_STD=ON \
  -DTHREADS_PREFER_PTHREAD_FLAG=OFF \
  -DCMAKE_BUILD_TYPE=Debug

CI/CD and Release Builds

GitHub Actions Workflows

The project includes comprehensive CI/CD workflows:

  • ci.yml: Multi-platform CI with test execution
  • release.yml: Automated release builds with packaging

Test Execution in CI

CI Test Strategy:

  • Core Tests: Always run (AsarWrapper, SnesTile, Compression, SnesPalette, Hex, Message)
  • Unit Tests: Run with continue-on-error=true for information
  • ROM Tests: Automatically excluded (no ROM files available)
  • E2E Tests: Automatically excluded (require ROM files)

Test Filters in CI:

# Core tests (must pass)
ctest -R "AsarWrapperTest|SnesTileTest|CompressionTest|SnesPaletteTest|HexTest|MessageTest"

# Additional unit tests (informational)
ctest -R ".*Test" -E ".*RomTest.*|.*E2E.*|.*ZSCustomOverworld.*|.*IntegrationTest.*"

vcpkg Fallback Mechanisms

All Windows CI/CD builds include automatic fallback mechanisms:

When vcpkg succeeds:

  • Full build with all dependencies (SDL2)
  • Complete feature set available

When vcpkg fails (network issues):

  • Automatic fallback to minimal build configuration
  • Uses source-built dependencies (Abseil, etc.)
  • Still produces functional executables

Supported Architectures

Windows:

  • x64 (64-bit) - Primary target for modern systems
  • ARM64 - For ARM-based Windows devices (Surface Pro X, etc.)

macOS:

  • Universal binary (Apple Silicon + Intel)

Linux:

  • x64 (64-bit)

Troubleshooting

Windows CMake Issues

CMake Not Found:

# Run the setup script
.\scripts\setup-windows-dev.ps1

# Or install manually via Chocolatey
choco install cmake

Submodule Compatibility Errors:

# Test CMake configuration
.\scripts\test-cmake-config.ps1

# Clean build with compatibility flags
Remove-Item -Recurse -Force build
cmake -B build -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DCMAKE_WARN_DEPRECATED=OFF

Visual Studio Project Issues:

# Regenerate project files
.\scripts\generate-vs-projects.ps1

# Clean and rebuild
Remove-Item -Recurse -Force build
cmake --preset windows-debug

vcpkg Issues

Dependencies Not Installing:

# Check vcpkg installation
vcpkg version

# Reinstall dependencies
vcpkg install --triplet x64-windows sdl2

# Check installed packages
vcpkg list

Network/Download Failures:

  • The CI/CD workflows automatically fall back to minimal builds
  • For local development, ensure stable internet connection
  • If vcpkg consistently fails, use minimal build mode:
    cmake -B build -DYAZE_MINIMAL_BUILD=ON
    

Visual Studio Integration:

# Re-integrate vcpkg
cd C:\vcpkg
.\vcpkg.exe integrate install

ZLIB or Other Dependencies Not Found:

# Regenerate project files with proper vcpkg integration
python scripts/generate-vs-projects.py

# Ensure vcpkg is properly set up
.\scripts\setup-windows-dev.ps1

Test Issues

Test Discovery Failures:

# Use CI test executable for minimal builds
cmake -B build -DYAZE_MINIMAL_BUILD=ON
cmake --build build

# Check test executable
./build/test/yaze_test --help

ROM Test Failures:

# Ensure ROM file exists
ls -la zelda3.sfc

# Run with explicit ROM path
./build/test/yaze_test --e2e --rom-path zelda3.sfc

SDL Initialization Errors:

  • These are expected in CI builds
  • Use minimal build configuration for CI compatibility
  • For local development, ensure SDL2 is properly installed

Architecture Errors (macOS)

# Clean and use ARM64-only preset
rm -rf build
cmake --preset debug  # Uses arm64 only

Missing Headers (Language Server)

# Regenerate compile commands
cmake --preset debug
cp build/compile_commands.json .
# Restart VS Code

CI Build Failures

Use minimal build configuration that matches CI:

cmake -B build -DYAZE_MINIMAL_BUILD=ON -DYAZE_ENABLE_UI_TESTS=OFF
cmake --build build

Common Error Solutions

"CMake Deprecation Warning" from submodules:

  • This is automatically handled by the project's CMake configuration
  • If you see these warnings, they can be safely ignored

"pthread_create not found" on Windows:

  • The project automatically sets THREADS_PREFER_PTHREAD_FLAG=OFF
  • This is normal for Windows builds

"Abseil C++ std propagation" warnings:

  • Automatically handled with ABSL_PROPAGATE_CXX_STD=ON
  • Ensures proper C++ standard handling

Visual Studio "file not found" errors:

  • Run python scripts/generate-vs-projects.py to regenerate project files
  • Ensure CMake configuration completed successfully first

CI/CD Build Failures:

  • Check if vcpkg download failed (network issues)
  • The workflows automatically fall back to minimal builds
  • For persistent issues, check the workflow logs for specific error messages

Test Executable Issues:

  • Ensure the correct test executable is being used (CI vs development)
  • Check that test filters are properly configured
  • Verify that ROM-dependent tests are excluded in CI builds