# Control4Free -- system-wide virtual controllers for the PS4 (GoldHEN payload).
#
# Build:
#   make                 # build/control4free.elf
#   make C4F_PROBE=1     # plus the rumble/light-bar research probe (dev only)
#   make clean
#
# A build needs the ps4-payload-sdk; docker/Dockerfile has it, and
# tools/build.ps1 runs this inside the container.

ifdef PS4_PAYLOAD_SDK
    include $(PS4_PAYLOAD_SDK)/toolchain/orbis.mk
else
    $(error PS4_PAYLOAD_SDK is undefined -- build in Docker, or point it at an SDK)
endif

VERSION := $(shell cat VERSION)

NAME    := control4free
ELF     := build/$(NAME).elf
OBJDIR  := build/payload
SOURCES := src/main.c src/log.c src/vda.c src/klog_line.c src/feedback.c src/web.c src/net.c

# Research build: logs what scePadVirtualDeviceGetRemoteSetting returns. Its ELF
# gets its own name, so it can never be mistaken for a release.
ifdef C4F_PROBE
    EXTRA_CFLAGS := -DC4F_PROBE_SETTING
    ELF    := build/$(NAME)-probe.elf
    OBJDIR := build/probe
endif

OBJECTS := $(SOURCES:src/%.c=$(OBJDIR)/%.o) $(OBJDIR)/client.o $(OBJDIR)/assets.o $(OBJDIR)/qrcodegen.o

CFLAGS  += -std=gnu11 -Wall -Wextra -Wpointer-arith -g -O2
CFLAGS  += -MMD -MP
CFLAGS  += -Iinclude -Ivendor/jsmn -Ivendor/qrcodegen -DC4F_VERSION='"$(VERSION)"' $(EXTRA_CFLAGS)
LDFLAGS += -lScePad -lSceUserService -ldl -lpthread

.PHONY: all clean
.DEFAULT_GOAL := all

-include $(OBJECTS:.o=.d)

all: $(ELF)

$(OBJDIR) build:
	mkdir -p $@

# VERSION is compiled into the objects, and make doesn't notice a changed flag,
# so a new version has to rebuild them.
$(OBJDIR)/%.o: src/%.c VERSION | $(OBJDIR)
	$(CC) $(CFLAGS) -c $< -o $@

build/client.c: client/index.html tools/embed_client.py | build
	python3 tools/embed_client.py $< $@

# The page's Invite QR code (MIT, the same copy the app uses).
$(OBJDIR)/qrcodegen.o: vendor/qrcodegen/qrcodegen.c | $(OBJDIR)
	$(CC) $(CFLAGS) -c $< -o $@

$(OBJDIR)/client.o: build/client.c | $(OBJDIR)
	$(CC) $(CFLAGS) -c $< -o $@

# The manifest and icon the page points at, so it can live on a home screen.
build/assets.c: client/manifest.webmanifest client/icon-192.png tools/embed_file.py | build
	python3 tools/embed_file.py $@ c4fManifest=client/manifest.webmanifest c4fIcon=client/icon-192.png

$(OBJDIR)/assets.o: build/assets.c | $(OBJDIR)
	$(CC) $(CFLAGS) -c $< -o $@

$(ELF): $(OBJECTS) | build
	$(CC) -o $@ $(OBJECTS) $(LDFLAGS)
	@echo "built $@ ($(VERSION))"

clean:
	rm -rf build
