Hack the build system ...

This commit is contained in:
Maximilian Mader 2025-05-23 21:42:11 +02:00
parent e24288866a
commit 9619220525
Signed by: Max
GPG Key ID: F71D56A3151C4FB3
8 changed files with 233 additions and 58 deletions

View File

@ -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()

View File

@ -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()

View File

@ -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)

BIN
src/platform/ps3/icon0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View File

@ -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/")

View File

@ -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 "$<TARGET_FILE:${BINARY_NAME}-sdl>" "${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()

39
src/platform/ps3/sfo.xml Normal file
View File

@ -0,0 +1,39 @@
<?xml version="1.0" ?>
<sfo>
<value name="APP_VER" type="string">
@PS3_APP_VER@
</value>
<value name="ATTRIBUTE" type="integer">
0
</value>
<value name="BOOTABLE" type="integer">
1
</value>
<value name="CATEGORY" type="string">
HG
</value>
<value name="LICENSE" type="string">
Mozilla Public License 2.0 (MPL 2.0)
</value>
<value name="PARENTAL_LEVEL" type="integer">
0
</value>
<value name="PS3_SYSTEM_VER" type="string">
01.8000
</value>
<value name="RESOLUTION" type="integer">
63
</value>
<value name="SOUND_FORMAT" type="integer">
279
</value>
<value name="TITLE" type="string">
@PS3_PKG_TITLE@
</value>
<value name="TITLE_ID" type="string">
@PS3_PKG_TITLE_ID@
</value>
<value name="VERSION" type="string">
@PS3_APP_REVISION@
</value>
</sfo>

View File

@ -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 $<TARGET_FILE:${BINARY_NAME}-sdl> -o $<TARGET_FILE:${BINARY_NAME}-sdl> # Strip the binary
)
endif()
add_custom_command(
TARGET ${BINARY_NAME}-sdl
POST_BUILD
COMMENT "Running PS3 specific post-build steps"
COMMAND ${PS3DEV}/bin/sprxlinker $<TARGET_FILE:${BINARY_NAME}-sdl> # Run sprxlinker on it
COMMAND ${PS3DEV}/bin/make_self $<TARGET_FILE:${BINARY_NAME}-sdl> $<TARGET_FILE:${BINARY_NAME}-sdl>.self # Convert it into a .self file
COMMAND ${PS3DEV}/bin/fself $<TARGET_FILE:${BINARY_NAME}-sdl> $<TARGET_FILE:${BINARY_NAME}-sdl>.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)