mirror of
https://github.com/mihawk-99/PS5_RetroArch.git
synced 2026-10-18 23:09:29 -05:00
The frontend now builds into a signed title, and the PS5 driver is in
RetroArch's table in the image that ships, not only in the source.
bash tools/build-title.sh
-> 225 of 225 sources compiled, archived into build/ra/libretroarch.a
-> dist/PPSA99169/eboot.bin, 8,026,239 bytes
container: signed, plaintext; 12 segments; integrity: valid
digest 71c88975040535a02b462618dd394a7a378034272c9bffa43ce0ca4b717ab9b7
(identical across two consecutive builds)
readelf -r build/ra/obj/gfx_video_driver.c.o
-> .rela.data.video_drivers holds exactly two entries: video_ps5, video_null
nm build/llvm-pie.elf
-> video_ps5, video_null, rarch_main and a single main
bash tools/check-manifest.sh
-> 7 files match their digests, none extra, eboot.bin magic 4f153d1d, and it
fails as it should when one byte of the image is changed
tools/verify.sh
-> PASS (format unit build integration evidence)
Registration and entry point. The port's changes are applied by
tools/apply-port-patches.py to the configured copy under build/ra-conf and never
to vendor/retroarch; patches/series names both. RetroArch's own main is compiled
out with -DHAVE_MAIN, the flag its desktop build passes, so src/main.cpp supplies
the only one and calls rarch_main.
Five faults fixed on the way, each recorded in docs/PHASE_LOG.md: the build read
sources from vendor/ and headers from build/ra-conf, so the driver table in the
image had no ps5 entry; 36 hand-written -DHAVE_* flags included six features
configure had turned off; config.h alone is not enough because a source can test a
feature before it is reached (libchdr without zlib); five Linux-only subsystems
were in the object list and are now off at their own configure switches; and two
link-time stubs the pipeline refuses needed -DNDEBUG and -DZSTD_TRACE=0.
The abandoned route is removed: deploy.py, console-launch.sh, check-payload.sh,
scaffold-native.sh, build-native-app.sh, install-title.sh and deploy.sh. Every
tool named by another tool now exists - tools/fetch-retroarch.sh was named by
three tools and three documents and had never been committed, and it now pins
RetroArch at v1.22.2 (69a4f0e) and drops the history so upstream cannot be
committed into. The gate scripts that had never been written are written:
lint-shell, lint-format, check-manifest. The template's unit test, which built a
test for a file that does not exist here, is replaced by tests/test_frontend.py.
The title has not run yet. It is built, signed and manifested; the folder has to
reach /data/homebrew/PPSA99169, and writes from this machine do not take on that
console.
184 lines
6.8 KiB
Makefile
184 lines
6.8 KiB
Makefile
# ps5-native-app-boilerplate - Linux/WSL build entry points.
|
|
# Copyright (C) 2026 BlackBearReloaded
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
SHELL := /bin/bash
|
|
.DEFAULT_GOAL := app
|
|
|
|
-include .env
|
|
|
|
APP_DEFINITIONS ?=
|
|
APP_INCLUDE_PATHS ?=
|
|
APP_STATIC_ARCHIVES ?=
|
|
APP_RUNTIME_MODULES ?=
|
|
PACBREW_PACKAGES ?=
|
|
PACBREW_INCLUDE_PATHS ?=
|
|
PACBREW_STATIC_ARCHIVES ?=
|
|
PS5_HOST ?=
|
|
FTP_PORT ?= 2121
|
|
DEPLOY_FORMAT ?= folder
|
|
PS5_FTP_USER ?= anonymous
|
|
PS5_FTP_PASSWORD ?= codex
|
|
DEPLOY_DRY_RUN ?= 0
|
|
TITLE_ID ?=
|
|
APP_NAME ?=
|
|
APP_CATEGORY ?= game
|
|
CONTENT_SUFFIX ?=
|
|
HOST_CXX ?= clang++
|
|
HOST_TEST_CXXFLAGS ?= -std=c++20 -O2 -Wall -Wextra -Wpedantic -Werror \
|
|
-ffunction-sections -fdata-sections
|
|
HOST_TEST_LDFLAGS ?= -Wl,--gc-sections
|
|
GTEST_ARGS ?=
|
|
export APP_DEFINITIONS APP_INCLUDE_PATHS APP_STATIC_ARCHIVES APP_RUNTIME_MODULES
|
|
export PACBREW_PACKAGES PACBREW_INCLUDE_PATHS PACBREW_STATIC_ARCHIVES
|
|
export PS5_HOST FTP_PORT DEPLOY_FORMAT PS5_FTP_USER PS5_FTP_PASSWORD DEPLOY_DRY_RUN
|
|
export TITLE_ID APP_NAME APP_CATEGORY CONTENT_SUFFIX
|
|
|
|
RUNTIME := runtime/libc.prx
|
|
RUNTIME_INPUTS := tools/rebuild-libc.sh \
|
|
$(wildcard tooling/native/*.cpp tooling/native/*.hpp) \
|
|
$(wildcard tooling/native/runtime/*.txt)
|
|
HOST_UNIT_TEST := build/tests/demo_renderer_tests
|
|
|
|
.PHONY: all app build init doctor test test-deps test-unit test-integration libc deps pacbrew pacbrew-list assets-check format format-check tidy lint check ffpkg ffpfsc packages deploy undeploy clean distclean help
|
|
|
|
all: app
|
|
build: app
|
|
|
|
init:
|
|
@printf '%s\n' '==> [init] Configuring the application identity in sce_sys/param.json'
|
|
@bash tools/init-project.sh sce_sys/param.json
|
|
|
|
doctor:
|
|
@printf '%s\n' '==> [doctor] Checking the Linux/WSL host without changing it'
|
|
@bash tools/doctor.sh
|
|
|
|
test: test-unit
|
|
|
|
test-deps:
|
|
@printf '%s\n' '==> [test-deps] Nothing to fetch: the tests are host-native python'
|
|
@python3 -c 'import sys; print("==> [test-deps] python", sys.version.split()[0])'
|
|
|
|
# The template's GoogleTest target is gone with the template's demo renderer. What
|
|
# replaced it is tests/test_frontend.py, which is python and needs no build step:
|
|
# it compiles the frame-layout function out of src/display.cpp with the host
|
|
# compiler and reads the built object and the built artifact directly, so it can
|
|
# question what was made without a cross toolchain and without a console.
|
|
test-unit:
|
|
@printf '%s\n' '==> [test-unit] Running the host-native frontend tests'
|
|
@python3 -m unittest discover -s tests -p 'test_*.py' -v
|
|
|
|
test-integration: test-unit
|
|
|
|
deps: test-deps
|
|
@printf '%s\n' '==> [deps] Fetching declared native dependencies'
|
|
@bash tools/setup-native-dependencies.sh
|
|
@bash tools/setup-pacbrew-dependencies.sh --environment
|
|
|
|
pacbrew:
|
|
@printf '%s\n' '==> [pacbrew] Fetching the pinned prebuilt ports sysroot'
|
|
@bash tools/setup-pacbrew-dependencies.sh --all
|
|
|
|
pacbrew-list:
|
|
@printf '%s\n' '==> [pacbrew] Listing available pkg-config modules'
|
|
@bash tools/setup-pacbrew-dependencies.sh --list
|
|
|
|
assets-check:
|
|
@printf '%s\n' '==> [assets] Validating icon, backgrounds, and selection audio'
|
|
@bash tools/validate-assets.sh
|
|
|
|
libc:
|
|
@printf '%s\n' '==> [libc] Rebuilding and verifying the clean-room runtime'
|
|
@bash tools/rebuild-libc.sh
|
|
|
|
$(RUNTIME): $(RUNTIME_INPUTS)
|
|
@printf '%s\n' '==> [libc] Generating the missing or outdated runtime'
|
|
@bash tools/rebuild-libc.sh
|
|
|
|
app: $(RUNTIME)
|
|
@printf '%s\n' '==> [app] Compiling, linking, signing, and assembling the app folder'
|
|
@bash tools/build.sh Folder
|
|
|
|
ffpkg: $(RUNTIME)
|
|
@printf '%s\n' '==> [ffpkg] Building the app folder and UFS2 image'
|
|
@bash tools/build.sh Ffpkg
|
|
|
|
ffpfsc: $(RUNTIME)
|
|
@printf '%s\n' '==> [ffpfsc] Building the app folder and compressed image'
|
|
@bash tools/build.sh Ffpfsc
|
|
|
|
packages: $(RUNTIME)
|
|
@printf '%s\n' '==> [packages] Building the app folder and both package formats'
|
|
@bash tools/build.sh All
|
|
|
|
deploy:
|
|
@printf '%s\n' '==> [deploy] Building the title and publishing it over FTP'
|
|
@bash tools/build-title.sh
|
|
@python3 tools/deploy-title.py
|
|
|
|
deploy-check:
|
|
@printf '%s\n' '==> [deploy] Reading back what the console holds for this title'
|
|
@python3 tools/deploy-title.py --check
|
|
|
|
undeploy:
|
|
@printf '%s\n' '==> [undeploy] Removing staged development files for this title over FTP'
|
|
@python3 tools/deploy-title.py --clean
|
|
|
|
format:
|
|
@printf '%s\n' '==> [format] Formatting C and C++ sources'
|
|
@bash tools/run_clang_format.sh
|
|
|
|
format-check:
|
|
@printf '%s\n' '==> [format] Checking C and C++ formatting'
|
|
@bash tools/run_clang_format.sh --check
|
|
|
|
tidy:
|
|
@printf '%s\n' '==> [tidy] Running Clang static analysis'
|
|
@bash tools/run_clang_tidy.sh
|
|
|
|
lint:
|
|
@printf '%s\n' '==> [lint] Running source, metadata, and shell checks'
|
|
@bash tools/lint.sh
|
|
|
|
check: lint test app
|
|
|
|
clean:
|
|
@printf '%s\n' '==> [clean] Removing generated build outputs'
|
|
@rm -rf -- build dist
|
|
@rm -f -- $(RUNTIME)
|
|
|
|
distclean: clean
|
|
@printf '%s\n' '==> [distclean] Removing downloaded dependency caches'
|
|
@rm -rf -- .deps
|
|
|
|
help:
|
|
@printf '%s\n' \
|
|
'make Generate libc.prx and build the Hello World folder' \
|
|
'make init TITLE_ID=PPSA12345 APP_NAME="My App" Configure app identity' \
|
|
'make doctor Check required and optional Linux/WSL tools' \
|
|
'make test Run all host unit and integration tests' \
|
|
'make test-deps Fetch verified host-only GoogleTest source' \
|
|
'make test-unit Run host-native GoogleTest application tests' \
|
|
'make test-integration Run host tooling integration tests' \
|
|
'make deps Fetch native dependencies into .deps/' \
|
|
'make pacbrew Fetch the pinned PacBrew ports sysroot' \
|
|
'make pacbrew-list List PacBrew pkg-config module names' \
|
|
'make assets-check Validate the current presentation assets' \
|
|
'make libc Force a deterministic runtime/libc.prx rebuild' \
|
|
'make format Apply the shared Clang formatting policy' \
|
|
'make format-check Check formatting without modifying files' \
|
|
'make tidy Run the shared Clang static-analysis policy' \
|
|
'make lint Run format, tidy, metadata, and shell checks' \
|
|
'make check Run lint and build the skeleton app' \
|
|
'make ffpkg Build the folder and UFS2 .ffpkg image' \
|
|
'make ffpfsc Build the folder and compressed .ffpfsc image' \
|
|
'make packages Build folder, .ffpkg, and .ffpfsc outputs' \
|
|
'make deploy PS5_HOST=<address> Build and FTP-deploy the app folder' \
|
|
'make undeploy PS5_HOST=<address> Remove this title from /data/homebrew' \
|
|
'Build variables: APP_DEFINITIONS, APP_INCLUDE_PATHS, APP_STATIC_ARCHIVES, APP_RUNTIME_MODULES' \
|
|
'PacBrew variables: PACBREW_PACKAGES, PACBREW_INCLUDE_PATHS, PACBREW_STATIC_ARCHIVES' \
|
|
'Deploy variables: FTP_PORT=2121, DEPLOY_FORMAT=folder|ffpfsc|ffpkg, DEPLOY_DRY_RUN=0|1' \
|
|
'Local defaults: Copy .env.example to the ignored .env file' \
|
|
'make clean Remove build/, dist/, and generated libc.prx' \
|
|
'make distclean Also remove the ignored .deps/ cache'
|