Some progress
This commit is contained in:
@@ -0,0 +1,106 @@
|
||||
# Copyright (c) 2026 Dominic Masters
|
||||
#
|
||||
# This software is released under the MIT License.
|
||||
# https://opensource.org/licenses/MIT
|
||||
|
||||
# Resolve YAUL_INSTALL_ROOT (already set by the toolchain file, but guard
|
||||
# in case cmake/targets/ is loaded standalone for IDE tooling).
|
||||
if(NOT DEFINED YAUL_INSTALL_ROOT)
|
||||
if(DEFINED ENV{YAUL_INSTALL_ROOT})
|
||||
set(YAUL_INSTALL_ROOT "$ENV{YAUL_INSTALL_ROOT}")
|
||||
else()
|
||||
set(YAUL_INSTALL_ROOT "/opt/yaul")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Yaul installs headers/libs under the arch-prefix sysroot subdirectory:
|
||||
# ${YAUL_INSTALL_ROOT}/sh2eb-elf/include/
|
||||
# ${YAUL_INSTALL_ROOT}/sh2eb-elf/lib/
|
||||
# Cross-compiled zlib and libzip are installed to the same sysroot.
|
||||
set(_YAUL_SYSROOT "${YAUL_INSTALL_ROOT}/sh2eb-elf")
|
||||
set(_YAUL_BIN "${YAUL_INSTALL_ROOT}/bin")
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Bypass system find_package calls for libraries we cross-compile into the
|
||||
# sh2eb-elf sysroot and install into ${_YAUL_SYSROOT}.
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
# zlib
|
||||
if(NOT TARGET ZLIB::ZLIB)
|
||||
add_library(ZLIB::ZLIB INTERFACE IMPORTED GLOBAL)
|
||||
set_target_properties(ZLIB::ZLIB PROPERTIES
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${_YAUL_SYSROOT}/include"
|
||||
INTERFACE_LINK_LIBRARIES "${_YAUL_SYSROOT}/lib/libz.a"
|
||||
)
|
||||
endif()
|
||||
set(ZLIB_FOUND TRUE CACHE BOOL "" FORCE)
|
||||
set(ZLIB_INCLUDE_DIR "${_YAUL_SYSROOT}/include" CACHE PATH "" FORCE)
|
||||
set(ZLIB_LIBRARY "${_YAUL_SYSROOT}/lib/libz.a" CACHE FILEPATH "" FORCE)
|
||||
|
||||
# libzip — pre-installed into the sh2eb-elf sysroot; skip Findlibzip.cmake.
|
||||
set(libzip_FOUND TRUE CACHE BOOL "libzip found (Saturn sysroot)" FORCE)
|
||||
find_path(_sat_zip_inc NAMES zip.h
|
||||
PATHS "${_YAUL_SYSROOT}/include"
|
||||
NO_DEFAULT_PATH
|
||||
)
|
||||
if(_sat_zip_inc)
|
||||
target_include_directories(${DUSK_LIBRARY_TARGET_NAME} PRIVATE "${_sat_zip_inc}")
|
||||
endif()
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Compile definitions
|
||||
# ---------------------------------------------------------------------------
|
||||
target_compile_definitions(${DUSK_LIBRARY_TARGET_NAME} PUBLIC
|
||||
DUSK_SATURN
|
||||
DUSK_INPUT_GAMEPAD
|
||||
DUSK_PLATFORM_ENDIAN_BIG
|
||||
DUSK_DISPLAY_WIDTH=320
|
||||
DUSK_DISPLAY_HEIGHT=224
|
||||
DUSK_THREAD_NONE
|
||||
)
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Compile options
|
||||
# ---------------------------------------------------------------------------
|
||||
target_compile_options(${DUSK_LIBRARY_TARGET_NAME} PRIVATE
|
||||
-m2 -mb
|
||||
-fno-builtin
|
||||
-fomit-frame-pointer
|
||||
-w
|
||||
)
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Include paths
|
||||
# ---------------------------------------------------------------------------
|
||||
target_include_directories(${DUSK_LIBRARY_TARGET_NAME} PRIVATE
|
||||
"${_YAUL_SYSROOT}/include"
|
||||
"${_YAUL_SYSROOT}/include/yaul"
|
||||
)
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Link libraries
|
||||
# ---------------------------------------------------------------------------
|
||||
target_link_directories(${DUSK_LIBRARY_TARGET_NAME} PRIVATE
|
||||
"${_YAUL_SYSROOT}/lib"
|
||||
)
|
||||
|
||||
target_link_libraries(${DUSK_LIBRARY_TARGET_NAME} PRIVATE
|
||||
"${_YAUL_SYSROOT}/lib/libyaul.a"
|
||||
"${_YAUL_SYSROOT}/lib/libzip.a"
|
||||
"${_YAUL_SYSROOT}/lib/libz.a"
|
||||
m
|
||||
)
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Post-build: ELF → binary image
|
||||
# sh2eb-elf-objcopy converts the ELF to a flat binary that IP.BIN loads
|
||||
# into Saturn Work RAM.
|
||||
# ---------------------------------------------------------------------------
|
||||
set(DUSK_SAT_BIN "${CMAKE_BINARY_DIR}/Dusk.bin")
|
||||
add_custom_command(TARGET ${DUSK_BINARY_TARGET_NAME} POST_BUILD
|
||||
COMMAND "${_YAUL_BIN}/sh2eb-elf-objcopy"
|
||||
-O binary
|
||||
"$<TARGET_FILE:${DUSK_BINARY_TARGET_NAME}>"
|
||||
"${DUSK_SAT_BIN}"
|
||||
COMMENT "Converting ${DUSK_BINARY_TARGET_NAME} ELF → ${DUSK_SAT_BIN}"
|
||||
)
|
||||
@@ -0,0 +1,59 @@
|
||||
# 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 provides its own startup code and linker script.
|
||||
# The kernel.ld script maps Saturn Work RAM (0x06000000+).
|
||||
set(_YAUL_LD "${YAUL_INSTALL_ROOT}/share/yaul/ip/kernel.ld")
|
||||
set(CMAKE_EXE_LINKER_FLAGS_INIT
|
||||
"-T\"${_YAUL_LD}\" -Wl,--start-group -Wl,--end-group -nostartfiles")
|
||||
Reference in New Issue
Block a user