From 96192205256e71e0a57b0c17a23ca9f1de5e3d2b Mon Sep 17 00:00:00 2001 From: Maximilian Mader Date: Fri, 23 May 2025 21:42:11 +0200 Subject: [PATCH] Hack the build system ... --- CMakeLists.txt | 42 ++++++++++-------- src/platform/ps3/CMakeLists.txt | 14 +++--- src/platform/ps3/CMakeToolchain.txt | 64 ++++++++++++++------------- src/platform/ps3/icon0.png | Bin 0 -> 27571 bytes src/platform/ps3/pkg-version.cmake | 37 ++++++++++++++++ src/platform/ps3/post-build.cmake | 66 ++++++++++++++++++++++++++++ src/platform/ps3/sfo.xml | 39 ++++++++++++++++ src/platform/sdl/CMakeLists.txt | 29 ++++++++++-- 8 files changed, 233 insertions(+), 58 deletions(-) create mode 100644 src/platform/ps3/icon0.png create mode 100644 src/platform/ps3/pkg-version.cmake create mode 100644 src/platform/ps3/post-build.cmake create mode 100644 src/platform/ps3/sfo.xml diff --git a/CMakeLists.txt b/CMakeLists.txt index 105ca878d..af1f68026 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -308,7 +308,9 @@ if(DEFINED PS3) set(BUILD_GLES2 OFF CACHE BOOL "Build with OpenGL|ES 2" FORCE) set(BUILD_GLES3 OFF CACHE BOOL "Build with OpenGL|ES 3" FORCE) set(USE_ELF OFF) - set(BUILD_SDL ON) + set(USE_PNG OFF) + set(USE_LIBZIP OFF) + set(BUILD_SDL OFF) set(BUILD_GL OFF) set(BUILD_QT OFF) set(ENABLE_SCRIPTING OFF) @@ -425,23 +427,23 @@ else() endif() if(BUILD_GL) -if(PS3) -list(APPEND FEATURES EGL) -set(OPENGL_LIBRARY EGL GL stdc++ gcm_sys rsx sysutil io audio rt lv2 io audio) -else() - find_package(OpenGL QUIET) - if(NOT OPENGL_FOUND OR (APPLE AND MACOSX_SDK VERSION_GREATER 10.14)) - set(BUILD_GL OFF CACHE BOOL "OpenGL not found" FORCE) - elseif(UNIX AND NOT APPLE AND TARGET OpenGL::GL) - set(OPENGL_LIBRARY OpenGL::GL) - endif() - if(OpenGL_GLX_FOUND) - list(APPEND FEATURES GLX) - endif() - if(OpenGL_EGL_FOUND) + if(PS3) list(APPEND FEATURES EGL) - list(APPEND OPENGL_LIBRARY ${OPENGL_egl_LIBRARY}) - endif() + set(OPENGL_LIBRARY EGL GL stdc++ gcm_sys rsx sysutil io audio rt lv2 io audio) + else() + find_package(OpenGL QUIET) + if(NOT OPENGL_FOUND OR (APPLE AND MACOSX_SDK VERSION_GREATER 10.14)) + set(BUILD_GL OFF CACHE BOOL "OpenGL not found" FORCE) + elseif(UNIX AND NOT APPLE AND TARGET OpenGL::GL) + set(OPENGL_LIBRARY OpenGL::GL) + endif() + if(OpenGL_GLX_FOUND) + list(APPEND FEATURES GLX) + endif() + if(OpenGL_EGL_FOUND) + list(APPEND FEATURES EGL) + list(APPEND OPENGL_LIBRARY ${OPENGL_egl_LIBRARY}) + endif() endif() endif() if(BUILD_GL) @@ -1008,7 +1010,7 @@ else() endif() endif() -if(DISABLE_FRONTENDS AND NOT PS3) +if(DISABLE_FRONTENDS) set(BUILD_SDL OFF) set(BUILD_QT OFF) endif() @@ -1231,6 +1233,8 @@ if(DISTBUILD) set(CPACK_COMPONENTS_ALL ${BINARY_NAME} ${BINARY_NAME}-dbg ${BINARY_NAME}-3ds ${BINARY_NAME}-perf) elseif(WII) set(CPACK_COMPONENTS_ALL ${BINARY_NAME} ${BINARY_NAME}-dbg ${BINARY_NAME}-wii ${BINARY_NAME}-perf) + elseif(PS3) + set(CPACK_COMPONENTS_ALL ${BINARY_NAME} ${BINARY_NAME}-dbg ${BINARY_NAME}-ps3 ${BINARY_NAME}-perf) elseif(PSP2) set(CPACK_COMPONENTS_ALL ${BINARY_NAME} ${BINARY_NAME}-dbg ${BINARY_NAME}-psp2 ${BINARY_NAME}-perf) elseif(SWITCH) @@ -1260,6 +1264,8 @@ elseif(PSP2) cpack_add_component(${BINARY_NAME}-psp2 GROUP base) elseif(WII) cpack_add_component(${BINARY_NAME}-wii GROUP base) +elseif(PS3) + cpack_add_component(${BINARY_NAME}-ps3 GROUP base) elseif(SWITCH) cpack_add_component(${BINARY_NAME}-switch GROUP base) endif() diff --git a/src/platform/ps3/CMakeLists.txt b/src/platform/ps3/CMakeLists.txt index d83bc68b9..0dec21750 100644 --- a/src/platform/ps3/CMakeLists.txt +++ b/src/platform/ps3/CMakeLists.txt @@ -1,14 +1,16 @@ -find_library(GLAPI_LIBRARY GL REQUIRED) -find_library(EGL_LIBRARY EGL REQUIRED) - set(OS_DEFINES _GNU_SOURCE IOAPI_NO_64 ENABLE_VFS_FD) list(APPEND VFS_SRC ${PROJECT_SOURCE_DIR}/src/util/vfs/vfs-fd.c ${PROJECT_SOURCE_DIR}/src/util/vfs/vfs-dirent.c) -list(APPEND GUI_SRC ${CMAKE_CURRENT_SOURCE_DIR}/gui-font.c) - -include_directories(AFTER ${OPENGL_EGL_INCLUDE_DIR}) set(VFS_SRC ${VFS_SRC} PARENT_SCOPE) set(OS_DEFINES ${OS_DEFINES} PARENT_SCOPE) set(OS_LIB ${OS_LIB} PARENT_SCOPE) +set(PS3_PKG_TITLE "${PROJECT_NAME} ${VERSION_STRING}") +set(PS3_PKG_TITLE_ID "MGBA00001") +set(PS3_PKG_PUBLISHER_ID "UP0001") +include(${CMAKE_CURRENT_SOURCE_DIR}/post-build.cmake) +include(${CMAKE_CURRENT_SOURCE_DIR}/pkg-version.cmake) +add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../sdl ${CMAKE_CURRENT_BINARY_DIR}/sdl) + +add_ps3_build_steps() diff --git a/src/platform/ps3/CMakeToolchain.txt b/src/platform/ps3/CMakeToolchain.txt index f5775865c..bb6d76f09 100644 --- a/src/platform/ps3/CMakeToolchain.txt +++ b/src/platform/ps3/CMakeToolchain.txt @@ -11,53 +11,57 @@ INCLUDE(CMakeForceCompiler) if(DEFINED ENV{PS3DEV}) - SET(PS3DEV $ENV{PS3DEV}) + set(PS3DEV $ENV{PS3DEV}) else() message(FATAL_ERROR "The environment variable PS3DEV needs needs to be defined.") endif() if(DEFINED ENV{PSL1GHT}) - SET(PSL1GHT $ENV{PSL1GHT}) + set(PSL1GHT $ENV{PSL1GHT}) else() message(FATAL_ERROR "The environment variable PSL1GHT needs to be defined.") endif() -SET(CMAKE_SYSTEM_NAME Generic) -SET(CMAKE_SYSTEM_VERSION 1) -SET(CMAKE_SYSTEM_PROCESSOR powerpc) +set(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_SYSTEM_VERSION 1) +set(CMAKE_SYSTEM_PROCESSOR powerpc) -SET(CMAKE_C_COMPILER ppu-gcc) -SET(CMAKE_CXX_COMPILER ppu-g++) +set(CMAKE_C_COMPILER ppu-gcc) +set(CMAKE_CXX_COMPILER ppu-g++) -SET(PPU_CFLAGS "-mhard-float -fmodulo-sched -ffunction-sections -fdata-sections -I$ENV{PSL1GHT}/ppu/include -I$ENV{PSL1GHT}/portlibs/ppu/include -I$ENV{PSL1GHT}/ppu/include/simdmath") -SET(PPU_CXXFLAGS "-D_GLIBCXX11_USE_C99_STDIO ${PPU_CFLAGS}") -SET(PPU_LDFLAGS "-mhard-float -fmodulo-sched -Wl,--gc-sections -L$ENV{PSL1GHT}/ppu/lib -L$ENV{PSL1GHT}/portlibs/ppu/lib") +set(MACHDEP "-mhard-float -fmodulo-sched -ffunction-sections -fdata-sections") -SET(CMAKE_INSTALL_PREFIX $ENV{PS3DEV}/portlibs/ppu) +set(INCLUDES "-I${PS3DEV}/ppu/include -I${PS3DEV}/portlibs/ppu/include") +set(PPU_CFLAGS "-mcpu=cell -mregnames -Wall ${MACHDEP} ${INCLUDES} -Wa,-mcell") +set(PPU_LDFLAGS "-mcpu=cell -mregnames -Wall ${MACHDEP} -Wl,--gc-sections -L${PS3DEV}/ppu/lib -L${PS3DEV}/portlibs/ppu/lib") +set(PPU_CXXFLAGS "-D_GLIBCXX11_USE_C99_STDIO ${PPU_CFLAGS}") -SET(CMAKE_FIND_ROOT_PATH $ENV{PS3DEV} $ENV{PS3DEV}/ppu $ENV{PS3DEV}/portlibs/ppu) -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 ${PS3DEV} ${PS3DEV}/ppu ${PS3DEV}/portlibs/ppu) +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_PROPERTY(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS TRUE) -SET(CMAKE_C_FLAGS_INIT ${PPU_CFLAGS}) -SET(CMAKE_CXX_FLAGS_INIT ${PPU_CXXFLAGS}) -SET(CMAKE_EXE_LINKER_FLAGS_INIT ${PPU_LDFLAGS}) -SET(CMAKE_EXECUTABLE_SUFFIX "elf") -SET(CMAKE_EXECUTABLE_SUFFIX_ASM .elf) -SET(CMAKE_EXECUTABLE_SUFFIX_C .elf) -SET(CMAKE_EXECUTABLE_SUFFIX_CXX .elf) +set(CMAKE_C_FLAGS ${PPU_CFLAGS}) +set(ASFLAGS "${MACHDEP} -mcpu=cell -mregnames -D__ASSEMBLY__ -Wa,-mcell ${INCLUDES}") +set(CMAKE_CXX_FLAGS ${PPU_CXXFLAGS}) +set(CMAKE_EXE_LINKER_FLAGS ${PPU_LDFLAGS}) +set(CMAKE_STATIC_LIBRARY_SUFFIX ".a") +set(CMAKE_STATIC_LIBRARY_SUFFIX_C ".a") +set(CMAKE_STATIC_LIBRARY_SUFFIX_CXX ".a") -SET(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "-nostartfiles -Wl,-r -Wl,-d") +set(CMAKE_EXECUTABLE_SUFFIX "elf") +set(CMAKE_EXECUTABLE_SUFFIX_ASM .elf) +set(CMAKE_EXECUTABLE_SUFFIX_C .elf) +set(CMAKE_EXECUTABLE_SUFFIX_CXX .elf) -SET($ENV{PKG_CONFIG_DIR} "") -SET($ENV{PKG_CONFIG_PATH} "") -SET($ENV{PKG_CONFIG_SYSROOT_DIR} "") -SET($ENV{PKG_CONFIG_LIBDIR} "$ENV{PS3DEV}/portlibs/ppu/lib/pkgconfig") +set($ENV{PKG_CONFIG_DIR} "") +set($ENV{PKG_CONFIG_PATH} "") +set($ENV{PKG_CONFIG_SYSROOT_DIR} "") +set($ENV{PKG_CONFIG_LIBDIR} "${PS3DEV}/portlibs/ppu/lib/pkgconfig") -SET(PS3 ON) -SET(PLATFORM_PS3 TRUE) -SET(PPU TRUE) +set(PS3 ON) +set(PLATFORM_PS3 TRUE) +set(PPU TRUE) diff --git a/src/platform/ps3/icon0.png b/src/platform/ps3/icon0.png new file mode 100644 index 0000000000000000000000000000000000000000..6c1f1a72d3f1c9d99b42d283cf5bb6eab1c81ce6 GIT binary patch literal 27571 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 Gq5lVO0U!JT literal 0 HcmV?d00001 diff --git a/src/platform/ps3/pkg-version.cmake b/src/platform/ps3/pkg-version.cmake new file mode 100644 index 000000000..d0f68fb6c --- /dev/null +++ b/src/platform/ps3/pkg-version.cmake @@ -0,0 +1,37 @@ +string(LENGTH "${LIB_VERSION_MAJOR}" _len) +string(SUBSTRING "00${LIB_VERSION_MAJOR}" ${_len} -1 PS3_APP_VER_MAJOR) +string(LENGTH "${LIB_VERSION_MINOR}" _len) +string(SUBSTRING "00${LIB_VERSION_MINOR}" ${_len} -1 PS3_APP_VER_MINOR) +set(PS3_APP_VER "${PS3_APP_VER_MAJOR}.${PS3_APP_VER_MINOR}") + +string(LENGTH "${LIB_VERSION_PATCH}" _len) +string(SUBSTRING "00${LIB_VERSION_PATCH}" ${_len} -1 PS3_APP_REVISION) +set(PS3_APP_REVISION "01.${PS3_APP_REVISION}") + +set(PS3_PKG_NP_TITLE_ID "${PS3_PKG_TITLE_ID}_00") +set(PS3_PKG_SERVICE_ID "${PS3_PKG_PUBLISHER_ID}-${PS3_PKG_NP_TITLE_ID}") +if(CMAKE_BUILD_TYPE STREQUAL "Release") + string(LENGTH "${PS3_PKG_ENTITLEMENT_LABEL_VERSION_STR}" _len) + if (${_len} GREATER 5) + set(PS3_PKG_ENTITLEMENT_LABEL_VERSION_STR "${LIB_VERSION_MAJOR}${LIB_VERSION_MINOR}") + string(LENGTH "${PS3_PKG_ENTITLEMENT_LABEL_VERSION_STR}" _len) + endif() + string(SUBSTRING "00000${PS3_PKG_ENTITLEMENT_LABEL_VERSION_STR}" ${_len} -1 PS3_PKG_ENTITLEMENT_LABEL_VERSION_STR) + + set(PS3_PKG_ENTITLEMENT_LABEL "MGBARELEASE${PS3_PKG_ENTITLEMENT_LABEL_VERSION_STR}") +else() + set(PS3_PKG_ENTITLEMENT_LABEL_VERSION_STR "${LIB_VERSION_MAJOR}${LIB_VERSION_MINOR}${LIB_VERSION_PATCH}") + + string(LENGTH "${PS3_PKG_ENTITLEMENT_LABEL_VERSION_STR}" _len) + if (${_len} GREATER 7) + set(PS3_PKG_ENTITLEMENT_LABEL_VERSION_STR "${LIB_VERSION_MAJOR}${LIB_VERSION_MINOR}") + string(LENGTH "${PS3_PKG_ENTITLEMENT_LABEL_VERSION_STR}" _len) + endif() + string(SUBSTRING "0000000${PS3_PKG_ENTITLEMENT_LABEL_VERSION_STR}" ${_len} -1 PS3_PKG_ENTITLEMENT_LABEL_VERSION_STR) + + set(PS3_PKG_ENTITLEMENT_LABEL "MDEBUG${PS3_PKG_ENTITLEMENT_LABEL_VERSION_STR}") +endif() +set(PS3_PKG_CONTENT_ID "${PS3_PKG_SERVICE_ID}-${PS3_PKG_ENTITLEMENT_LABEL}") + +set(PS3_PKG_ICON "${CMAKE_CURRENT_SOURCE_DIR}/icon0.png") +set(PS3_PKG_CONTENT_FOLDER "content/") diff --git a/src/platform/ps3/post-build.cmake b/src/platform/ps3/post-build.cmake new file mode 100644 index 000000000..86fcd294b --- /dev/null +++ b/src/platform/ps3/post-build.cmake @@ -0,0 +1,66 @@ +if(POLICY CMP0079) + cmake_policy(SET CMP0079 NEW) +endif() + +function(add_ps3_build_steps) + link_libraries(stdc++ simdmath rsx gcm_sys io audio sysutil rt lv2 m) + + setup_ps3_pkg() +endfunction() + +# Setup PS3 Package Generation +function(setup_ps3_pkg) + psl1ght_pkg_step1() + psl1ght_pkg_step2() + psl1ght_pkg_step3() + + add_dependencies(${BINARY_NAME}_pkg ${BINARY_NAME}_ps3_pkg_step3) +endfunction() + +# This function makes the staging directory, copies the icon into it, makes the .self into a npdrm self (EBOOT.BIN) and generates the PARAM.SFO +function(psl1ght_pkg_step1) + add_custom_target(${BINARY_NAME}_pkg ALL DEPENDS ${BINARY_NAME}-sdl) + + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/sfo.xml ${CMAKE_BINARY_DIR}/sfo.xml) + + add_custom_target(${BINARY_NAME}_ps3_pkg_step1) + add_custom_command( + TARGET ${BINARY_NAME}_ps3_pkg_step1 + COMMENT "Running initial PKG setup" + COMMAND mkdir -p ${CMAKE_BINARY_DIR}/${BINARY_NAME}_pkg/USRDIR # Make the staging directory + COMMAND cp ${PS3_PKG_ICON} ${CMAKE_BINARY_DIR}/${BINARY_NAME}_pkg/ICON0.PNG # Copy the icon into the staging directory + COMMAND ${PS3DEV}/bin/make_self_npdrm "$" "${CMAKE_BINARY_DIR}/${BINARY_NAME}_pkg/USRDIR/EBOOT.BIN" ${PS3_PKG_CONTENT_ID} # Make the MNDRM self file + COMMAND ${PS3DEV}/bin/sfo.py --title "${PS3_PKG_TITLE}" --appid "${PS3_PKG_TITLE_ID}" -f "${CMAKE_BINARY_DIR}/sfo.xml" ${CMAKE_BINARY_DIR}/${BINARY_NAME}_pkg/PARAM.SFO # Generate the PARAM.SFO from the given sfo.xml file + ) +endfunction() + +# This function just adds a custom command to copy content from a specific folder (the 2nd parameter) to the pkg staging folder +function(psl1ght_pkg_step2) + add_custom_target(${BINARY_NAME}_ps3_pkg_step2 DEPENDS ${BINARY_NAME}_ps3_pkg_step1) + add_custom_command( + TARGET ${BINARY_NAME}_ps3_pkg_step2 + COMMENT "Adding content files" + COMMAND cp -r ${CMAKE_SOURCE_DIR}/${PS3_PKG_CONTENT_FOLDER}/* ${CMAKE_BINARY_DIR}/${BINARY_NAME}_pkg/ # Copy the content into the staging directory + ) +endfunction() + +# This function builds the PKG before finalizing it for gnpdrm +function(psl1ght_pkg_step3) + file(GLOB RESULT "${CMAKE_SOURCE_DIR}/${PS3_PKG_CONTENT_FOLDER}/*") + list(LENGTH RESULT RES_LEN) + if(${RES_LEN} EQUAL 0) + # no content + add_custom_target(${BINARY_NAME}_ps3_pkg_step3 DEPENDS ${BINARY_NAME}_ps3_pkg_step1) + else() + # has content + add_custom_target(${BINARY_NAME}_ps3_pkg_step3 DEPENDS ${BINARY_NAME}_ps3_pkg_step2) + endif() + + add_custom_command( + TARGET ${BINARY_NAME}_ps3_pkg_step3 + COMMENT "Finalizing PKG build" + COMMAND ${PS3DEV}/bin/pkg.py --contentid ${PS3_PKG_CONTENT_ID} ${CMAKE_BINARY_DIR}/${BINARY_NAME}_pkg/ ${CMAKE_BINARY_DIR}/${BINARY_NAME}.pkg # Create the PKG file + COMMAND cp ${CMAKE_BINARY_DIR}/${BINARY_NAME}.pkg ${CMAKE_BINARY_DIR}/${BINARY_NAME}.gnpdrm.pkg # Copy that PKG file to a new PKG file for finalization + COMMAND ${PS3DEV}/bin/package_finalize ${CMAKE_BINARY_DIR}/${BINARY_NAME}.gnpdrm.pkg # Finalize that PKG file to get a GNPDRM PKG + ) +endfunction() diff --git a/src/platform/ps3/sfo.xml b/src/platform/ps3/sfo.xml new file mode 100644 index 000000000..bc54f75a9 --- /dev/null +++ b/src/platform/ps3/sfo.xml @@ -0,0 +1,39 @@ + + + + @PS3_APP_VER@ + + + 0 + + + 1 + + + HG + + + Mozilla Public License 2.0 (MPL 2.0) + + + 0 + + + 01.8000 + + + 63 + + + 279 + + + @PS3_PKG_TITLE@ + + + @PS3_PKG_TITLE_ID@ + + + @PS3_APP_REVISION@ + + diff --git a/src/platform/sdl/CMakeLists.txt b/src/platform/sdl/CMakeLists.txt index 69396aa1b..9c7126c54 100644 --- a/src/platform/sdl/CMakeLists.txt +++ b/src/platform/sdl/CMakeLists.txt @@ -63,6 +63,8 @@ elseif(APPLE) if(NOT CMAKE_SYSTEM_VERSION VERSION_LESS "19.0") # Darwin 19.x is macOS 10.15 list(APPEND SDL_LIBRARY "-framework GameController" "-framework CoreHaptics") endif() +elseif(PS3) + list(APPEND SDL_LIBRARY simdmath rsx gcm_sys io audio sysutil rt lv2 m) endif() if(NOT SDLMAIN_LIBRARY) @@ -72,11 +74,7 @@ endif() set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libsdl${SDL_VERSION_DEBIAN}" PARENT_SCOPE) file(GLOB PLATFORM_SRC ${CMAKE_CURRENT_SOURCE_DIR}/sdl-*.c) -if(PS3) -set(PLATFORM_LIBRARY EGL GL stdc++ gcm_sys rsx sysutil io audio rt lv2 io audio ${SDL_LIBRARY} EGL GL stdc++ gcm_sys rsx sysutil io audio rt lv2 io audio ${SDLMAIN_LIBRARY} EGL GL stdc++ gcm_sys rsx sysutil io audio rt lv2 io audio ${SDL_LIBRARY} ${PIXMAN-1_LIBRARIES}) -else() set(PLATFORM_LIBRARY ${SDL_LIBRARY} ${SDLMAIN_LIBRARY} ${SDL_LIBRARY} ${PIXMAN-1_LIBRARIES}) -endif() include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${PIXMAN-1_INCLUDE_DIRS} ${SDL_INCLUDE_DIR}) set(SDL_INCLUDE_DIR "${SDL_INCLUDE_DIR}" PARENT_SCOPE) @@ -114,6 +112,29 @@ if(NOT WIN32) else() set_target_properties(${BINARY_NAME}-sdl PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}") endif() + +if(PS3) + list(APPEND SDL_LIBRARY simdmath rsx gcm_sys io audio sysutil rt lv2 m) + + if(CMAKE_BUILD_TYPE STREQUAL "Release") + add_custom_command( + TARGET ${BINARY_NAME}-sdl + POST_BUILD + COMMENT "Stripping PS3 binary" + COMMAND ${PS3DEV}/ppu/bin/powerpc64-ps3-elf-strip $ -o $ # Strip the binary + ) + endif() + + add_custom_command( + TARGET ${BINARY_NAME}-sdl + POST_BUILD + COMMENT "Running PS3 specific post-build steps" + COMMAND ${PS3DEV}/bin/sprxlinker $ # Run sprxlinker on it + COMMAND ${PS3DEV}/bin/make_self $ $.self # Convert it into a .self file + COMMAND ${PS3DEV}/bin/fself $ $.fake.self # Convert the .self file info a .fake.self + ) +endif() + install(TARGETS ${BINARY_NAME}-sdl DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-sdl) if(UNIX) install(FILES ${PROJECT_SOURCE_DIR}/doc/mgba.6 DESTINATION ${MANDIR}/man6 COMPONENT ${BINARY_NAME}-sdl)