Skip to content

Commit 72f824f

Browse files
committed
Initial commit for auto prx stub generation
1 parent 9d20069 commit 72f824f

File tree

7 files changed

+74
-18
lines changed

7 files changed

+74
-18
lines changed

OpenOrbis-tc.cmake

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,14 @@ set(CMAKE_CXX_COMPILER_TARGET "${CMAKE_C_COMPILER_TARGET}" CACHE STRING "" FORCE
2525
set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY" CACHE STRING "" FORCE)
2626
set(CMAKE_SYSROOT "${OO_PS4_TOOLCHAIN}" CACHE PATH "" FORCE)
2727

28+
if(CMAKE_HOST_WIN32)
29+
set(OO_BINARIES_PATH ${OO_PS4_TOOLCHAIN}/bin/windows)
30+
elseif(CMAKE_HOST_LINUX)
31+
set(OO_BINARIES_PATH ${OO_PS4_TOOLCHAIN}/bin/linux)
32+
else()
33+
message(FATAL_ERROR "Unsupported OS")
34+
endif()
35+
2836
include_directories(SYSTEM
2937
${OO_PS4_TOOLCHAIN}/include
3038
${OO_PS4_TOOLCHAIN}/include/c++/v1
@@ -34,7 +42,7 @@ link_directories(BEFORE
3442
${OO_PS4_TOOLCHAIN}/lib
3543
)
3644

37-
add_link_options(-pie -nostartfiles -nodefaultlibs -lc -lc++ -lkernel -fuse-ld=lld${OO_PS4_LINKER_SUFFIX} -Wl,-m,elf_x86_64 -Wl,--eh-frame-hdr "-Wl,--script,${OO_PS4_TOOLCHAIN}/link.x")
45+
add_link_options(-nostartfiles -nodefaultlibs -lc -lc++ -lkernel -fuse-ld=lld${OO_PS4_LINKER_SUFFIX} -Wl,-m,elf_x86_64 -Wl,--eh-frame-hdr "-Wl,--script,${OO_PS4_TOOLCHAIN}/link.x")
3846

3947
add_compile_options(-nostdinc++ -nostdinc -fPIC -funwind-tables -fshort-wchar)
4048

@@ -46,37 +54,46 @@ else()
4654
add_compile_options(-O3)
4755
endif()
4856

57+
function(OpenOrbis_AddFSelfCommand TargetProject WorkDir FSelfName TargetSDKVer)
58+
set_target_properties(${TargetProject} PROPERTIES OUTPUT_NAME "${FSelfName}" SUFFIX ".elf" PREFIX "")
59+
60+
set(OUT_TYPE "eboot")
61+
set(OUT_EXT "bin")
62+
63+
if(NOT ${FSelfName} STREQUAL "eboot")
64+
set(OUT_TYPE "lib")
65+
set(OUT_EXT "prx")
66+
endif()
67+
68+
math(EXPR OO_FWVER "${TargetSDKVer} * 65536")
69+
70+
# Create object from generated elf file
71+
add_custom_command(TARGET ${TargetProject} POST_BUILD COMMAND
72+
${CMAKE_COMMAND} -E env "OO_PS4_TOOLCHAIN=${OO_PS4_TOOLCHAIN}"
73+
${OO_BINARIES_PATH}/create-fself -in "${WorkDir}/${FSelfName}.elf"
74+
--out "${WorkDir}/${FSelfName}.oelf" "--${OUT_TYPE}" "${WorkDir}/${FSelfName}.${OUT_EXT}" --paid 0x3800000000000011 --sdkver "${TargetSDKVer}" --fwversion "${OO_FWVER}"
75+
)
76+
77+
unset(OUT_TYPE)
78+
unset(OUT_EXT)
79+
unset(OO_FWVER)
80+
endfunction()
81+
4982
function(OpenOrbisPackage_PreProject)
5083
if(TARGET ${PKG_TITLE_ID})
5184
message(FATAL_ERROR "Test name collision detected: ${PKG_TITLE_ID}.")
5285
endif()
5386
endfunction()
5487

5588
function(OpenOrbisPackage_PostProject path_bin)
56-
set_target_properties(${PKG_TITLE_ID} PROPERTIES OUTPUT_NAME "eboot" SUFFIX ".elf" PREFIX "")
57-
58-
if(CMAKE_HOST_WIN32)
59-
set(ORBIS_BIN_PATH ${OO_PS4_TOOLCHAIN}/bin/windows)
60-
elseif(CMAKE_HOST_LINUX)
61-
set(ORBIS_BIN_PATH ${OO_PS4_TOOLCHAIN}/bin/linux)
62-
else()
63-
message(FATAL_ERROR "Unsupported OS")
64-
endif()
65-
6689
if(OO_PS4_NOPKG)
6790
set(PKG_SHOULDBUILD "nopkg")
6891
else()
6992
set(PKG_SHOULDBUILD "pkg")
7093
endif()
7194

72-
math(EXPR OO_FWVER "${PKG_SYSVER} * 65536")
73-
7495
# Create eboot.bin from generated elf file
75-
add_custom_command(TARGET ${PKG_TITLE_ID} POST_BUILD COMMAND
76-
${CMAKE_COMMAND} -E env "OO_PS4_TOOLCHAIN=${OO_PS4_TOOLCHAIN}"
77-
${ORBIS_BIN_PATH}/create-fself -in ${path_eboot} "${path_bin}/eboot.elf"
78-
--out "${path_bin}/eboot.oelf" --eboot "${path_bin}/eboot.bin" --paid 0x3800000000000011 --sdkver "${PKG_SYSVER}" --fwversion "${OO_FWVER}"
79-
)
96+
OpenOrbis_AddFSelfCommand(${PKG_TITLE_ID} ${path_bin} "eboot" ${PKG_SYSVER})
8097
get_filename_component(CURRENT_FOLDER_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME)
8198
set(install_dir "${CMAKE_INSTALL_PREFIX}/${CURRENT_FOLDER_NAME}/${PKG_TITLE_ID}")
8299

@@ -196,4 +213,6 @@ function(OpenOrbisPackage_PostProject path_bin)
196213
else()
197214
message(FATAL_ERROR "Unsupported OS")
198215
endif()
216+
217+
unset(install_dir)
199218
endfunction()

tests/app_data/sce_module/.gitkeep

Whitespace-only changes.
-51.2 KB
Binary file not shown.

tests/app_data/sce_module/libc.prx

-51.2 KB
Binary file not shown.

tests/app_data/sce_sys/about/.gitkeep

Whitespace-only changes.
-75.7 KB
Binary file not shown.

tests/ps4_package.cmake

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,36 @@
1+
function(create_lib work_dir work_lib_name src_files fw_version inst_path out_lib_name)
2+
add_library(${work_lib_name} SHARED ${src_files} ${OO_PS4_TOOLCHAIN}/lib/crtlib.o)
3+
OpenOrbis_AddFSelfCommand(${work_lib_name} ${work_dir} ${work_lib_name} ${fw_version})
4+
install(FILES ${work_dir}/${work_lib_name}.prx
5+
DESTINATION "${inst_path}"
6+
RENAME "${out_lib_name}"
7+
)
8+
endfunction()
9+
10+
function(internal_create_stub_libs out_dir fw_version)
11+
get_filename_component(curr_folder ${CMAKE_CURRENT_SOURCE_DIR} NAME)
12+
set(install_dir "${CMAKE_INSTALL_PREFIX}/${curr_folder}/${PKG_TITLE_ID}")
13+
14+
# Generate libc.prx stub
15+
if(NOT TARGET "c${fw_version}")
16+
create_lib(${out_dir} "c${fw_version}" "${OO_PS4_TOOLCHAIN}/src/modules/libc/libc/lib.c" ${fw_version} "${install_dir}/sce_module" "libc.prx")
17+
endif()
18+
19+
# Generate libSceFios2.prx
20+
if(NOT TARGET "fios${fw_version}")
21+
create_lib(${out_dir} "fios${fw_version}" "${OO_PS4_TOOLCHAIN}/src/modules/libSceFios2/libSceFios2/lib.c" ${fw_version} "${install_dir}/sce_module" "libSceFios2.prx")
22+
endif()
23+
24+
# Generate right.sprx
25+
if(NOT TARGET "right${fw_version}")
26+
create_lib(${out_dir} "right${fw_version}" "${OO_PS4_TOOLCHAIN}/src/modules/right/right/lib.c" ${fw_version} "${install_dir}/sce_sys/about" "right.sprx")
27+
target_link_options("right${fw_version}" PRIVATE "-Wl,--version-script=${OO_PS4_TOOLCHAIN}/src/modules/right/right/right.version")
28+
endif()
29+
30+
unset(install_dir)
31+
unset(curr_folder)
32+
endfunction()
33+
134
function(create_pkg pkg_title_id fw_major fw_minor src_files)
235
set(FW_MAJOR_PADDED 0 PARENT_SCOPE)
336
set(FW_MINOR_PADDED 0 PARENT_SCOPE)
@@ -67,7 +100,11 @@ function(create_pkg pkg_title_id fw_major fw_minor src_files)
67100
PRIVATE FW_VER_MAJOR=${fw_major} FW_VER_MINOR=${fw_minor} FW_VER="${PKG_SYSVER}u"
68101
)
69102

103+
target_link_options(${pkg_title_id} PRIVATE -pie)
104+
70105
add_dependencies(${pkg_title_id} CppUTest)
71106

107+
internal_create_stub_libs(${CMAKE_CURRENT_BINARY_DIR} ${PKG_SYSVER})
108+
72109
OpenOrbisPackage_PostProject(${out_dir})
73110
endfunction(create_pkg)

0 commit comments

Comments
 (0)