# orbisRPC Setup installer (OpenOrbis app).
# Flow: daemon payload -> token -> done (gen bump supersedes old daemon).
# Payload Guest reads /data/payloads/ on this console.
TITLE       := orbisRPC Setup
VERSION     := 1.1.0
TITLE_ID    := ORPC00001
CONTENT_ID  := IV0000-ORPC00001_00-ORBISRPCSETUP000

# Packaging knobs under experiment (see the note above param.sfo).
#   PKG_ATTR=32 PKG_CATEGORY=gde AUTHINFO=1  -> Apollo-parity build
PKG_ATTR    ?= 0
PKG_CATEGORY ?= gd
AUTHINFO    ?= 0
AUTHINFO_BLOB := 000000000000000000000000001C004000FF000000000080000000000000000000000000000000000000008000400040000000000000008000000000000000080040FFFF000000F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
ifeq ($(AUTHINFO),1)
AUTHINFO_FLAG := --authinfo $(AUTHINFO_BLOB)
else
AUTHINFO_FLAG :=
endif

LIBS        := -lc -lkernel -lc++ -lSceMsgDialog -lSceCommonDialog -lSceImeDialog -lSceSysmodule -lSceNet -lSceUserService -lSceSystemService -lScePad

ASSETS      := $(wildcard installer/assets/**/*)
LIBMODULES  := $(wildcard installer/sce_module/*)

TOOLCHAIN   ?= $(OO_PS4_TOOLCHAIN)
ifeq ($(TOOLCHAIN),)
TOOLCHAIN   := /Users/mac/PS4Toolchain/OpenOrbis/PS4Toolchain
endif
export OO_PS4_TOOLCHAIN := $(TOOLCHAIN)
PROJDIR     := installer
COMMONDIR   := $(TOOLCHAIN)/samples/_common
INTDIR      := $(PROJDIR)/x64/Debug

CFILES      := $(wildcard $(PROJDIR)/*.c)
CPPFILES    := $(wildcard $(PROJDIR)/*.cpp)
OBJS        := $(patsubst $(PROJDIR)/%.c, $(INTDIR)/%.o, $(CFILES)) $(patsubst $(PROJDIR)/%.cpp, $(INTDIR)/%.o, $(CPPFILES)) $(INTDIR)/jsonlite.o

# llvmshim (no brew): export PATH="$HOME/llvmshim:$PATH" before make.
LLVM        := $(HOME)/llvmshim
CC          := $(LLVM)/clang
CCX         := $(LLVM)/clang++
LD          := $(LLVM)/ld.lld
CDIR        := macos

CFLAGS      := -DINSTALLER_PS4 -DSETUP_VERSION='"$(VERSION)"' --target=x86_64-pc-freebsd12-elf -fPIC -funwind-tables -c -isysroot $(TOOLCHAIN) -isystem $(TOOLCHAIN)/include -Iorbisrpc -Iinstaller
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 -L$(TOOLCHAIN)/lib

_unused     := $(shell mkdir -p $(INTDIR))

all: $(CONTENT_ID).pkg

$(CONTENT_ID).pkg: installer/pkg.gp4
	cd installer && $(TOOLCHAIN)/bin/$(CDIR)/PkgTool.Core pkg_build pkg.gp4 . && mv $(CONTENT_ID).pkg ..

installer/pkg.gp4: installer/eboot.bin installer/assets/daemon.elf installer/assets/config.json installer/sce_sys/about/right.sprx installer/sce_sys/param.sfo installer/sce_sys/icon0.png installer/sce_sys/pic1.png $(LIBMODULES) $(ASSETS)
	cd installer && $(TOOLCHAIN)/bin/$(CDIR)/create-gp4 -out pkg.gp4 --content-id=$(CONTENT_ID) --files "eboot.bin assets/daemon.elf assets/config.json sce_sys/about/right.sprx sce_sys/param.sfo sce_sys/icon0.png sce_sys/pic1.png sce_module/libSceFios2.prx sce_module/libc.prx $(patsubst installer/%,%,$(ASSETS))"

# PACKAGING IS AN OPEN EXPERIMENT, NOT A SETTLED ANSWER.
#
# History: v1.0.0 shipped ATTRIBUTE=0 / CATEGORY=gd and launched on real
# hardware. A "universal packaging" theory (borrowed from Apollo Save
# Tool) changed these to 32 / gde and added --authinfo; every build
# carrying those values died silently pre-logging on a real console (4/4).
# Isolation ruled out --authinfo (2 builds without it, still crashed), the
# SDL UI, and the native UI. LIBS, the object set, sce_module, and
# installer/ui.c are identical to the working v1.0.0 build, and every
# installer.c / icfg.c delta is provably safe before the first log call.
# That leaves param.sfo as the only untested variable.
#
# COUNTER-EVIDENCE (do not delete without reading): Apollo's current main
# (v02.32) ships ATTRIBUTE=32 / CATEGORY=gde / --authinfo and is a proven
# universal PS4 app. So 0/gd is very likely innocent too, and the real
# cause is still unknown. The 0/gd build is a TEST, not a conclusion.
# Whichever value survives a console test wins; switch with:
#   make -f installer/Makefile PKG_ATTR=32 PKG_CATEGORY=gde AUTHINFO=1
installer/sce_sys/param.sfo: installer/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 $(PKG_ATTR)
	$(TOOLCHAIN)/bin/$(CDIR)/PkgTool.Core sfo_setentry $@ CATEGORY --type Utf8 --maxsize 4 --value '$(PKG_CATEGORY)'
	$(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)'

installer/eboot.bin: $(OBJS)
	$(LD) $(INTDIR)/*.o -o $(INTDIR)/$(PROJDIR).elf $(LDFLAGS)
	$(TOOLCHAIN)/bin/$(CDIR)/create-fself-macos -in=$(INTDIR)/$(PROJDIR).elf -out=$(INTDIR)/$(PROJDIR).oelf --eboot "installer/eboot.bin" --paid 0x3800000000000011 $(AUTHINFO_FLAG)

$(INTDIR)/%.o: $(PROJDIR)/%.c
	$(CC) $(CFLAGS) -o $@ $<

$(INTDIR)/jsonlite.o: orbisrpc/jsonlite.c
	$(CC) $(CFLAGS) -o $@ $<

# Stage the daemon payload + config into the app image.
# config.json carries the SET_ME placeholder; a pre-seeded valid token
# (kept out of the repo) makes the installer skip token entry.
installer/assets/daemon.elf: build-sdk/orbisrpc_sdk.elf
	cp $< $@
installer/assets/config.json: installer/config.json
	cp $< $@

$(INTDIR)/%.o: $(PROJDIR)/%.cpp
	$(CCX) $(CXXFLAGS) -o $@ $<

clean:
	rm -rf $(INTDIR) installer/eboot.bin installer/pkg.gp4 $(CONTENT_ID).pkg installer/sce_sys/param.sfo installer/assets/daemon.elf installer/assets/config.json
