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 000000000..6c1f1a72d Binary files /dev/null and b/src/platform/ps3/icon0.png differ 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)