diff --git a/.github/workflows/cl.yml b/.github/workflows/cl.yml new file mode 100644 index 0000000..194b42e --- /dev/null +++ b/.github/workflows/cl.yml @@ -0,0 +1,65 @@ +name: cl + +on: + push: + branches: + - '*' + pull_request: + workflow_dispatch: + +jobs: + enumerate: + runs-on: ubuntu-latest + container: ps2dev/ps2dev:latest + outputs: + matrix: ${{ steps.variants.outputs.matrix }} + steps: + - name: Install dependencies + run: apk add --no-cache build-base git p7zip + + - uses: actions/checkout@v4 + - name: Configure git + run: | + git config --global --add safe.directory "$GITHUB_WORKSPACE" + git fetch --prune --unshallow || true + + - name: Enumerate variants + id: variants + run: | + matrix=$(make list-variants) + echo "matrix=$matrix" >> "$GITHUB_OUTPUT" + + build: + needs: enumerate + runs-on: ubuntu-latest + container: ps2dev/ps2dev:latest + strategy: + fail-fast: false + matrix: ${{ fromJson(needs.enumerate.outputs.matrix) }} + steps: + - name: Install dependencies + run: apk add --no-cache build-base git p7zip + + - uses: actions/checkout@v4 + - name: Configure git + run: | + git config --global --add safe.directory "$GITHUB_WORKSPACE" + git fetch --prune --unshallow || true + + - name: Compute metadata + id: meta + run: echo "short_sha=${GITHUB_SHA::7}" >> "$GITHUB_OUTPUT" + + - name: Build ${{ matrix.name }} + run: | + SHORT_SHA=${{ steps.meta.outputs.short_sha }} + OUTDIR="build/variants/${{ matrix.name }}" + make VARIANT=${{ matrix.name }} ${{ matrix.flags }} OUTDIR=$OUTDIR COMMIT_HASH=$SHORT_SHA clean + make VARIANT=${{ matrix.name }} ${{ matrix.flags }} OUTDIR=$OUTDIR COMMIT_HASH=$SHORT_SHA all + test -f "$OUTDIR/BUILD_CONFIG.txt" + + - name: Upload ${{ matrix.name }} + uses: actions/upload-artifact@v4 + with: + name: ps2bbl-${{ matrix.name }}-${{ steps.meta.outputs.short_sha }} + path: build/variants/${{ matrix.name }} diff --git a/Makefile b/Makefile index 13104dd..d0c3c76 100644 --- a/Makefile +++ b/Makefile @@ -9,12 +9,14 @@ __________ _________________ ____________________.____ endef export HEADER +# ---{ CANONICAL BUILD OPTIONS }--- # +VARIANT ?= default -# ---{BUILD CFG}--- # -HAS_EMBED_IRX ?= 1# whether to embed or not non vital IRX (wich will be loaded from memcard files) +# Device and platform feature toggles +HAS_EMBED_IRX ?= 1 # whether to embed or not non vital IRX (wich will be loaded from memcard files) DEBUG ?= 0 CHAINLOAD ?= 0 # Only inits the system and boots CHAINLOAD_PATH from the memory card. If specified file doesn't exist, attempts to boot RESCUE.ELF from USB -CHAINLOAD_PATH ?= "mc?:BOOT/PAYLOAD.ELF" +CHAINLOAD_PATH ?= mc?:/BOOT/PAYLOAD.ELF PSX ?= 0 # PSX DESR support HDD ?= 0 #wether to add internal HDD support MMCE ?= 0 @@ -35,9 +37,81 @@ FILEXIO_NEED ?= 0 # if we need filexio and imanx loaded for other features (HDD, DEV9_NEED ?= 0 # if we need DEV9 loaded for other features (HDD, UDPTTY, etc) # Related to binary size reduction (it disables some features, please be sure you won't disable something you need) -KERNEL_NOPATCH = 1 -NEWLIB_NANO = 1 -DUMMY_TIMEZONE = 1 +KERNEL_NOPATCH ?= 1 +NEWLIB_NANO ?= 1 +DUMMY_TIMEZONE ?= 1 +DUMMY_LIBC_INIT ?= 0 + +CANONICAL_OPTIONS := HAS_EMBED_IRX DEBUG CHAINLOAD CHAINLOAD_PATH PSX HDD HDD_RUNTIME MMCE MMCE_RUNTIME MX4SIO MX4SIO_RUNTIME \ + XFROM XFROM_RUNTIME PROHBIT_DVD_0100 XCDVD_READKEY UDPTTY PPCTTY PRINTF HOMEBREW_IRX FILEXIO_NEED DEV9_NEED \ + KERNEL_NOPATCH NEWLIB_NANO DUMMY_TIMEZONE DUMMY_LIBC_INIT + +COMMIT_HASH ?= $(shell git rev-parse --short HEAD) +SUPPRESS_FEATURE_INFO := $(if $(filter list-variants variants,$(MAKECMDGOALS)),1,) +feature_info = $(if $(SUPPRESS_FEATURE_INFO),,$(info $(1))) + +# Normalize optional parameters +ifeq ($(strip $(PRINTF)),) + PRINTF := NONE +endif + +# ---{ OUTPUT LOCATIONS }--- # +ifndef BINDIR + OUTDIR ?= $(if $(filter default,$(VARIANT)),bin,build/out/$(VARIANT)) + OUTDIR := $(patsubst %/,%,$(OUTDIR)) + BINDIR := $(OUTDIR)/ +else + OUTDIR := $(patsubst %/,%,$(BINDIR)) + BINDIR := $(OUTDIR)/ +endif +EE_OBJS_DIR := $(OUTDIR)/obj/ +EE_ASM_DIR := $(OUTDIR)/asm/ +VARIANTS_OUTDIR ?= build/variants + +# ---{ VARIANT DEFINITIONS }--- # +VARIANT_DEFINITIONS := \ + default: \ + chainload:CHAINLOAD=1 \ + hdd:HDD=1 \ + hdd_chainload:HDD=1,CHAINLOAD=1 \ + hdd_runtime:HDD_RUNTIME=1 \ + hdd_runtime_chainload:HDD_RUNTIME=1,CHAINLOAD=1 \ + mmce:MMCE=1 \ + mmce_chainload:MMCE=1,CHAINLOAD=1 \ + mmce_runtime:MMCE_RUNTIME=1 \ + mmce_runtime_chainload:MMCE_RUNTIME=1,CHAINLOAD=1 \ + mx4sio:MX4SIO=1 \ + mx4sio_chainload:MX4SIO=1,CHAINLOAD=1 \ + mx4sio_runtime:MX4SIO_RUNTIME=1 \ + mx4sio_runtime_chainload:MX4SIO_RUNTIME=1,CHAINLOAD=1 \ + xfrom:XFROM=1 \ + xfrom_chainload:XFROM=1,CHAINLOAD=1 \ + xfrom_runtime:XFROM_RUNTIME=1 \ + xfrom_runtime_chainload:XFROM_RUNTIME=1,CHAINLOAD=1 \ + psx:PSX=1 \ + psx_chainload:PSX=1,CHAINLOAD=1 \ + psx_hdd:PSX=1,HDD=1 \ + psx_hdd_chainload:PSX=1,HDD=1,CHAINLOAD=1 \ + psx_hdd_runtime:PSX=1,HDD_RUNTIME=1 \ + psx_hdd_runtime_chainload:PSX=1,HDD_RUNTIME=1,CHAINLOAD=1 \ + psx_mmce:PSX=1,MMCE=1 \ + psx_mmce_chainload:PSX=1,MMCE=1,CHAINLOAD=1 \ + psx_mmce_runtime:PSX=1,MMCE_RUNTIME=1 \ + psx_mmce_runtime_chainload:PSX=1,MMCE_RUNTIME=1,CHAINLOAD=1 \ + psx_mx4sio:PSX=1,MX4SIO=1 \ + psx_mx4sio_chainload:PSX=1,MX4SIO=1,CHAINLOAD=1 \ + psx_mx4sio_runtime:PSX=1,MX4SIO_RUNTIME=1 \ + psx_mx4sio_runtime_chainload:PSX=1,MX4SIO_RUNTIME=1,CHAINLOAD=1 \ + psx_xfrom:PSX=1,XFROM=1 \ + psx_xfrom_chainload:PSX=1,XFROM=1,CHAINLOAD=1 \ + psx_xfrom_runtime:PSX=1,XFROM_RUNTIME=1 \ + psx_xfrom_runtime_chainload:PSX=1,XFROM_RUNTIME=1,CHAINLOAD=1 \ + udptty:UDPTTY=1 \ + ppctty:PPCTTY=1 + +variant_name = $(word 1,$(subst :, ,$1)) +variant_flags = $(wordlist 2,200,$(subst :, ,$1)) +variant_json = {"name":"$(call variant_name,$1)","flags":"$(strip $(call variant_flags,$1))"} # ---{ VERSIONING }--- # @@ -48,13 +122,13 @@ STATUS = Beta # ---{ EXECUTABLES }--- # -BINDIR ?= bin/ BASENAME ?= PS2BBL EE_BIN = $(BINDIR)$(BASENAME).ELF EE_BIN_STRIPPED = $(BINDIR)stripped_$(BASENAME).ELF EE_BIN_PACKED = $(BINDIR)COMPRESSED_$(BASENAME).ELF KELFTYPE ?= MC EE_BIN_ENCRYPTED = $(BINDIR)$(BASENAME)_$(KELFTYPE).KELF +BUILD_CONFIG = $(OUTDIR)/BUILD_CONFIG.txt # ---{ OBJECTS & STUFF }--- # @@ -85,10 +159,29 @@ ifneq ($(VERBOSE), 1) .SILENT: endif +# ---{ VALIDATION }--- # +ifeq ($(filter 0 1,$(HAS_EMBED_IRX)),) + $(error HAS_EMBED_IRX must be 0 or 1) +endif +ifeq ($(filter 0 1,$(DEBUG)),) + $(error DEBUG must be 0 or 1) +endif +ifeq ($(filter 0 1,$(CHAINLOAD)),) + $(error CHAINLOAD must be 0 or 1) +endif +ifeq ($(filter 0 1,$(PSX)),) + $(error PSX must be 0 or 1) +endif +ifeq ($(filter 0 1,$(HDD) $(HDD_RUNTIME) $(MMCE) $(MMCE_RUNTIME) $(MX4SIO) $(MX4SIO_RUNTIME) $(XFROM) $(XFROM_RUNTIME) $(UDPTTY) $(PPCTTY)),) + $(error Storage/debug feature toggles must be 0 or 1) +endif +ifeq ($(filter NONE PRINTF EE_SIO SCR,$(PRINTF)),) + $(error PRINTF must be one of: NONE, PRINTF, EE_SIO, SCR) +endif + ifeq ($(CHAINLOAD), 1) HAS_EMBED_IRX = 1 EE_CFLAGS += -DCHAINLOAD -DCHAINLOAD_PATH=\"$(CHAINLOAD_PATH)\" - undefine EMBEDDED_STUFF endif ifeq ($(MX4SIO), 1) @@ -117,6 +210,7 @@ endif ifeq ($(MX4SIO_RUNTIME), 1) HOMEBREW_IRX = 1 FILEXIO_NEED = 1 + EE_OBJS += mx4sio_bd_irx.o EE_CFLAGS += -DMX4SIO_RUNTIME ifeq ($(MX4SIO), 1) $(error MX4SIO_RUNTIME cant coexist with MX4SIO) @@ -135,6 +229,7 @@ endif ifeq ($(MMCE_RUNTIME), 1) HOMEBREW_IRX = 1 FILEXIO_NEED = 1 + EE_OBJS += mmceman_irx.o EE_CFLAGS += -DMMCE_RUNTIME ifeq ($(MMCE), 1) $(error MMCE_RUNTIME cant coexist with MMCE) @@ -152,28 +247,30 @@ endif ifeq ($(XFROM), 1) FILEXIO_NEED = 1 + EE_OBJS += xfromman_irx.o extflash_irx.o EE_CFLAGS += -DXFROM endif ifeq ($(XFROM_RUNTIME), 1) FILEXIO_NEED = 1 + EE_OBJS += xfromman_irx.o extflash_irx.o EE_CFLAGS += -DXFROM_RUNTIME endif ifeq ($(HOMEBREW_IRX), 1) - $(info --- enforcing usage of homebrew IRX modules) + $(call feature_info,--- enforcing usage of homebrew IRX modules) USE_ROM_PADMAN = 0 USE_ROM_MCMAN = 0 USE_ROM_SIO2MAN = 0 else - $(info --- using BOOT-ROM drivers) + $(call feature_info,--- using BOOT-ROM drivers) USE_ROM_PADMAN = 1 USE_ROM_MCMAN = 1 USE_ROM_SIO2MAN = 1 endif ifeq ($(PSX), 1) - $(info --- building with PSX-DESR support) + $(call feature_info,--- building with PSX-DESR support) BASENAME = PSXBBL EE_CFLAGS += -DPSX=1 EE_OBJS += scmd_add.o ioprp.o @@ -183,7 +280,7 @@ else endif ifeq ($(DEBUG), 1) - $(info --- debugging enabled) + $(call feature_info,--- debugging enabled) EE_CFLAGS += -DDEBUG -O0 -g EE_LIBS += -lelf-loader else @@ -214,15 +311,15 @@ else endif ifeq ($(HAS_EMBED_IRX), 1) - $(info --- USB drivers will be embedded) + $(call feature_info,--- USB drivers will be embedded) EE_OBJS += usbd_irx.o bdm_irx.o bdmfs_fatfs_irx.o usbmass_bd_irx.o EE_CFLAGS += -DHAS_EMBEDDED_IRX else - $(info --- USB drivers will be external) + $(call feature_info,--- USB drivers will be external) endif ifeq ($(HDD), 1) - $(info --- compiling with HDD support) + $(call feature_info,--- compiling with HDD support) EE_LIBS += -lpoweroff EE_OBJS += ps2fs_irx.o ps2hdd_irx.o ps2atad_irx.o poweroff_irx.o EE_CFLAGS += -DHDD @@ -232,7 +329,7 @@ ifeq ($(HDD), 1) endif ifeq ($(HDD_RUNTIME), 1) - $(info --- runtime HDD enablement support enabled) + $(call feature_info,--- runtime HDD enablement support enabled) EE_CFLAGS += -DHDD_RUNTIME FILEXIO_NEED = 1 DEV9_NEED = 1 @@ -240,7 +337,7 @@ ifeq ($(HDD_RUNTIME), 1) endif ifeq ($(UDPTTY), 1) - $(info --- UDPTTY enabled) + $(call feature_info,--- UDPTTY enabled) EE_CFLAGS += -DUDPTTY EE_OBJS += udptty_irx.o ps2ip_irx.o netman_irx.o smap_irx.o DEV9_NEED = 1 @@ -248,7 +345,7 @@ ifeq ($(UDPTTY), 1) PRINTF = PRINTF endif else ifeq ($(PPCTTY), 1) - $(info --- PPCTTY enabled) + $(call feature_info,--- PPCTTY enabled) EE_CFLAGS += -DPPCTTY EE_OBJS += ppctty_irx.o ifneq ($(PRINTF), EE_SIO) # only enable common printf if EE_SIO is disabled. this allows separating EE and IOP printf @@ -257,7 +354,7 @@ else ifeq ($(PPCTTY), 1) endif ifeq ($(FILEXIO_NEED), 1) - $(info --- FILEXIO will be included) + $(call feature_info,--- FILEXIO will be included) EE_CFLAGS += -DFILEXIO EE_LIBS += -lfileXio EE_OBJS += filexio_irx.o iomanx_irx.o @@ -267,6 +364,10 @@ ifeq ($(DUMMY_TIMEZONE), 1) EE_CFLAGS += -DDUMMY_TIMEZONE endif +ifeq ($(NEWLIB_NANO), 1) + EE_CFLAGS += -DNEWLIB_NANO +endif + ifeq ($(DEV9_NEED), 1) EE_CFLAGS += -DDEV9 EE_OBJS += ps2dev9_irx.o @@ -288,15 +389,15 @@ endif ifeq ($(PRINTF), NONE) else ifeq ($(PRINTF), SCR) - $(info --- SCR Printf enabled) + $(call feature_info,--- SCR Printf enabled) EE_CFLAGS += -DSCR_PRINT else ifeq ($(PRINTF), EE_SIO) - $(info --- EESIO Printf enabled) + $(call feature_info,--- EESIO Printf enabled) EE_CFLAGS += -DEE_SIO_DEBUG EE_LIBS += -lsiocookie EE_OBJS += sioprintf.o else ifeq ($(PRINTF), PRINTF) - $(info --- Common Printf enabled) + $(call feature_info,--- Common Printf enabled) EE_CFLAGS += -DCOMMON_PRINTF else ifneq ($(PRINTF),) $(warning UNKNOWN PRINTF REQUESTED: '$(PRINTF)') @@ -311,15 +412,15 @@ ifeq ($(PROHBIT_DVD_0100),1) endif # ---{ RECIPES }--- # -.PHONY: greeting debug all clean kelf packed release +.PHONY: greeting debug all clean kelf packed release variants list-variants -all: $(EE_BIN) +all: $(EE_BIN) $(BUILD_CONFIG) ifeq (DEBUG, 1) $(MAKE) greeting endif rebuild: clean packed -packed: $(EE_BIN_PACKED) +packed: $(EE_BIN_PACKED) $(BUILD_CONFIG) greeting: @echo built PS2BBL PSX=$(PSX), LOCAL_IRX=$(HAS_EMBED_IRX), DEBUG=$(DEBUG) @@ -329,12 +430,12 @@ greeting: @echo printf=$(PRINTF) @echo $(EE_OBJS) -release: clean $(EE_BIN_PACKED) +release: clean $(EE_BIN_PACKED) $(BUILD_CONFIG) @rm -f $(EE_BIN_STRIPPED) @echo "$$HEADER" clean: - @rm -rf $(EE_BIN) $(EE_BIN_STRIPPED) $(EE_BIN_ENCRYPTED) $(EE_BIN_PACKED) + @rm -rf $(EE_BIN) $(EE_BIN_STRIPPED) $(EE_BIN_ENCRYPTED) $(EE_BIN_PACKED) $(BUILD_CONFIG) @rm -rf $(EE_OBJS_DIR) $(EE_ASM_DIR) $(EE_BIN_STRIPPED): $(EE_BIN) @@ -358,6 +459,19 @@ else ifeq ($(KELFTYPE), HDD) else $(error UNKNOWN KELF TYPE: '$(KELFTYPE)') endif + +$(BUILD_CONFIG): $(EE_BIN) + @mkdir -p $(OUTDIR) + @echo "VARIANT=$(VARIANT)" > $@ + @echo "COMMIT_HASH=$(COMMIT_HASH)" >> $@ + @echo "UTC_TIME=$(shell date -u '+%Y-%m-%dT%H:%M:%SZ')" >> $@ + @echo "OUTDIR=$(OUTDIR)" >> $@ + @echo "BASENAME=$(BASENAME)" >> $@ + @echo "OPTIONS" >> $@ + @for opt in $(CANONICAL_OPTIONS); do echo " $$opt=$($(opt))"; done >> $@ + @echo "MAKEOVERRIDES=$(MAKEOVERRIDES)" >> $@ + @echo "CFLAGS=$(EE_CFLAGS)" >> $@ + @echo "DEFINES=$(filter -D%,$(EE_CFLAGS))" >> $@ # move OBJ to folder and search source on src/, borrowed from OPL makefile EE_OBJS := $(EE_OBJS:%=$(EE_OBJS_DIR)%) # remap all EE_OBJ to obj subdir @@ -389,6 +503,31 @@ ifneq ($(VERBOSE),1) @echo " - $@" endif $(EE_AS) $(EE_ASFLAGS) $< -o $@ + +list-variants: + @sep="" + @printf '{"include":[' + @for entry in $(VARIANT_DEFINITIONS); do \ + name=$${entry%%:*}; \ + flags=$${entry#*:}; \ + if [ "$$entry" = "$$name" ]; then flags=""; fi; \ + flags=$$(echo "$$flags" | sed 's/,/ /g'); \ + printf '%s{"name":"%s","flags":"%s"}' "$$sep" "$$name" "$$flags"; \ + sep=","; \ + done; \ + printf ']}\n' + +variants: + @set -e; \ + for entry in $(VARIANT_DEFINITIONS); do \ + name=$${entry%%:*}; \ + flags=$${entry#*:}; \ + if [ "$$entry" = "$$name" ]; then flags=""; fi; \ + flags=$$(echo "$$flags" | sed 's/,/ /g'); \ + odir="$(VARIANTS_OUTDIR)/$$name"; \ + $(MAKE) VARIANT=$$name OUTDIR=$$odir $$flags clean >/dev/null; \ + $(MAKE) VARIANT=$$name OUTDIR=$$odir $$flags all; \ + done # analize: $(MAKE) rebuild DEBUG=1 @@ -402,6 +541,10 @@ banner: @echo "$$HEADER" # Include makefiles -include $(PS2SDK)/samples/Makefile.pref -include $(PS2SDK)/samples/Makefile.eeglobal -include embed.make +ifneq ($(filter list-variants,$(MAKECMDGOALS)),) + # Skip heavy includes when only enumerating variants +else + include $(PS2SDK)/samples/Makefile.pref + include $(PS2SDK)/samples/Makefile.eeglobal + include embed.make +endif diff --git a/include/irx_import.h b/include/irx_import.h index a10ea3f..e37a146 100644 --- a/include/irx_import.h +++ b/include/irx_import.h @@ -15,7 +15,7 @@ IMPORT_BIN2C(padman_irx); IMPORT_BIN2C(psx_ioprp); #endif -#ifdef MMCE +#if defined(MMCE) || defined(MMCE_RUNTIME) IMPORT_BIN2C(mmceman_irx); #endif @@ -31,6 +31,11 @@ IMPORT_BIN2C(ps2hdd_irx); IMPORT_BIN2C(ps2fs_irx); #endif +#if defined(XFROM) || defined(XFROM_RUNTIME) +IMPORT_BIN2C(xfromman_irx); +IMPORT_BIN2C(extflash_irx); +#endif + #ifdef UDPTTY IMPORT_BIN2C(ps2ip_irx); IMPORT_BIN2C(udptty_irx); @@ -38,7 +43,7 @@ IMPORT_BIN2C(netman_irx); IMPORT_BIN2C(smap_irx); #endif -#ifdef MX4SIO +#if defined(MX4SIO) || defined(MX4SIO_RUNTIME) IMPORT_BIN2C(mx4sio_bd_irx); #ifdef USE_ROM_SIO2MAN #error MX4SIO needs Homebrew SIO2MAN to work diff --git a/src/main.c b/src/main.c index c422914..08754d3 100644 --- a/src/main.c +++ b/src/main.c @@ -36,6 +36,8 @@ static const char *const DEFAULT_CONFIG_PATHS[SOURCE_COUNT] = { }; const char *CONFIG_PATHS[SOURCE_COUNT]; +static int LocateExternalIRXPath(const char *filename, char *resolved_path, size_t resolved_size); + const char *const DEFPATH[] = { "mc?:/BOOT/BOOT.ELF", // AUTO [0] "mc?:/BOOT/BOOT2.ELF",