Files
2026-07-28 06:34:41 +02:00

155 lines
6.1 KiB
Makefile

# Package metadata.
TITLE := NP2kai PS4
RELEASE_VERSION := 1.0
VERSION := 01.00
TITLE_ID := BREW00984
CONTENT_ID := IV0000-BREW00984_00-NP2KAIBOOTSTRAP0
# NP2kai and libretro-common static libraries.
CORE_DIR := third_party/NP2kai/sdl
CORE_LIB := $(CORE_DIR)/np2kai_libretro_ps4.a
COMMON_LIB := build/ps4-libretro-common/libretro_common_ps4.a
CORE_INCLUDE := $(CORE_DIR)/libretro/libretro-common/include
# Libraries linked into the ELF.
LIBS := -lc -lkernel -lc++ -lSceUserService -lSceVideoOut -lSceAudioOut -lScePad -lSceSysmodule -lSceKeyboard -lSceFreeType -lSDL2 -lSDL2_image
# Additional compile flags.
EXTRAFLAGS := -Ithird_party/NP2kai/sdl/libretro/libretro-common/include -O3 -DNDEBUG -march=btver2 -mtune=btver2 -fomit-frame-pointer
# Asset and module directories.
ASSETS := $(shell find assets -type f ! -path 'assets/games/*' ! -path 'assets/system/np2kai/*.rom' ! -path 'assets/system/np2kai/*.ROM' ! -path 'assets/system/np2kai/font.bmp')
LIBMODULES := sce_module/libc.prx sce_module/libSceFios2.prx
OPENORBIS_MODULE_DIR = $(TOOLCHAIN)/src/modules
# Root vars.
TOOLCHAIN := $(OO_PS4_TOOLCHAIN)
PROJDIR := SDL2
COMMONDIR := $(TOOLCHAIN)/samples/_common
INTDIR := $(PROJDIR)/x64/Debug
# Define objects to build.
CFILES := $(wildcard $(PROJDIR)/*.c)
CPPFILES := $(wildcard $(PROJDIR)/*.cpp)
COMMONFILES :=
OBJS := $(patsubst $(PROJDIR)/%.c, $(INTDIR)/%.o, $(CFILES)) $(patsubst $(PROJDIR)/%.cpp, $(INTDIR)/%.o, $(CPPFILES)) $(patsubst $(COMMONDIR)/%.cpp, $(INTDIR)/%.o, $(COMMONFILES))
# Define final C/C++ flags.
CFLAGS := --target=x86_64-pc-freebsd12-elf -fPIC -funwind-tables -c $(EXTRAFLAGS) -isysroot $(TOOLCHAIN) -isystem $(TOOLCHAIN)/include
CXXFLAGS := $(CFLAGS) -isystem $(TOOLCHAIN)/include/c++/v1
LDFLAGS := -m elf_x86_64 -pie --script $(TOOLCHAIN)/link.x --eh-frame-hdr -L$(TOOLCHAIN)/lib $(LIBS) $(TOOLCHAIN)/lib/crt1.o
# Create the intermediate directory.
_unused := $(shell mkdir -p $(INTDIR))
# Check for Linux vs macOS and account for clang/ld path.
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Linux)
CC := clang
CCX := clang++
LD := ld.lld
CDIR := linux
endif
ifeq ($(UNAME_S),Darwin)
CC := /usr/local/opt/llvm/bin/clang
CCX := /usr/local/opt/llvm/bin/clang++
LD := /usr/local/opt/llvm/bin/ld.lld
CDIR := macos
endif
all: $(CONTENT_ID).pkg
.PHONY: prepare-openorbis-modules
prepare-openorbis-modules: sce_sys/about/right.sprx $(LIBMODULES)
sce_sys/about/right.sprx:
@mkdir -p $(@D)
@test -f "$(OPENORBIS_MODULE_DIR)/right.sprx" || \
(echo "ERROR: falta $(OPENORBIS_MODULE_DIR)/right.sprx" >&2; exit 1)
cp "$(OPENORBIS_MODULE_DIR)/right.sprx" "$@"
sce_module/libc.prx:
@mkdir -p $(@D)
@test -f "$(OPENORBIS_MODULE_DIR)/libc.prx" || \
(echo "ERROR: falta $(OPENORBIS_MODULE_DIR)/libc.prx" >&2; exit 1)
cp "$(OPENORBIS_MODULE_DIR)/libc.prx" "$@"
sce_module/libSceFios2.prx:
@mkdir -p $(@D)
@test -f "$(OPENORBIS_MODULE_DIR)/libSceFios2.prx" || \
(echo "ERROR: falta $(OPENORBIS_MODULE_DIR)/libSceFios2.prx" >&2; exit 1)
cp "$(OPENORBIS_MODULE_DIR)/libSceFios2.prx" "$@"
.PHONY: validate-package-metadata
validate-package-metadata: prepare-openorbis-modules
python3 tools/validate-ps4-package-metadata.py \
--version "$(VERSION)" \
--title-id "$(TITLE_ID)" \
--content-id "$(CONTENT_ID)" \
--right-sprx sce_sys/about/right.sprx \
--icon sce_sys/icon0.png
$(CONTENT_ID).pkg: pkg.gp4
$(TOOLCHAIN)/bin/$(CDIR)/PkgTool.Core pkg_build $< .
pkg.gp4: eboot.bin sce_sys/about/right.sprx sce_sys/param.sfo sce_sys/icon0.png $(LIBMODULES) $(ASSETS) | validate-package-metadata
$(TOOLCHAIN)/bin/$(CDIR)/create-gp4 -out $@ --content-id=$(CONTENT_ID) --files "$^"
./repair-gp4-rootdir.py $@
sce_sys/param.sfo: Makefile
$(TOOLCHAIN)/bin/$(CDIR)/PkgTool.Core sfo_new $@
$(TOOLCHAIN)/bin/$(CDIR)/PkgTool.Core sfo_setentry $@ APP_TYPE --type Integer --maxsize 4 --value 1
$(TOOLCHAIN)/bin/$(CDIR)/PkgTool.Core sfo_setentry $@ APP_VER --type Utf8 --maxsize 8 --value '$(VERSION)'
$(TOOLCHAIN)/bin/$(CDIR)/PkgTool.Core sfo_setentry $@ ATTRIBUTE --type Integer --maxsize 4 --value 0
$(TOOLCHAIN)/bin/$(CDIR)/PkgTool.Core sfo_setentry $@ CATEGORY --type Utf8 --maxsize 4 --value 'gd'
$(TOOLCHAIN)/bin/$(CDIR)/PkgTool.Core sfo_setentry $@ CONTENT_ID --type Utf8 --maxsize 48 --value '$(CONTENT_ID)'
$(TOOLCHAIN)/bin/$(CDIR)/PkgTool.Core sfo_setentry $@ DOWNLOAD_DATA_SIZE --type Integer --maxsize 4 --value 0
$(TOOLCHAIN)/bin/$(CDIR)/PkgTool.Core sfo_setentry $@ SYSTEM_VER --type Integer --maxsize 4 --value 0
$(TOOLCHAIN)/bin/$(CDIR)/PkgTool.Core sfo_setentry $@ TITLE --type Utf8 --maxsize 128 --value '$(TITLE)'
$(TOOLCHAIN)/bin/$(CDIR)/PkgTool.Core sfo_setentry $@ TITLE_ID --type Utf8 --maxsize 12 --value '$(TITLE_ID)'
$(TOOLCHAIN)/bin/$(CDIR)/PkgTool.Core sfo_setentry $@ VERSION --type Utf8 --maxsize 8 --value '$(VERSION)'
$(CORE_LIB):
./build-ps4-core.sh
$(COMMON_LIB):
./build-libretro-common-ps4.sh
eboot.bin: $(INTDIR) $(OBJS) $(CORE_LIB) $(COMMON_LIB)
$(LD) $(INTDIR)/*.o \
--whole-archive $(CORE_LIB) --no-whole-archive \
--start-group $(COMMON_LIB) --end-group \
-o $(INTDIR)/$(PROJDIR).elf $(LDFLAGS)
$(TOOLCHAIN)/bin/$(CDIR)/create-fself -in=$(INTDIR)/$(PROJDIR).elf -out=$(INTDIR)/$(PROJDIR).oelf --eboot "eboot.bin" --paid 0x3800000000000011
$(INTDIR)/%.o: $(PROJDIR)/%.c
$(CC) $(CFLAGS) -o $@ $<
$(INTDIR)/%.o: $(PROJDIR)/%.cpp
$(CCX) $(CXXFLAGS) -o $@ $<
$(INTDIR)/%.o: $(COMMONDIR)/%.c
$(CCX) $(CXXFLAGS) -o $@ $<
$(INTDIR)/%.o: $(COMMONDIR)/%.cpp
$(CCX) $(CXXFLAGS) -o $@ $<
clean:
rm -f $(CONTENT_ID).pkg pkg.gp4 pkg/sce_sys/param.sfo eboot.bin \
$(INTDIR)/$(PROJDIR).elf $(INTDIR)/$(PROJDIR).oelf $(OBJS)
clean-common:
rm -rf build/ps4-libretro-common
.PHONY: clean-openorbis-modules
clean-openorbis-modules:
rm -f sce_module/libc.prx sce_module/libSceFios2.prx sce_sys/about/right.sprx
# v0.37 downloaded external sources into these directories. Nothing writes
# them any more; the rule stays so an upgraded tree can be cleaned in place.
.PHONY: clean-native-keyboard
clean-native-keyboard:
rm -rf build/native-keyboard third_party/native-keyboard-src