# Copyright (c) 2026 Dominic Masters # # This software is released under the MIT License. # https://opensource.org/licenses/MIT # # CMake toolchain file for Sega Saturn (Hitachi SH-2, big-endian) # using the Yaul homebrew SDK. Set YAUL_INSTALL_ROOT or the # YAUL_INSTALL_ROOT environment variable before invoking cmake. set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_PROCESSOR sh2) # Resolve Yaul install root if(NOT DEFINED YAUL_INSTALL_ROOT) if(DEFINED ENV{YAUL_INSTALL_ROOT}) set(YAUL_INSTALL_ROOT "$ENV{YAUL_INSTALL_ROOT}" CACHE PATH "Yaul SDK root" FORCE) else() set(YAUL_INSTALL_ROOT "/opt/yaul" CACHE PATH "Yaul SDK root" FORCE) endif() endif() # Yaul SH-2 cross-compiler prefix is sh2eb-elf (big-endian SH-2 ELF). # Binaries live in ${YAUL_INSTALL_ROOT}/bin/; headers/libs under # ${YAUL_INSTALL_ROOT}/sh2eb-elf/{include,lib}/. set(_YAUL_BIN "${YAUL_INSTALL_ROOT}/bin") set(CMAKE_C_COMPILER "${_YAUL_BIN}/sh2eb-elf-gcc") set(CMAKE_CXX_COMPILER "${_YAUL_BIN}/sh2eb-elf-g++") set(CMAKE_AR "${_YAUL_BIN}/sh2eb-elf-ar") set(CMAKE_RANLIB "${_YAUL_BIN}/sh2eb-elf-ranlib") set(CMAKE_STRIP "${_YAUL_BIN}/sh2eb-elf-strip") set(CMAKE_OBJCOPY "${_YAUL_BIN}/sh2eb-elf-objcopy") set(CMAKE_LINKER "${_YAUL_BIN}/sh2eb-elf-ld") set(CMAKE_CROSSCOMPILING TRUE) # Tell CMake not to try to run built executables set(CMAKE_CROSSCOMPILING_EMULATOR "" CACHE STRING "" FORCE) set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) # Sysroot — Yaul installs headers/libs under the arch-prefix subdirectory set(_YAUL_SYSROOT "${YAUL_INSTALL_ROOT}/sh2eb-elf") set(CMAKE_FIND_ROOT_PATH "${_YAUL_SYSROOT}") set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) # SH-2 core flags: big-endian (-mb), SH-2 ISA (-m2), no FPU set(_SAT_C_FLAGS "-m2 -mb -fno-builtin -fomit-frame-pointer") set(CMAKE_C_FLAGS_INIT "${_SAT_C_FLAGS}") # Yaul installs yaul.specs to ${YAUL_INSTALL_ROOT}/sh2eb-elf/lib/ and # ldscripts/yaul.x to ${YAUL_INSTALL_ROOT}/sh2eb-elf/lib/ldscripts/. # GCC searches ${prefix}/${target}/lib/ for specs, so -specs=yaul.specs works # without an absolute path once the SDK is installed. set(CMAKE_EXE_LINKER_FLAGS_INIT "-specs=yaul.specs -Wl,--gc-sections -nostartfiles -Wl,--start-group -Wl,--end-group")