From 1ef3166601b282d95eed9d0c0dc21ce28be07bd9 Mon Sep 17 00:00:00 2001 From: olebeck <31539311+olebeck@users.noreply.github.com> Date: Sun, 22 Jun 2025 02:16:31 +0200 Subject: [PATCH] add psvita to cmake --- 3rdparty/CMakeLists.txt | 3 ++ CMakeLists.txt | 71 +++++++++++++++++++++++++++++------- CMakePresets.json | 41 +++++++++++++++++++++ cmake/modules/pvr_psp2.cmake | 53 +++++++++++++++++++++++++++ miniwin/CMakeLists.txt | 8 +++- 5 files changed, 160 insertions(+), 16 deletions(-) create mode 100644 CMakePresets.json create mode 100644 cmake/modules/pvr_psp2.cmake diff --git a/3rdparty/CMakeLists.txt b/3rdparty/CMakeLists.txt index 1e153bd9..daaeae0d 100644 --- a/3rdparty/CMakeLists.txt +++ b/3rdparty/CMakeLists.txt @@ -72,3 +72,6 @@ target_include_directories(imgui PUBLIC ${imgui_SOURCE_DIR}) target_link_libraries(imgui PUBLIC SDL3::Headers) target_link_libraries(imgui PRIVATE SDL3::SDL3) set_property(TARGET imgui PROPERTY CXX_CLANG_TIDY "") +if(VITA) + target_compile_definitions(imgui PRIVATE IMGUI_DISABLE_DEFAULT_SHELL_FUNCTIONS) +endif() diff --git a/CMakeLists.txt b/CMakeLists.txt index 461e8378..d1677011 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,7 +35,7 @@ option(ISLE_WERROR "Treat warnings as errors" OFF) option(ISLE_DEBUG "Enable imgui debug" ON) cmake_dependent_option(ISLE_USE_DX5 "Build with internal DirectX 5 SDK" "${NOT_MINGW}" "WIN32;CMAKE_SIZEOF_VOID_P EQUAL 4" OFF) cmake_dependent_option(ISLE_MINIWIN "Use miniwin" ON "NOT ISLE_USE_DX5" OFF) -cmake_dependent_option(ISLE_BUILD_CONFIG "Build CONFIG.EXE application" ON "MSVC OR ISLE_MINIWIN" OFF) +cmake_dependent_option(ISLE_BUILD_CONFIG "Build CONFIG.EXE application" ON "MSVC OR ISLE_MINIWIN;NOT VITA" OFF) cmake_dependent_option(ISLE_COMPILE_SHADERS "Compile shaders" ON "SDL_SHADERCROSS_BIN;TARGET Python3::Interpreter" OFF) option(CMAKE_POSITION_INDEPENDENT_CODE "Build with -fPIC" ON) option(ENABLE_CLANG_TIDY "Enable clang-tidy") @@ -43,6 +43,7 @@ option(DOWNLOAD_DEPENDENCIES "Download dependencies" ON) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" CACHE PATH "Directory where to put executables and dll") set(ISLE_EMSCRIPTEN_HOST "" CACHE STRING "Host URL for Emscripten streaming (e.g., https://test.com)") cmake_dependent_option(BUILD_SHARED_LIBS "Build lego1 as a shared library" ON "NOT EMSCRIPTEN" OFF) +set(LIBRARY_TYPE "SHARED") message(STATUS "Isle app: ${ISLE_BUILD_APP}") message(STATUS "Config app: ${ISLE_BUILD_CONFIG}") @@ -51,7 +52,42 @@ message(STATUS "Internal miniwin: ${ISLE_MINIWIN}") message(STATUS "Isle debugging: ${ISLE_DEBUG}") message(STATUS "Compile shaders: ${ISLE_COMPILE_SHADERS}") -if (DOWNLOAD_DEPENDENCIES) +macro(fetch_iniparser) + FetchContent_Declare( + iniparser + GIT_REPOSITORY "https://gitlab.com/iniparser/iniparser.git" + GIT_TAG "main" + EXCLUDE_FROM_ALL + ) + block() + set(BUILD_DOCS off) + set(BUILD_SHARED_LIBS off) + FetchContent_MakeAvailable(iniparser) + endblock() +endmacro() + +if(VITA) + set(LIBRARY_TYPE "STATIC") + list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/modules") + include(cmake/modules/pvr_psp2.cmake) + + FetchContent_Declare( + SDL3 + GIT_REPOSITORY "https://github.com/libsdl-org/SDL.git" + GIT_TAG "main" + EXCLUDE_FROM_ALL + ) + block() + set(VIDEO_VITA_PVR ON) + get_target_property(PVR_INCLUDES GLESv2 INTERFACE_INCLUDE_DIRECTORIES) + list(APPEND CMAKE_REQUIRED_INCLUDES ${PVR_INCLUDES}) + FetchContent_MakeAvailable(SDL3) + target_include_directories(SDL3-static PRIVATE ${PVR_INCLUDES}) + endblock() + + fetch_iniparser() + +elseif (DOWNLOAD_DEPENDENCIES) # FetchContent downloads and configures dependencies message(STATUS "Fetching SDL3 and iniparser. This might take a while...") include(FetchContent) @@ -63,17 +99,7 @@ if (DOWNLOAD_DEPENDENCIES) ) FetchContent_MakeAvailable(SDL3) - FetchContent_Declare( - iniparser - GIT_REPOSITORY "https://gitlab.com/iniparser/iniparser.git" - GIT_TAG "main" - EXCLUDE_FROM_ALL - ) - block() - set(BUILD_DOCS off) - set(BUILD_SHARED_LIBS off) - FetchContent_MakeAvailable(iniparser) - endblock() + fetch_iniparser() else() # find_package looks for already-installed system packages. # Configure with `-DCMAKE_PREFIX_PATH="/path/to/package1;/path/to/package2"` @@ -141,7 +167,7 @@ target_link_directories(DirectX5::DirectX5 INTERFACE "${CMAKE_SOURCE_DIR}/3rdpar add_library(Vec::Vec INTERFACE IMPORTED) target_include_directories(Vec::Vec INTERFACE "${CMAKE_SOURCE_DIR}/3rdparty/vec") -add_library(lego1 +add_library(lego1 ${LIBRARY_TYPE} LEGO1/main.cpp ) target_precompile_headers(lego1 PRIVATE "LEGO1/lego1_pch.h") @@ -644,6 +670,23 @@ endif() set(CPACK_PACKAGE_DIRECTORY "dist") set(CPACK_PACKAGE_FILE_NAME "isle-${PROJECT_VERSION}-${ISLE_PACKAGE_NAME}-${CMAKE_SYSTEM_PROCESSOR}") +if(VITA) + include("${VITASDK}/share/vita.cmake" REQUIRED) + + target_link_libraries(lego1 PRIVATE GLESv2) + + set(ISLE_PACKAGE_NAME "vita-isle") + set(VITA_APP_NAME "Hello World") + set(VITA_TITLEID "VSDK00006") + set(VITA_VERSION "01.00") + + vita_create_self(isle.self isle) + + vita_create_vpk(isle.vpk ${VITA_TITLEID} isle.self + VERSION ${VITA_VERSION} + NAME ${VITA_APP_NAME} + ) +endif() if(MSVC) set(CPACK_GENERATOR ZIP) else() diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 00000000..d0147d06 --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,41 @@ +{ + "version": 5, + "cmakeMinimumRequired": { + "major": 3, + "minor": 22, + "patch": 0 + }, + "configurePresets": [ + { + "name": "release", + "generator": "Ninja", + "binaryDir": "${sourceDir}/build/${presetName}", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release" + } + }, + { + "name": "debug", + "inherits": ["release"], + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug" + } + }, + + { + "name": "vita", + "inherits": ["release"], + "cacheVariables": { + "CMAKE_TOOLCHAIN_FILE": "$env{VITASDK}/share/vita.toolchain.cmake" + } + }, + + { + "name": "vita-debug", + "inherits": ["debug"], + "cacheVariables": { + "CMAKE_TOOLCHAIN_FILE": "$env{VITASDK}/share/vita.toolchain.cmake" + } + } + ] +} \ No newline at end of file diff --git a/cmake/modules/pvr_psp2.cmake b/cmake/modules/pvr_psp2.cmake new file mode 100644 index 00000000..0a52d6bc --- /dev/null +++ b/cmake/modules/pvr_psp2.cmake @@ -0,0 +1,53 @@ +cmake_minimum_required(VERSION 3.21) + +include(FetchContent) + +# headers +FetchContent_Declare( + PVR_PSP2 + URL https://github.com/GrapheneCt/PVR_PSP2/archive/refs/tags/v3.9.tar.gz + SOURCE_SUBDIR . + DOWNLOAD_EXTRACT_TIMESTAMP FALSE +) +FetchContent_MakeAvailable(PVR_PSP2) +set(PVR_PSP2_SOURCE_DIR ${pvr_psp2_SOURCE_DIR}) +set(PVR_PSP2_BINARY_DIR ${pvr_psp2_BINARY_DIR}) + +# stubs +file(DOWNLOAD + https://github.com/GrapheneCt/PVR_PSP2/releases/download/v3.9/vitasdk_stubs.zip + ${PVR_PSP2_BINARY_DIR}/vitasdk_stubs.zip + EXPECTED_HASH SHA256=7ee2498b58cb97871fcb0e3e134ce1045acf2c22ce4873b1844a391b5da4fe47 +) + +# suprxs +file(DOWNLOAD + https://github.com/GrapheneCt/PVR_PSP2/releases/download/v3.9/PSVita_Release.zip + ${PVR_PSP2_BINARY_DIR}/PSVita_Release.zip + EXPECTED_HASH SHA256=ed69be89f21c4894e8009a8c3567c89b1778c8db0beb3c2f4ea134adab4c494f +) + +# extract +file(MAKE_DIRECTORY ${PVR_PSP2_BINARY_DIR}/extracted) + +execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf ${PVR_PSP2_BINARY_DIR}/vitasdk_stubs.zip + WORKING_DIRECTORY ${PVR_PSP2_BINARY_DIR}/extracted) + +execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf ${PVR_PSP2_BINARY_DIR}/PSVita_Release.zip + WORKING_DIRECTORY ${PVR_PSP2_BINARY_DIR}/extracted) + +# create library +add_library(GLESv2 INTERFACE) +target_include_directories(GLESv2 INTERFACE + ${PVR_PSP2_SOURCE_DIR}/include +) +target_link_directories(GLESv2 INTERFACE + ${PVR_PSP2_BINARY_DIR}/extracted/libGLESv2_stub_vitasdk.a/ + ${PVR_PSP2_BINARY_DIR}/extracted/libgpu_es4_ext_stub_vitasdk.a/ + ${PVR_PSP2_BINARY_DIR}/extracted/libIMGEGL_stub_vitasdk.a/ +) +target_link_libraries(GLESv2 INTERFACE + libGLESv2_stub_weak + libgpu_es4_ext_stub_weak + libIMGEGL_stub_weak +) diff --git a/miniwin/CMakeLists.txt b/miniwin/CMakeLists.txt index 5017f456..88e0d471 100644 --- a/miniwin/CMakeLists.txt +++ b/miniwin/CMakeLists.txt @@ -38,12 +38,16 @@ else() message(STATUS "🧩 OpenGL 1.x support not enabled — needs OpenGL and GLEW") endif() -find_library(OPENGL_ES2_LIBRARY NAMES GLESv2) +if(TARGET GLESv2) + set(OPENGL_ES2_LIBRARY GLESv2) +else() + find_library(OPENGL_ES2_LIBRARY NAMES GLESv2) +endif() if(OPENGL_ES2_LIBRARY) message(STATUS "Found OpenGL: enabling OpenGL ES 2.x renderer") target_sources(miniwin PRIVATE src/d3drm/backends/opengles2/renderer.cpp) target_compile_definitions(miniwin PRIVATE USE_OPENGLES2) - target_link_libraries(miniwin PRIVATE OpenGL::GL) + target_link_libraries(miniwin PRIVATE ${OPENGL_ES2_LIBRARY}) else() message(STATUS "🧩 OpenGL ES 2.x support not enabled") endif()