Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions .github/workflows/Build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,32 @@ jobs:
fi
done

- name: Build sample in a nested directory (CMake)
run: |
set -euo pipefail
(cd samples/audio && cmake --preset psp -B build/debug && cmake --build build/debug -j)
test -f samples/audio/build/debug/EBOOT.PBP
cmp samples/audio/Resources/music.bgm samples/audio/build/debug/Resources/music.bgm
test ! -e samples/audio/build/debug/build
test -z "$(find samples/audio/build/debug -mindepth 2 -name CMakeCache.txt -print -quit)"

- name: Build all samples together (CMake)
run: |
set -euo pipefail
# One build tree for every sample: each must package into its own directory
(cd samples && cmake --preset psp && cmake --build --preset psp -j)
want=$(grep -c add_subdirectory samples/CMakeLists.txt)
got=$(find samples/cbuild -mindepth 2 -maxdepth 2 -name EBOOT.PBP | wc -l) # cbuild/<sample>/EBOOT.PBP
echo "EBOOT.PBP: $got of $want samples"
test "$got" -eq "$want"
test -z "$(find samples/cbuild -mindepth 2 -name CMakeCache.txt -print -quit)"
test ! -e samples/cbuild/audio/build
cmp samples/audio/Resources/music.bgm samples/cbuild/audio/Resources/music.bgm
test -f samples/cbuild/rectAndFonts/rectAndFonts
test ! -e samples/cbuild/rectAndFonts/dialog
test ! -e samples/cbuild/shapes/main.cpp
test ! -e samples/cbuild/shapes/shapes.hpp

host-tests:
name: Host unit tests
runs-on: ubuntu-latest
Expand Down
5 changes: 3 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -159,13 +159,14 @@ include(${CMAKE_SYSTEM_CMAKE_PLATFORM_PATH}/IMG.cmake)
# Specify that stub.S is an assembly file
set_source_files_properties(${SOURCE_DIR}/stub.S PROPERTIES LANGUAGE ASM)

# Suppress warnings for third-party library sources
# Suppress warnings for third-party library sources. Like the Makefile's CFLAGS_THIRD_PARTY,
# they don't get _PSP_FW_VERSION: libccc would switch to its sceIo path, which isn't the tested one
set_source_files_properties(
${PSPMATH_SOURCES}
${GIFLIB_SOURCES}
${INTRAFONT_SOURCES}
PROPERTIES
COMPILE_FLAGS "-w"
COMPILE_FLAGS "-w -U_PSP_FW_VERSION"
)

# Add sources to the target
Expand Down
51 changes: 51 additions & 0 deletions cmake/OSLibSample.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
function(osl_add_sample target title source)
add_executable(${target} ${source})

execute_process(COMMAND psp-config --psp-prefix OUTPUT_VARIABLE PSPDIR OUTPUT_STRIP_TRAILING_WHITESPACE)
if(PSPDIR)
target_link_libraries(${target} PRIVATE "-L${PSPDIR}/sdk/lib" "-L${PSPDIR}/lib")
endif()
target_link_libraries(${target} PRIVATE
osl
png jpeg z m
pspdisplay pspge pspuser pspdebug
pspsdk pspctrl psphprm pspumd psprtc pspgu pspgum pspaudiolib pspaudio pspaudiocodec psppower pspusb pspusbstor psputility pspssl psphttp pspwlan
${ARGN}
)

