mirror of
https://github.com/ran-j/PS2Recomp.git
synced 2026-09-26 08:51:05 -04:00
c8c86661fa
feat: Added PS2Vfs for virtual file system operations, including file opening, reading, writing, and path resolution. feat: Improve VIF1 data processing to handle GIF image packets more efficiently.
611 lines
19 KiB
CMake
611 lines
19 KiB
CMake
cmake_minimum_required(VERSION 3.20)
|
|
|
|
project(PS2Runtime VERSION 0.1.0 LANGUAGES CXX)
|
|
|
|
set(CMAKE_CXX_STANDARD 20)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
|
|
option(PS2X_ENABLE_RUNNER_UNITY_BUILD "Build ps2EntryRunner with CMake unity build" ON)
|
|
set(PS2X_RUNNER_UNITY_BUILD_BATCH_SIZE 32 CACHE STRING "Unity build batch size for ps2EntryRunner")
|
|
option(PS2X_ENABLE_RUNNER_PCH "Precompile the heavy runtime headers for ps2EntryRunner" ON)
|
|
option(PS2X_ENABLE_SCCACHE "Use sccache as compiler launcher when available" ON)
|
|
|
|
option(PS2X_ENABLE_RUNTIME_LOGS "Enable PS2 runtime logs" ON)
|
|
option(PS2X_ENABLE_AGRESSIVE_LOGS "Enable very verbose/agressive PS2 runtime logs" ON)
|
|
option(PS2X_ENABLE_IOP_RPC_TRACE "Log unhandled IOP/SIF RPC trace suggestions" ON)
|
|
option(PS2X_STRICT_RETURN_DIAGNOSTICS "Route generated JR $ra returns through runtime branch diagnostics" OFF)
|
|
option(PS2X_SHOW_WINDOWS_CONSOLE "Show a console window for ps2EntryRunner on Windows release builds" ON)
|
|
option(PS2X_ENABLE_DEBUG_UI "Build the desktop runtime debug UI" ON)
|
|
|
|
if(PS2X_ENABLE_SCCACHE)
|
|
find_program(PS2X_SCCACHE_PROGRAM sccache)
|
|
|
|
if(PS2X_SCCACHE_PROGRAM)
|
|
if(CMAKE_C_COMPILER)
|
|
set(CMAKE_C_COMPILER_LAUNCHER "${PS2X_SCCACHE_PROGRAM}")
|
|
endif()
|
|
|
|
set(CMAKE_CXX_COMPILER_LAUNCHER "${PS2X_SCCACHE_PROGRAM}")
|
|
message(STATUS "Using sccache: ${PS2X_SCCACHE_PROGRAM}")
|
|
else()
|
|
message(STATUS "sccache not found; continuing without compiler launcher")
|
|
endif()
|
|
endif()
|
|
|
|
include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/ReleaseMode.cmake")
|
|
|
|
set(PS2X_IS_VITA OFF)
|
|
|
|
if((CMAKE_C_COMPILER MATCHES "arm-vita-eabi") OR
|
|
(CMAKE_CXX_COMPILER MATCHES "arm-vita-eabi"))
|
|
set(PS2X_IS_VITA ON)
|
|
endif()
|
|
|
|
set(PS2X_IS_ANDROID OFF)
|
|
|
|
if(ANDROID)
|
|
set(PS2X_IS_ANDROID ON)
|
|
endif()
|
|
|
|
option(PS2X_VITA_CREATE_PACKAGE "Create Vita eboot/vpk targets" ON)
|
|
set(PS2X_VITA_APP_NAME "PS2 Retro X" CACHE STRING "Display name for the Vita bubble")
|
|
set(PS2X_VITA_TITLEID "RANJ00001" CACHE STRING "9-character Vita title id")
|
|
set(PS2X_VITA_VERSION "01.00" CACHE STRING "Vita app version")
|
|
set(PS2X_DEFAULT_BOOT_ELF "" CACHE STRING "Guest ELF path passed directly to main() when argv is unavailable")
|
|
|
|
if(PS2X_IS_VITA)
|
|
if(NOT DEFINED ENV{VITASDK})
|
|
message(FATAL_ERROR "VITASDK is not defined. Configure inside the VitaSDK environment or pass the Vita toolchain file.")
|
|
endif()
|
|
|
|
set(PS2X_VITASDK "$ENV{VITASDK}")
|
|
|
|
if(NOT EXISTS "${PS2X_VITASDK}/share/vita.cmake")
|
|
message(FATAL_ERROR "Could not find vita.cmake under ${PS2X_VITASDK}/share.")
|
|
endif()
|
|
|
|
include("${PS2X_VITASDK}/share/vita.cmake" REQUIRED)
|
|
else()
|
|
include(FetchContent)
|
|
set(FETCHCONTENT_QUIET FALSE)
|
|
set(BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
|
|
set(BUILD_GAMES OFF CACHE BOOL "" FORCE)
|
|
|
|
if(PS2X_IS_ANDROID)
|
|
set(PLATFORM "Android" CACHE STRING "" FORCE)
|
|
endif()
|
|
|
|
FetchContent_Declare(
|
|
raylib
|
|
GIT_REPOSITORY "https://github.com/raysan5/raylib.git"
|
|
GIT_TAG "5.5" # we will migrate to 4.2.0 later, trust me it will be better
|
|
GIT_PROGRESS TRUE
|
|
)
|
|
FetchContent_MakeAvailable(raylib)
|
|
|
|
if(PS2X_ENABLE_DEBUG_UI AND NOT PS2X_IS_ANDROID)
|
|
FetchContent_Declare(
|
|
imgui
|
|
GIT_REPOSITORY https://github.com/ocornut/imgui.git
|
|
GIT_TAG "v1.92.7-docking"
|
|
GIT_SHALLOW TRUE
|
|
)
|
|
FetchContent_GetProperties(imgui)
|
|
|
|
if(NOT imgui_POPULATED)
|
|
FetchContent_Populate(imgui)
|
|
endif()
|
|
|
|
set(PS2X_IMGUI_SOURCE_DIR "${imgui_SOURCE_DIR}")
|
|
|
|
add_library(imgui STATIC
|
|
"${PS2X_IMGUI_SOURCE_DIR}/imgui.cpp"
|
|
"${PS2X_IMGUI_SOURCE_DIR}/imgui_draw.cpp"
|
|
"${PS2X_IMGUI_SOURCE_DIR}/imgui_tables.cpp"
|
|
"${PS2X_IMGUI_SOURCE_DIR}/imgui_widgets.cpp"
|
|
"${PS2X_IMGUI_SOURCE_DIR}/imgui_demo.cpp"
|
|
)
|
|
target_include_directories(imgui PUBLIC "${PS2X_IMGUI_SOURCE_DIR}")
|
|
|
|
FetchContent_Declare(
|
|
rlImGui
|
|
GIT_REPOSITORY https://github.com/raylib-extras/rlImGui.git
|
|
GIT_TAG "Raylib_5_5"
|
|
GIT_SHALLOW TRUE
|
|
)
|
|
FetchContent_GetProperties(rlImGui)
|
|
|
|
if(NOT rlimgui_POPULATED)
|
|
FetchContent_Populate(rlImGui)
|
|
endif()
|
|
|
|
set(PS2X_RLIMGUI_SOURCE_DIR "${rlimgui_SOURCE_DIR}")
|
|
|
|
add_library(rlImGui STATIC
|
|
"${PS2X_RLIMGUI_SOURCE_DIR}/rlImGui.cpp"
|
|
)
|
|
target_include_directories(rlImGui PUBLIC "${PS2X_RLIMGUI_SOURCE_DIR}")
|
|
target_link_libraries(rlImGui PUBLIC raylib imgui)
|
|
endif()
|
|
endif()
|
|
|
|
add_library(ps2_host_backend INTERFACE)
|
|
|
|
set(PS2X_DEFAULT_BOOT_ELF_DEFINE "")
|
|
|
|
if(PS2X_DEFAULT_BOOT_ELF)
|
|
set(PS2X_DEFAULT_BOOT_ELF_DEFINE "${PS2X_DEFAULT_BOOT_ELF}")
|
|
string(REPLACE "\\" "\\\\" PS2X_DEFAULT_BOOT_ELF_DEFINE "${PS2X_DEFAULT_BOOT_ELF_DEFINE}")
|
|
string(REPLACE "\"" "\\\"" PS2X_DEFAULT_BOOT_ELF_DEFINE "${PS2X_DEFAULT_BOOT_ELF_DEFINE}")
|
|
endif()
|
|
|
|
if(PS2X_IS_VITA)
|
|
set(PS2X_VITA_PREFIX "${PS2X_VITASDK}/arm-vita-eabi")
|
|
set(PS2X_VITA_EXTRA_INCLUDE_DIRS "" CACHE STRING "Extra include directories for Vita host dependencies")
|
|
set(PS2X_VITA_LIBRARY_DIR "${PS2X_VITA_PREFIX}/lib")
|
|
set(PS2X_VITA_REQUIRED_LIBRARY_NAMES
|
|
raylib
|
|
SDL2
|
|
OpenSLES
|
|
taihen_stub
|
|
SceAppMgr_stub
|
|
SceCtrl_stub
|
|
SceGxm_stub
|
|
SceCommonDialog_stub
|
|
SceLibKernel_stub
|
|
SceAudio_stub
|
|
SceTouch_stub
|
|
SceHid_stub
|
|
SceMotion_stub
|
|
SceSysmodule_stub
|
|
SceIofilemgr_stub
|
|
SceNetCtl_stub
|
|
SceNet_stub
|
|
SceDisplay_stub
|
|
SceAppUtil_stub
|
|
SceAudioIn_stub
|
|
ScePower_stub
|
|
SceProcessmgr_stub
|
|
SceIme_stub
|
|
libIMGEGL_stub_weak
|
|
libgpu_es4_ext_stub_weak
|
|
libGLESv2_stub_weak
|
|
libGL_stub_weak
|
|
libGLESv1_CM_stub_weak
|
|
)
|
|
|
|
set(PS2X_VITA_INCLUDE_DIRS
|
|
"${PS2X_VITA_PREFIX}/include"
|
|
)
|
|
|
|
foreach(PS2X_VITA_OPTIONAL_INCLUDE_DIR IN ITEMS
|
|
"${PS2X_VITA_PREFIX}/include/raylib"
|
|
"${PS2X_VITA_PREFIX}/include/SDL2")
|
|
if(EXISTS "${PS2X_VITA_OPTIONAL_INCLUDE_DIR}")
|
|
list(APPEND PS2X_VITA_INCLUDE_DIRS "${PS2X_VITA_OPTIONAL_INCLUDE_DIR}")
|
|
endif()
|
|
endforeach()
|
|
|
|
if(PS2X_VITA_EXTRA_INCLUDE_DIRS)
|
|
list(APPEND PS2X_VITA_INCLUDE_DIRS ${PS2X_VITA_EXTRA_INCLUDE_DIRS})
|
|
endif()
|
|
|
|
if(NOT EXISTS "${PS2X_VITA_PREFIX}/include/SDL2/SDL.h")
|
|
message(FATAL_ERROR
|
|
"Missing SDL2 headers under ${PS2X_VITA_PREFIX}/include/SDL2. "
|
|
"Quenom/raylib-5.5-vita requires SDL2 with PVR support installed into VitaSDK.")
|
|
endif()
|
|
|
|
if(NOT EXISTS "${PS2X_VITA_LIBRARY_DIR}")
|
|
message(FATAL_ERROR "Missing Vita library directory: ${PS2X_VITA_LIBRARY_DIR}")
|
|
endif()
|
|
|
|
function(ps2x_find_vita_library out_var library_name)
|
|
string(MAKE_C_IDENTIFIER "${library_name}" library_id)
|
|
set(cache_var "PS2X_VITA_LIB_${library_id}")
|
|
|
|
find_library(${cache_var}
|
|
NAMES "${library_name}" "${library_name}.a" "lib${library_name}.a"
|
|
PATHS "${PS2X_VITA_LIBRARY_DIR}"
|
|
NO_DEFAULT_PATH
|
|
)
|
|
|
|
if(NOT ${cache_var})
|
|
message(FATAL_ERROR
|
|
"Could not find Vita library '${library_name}' under ${PS2X_VITA_LIBRARY_DIR}. "
|
|
"Install Quenom/raylib-5.5-vita and its SDL2/PVR dependencies into VitaSDK first.")
|
|
endif()
|
|
|
|
set(${out_var} "${${cache_var}}" PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
set(PS2X_VITA_RESOLVED_LIBRARIES "")
|
|
|
|
foreach(PS2X_VITA_LIBRARY_NAME IN LISTS PS2X_VITA_REQUIRED_LIBRARY_NAMES)
|
|
ps2x_find_vita_library(PS2X_VITA_LIBRARY_PATH "${PS2X_VITA_LIBRARY_NAME}")
|
|
list(APPEND PS2X_VITA_RESOLVED_LIBRARIES "${PS2X_VITA_LIBRARY_PATH}")
|
|
endforeach()
|
|
|
|
target_compile_definitions(ps2_host_backend INTERFACE PLATFORM_VITA)
|
|
target_include_directories(ps2_host_backend INTERFACE ${PS2X_VITA_INCLUDE_DIRS})
|
|
target_link_libraries(ps2_host_backend INTERFACE
|
|
${PS2X_VITA_RESOLVED_LIBRARIES}
|
|
m
|
|
c
|
|
pthread
|
|
)
|
|
else()
|
|
target_link_libraries(ps2_host_backend INTERFACE raylib)
|
|
|
|
if(PS2X_IS_ANDROID)
|
|
target_link_libraries(ps2_host_backend INTERFACE log android)
|
|
endif()
|
|
endif()
|
|
|
|
if(PS2X_IS_ANDROID)
|
|
set(PS2X_ENABLE_FFMPEG_DEFAULT OFF)
|
|
else()
|
|
set(PS2X_ENABLE_FFMPEG_DEFAULT ON)
|
|
endif()
|
|
|
|
option(PS2X_ENABLE_FFMPEG "Enable FFmpeg-backed MPEG video decoding" ${PS2X_ENABLE_FFMPEG_DEFAULT})
|
|
|
|
if(NOT PS2X_ENABLE_FFMPEG)
|
|
message(STATUS "FFmpeg disabled; MPEG video decode falls back to stub frames")
|
|
add_library(ffmpeg INTERFACE)
|
|
elseif(WIN32)
|
|
include(ExternalProject)
|
|
|
|
set(FFMPEG_PREBUILT_TAG "n7.1-241205")
|
|
set(FFMPEG_PREBUILT_URL
|
|
"https://github.com/System233/ffmpeg-msvc-prebuilt/releases/download/${FFMPEG_PREBUILT_TAG}/ffmpeg-${FFMPEG_PREBUILT_TAG}-lgpl-amd64-shared.zip")
|
|
|
|
set(FFMPEG_PREFIX_DIR "${CMAKE_BINARY_DIR}/ThirdParty/ffmpeg-prefix")
|
|
set(FFMPEG_SOURCE_DIR "${FFMPEG_PREFIX_DIR}/src/ffmpeg_external")
|
|
set(FFMPEG_INCLUDE_DIR "${FFMPEG_SOURCE_DIR}/include")
|
|
set(FFMPEG_LIB_DIR "${FFMPEG_SOURCE_DIR}/bin")
|
|
set(FFMPEG_BIN_DIR "${FFMPEG_SOURCE_DIR}/bin")
|
|
|
|
ExternalProject_Add(ffmpeg_external
|
|
URL "${FFMPEG_PREBUILT_URL}"
|
|
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
|
|
PREFIX "${FFMPEG_PREFIX_DIR}"
|
|
CONFIGURE_COMMAND ""
|
|
BUILD_COMMAND ""
|
|
INSTALL_COMMAND ""
|
|
BUILD_BYPRODUCTS
|
|
"${FFMPEG_LIB_DIR}/avcodec.lib"
|
|
"${FFMPEG_LIB_DIR}/avformat.lib"
|
|
"${FFMPEG_LIB_DIR}/avutil.lib"
|
|
"${FFMPEG_LIB_DIR}/swresample.lib"
|
|
"${FFMPEG_LIB_DIR}/swscale.lib"
|
|
)
|
|
|
|
# Link against the import libraries shipped with the Windows DLLs.
|
|
add_library(ffmpeg_avcodec STATIC IMPORTED GLOBAL)
|
|
set_target_properties(ffmpeg_avcodec PROPERTIES
|
|
IMPORTED_LOCATION "${FFMPEG_LIB_DIR}/avcodec.lib"
|
|
INTERFACE_INCLUDE_DIRECTORIES "${FFMPEG_INCLUDE_DIR}"
|
|
)
|
|
add_dependencies(ffmpeg_avcodec ffmpeg_external)
|
|
|
|
add_library(ffmpeg_avformat STATIC IMPORTED GLOBAL)
|
|
set_target_properties(ffmpeg_avformat PROPERTIES
|
|
IMPORTED_LOCATION "${FFMPEG_LIB_DIR}/avformat.lib"
|
|
INTERFACE_INCLUDE_DIRECTORIES "${FFMPEG_INCLUDE_DIR}"
|
|
)
|
|
add_dependencies(ffmpeg_avformat ffmpeg_external)
|
|
|
|
add_library(ffmpeg_avutil STATIC IMPORTED GLOBAL)
|
|
set_target_properties(ffmpeg_avutil PROPERTIES
|
|
IMPORTED_LOCATION "${FFMPEG_LIB_DIR}/avutil.lib"
|
|
INTERFACE_INCLUDE_DIRECTORIES "${FFMPEG_INCLUDE_DIR}"
|
|
)
|
|
add_dependencies(ffmpeg_avutil ffmpeg_external)
|
|
|
|
add_library(ffmpeg_swresample STATIC IMPORTED GLOBAL)
|
|
set_target_properties(ffmpeg_swresample PROPERTIES
|
|
IMPORTED_LOCATION "${FFMPEG_LIB_DIR}/swresample.lib"
|
|
INTERFACE_INCLUDE_DIRECTORIES "${FFMPEG_INCLUDE_DIR}"
|
|
)
|
|
add_dependencies(ffmpeg_swresample ffmpeg_external)
|
|
|
|
add_library(ffmpeg_swscale STATIC IMPORTED GLOBAL)
|
|
set_target_properties(ffmpeg_swscale PROPERTIES
|
|
IMPORTED_LOCATION "${FFMPEG_LIB_DIR}/swscale.lib"
|
|
INTERFACE_INCLUDE_DIRECTORIES "${FFMPEG_INCLUDE_DIR}"
|
|
)
|
|
add_dependencies(ffmpeg_swscale ffmpeg_external)
|
|
|
|
add_library(ffmpeg INTERFACE)
|
|
target_link_libraries(ffmpeg INTERFACE
|
|
ffmpeg_avcodec
|
|
ffmpeg_avformat
|
|
ffmpeg_avutil
|
|
ffmpeg_swresample
|
|
ffmpeg_swscale
|
|
bcrypt
|
|
secur32
|
|
ws2_32
|
|
user32
|
|
advapi32
|
|
ole32
|
|
shell32
|
|
)
|
|
|
|
set(PS2X_FFMPEG_BIN_DIR "${FFMPEG_BIN_DIR}" CACHE INTERNAL "Directory containing FFmpeg runtime DLLs")
|
|
set(PS2X_COPY_FFMPEG_DLLS_SCRIPT
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/CopyFfmpegDlls.cmake"
|
|
CACHE INTERNAL
|
|
"Script used to stage FFmpeg runtime DLLs beside executables")
|
|
else()
|
|
find_package(PkgConfig REQUIRED)
|
|
pkg_check_modules(FFMPEG REQUIRED IMPORTED_TARGET GLOBAL
|
|
libavcodec
|
|
libavformat
|
|
libavutil
|
|
libswresample
|
|
libswscale
|
|
)
|
|
|
|
add_library(ffmpeg INTERFACE)
|
|
target_link_libraries(ffmpeg INTERFACE PkgConfig::FFMPEG)
|
|
endif()
|
|
|
|
function(ps2x_stage_ffmpeg_runtime_dlls target_name)
|
|
if(NOT WIN32)
|
|
return()
|
|
endif()
|
|
|
|
if(NOT PS2X_FFMPEG_BIN_DIR OR NOT PS2X_COPY_FFMPEG_DLLS_SCRIPT)
|
|
return()
|
|
endif()
|
|
|
|
if(TARGET ffmpeg_external)
|
|
add_dependencies(${target_name} ffmpeg_external)
|
|
endif()
|
|
|
|
add_custom_command(
|
|
TARGET ${target_name} POST_BUILD
|
|
COMMAND "${CMAKE_COMMAND}"
|
|
"-Dsource_dir=${PS2X_FFMPEG_BIN_DIR}"
|
|
"-Ddest_dir=$<TARGET_FILE_DIR:${target_name}>"
|
|
-P "${PS2X_COPY_FFMPEG_DLLS_SCRIPT}"
|
|
VERBATIM
|
|
)
|
|
endfunction()
|
|
|
|
add_library(ps2_runtime STATIC
|
|
src/lib/game_overrides.cpp
|
|
src/lib/gs/ps2_gif_arbiter.cpp
|
|
src/lib/ps2_audio.cpp
|
|
src/lib/ps2_audio_vag.cpp
|
|
src/lib/gs/ps2_gs_memory.cpp
|
|
src/lib/gs/gs_frontend.cpp
|
|
src/lib/gs/gs_cpu_backend.cpp
|
|
src/lib/ps2_iop_host.cpp
|
|
src/lib/ps2_memory.cpp
|
|
src/lib/ps2_pad.cpp
|
|
src/lib/ps2_rom_device.cpp
|
|
src/lib/ps2_vfs.cpp
|
|
src/lib/ps2_runtime.cpp
|
|
src/lib/ps2_vif1_interpreter.cpp
|
|
src/lib/vu/ps2_vu1_core.cpp
|
|
src/lib/vu/ps2_vu1_upper.cpp
|
|
src/lib/vu/ps2_vu1_lower.cpp
|
|
src/lib/games_database.cpp
|
|
)
|
|
|
|
if(PS2X_ENABLE_RUNTIME_LOGS)
|
|
target_compile_definitions(ps2_runtime PUBLIC
|
|
PS2_RUNTIME_LOGS=1
|
|
)
|
|
endif()
|
|
|
|
if(PS2X_ENABLE_AGRESSIVE_LOGS)
|
|
target_compile_definitions(ps2_runtime PUBLIC
|
|
AGRESSIVE_LOGS=1
|
|
PS2_FUNCTION_LOG_TRACKER=1
|
|
)
|
|
endif()
|
|
|
|
if(PS2X_ENABLE_IOP_RPC_TRACE)
|
|
target_compile_definitions(ps2_runtime PUBLIC
|
|
PS2X_ENABLE_IOP_RPC_TRACE=1
|
|
)
|
|
else()
|
|
target_compile_definitions(ps2_runtime PUBLIC
|
|
PS2X_ENABLE_IOP_RPC_TRACE=0
|
|
)
|
|
endif()
|
|
|
|
if(PS2X_STRICT_RETURN_DIAGNOSTICS)
|
|
target_compile_definitions(ps2_runtime PUBLIC
|
|
PS2X_STRICT_RETURN_DIAGNOSTICS=1
|
|
)
|
|
endif()
|
|
|
|
target_compile_definitions(ps2_runtime PRIVATE
|
|
PS2X_HAS_FFMPEG=$<BOOL:${PS2X_ENABLE_FFMPEG}>
|
|
)
|
|
|
|
file(GLOB_RECURSE KERNEL_SRC_FILES CONFIGURE_DEPENDS
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/lib/Kernel/*.cpp"
|
|
)
|
|
|
|
target_sources(ps2_runtime PRIVATE
|
|
${KERNEL_SRC_FILES}
|
|
)
|
|
|
|
file(GLOB RUNNER_SRC_FILES CONFIGURE_DEPENDS
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/runner/*.cpp"
|
|
)
|
|
|
|
set(RUNNER_MAIN_CPP "${CMAKE_CURRENT_SOURCE_DIR}/src/runner/main.cpp")
|
|
set(ROOT_MAIN_CPP "${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp")
|
|
|
|
if(EXISTS "${RUNNER_MAIN_CPP}")
|
|
list(APPEND RUNNER_SRC_FILES "${RUNNER_MAIN_CPP}")
|
|
elseif(EXISTS "${ROOT_MAIN_CPP}")
|
|
list(APPEND RUNNER_SRC_FILES "${ROOT_MAIN_CPP}")
|
|
endif()
|
|
|
|
if(PS2X_IS_ANDROID)
|
|
add_library(ps2EntryRunner SHARED
|
|
${RUNNER_SRC_FILES}
|
|
)
|
|
|
|
target_link_options(ps2EntryRunner PRIVATE "-Wl,--undefined=ANativeActivity_onCreate")
|
|
else()
|
|
add_executable(ps2EntryRunner
|
|
${RUNNER_SRC_FILES}
|
|
)
|
|
endif()
|
|
|
|
if(PS2X_ENABLE_RUNNER_UNITY_BUILD)
|
|
set_target_properties(ps2EntryRunner PROPERTIES
|
|
UNITY_BUILD ON
|
|
UNITY_BUILD_BATCH_SIZE "${PS2X_RUNNER_UNITY_BUILD_BATCH_SIZE}"
|
|
)
|
|
endif()
|
|
|
|
if(PS2X_ENABLE_RUNNER_PCH)
|
|
set(PS2X_RUNNER_PCH_HEADERS
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/include/ps2_runtime_macros.h"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/include/ps2_runtime.h"
|
|
)
|
|
|
|
foreach(PS2X_RUNNER_GENERATED_HEADER IN ITEMS
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/include/ps2_recompiled_functions.h"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/include/ps2_recompiled_stubs.h")
|
|
if(EXISTS "${PS2X_RUNNER_GENERATED_HEADER}")
|
|
list(APPEND PS2X_RUNNER_PCH_HEADERS "${PS2X_RUNNER_GENERATED_HEADER}")
|
|
endif()
|
|
endforeach()
|
|
|
|
list(APPEND PS2X_RUNNER_PCH_HEADERS
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/include/ps2_syscalls.h"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/include/ps2_stubs.h"
|
|
)
|
|
|
|
target_precompile_headers(ps2EntryRunner PRIVATE ${PS2X_RUNNER_PCH_HEADERS})
|
|
endif()
|
|
|
|
if(PS2X_DEFAULT_BOOT_ELF_DEFINE)
|
|
target_compile_definitions(ps2EntryRunner PRIVATE
|
|
PS2X_DEFAULT_BOOT_ELF="${PS2X_DEFAULT_BOOT_ELF_DEFINE}"
|
|
)
|
|
endif()
|
|
|
|
if(MSVC)
|
|
target_compile_options(ps2EntryRunner PRIVATE /FS)
|
|
endif()
|
|
|
|
target_include_directories(ps2_runtime PUBLIC
|
|
${CMAKE_CURRENT_SOURCE_DIR}/include
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src/lib/Kernel
|
|
)
|
|
|
|
target_link_libraries(ps2_runtime PUBLIC ps2_host_backend ffmpeg ps2_iop)
|
|
target_link_libraries(ps2EntryRunner
|
|
PRIVATE
|
|
ps2_runtime
|
|
)
|
|
|
|
if(PS2X_ENABLE_DEBUG_UI AND NOT PS2X_IS_VITA AND NOT PS2X_IS_ANDROID)
|
|
target_sources(ps2EntryRunner PRIVATE
|
|
src/lib/ps2_debug_panel.cpp
|
|
)
|
|
target_link_libraries(ps2EntryRunner PRIVATE rlImGui imgui)
|
|
target_compile_definitions(ps2EntryRunner PRIVATE PS2X_ENABLE_DEBUG_UI=1)
|
|
endif()
|
|
|
|
ps2x_stage_ffmpeg_runtime_dlls(ps2EntryRunner)
|
|
|
|
if(PS2X_IS_VITA)
|
|
set(VITA_MKSFOEX_FLAGS "${VITA_MKSFOEX_FLAGS} -d PARENTAL_LEVEL=1")
|
|
set(VITA_MKSFOEX_FLAGS "${VITA_MKSFOEX_FLAGS} -d ATTRIBUTE2=12")
|
|
|
|
if(PS2X_VITA_CREATE_PACKAGE)
|
|
set(PS2X_VITA_VPK_FILES "")
|
|
|
|
foreach(PS2X_VITA_MODULE IN ITEMS
|
|
libgpu_es4_ext.suprx
|
|
libIMGEGL.suprx
|
|
libGLESv2.suprx
|
|
libpvrPSP2_WSEGL.suprx
|
|
libGL.suprx)
|
|
set(PS2X_VITA_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/vita/module/${PS2X_VITA_MODULE}")
|
|
|
|
if(EXISTS "${PS2X_VITA_MODULE_PATH}")
|
|
list(APPEND PS2X_VITA_VPK_FILES FILE "${PS2X_VITA_MODULE_PATH}" "module/${PS2X_VITA_MODULE}")
|
|
else()
|
|
message(WARNING
|
|
"Missing ${PS2X_VITA_MODULE_PATH}; the vpk will rely on ur0:data/external/ for it")
|
|
endif()
|
|
endforeach()
|
|
|
|
vita_create_self(eboot.bin ps2EntryRunner UNSAFE)
|
|
vita_create_vpk(ps2EntryRunner.vpk ${PS2X_VITA_TITLEID} eboot.bin
|
|
VERSION ${PS2X_VITA_VERSION}
|
|
NAME ${PS2X_VITA_APP_NAME}
|
|
${PS2X_VITA_VPK_FILES}
|
|
)
|
|
endif()
|
|
endif()
|
|
|
|
if(CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
|
|
EnableFastReleaseMode(ps2_runtime)
|
|
EnableFastReleaseMode(ps2EntryRunner)
|
|
|
|
if(WIN32 AND NOT PS2X_SHOW_WINDOWS_CONSOLE)
|
|
if(MSVC)
|
|
target_link_options(ps2EntryRunner PRIVATE
|
|
$<$<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>:/SUBSYSTEM:WINDOWS>
|
|
$<$<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>:/ENTRY:mainCRTStartup>
|
|
)
|
|
elseif(MINGW)
|
|
target_link_options(ps2EntryRunner PRIVATE
|
|
$<$<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>:-mwindows>
|
|
)
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
# Work around WinAPI vs raylib symbol clash for CloseWindow on x64
|
|
if(MSVC)
|
|
target_link_options(ps2EntryRunner PRIVATE "/FORCE:MULTIPLE")
|
|
endif()
|
|
|
|
# Vita: Work around for GCC 10's LTO plugin
|
|
if(PS2X_IS_VITA)
|
|
target_link_options(ps2EntryRunner PRIVATE "-Wl,--allow-multiple-definition")
|
|
target_sources(ps2EntryRunner PRIVATE src/lib/ps2_vita_runtime.cpp)
|
|
set_source_files_properties(src/lib/ps2_vita_runtime.cpp PROPERTIES
|
|
SKIP_UNITY_BUILD_INCLUSION TRUE
|
|
COMPILE_OPTIONS "-fno-lto"
|
|
)
|
|
endif()
|
|
|
|
if(PS2X_IS_ANDROID)
|
|
target_sources(ps2EntryRunner PRIVATE src/lib/ps2_android_runtime.cpp)
|
|
endif()
|
|
|
|
install(TARGETS ps2_runtime ps2EntryRunner
|
|
RUNTIME DESTINATION bin
|
|
LIBRARY DESTINATION lib
|
|
ARCHIVE DESTINATION lib
|
|
)
|
|
|
|
if(WIN32 AND PS2X_ENABLE_FFMPEG)
|
|
install(DIRECTORY "${FFMPEG_BIN_DIR}/"
|
|
DESTINATION bin
|
|
FILES_MATCHING
|
|
PATTERN "*.dll"
|
|
)
|
|
endif()
|
|
|
|
install(DIRECTORY include/
|
|
DESTINATION include
|
|
)
|