- Added comprehensive Windows support details, including Visual Studio integration and environment verification. - Introduced quick start commands for building with different configurations (Basic Editor, AI Features, Full Build). - Expanded requirements section to clarify essential and optional dependencies. - Included detailed troubleshooting steps for common Windows build issues, with solutions for specific errors. - Updated CMake presets table to reflect new build options and configurations.
24 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.
⚡ Build Environment Verification
Before building for the first time, run the verification script to ensure your environment is properly configured:
Windows (PowerShell)
.\scripts\verify-build-environment.ps1
# With automatic fixes
.\scripts\verify-build-environment.ps1 -FixIssues
# Clean CMake cache
.\scripts\verify-build-environment.ps1 -CleanCache
# Verbose output
.\scripts\verify-build-environment.ps1 -Verbose
macOS/Linux
./scripts/verify-build-environment.sh
# With automatic fixes
./scripts/verify-build-environment.sh --fix
# Clean CMake cache
./scripts/verify-build-environment.sh --clean
# Verbose output
./scripts/verify-build-environment.sh --verbose
The verification script checks:
- ✓ CMake 3.16+ installation
- ✓ Git and submodule synchronization
- ✓ C++ compiler (GCC 13+, Clang 16+, MSVC 2019+)
- ✓ Platform-specific dependencies (GTK+3 on Linux, Xcode on macOS)
- ✓ CMake cache freshness
- ✓ Dependency compatibility (gRPC, httplib, nlohmann/json)
- ✓ Visual Studio 2022 detection (Windows only)
Quick Start
macOS (Apple Silicon)
# Verify environment first
./scripts/verify-build-environment.sh
# Build
cmake --preset debug
cmake --build build
Linux
# Verify environment first
./scripts/verify-build-environment.sh
# Build
cmake -B build -DCMAKE_BUILD_TYPE=Debug
cmake --build build
Windows (Visual Studio CMake Workflow)
# Verify environment first
.\scripts\verify-build-environment.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
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 (Header-Only & Source)
Core Libraries:
- SDL2 - Graphics and input handling
- ImGui - Immediate mode GUI framework
- Abseil - Google's C++ standard library extensions
- Asar - 65816 assembler for SNES
- GoogleTest - C++ testing framework
Third-Party Header-Only Libraries:
- nlohmann/json (third_party/json) - Modern C++ JSON library
- cpp-httplib (third_party/httplib) - HTTP client/server library
Optional Libraries:
- Native File Dialog Extended (NFD) - Native file dialogs (excluded in minimal builds)
- gRPC - Remote procedure call framework (optional, disabled by default)
Dependency Isolation
YAZE uses careful dependency isolation to prevent conflicts:
gRPC Configuration (when enabled with -DYAZE_WITH_GRPC=ON):
- Uses FetchContent to build from source
- Isolated from system protobuf/abseil installations
- Automatically disables system package detection
- Compatible with Clang 18 and C++23
Header-Only Libraries:
- nlohmann/json and cpp-httplib are header-only
- No linking required, zero binary conflicts
- Included via git submodules in third_party/
Submodule Management: All dependencies are included as git submodules for:
- ✅ Version consistency across all platforms
- ✅ No external package manager required
- ✅ Reproducible builds
- ✅ Offline development capability
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
YAZE provides comprehensive Windows support with Visual Studio integration, automated environment verification, and detailed troubleshooting guides.
Quick Start
# 1. Verify environment
.\scripts\verify-build-environment.ps1
# 2. Build (choose one)
# Basic editor:
cmake --preset windows-debug
cmake --build build --config Debug
# With AI features:
cmake --preset windows-ai-debug
cmake --build build --config Debug
# 3. Run
build\bin\Debug\yaze.exe
Requirements
Essential:
- Windows 10/11 (64-bit)
- Visual Studio 2022 or Visual Studio 2019 with:
- Desktop development with C++
- C++ CMake tools for Windows
- Windows 10/11 SDK
- Git for cloning and submodules
Optional:
- vcpkg for easier dependency management
- Node.js for collaboration server features
Build Options
YAZE offers multiple build configurations for different use cases:
Option A: Basic Editor (Recommended for first build)
cmake --preset windows-debug
cmake --build build --config Debug
- Full ROM editor with all core features
- Fastest build time (~5 minutes)
- No external dependencies beyond Visual Studio
Option B: Editor with AI Features
cmake --preset windows-ai-debug
cmake --build build --config Debug
- ROM editor + AI chat assistant + code generation
- Requires bundled JSON library (included)
- Build time: ~7 minutes
Option C: Full Build (AI + Collaboration)
cmake --preset windows-collab-debug
cmake --build build --config Debug
- Everything + network collaboration + automated testing
- Compiles gRPC from source
- First build: 15-20 minutes (subsequent builds much faster)
Available CMake Presets
| Preset | JSON | gRPC | Use Case | Build Time |
|---|---|---|---|---|
windows-debug |
❌ | ❌ | Basic ROM editing | ~5 min |
windows-release |
❌ | ❌ | Production build | ~5 min |
windows-dev |
❌ | ❌ | Core development | ~5 min |
windows-ai-debug |
✅ | ❌ | AI features | ~7 min |
windows-ai-release |
✅ | ❌ | AI production | ~7 min |
windows-collab-debug |
✅ | ✅ | Full features + collaboration | ~20 min* |
windows-arm64-debug |
❌ | ❌ | ARM64 Windows | ~5 min |
*First build only; subsequent builds: ~1 min
vcpkg Integration (Optional)
Setup vcpkg for SDL2:
# PowerShell
.\scripts\setup-vcpkg-windows.ps1
# Command Prompt
.\scripts\setup-vcpkg-windows.bat
# Install dependencies
vcpkg install sdl2:x64-windows yaml-cpp:x64-windows
Note: vcpkg is optional. YAZE bundles most dependencies and can build without it.
Platform-Specific Considerations
Windows Compatibility Features:
- ✅ Native path separator handling via
std::filesystem - ✅ Platform-specific process management (
tasklistvspgrep) - ✅ Correct home directory resolution (
%USERPROFILE%vs$HOME) - ✅ MSVC-compatible warning directives
- ✅ Cross-platform thread management with
std::thread - ✅ Unicode support for file paths and names
Known Platform Differences:
- File Locking: Windows has stricter file locking than Unix
- Process Spawning: Uses
cmd.exeinstead ofbash - Background Processes: Server runs in foreground (no
&operator) - Path Case Sensitivity: NTFS is case-preserving but case-insensitive
Supported Architectures:
- x64 (64-bit): Primary target for modern systems
- ARM64: For ARM-based Windows devices (Surface Pro X, etc.)
- x86 (32-bit): Not supported
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)
CMake Workflow (Recommended):
- File → Open → Folder
- Navigate to yaze directory
- Visual Studio detects
CMakeLists.txtautomatically - Select configuration from toolbar (Debug/Release)
- Press F5 to build and run
Why CMake Mode?
- ✅ No project generation - 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
- ✅ Cross-platform consistency - Same workflow on all platforms
Features:
- Full IntelliSense support
- Integrated debugging with breakpoints
- Automatic vcpkg dependency management (if configured)
- Multi-architecture support (x64, x86, ARM64)
- CMakeSettings.json for custom configurations
VS Code
- Install CMake Tools extension
- Open project, select "Debug" preset
- Language server uses
compile_commands.jsonautomatically
CLion
- Opens CMake projects directly
- Select Debug configuration
Xcode (macOS)
cmake --preset debug -G Xcode
open build/yaze.xcodeproj
Windows Development Scripts
vcpkg Setup (Optional)
setup-vcpkg-windows.ps1: Setup vcpkg for SDL2 dependencysetup-vcpkg-windows.bat: Batch version of vcpkg setup
Usage:
# Setup vcpkg (optional - for SDL2 via vcpkg instead of bundled)
.\scripts\setup-vcpkg-windows.ps1
# Or using batch
.\scripts\setup-vcpkg-windows.bat
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 executionrelease.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=truefor 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)
Windows Troubleshooting
This section provides detailed solutions for common Windows build issues.
Quick Diagnostics
Always start with the verification script to identify issues:
.\scripts\verify-build-environment.ps1
# With verbose output
.\scripts\verify-build-environment.ps1 -Verbose
# With automatic fixes
.\scripts\verify-build-environment.ps1 -FixIssues
Common Errors and Solutions
Error 1: "nlohmann/json.hpp: No such file or directory"
Full Error:
fatal error C1083: Cannot open include file: 'nlohmann/json.hpp': No such file or directory
Cause: Building code that uses JSON without enabling JSON support.
Solutions:
-
Use AI preset (enables JSON automatically):
cmake --preset windows-ai-debug cmake --build build --config Debug -
Enable JSON manually:
cmake --preset windows-debug -DYAZE_WITH_JSON=ON cmake --build build --config Debug -
Verify JSON library exists:
dir third_party\json\include\nlohmann\json.hpp -
Initialize submodules (if file is missing):
git submodule update --init --recursive -
Build without AI (if you don't need it):
cmake --preset windows-debug cmake --build build --config Debug
Error 2: "Cannot find nlohmann_json::nlohmann_json target"
Full Error:
CMake Error: The following imported targets are referenced, but are missing:
nlohmann_json::nlohmann_json
Cause: CMake isn't creating the JSON library target.
Solutions:
-
Clean and rebuild:
rmdir /s /q build cmake --preset windows-ai-debug cmake --build build --config Debug -
Check CMake output:
cmake --preset windows-ai-debug 2>&1 | findstr "json"Should show:
✓ JSON support enabled (nlohmann/json) -
Verify submodule:
git submodule status third_party/jsonShould show a commit hash (no
-prefix)
Error 3: "vcpkg toolchain file not found"
Full Error:
CMake Warning: CMAKE_TOOLCHAIN_FILE is set but file does not exist
Cause: Preset expects vcpkg but it's not installed.
Solution 1: Use bundled dependencies (recommended):
cmake --preset windows-debug -DCMAKE_TOOLCHAIN_FILE=""
cmake --build build --config Debug
Solution 2: Install vcpkg:
git clone https://github.com/Microsoft/vcpkg.git C:\vcpkg
cd C:\vcpkg
.\bootstrap-vcpkg.bat
setx VCPKG_ROOT "C:\vcpkg"
# Restart shell, then:
vcpkg install sdl2:x64-windows yaml-cpp:x64-windows
cmake --preset windows-debug
Solution 3: Point to your vcpkg installation:
cmake --preset windows-debug ^
-DCMAKE_TOOLCHAIN_FILE="D:\your\path\to\vcpkg\scripts\buildsystems\vcpkg.cmake"
Error 4: "SDL2 not found"
Full Error:
CMake Error: Could not find a package configuration file provided by "SDL2"
Solution 1: With vcpkg:
vcpkg install sdl2:x64-windows
cmake --preset windows-debug
Solution 2: Manual installation:
- Download SDL2 from https://libsdl.org/download-2.0.php
- Choose "SDL2-devel-2.x.x-VC.zip"
- Extract to
C:\SDL2 - Set environment variable:
setx SDL2_DIR "C:\SDL2\cmake" - Restart shell and rebuild
Error 5: Build is Very Slow (15-20 minutes)
Cause: Building with gRPC enabled compiles gRPC + Protobuf from source.
Solutions:
-
Be patient: First build is slow, subsequent builds are ~1 minute
-
Use precompiled gRPC via vcpkg:
vcpkg install grpc:x64-windows cmake --preset windows-collab-debug(Note: vcpkg gRPC install also takes 15-20 mins, but only once)
-
Build without gRPC (if you don't need collaboration):
cmake --preset windows-ai-debug -
Use parallel builds:
cmake --build build --config Debug -j 12
Error 6: "Cannot open file 'yaze.exe': Permission denied"
Full Error:
LINK : fatal error LNK1168: cannot open yaze.exe for writing
Cause: Previous instance of yaze.exe is still running.
Solutions:
-
Kill all instances:
taskkill /F /IM yaze.exe cmake --build build --config Debug -
Use Task Manager:
- Open Task Manager (Ctrl+Shift+Esc)
- Find
yaze.exeprocesses - End tasks
- Rebuild
Error 7: "C++ standard 'cxx_std_23' not supported"
Full Error:
CMake Error: The C++ compiler does not support C++23
Cause: Visual Studio version is too old.
Solutions:
-
Update Visual Studio:
- Open Visual Studio Installer
- Update to latest version (VS2022 17.4+ recommended)
- Ensure "C++ CMake tools" workload is installed
-
Temporary workaround (use C++20): Edit
CMakeLists.txtline 106:set(CMAKE_CXX_STANDARD 20) # Changed from 23(May cause compilation issues with newer features)
Error 8: Visual Studio Can't Find CMakePresets.json
Observation: VS doesn't show any build configurations.
Solutions:
-
Reload project:
- File → Close Folder
- File → Open → Folder
- Select yaze directory
- Wait for CMake to configure
-
Use CMake GUI (alternative):
- Open CMake GUI
- Set source:
<path to yaze> - Set build:
<path to yaze>/build - Click Configure
- Choose "Visual Studio 17 2022"
- Set options (YAZE_WITH_JSON, etc.)
- Click Generate
- Open
build/yaze.slnin VS
-
Check CMakePresets.json exists:
dir CMakePresets.json
Error 9: "error MSB8066: Custom build exited with code 1"
Full Error:
error MSB8066: Custom build for 'CMakeLists.txt' exited with code 1
Cause: CMake configuration failed, but VS doesn't show the actual error.
Solutions:
-
Run CMake from command line:
cmake --preset windows-debug 2>&1 | moreThis shows the actual CMake error.
-
Check CMake output in VS:
- View → Output
- Show output from: CMake
- Scroll up to find actual error message
-
Clean CMake cache:
rmdir /s /q build cmake --preset windows-debug
Debugging CMake Configuration
Enable verbose CMake output:
cmake --preset windows-debug --trace-expand > cmake_trace.txt
Look through cmake_trace.txt for errors.
Check what's being built:
cmake --preset windows-debug
cmake --build build --config Debug --verbose
Verify preset settings:
cmake --preset windows-debug --trace-expand | findstr "YAZE_WITH_JSON"
cmake --preset windows-debug --trace-expand | findstr "Z3ED_AI"
Tips for Successful Builds
-
Start simple:
cmake --preset windows-debug cmake --build build --config Debug -
Add features incrementally:
# Once basic build works, add JSON: cmake --preset windows-ai-debug cmake --build build --config Debug # Then add gRPC if needed: cmake --preset windows-collab-debug cmake --build build --config Debug -
Clean between major changes:
rmdir /s /q build cmake --preset <new-preset> cmake --build build --config Debug -
Use parallel builds:
cmake --build build --config Debug -j 12 -
Watch for warnings:
cmake --build build --config Debug 2>&1 | findstr "warning"
Still Having Issues?
Collect diagnostic information:
-
Run verification script:
.\scripts\verify-build-environment.ps1 -Verbose > diagnostic.txt -
Get CMake configuration:
cmake --preset windows-debug 2>&1 >> diagnostic.txt -
Get build output:
cmake --build build --config Debug 2>&1 >> diagnostic.txt
Create a GitHub Issue with:
- Windows version (run
winver) - Visual Studio version
- Contents of
diagnostic.txt - Which preset you're using
- Full error message
Contributing
Code Style
- C++23: Use modern language features
- Google C++ Style: Follow Google C++ style guide
- Naming: Use descriptive names, avoid abbreviations
Error Handling
- Use absl::Status for error handling
- Use absl::StatusOr for operations that return values
Pull Request Process
- Run tests: Ensure all stable tests pass (
ctest --preset stable) - Check formatting: Use
clang-format - Update documentation: If your changes affect behavior or APIs
Commit Messages
type(scope): brief description
Detailed explanation of changes.
Fixes #issue_number