set(OUT_DIR "${CMAKE_CURRENT_BINARY_DIR}")
set_target_properties(${target} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${OUT_DIR}")
find_program(MKSFOEX mksfoex)
find_program(PACKPBP pack-pbp)
set(PARAM_SFO "${OUT_DIR}/PARAM.SFO")
set(EBOOT_PBP "${OUT_DIR}/EBOOT.PBP")
if(MKSFOEX AND PACKPBP)
add_custom_command(TARGET ${target} POST_BUILD
COMMAND ${MKSFOEX} "${title}" "${PARAM_SFO}"
COMMAND ${PACKPBP} "${EBOOT_PBP}" "${PARAM_SFO}" NULL NULL NULL NULL NULL $<TARGET_FILE:${target}> NULL
BYPRODUCTS "${PARAM_SFO}" "${EBOOT_PBP}"
COMMENT "Packaging EBOOT.PBP (ELF)" VERBATIM)
endif()

file(GLOB SAMPLE_FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/*")
foreach(F ${SAMPLE_FILES})
string(TOLOWER "${F}" F_LC)
if(F_LC MATCHES "\\.(c|cpp|h|hpp|o|elf|prx|pbp)$" OR F_LC STREQUAL "makefile")
continue()
endif()
set(F_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${F}")
if(IS_DIRECTORY "${F_PATH}")
# The active build may not have a cache on the first configure.
string(FIND "${CMAKE_CURRENT_BINARY_DIR}/" "${F_PATH}/" BUILD_DIR_PREFIX)
file(GLOB_RECURSE BUILD_CACHE_FILES "${F_PATH}/CMakeCache.txt")
if(BUILD_DIR_PREFIX EQUAL 0 OR BUILD_CACHE_FILES)
continue()
endif()
add_custom_command(TARGET ${target} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory "${F_PATH}" "${OUT_DIR}/${F}" VERBATIM)
else()
add_custom_command(TARGET ${target} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${F_PATH}" "${OUT_DIR}/${F}" VERBATIM)
endif()
endforeach()
endfunction()
3 changes: 2 additions & 1 deletion cmake/PSP.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ set(CMAKE_CXX_COMPILER psp-g++)
set(CMAKE_ASM_COMPILER psp-gcc)

# PSP Firmware version and defines
add_definitions(-DPSP_FW_VERSION=371 -D__PSP__ -DPSP)
# _PSP_FW_VERSION is what the code tests, as defined by the PSPSDK's build.mak for Make builds
add_definitions(-DPSP_FW_VERSION=371 -D_PSP_FW_VERSION=371 -D__PSP__ -DPSP)

# Get the PSP prefix using psp-config
execute_process(
Expand Down
49 changes: 2 additions & 47 deletions samples/OSK/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,50 +1,5 @@
cmake_minimum_required(VERSION 3.10)
project(OSK C)

add_executable(osk main.c)

# Link OSLib and PSP SDK libs (SDK libs last)
target_link_libraries(osk PRIVATE
osl
png jpeg z m
pspdisplay pspge pspuser pspdebug
pspsdk pspctrl psphprm pspumd psprtc pspgu pspgum pspaudiolib pspaudio pspaudiocodec psppower pspusb pspusbstor psputility pspssl psphttp pspwlan
)

# Ensure PSP SDK lib search paths
execute_process(COMMAND psp-config --psp-prefix OUTPUT_VARIABLE PSPDIR OUTPUT_STRIP_TRAILING_WHITESPACE)
if(PSPDIR)
target_link_directories(osk PRIVATE "${PSPDIR}/sdk/lib" "${PSPDIR}/lib")
target_link_options(osk PRIVATE "-L${PSPDIR}/sdk/lib" "-L${PSPDIR}/lib")
endif()

set_target_properties(osk PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")

find_program(MKSFOEX mksfoex)
find_program(PACKPBP pack-pbp)

set(OUT_DIR "${CMAKE_BINARY_DIR}")
set(PARAM_SFO "${OUT_DIR}/PARAM.SFO")
set(EBOOT_PBP "${OUT_DIR}/EBOOT.PBP")
set(TITLE "OSK test")

if(MKSFOEX AND PACKPBP)
add_custom_command(TARGET osk POST_BUILD
COMMAND ${MKSFOEX} "${TITLE}" "${PARAM_SFO}"
COMMAND ${PACKPBP} "${EBOOT_PBP}" "${PARAM_SFO}" NULL NULL NULL NULL NULL $<TARGET_FILE:osk> NULL
BYPRODUCTS "${PARAM_SFO}" "${EBOOT_PBP}"
COMMENT "Packaging EBOOT.PBP (ELF)" VERBATIM)
endif()

file(GLOB SAMPLE_FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/*")
foreach(F ${SAMPLE_FILES})
string(TOLOWER "${F}" F_LC)
if(F_LC MATCHES "\\.(c|h|o|elf|prx|pbp)$" OR F_LC STREQUAL "makefile")
continue()
endif()
if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${F}")
add_custom_command(TARGET osk POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/${F}" "${OUT_DIR}/${F}" VERBATIM)
else()
add_custom_command(TARGET osk POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/${F}" "${OUT_DIR}/${F}" VERBATIM)
endif()
endforeach()
include("${CMAKE_CURRENT_LIST_DIR}/../../cmake/OSLibSample.cmake")
osl_add_sample(${PROJECT_NAME} "OSK test" main.c)
40 changes: 35 additions & 5 deletions samples/README.md
Original file line number Diff line number Diff line change
@@ -1,19 +1,49 @@
OSLib Samples
-----------------
# OSLib Samples

All samples need a file named bkg.png (the background image).
Install OSLib before building the samples. Run the following commands from an
individual sample directory:

Building any sample with CMake (standalone):
```bash
cmake -S . -B cbuild -DCMAKE_TOOLCHAIN_FILE=../../cmake/PSP.cmake
cmake --build cbuild -j
```

Or can use the presets:
Or use the presets:

```bash
cmake --preset psp
cmake --build --preset psp -j
```

Outputs: `cbuild/EBOOT.PBP` and copied assets.

To build all samples, run the preset commands from `samples/`. Each sample's
executable, `PARAM.SFO`, `EBOOT.PBP` and assets go in `cbuild/<sample>/`.
CMake target and executable names match the sample directory, including case:
for example, `helloWorld`, `intraFont`, `OSK` and `rectAndFonts`. To build only one
sample from the combined build:

```bash
cmake --build cbuild --target rectAndFonts -j
```

Each sample uses the shared `cmake/OSLibSample.cmake` helper for linking,
packaging and asset copying. A new sample's `CMakeLists.txt` follows this template:

```cmake
cmake_minimum_required(VERSION 3.10)
project(mySample C)

include("${CMAKE_CURRENT_LIST_DIR}/../../cmake/OSLibSample.cmake")
osl_add_sample(${PROJECT_NAME} "My Sample" main.c)
```

Pass sample-specific libraries after the source file, for example:

```cmake
osl_add_sample(${PROJECT_NAME} "Network Sample" main.c pspnet pspnet_apctl)
```

For a C++ sample, enable `CXX` in `project()` and pass `main.cpp` instead.
The title argument becomes the PSP menu title. Source files and CMake build trees
are excluded from copied assets; asset directories such as `Resources/` are kept.
48 changes: 2 additions & 46 deletions samples/adhoc/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,51 +1,7 @@
cmake_minimum_required(VERSION 3.10)
project(adhoc C)

add_executable(adhoc main.c)

# Link OSLib and PSP SDK libs (SDK libs last)
target_link_libraries(adhoc PRIVATE
osl
png jpeg z m
pspdisplay pspge pspuser pspdebug
pspsdk pspctrl psphprm pspumd psprtc pspgu pspgum pspaudiolib pspaudio pspaudiocodec psppower pspusb pspusbstor psputility pspssl psphttp pspwlan
include("${CMAKE_CURRENT_LIST_DIR}/../../cmake/OSLibSample.cmake")
osl_add_sample(${PROJECT_NAME} "Ad hoc sample" main.c
pspnet pspnet_apctl pspnet_adhoc pspnet_adhocctl pspnet_adhocmatching
)

# Ensure PSP SDK lib search paths
execute_process(COMMAND psp-config --psp-prefix OUTPUT_VARIABLE PSPDIR OUTPUT_STRIP_TRAILING_WHITESPACE)
if(PSPDIR)
target_link_directories(adhoc PRIVATE "${PSPDIR}/sdk/lib" "${PSPDIR}/lib")
target_link_options(adhoc PRIVATE "-L${PSPDIR}/sdk/lib" "-L${PSPDIR}/lib")
endif()

set_target_properties(adhoc PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")

find_program(MKSFOEX mksfoex)
find_program(PACKPBP pack-pbp)

set(OUT_DIR "${CMAKE_BINARY_DIR}")
set(PARAM_SFO "${OUT_DIR}/PARAM.SFO")
set(EBOOT_PBP "${OUT_DIR}/EBOOT.PBP")
set(TITLE "Ad hoc sample")

if(MKSFOEX AND PACKPBP)
add_custom_command(TARGET adhoc POST_BUILD
COMMAND ${MKSFOEX} "${TITLE}" "${PARAM_SFO}"
COMMAND ${PACKPBP} "${EBOOT_PBP}" "${PARAM_SFO}" NULL NULL NULL NULL NULL $<TARGET_FILE:adhoc> NULL
BYPRODUCTS "${PARAM_SFO}" "${EBOOT_PBP}"
COMMENT "Packaging EBOOT.PBP (ELF)" VERBATIM)
endif()

file(GLOB SAMPLE_FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/*")
foreach(F ${SAMPLE_FILES})
string(TOLOWER "${F}" F_LC)
if(F_LC MATCHES "\\.(c|h|o|elf|prx|pbp)$" OR F_LC STREQUAL "makefile")
continue()
endif()
if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${F}")
add_custom_command(TARGET adhoc POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/${F}" "${OUT_DIR}/${F}" VERBATIM)
else()
add_custom_command(TARGET adhoc POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/${F}" "${OUT_DIR}/${F}" VERBATIM)
endif()
endforeach()
49 changes: 2 additions & 47 deletions samples/audio/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,50 +1,5 @@
cmake_minimum_required(VERSION 3.10)
project(audio C)

add_executable(audio main.c)

# Link OSLib and PSP SDK libs (SDK libs last)
target_link_libraries(audio PRIVATE
osl
png jpeg z m
pspdisplay pspge pspuser pspdebug
pspsdk pspctrl psphprm pspumd psprtc pspgu pspgum pspaudiolib pspaudio pspaudiocodec psppower pspusb pspusbstor psputility pspssl psphttp pspwlan
)

# Ensure PSP SDK lib search paths
execute_process(COMMAND psp-config --psp-prefix OUTPUT_VARIABLE PSPDIR OUTPUT_STRIP_TRAILING_WHITESPACE)
if(PSPDIR)
target_link_directories(audio PRIVATE "${PSPDIR}/sdk/lib" "${PSPDIR}/lib")
target_link_options(audio PRIVATE "-L${PSPDIR}/sdk/lib" "-L${PSPDIR}/lib")
endif()

set_target_properties(audio PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")

find_program(MKSFOEX mksfoex)
find_program(PACKPBP pack-pbp)

set(OUT_DIR "${CMAKE_BINARY_DIR}")
set(PARAM_SFO "${OUT_DIR}/PARAM.SFO")
set(EBOOT_PBP "${OUT_DIR}/EBOOT.PBP")
set(TITLE "Audio Sample")

if(MKSFOEX AND PACKPBP)
add_custom_command(TARGET audio POST_BUILD
COMMAND ${MKSFOEX} "${TITLE}" "${PARAM_SFO}"
COMMAND ${PACKPBP} "${EBOOT_PBP}" "${PARAM_SFO}" NULL NULL NULL NULL NULL $<TARGET_FILE:audio> NULL
BYPRODUCTS "${PARAM_SFO}" "${EBOOT_PBP}"
COMMENT "Packaging EBOOT.PBP (ELF)" VERBATIM)
endif()

file(GLOB SAMPLE_FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/*")
foreach(F ${SAMPLE_FILES})
string(TOLOWER "${F}" F_LC)
if(F_LC MATCHES "\\.(c|h|o|elf|prx|pbp)$" OR F_LC STREQUAL "makefile")
continue()
endif()
if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${F}")
add_custom_command(TARGET audio POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/${F}" "${OUT_DIR}/${F}" VERBATIM)
else()
add_custom_command(TARGET audio POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/${F}" "${OUT_DIR}/${F}" VERBATIM)
endif()
endforeach()
include("${CMAKE_CURRENT_LIST_DIR}/../../cmake/OSLibSample.cmake")
osl_add_sample(${PROJECT_NAME} "Audio Sample" main.c)
48 changes: 2 additions & 46 deletions samples/dialog/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,51 +1,7 @@
cmake_minimum_required(VERSION 3.10)
project(dialog C)

add_executable(dialog main.c)

# Link OSLib and PSP SDK libs (SDK libs last)
target_link_libraries(dialog PRIVATE
osl
png jpeg z m
pspdisplay pspge pspuser pspdebug
pspsdk pspctrl psphprm pspumd psprtc pspgu pspgum pspaudiolib pspaudio pspaudiocodec psppower pspusb pspusbstor psputility pspssl psphttp pspwlan
include("${CMAKE_CURRENT_LIST_DIR}/../../cmake/OSLibSample.cmake")
osl_add_sample(${PROJECT_NAME} "Dialog test" main.c
pspnet pspnet_apctl
)

# Ensure PSP SDK lib search paths
execute_process(COMMAND psp-config --psp-prefix OUTPUT_VARIABLE PSPDIR OUTPUT_STRIP_TRAILING_WHITESPACE)
if(PSPDIR)
target_link_directories(dialog PRIVATE "${PSPDIR}/sdk/lib" "${PSPDIR}/lib")
target_link_options(dialog PRIVATE "-L${PSPDIR}/sdk/lib" "-L${PSPDIR}/lib")
endif()

set_target_properties(dialog PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")

find_program(MKSFOEX mksfoex)
find_program(PACKPBP pack-pbp)

set(OUT_DIR "${CMAKE_BINARY_DIR}")
set(PARAM_SFO "${OUT_DIR}/PARAM.SFO")
set(EBOOT_PBP "${OUT_DIR}/EBOOT.PBP")
set(TITLE "Dialog test")

if(MKSFOEX AND PACKPBP)
add_custom_command(TARGET dialog POST_BUILD
COMMAND ${MKSFOEX} "${TITLE}" "${PARAM_SFO}"
COMMAND ${PACKPBP} "${EBOOT_PBP}" "${PARAM_SFO}" NULL NULL NULL NULL NULL $<TARGET_FILE:dialog> NULL
BYPRODUCTS "${PARAM_SFO}" "${EBOOT_PBP}"
COMMENT "Packaging EBOOT.PBP (ELF)" VERBATIM)
endif()

file(GLOB SAMPLE_FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/*")
foreach(F ${SAMPLE_FILES})
string(TOLOWER "${F}" F_LC)
if(F_LC MATCHES "\\.(c|h|o|elf|prx|pbp)$" OR F_LC STREQUAL "makefile")
continue()
endif()
if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${F}")
add_custom_command(TARGET dialog POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/${F}" "${OUT_DIR}/${F}" VERBATIM)
else()
add_custom_command(TARGET dialog POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/${F}" "${OUT_DIR}/${F}" VERBATIM)
endif()
endforeach()
Loading
Loading