cmake_minimum_required(VERSION 3.25)
set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_LIST_DIR}/cmake/toolchain.cmake")
project(
psbw
LANGUAGES C CXX ASM
VERSION 1.0.0
)
find_package(Python3 REQUIRED COMPONENTS Interpreter)
set(GAME_NAME game)
file(GLOB audio_files "${PROJECT_SOURCE_DIR}/assets/music/*.mp3")
set(audio_tracks "")
foreach(audio_file IN LISTS audio_files)
get_filename_component(audio_filename ${audio_file} NAME)
set(audio_tracks "${audio_tracks}\n")
endforeach()
configure_file(
"${PROJECT_SOURCE_DIR}/iso.xml"
"${PROJECT_BINARY_DIR}/iso.xml"
)
configure_file(
"${PROJECT_SOURCE_DIR}/system.cnf"
"${PROJECT_BINARY_DIR}/system.cnf"
)
# Create common library which contains things like CPP support and libc
add_library(
common OBJECT
lib/libc/crt0.c
lib/libc/cxxsupport.cpp
lib/libc/malloc.c
lib/libc/memset.s
lib/libc/misc.c
lib/libc/misc.s
lib/libc/string.c
lib/ps1/system.c
lib/ps1/system.s
lib/ps1/unhandledexc.c
lib/vendor/printf.c
)
target_include_directories(
common PUBLIC
lib
inc
lib/libc
)
# Create the Game library which contains the actual game code
add_library(
${GAME_NAME} OBJECT
game/main.cpp
game/scenes/MainMenu.cpp
game/scenes/Psxris.cpp
game/scenes/Test3D.cpp
)
target_include_directories(
${GAME_NAME} PUBLIC
lib
inc
lib/libc
)
# Create the final executable of the engine and link common and game into it
add_executable(${PROJECT_NAME}
#Internal
src/main.cpp
src/interrupts.c
src/draw.cpp
src/vsync.c
src/cdrom.c
src/cdread.c
src/cdmisc.c
src/filesystem.c
src/gte.c
src/trig.c
src/sio0.cpp
#API
src/psbw/Sio.cpp
src/psbw/Scene.cpp
src/psbw/GameObject.cpp
src/psbw/Sprite.cpp
src/psbw/Mesh.cpp
src/psbw/Text.cpp
src/psbw/Manager.cpp
src/psbw/Controller.cpp
src/psbw/Sound.cpp
src/psbw/Fudgebundle.cpp
src/psbw/Font.cpp
)
target_link_libraries(${PROJECT_NAME} PRIVATE ${GAME_NAME} common)
target_include_directories(${PROJECT_NAME} PUBLIC inc)
# The final executable requires conversion to be ran on the PSX
add_custom_command(
TARGET ${PROJECT_NAME} POST_BUILD
BYPRODUCTS ${GAME_NAME}.psexe
COMMAND
"${Python3_EXECUTABLE}" "${PROJECT_SOURCE_DIR}/tools/convertExecutable.py"
"$" ${GAME_NAME}.psexe
VERBATIM
)
function(addBinaryFile target name path)
set(_file "${PROJECT_BINARY_DIR}/${target}_${name}.s")
cmake_path(ABSOLUTE_PATH path OUTPUT_VARIABLE _path)
file(
CONFIGURE
OUTPUT "${_file}"
CONTENT [[
.section .data.${name}, "aw"
.balign 8
.global ${name}
.type ${name}, @object
.size ${name}, (${name}_end - ${name})
${name}:
.incbin "${_path}"
${name}_end:
]]
ESCAPE_QUOTES
NEWLINE_STYLE LF
)
target_sources(${target} PRIVATE "${_file}")
set_source_files_properties("${_file}" PROPERTIES OBJECT_DEPENDS "${_path}")
endfunction()
function(convertImage input bpp)
add_custom_command(
OUTPUT ${ARGN}
DEPENDS "${PROJECT_SOURCE_DIR}/${input}"
COMMAND
"${Python3_EXECUTABLE}" "${PROJECT_SOURCE_DIR}/tools/convertImage.py"
-b ${bpp} "${PROJECT_SOURCE_DIR}/${input}" ${ARGN}
VERBATIM
)
endfunction()
function(psn00bsdk_add_cd_image name image_name config_file)
if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
set(MKPSXISO mkpsxiso.exe)
ELSE()
set(MKPSXISO ${PROJECT_BINARY_DIR}/tree/bin/mkpsxiso)
ENDIF()
cmake_path(HASH config_file _hash)
add_custom_command(
OUTPUT ${image_name}.bin ${image_name}.cue
COMMAND
${MKPSXISO} -y
-o ${image_name}.bin -c ${image_name}.cue ${PROJECT_BINARY_DIR}/iso.xml
COMMENT "Building CD image ${image_name}"
VERBATIM
${ARGN}
)
add_custom_target(
${name} ALL
DEPENDS
${CMAKE_CURRENT_BINARY_DIR}/${image_name}.bin
${CMAKE_CURRENT_BINARY_DIR}/${image_name}.cue
)
endfunction()
if (NOT CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
include(ExternalProject)
ExternalProject_Add(
mkpsxiso
PREFIX subprojects
SOURCE_DIR ${PROJECT_SOURCE_DIR}/tools/mkpsxiso
INSTALL_DIR tree
CMAKE_CACHE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=${PROJECT_BINARY_DIR}/tree
)
ENDIF()
if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
psn00bsdk_add_cd_image(
iso # Target name
${GAME_NAME} # Output file name (= template.bin + template.cue)
iso.xml # Path to config file
DEPENDS psbw system.cnf
)
ELSE()
psn00bsdk_add_cd_image(
iso # Target name
${GAME_NAME} # Output file name (= template.bin + template.cue)
iso.xml # Path to config file
DEPENDS psbw system.cnf mkpsxiso
)
ENDIF()
include(${PROJECT_SOURCE_DIR}/cmake/defines.cmake)
read_yaml_and_set_defines(GameSettings.yaml)
convertImage(font.png 4 font.dat fontPalette.dat)
addBinaryFile(${PROJECT_NAME} debugFont "${PROJECT_BINARY_DIR}/font.dat")
addBinaryFile(${PROJECT_NAME} debugFontPalette "${PROJECT_BINARY_DIR}/font.dat")