# =============================================================================
# Palm OS Dual-Target Makefile Template
#
# Unterstuetzt:
#   make build                  -> Palm OS 4 (reine 68K-App)
#   make build TARGET=palmos5   -> Palm OS 5 (ARM-nativ mit 68K-Stub)
#
# Anleitung:
#   1. APP_NAME, CREATOR_ID, SOURCES anpassen
#   2. .c-Dateien und .rcp-Datei erstellen
#   3. "make build" ausfuehren
# =============================================================================

# === Projekt-Konfiguration (vom User auszufuellen) ===
APP_NAME    = MyApp
CREATOR_ID  = MyAp
RESOURCES   = app.rcp

# Quelldateien:
# - palmos4: SOURCES wird direkt kompiliert (68K)
# - palmos5: ARM_SOURCES wird fuer ARM kompiliert, SOURCES wird ignoriert
SOURCES      = main.c
ARM_SOURCES  = main_arm.c
HEADERS      =

# === Target: palmos4 (default) oder palmos5 ===
TARGET ?= palmos4

# === Gemeinsame Pfade ===
# Auto-detect: Projekt liegt innerhalb des geklonten Repos (z.B. palmdev-macos/myapp/)
REPO_DIR      := $(shell cd .. && pwd)
TOOLCHAIN_DIR = $(REPO_DIR)/toolchain
PEAL_DIR      = $(REPO_DIR)/peal
SDK4_DIR      = $(REPO_DIR)/sdk/sdk-4
SDK5_DIR      = $(REPO_DIR)/sdk/sdk-5r3
BUILD_DIR     = build/$(TARGET)

# === Gemeinsame Tools ===
# pilrc: zuerst lokal im Repo suchen, dann Homebrew, dann PATH
PILRC     := $(shell \
    if [ -x "$(REPO_DIR)/tools/pilrc" ]; then echo "$(REPO_DIR)/tools/pilrc"; \
    elif [ -x "/opt/homebrew/opt/pilrc/bin/pilrc" ]; then echo "/opt/homebrew/opt/pilrc/bin/pilrc"; \
    else echo "pilrc"; fi)
BUILD_PRC = $(TOOLCHAIN_DIR)/bin/build-prc
export GCC_EXEC_PREFIX = $(TOOLCHAIN_DIR)/lib/gcc-lib/

# =============================================================================
# Palm OS 4 (reine 68K-App)
# =============================================================================
ifeq ($(TARGET),palmos4)

SDK_DIR = $(SDK4_DIR)

CC = $(TOOLCHAIN_DIR)/bin/m68k-palmos-gcc
CFLAGS = -B$(TOOLCHAIN_DIR)/lib/gcc-lib/m68k-palmos/2.95.3-kgpd/ \
         -B$(TOOLCHAIN_DIR)/m68k-palmos/bin/ \
         -B$(TOOLCHAIN_DIR)/m68k-palmos/lib/ \
         -nostdinc \
         -I$(SDK_DIR)/include \
         -I$(SDK_DIR)/include/Core \
         -I$(SDK_DIR)/include/Core/Hardware \
         -I$(SDK_DIR)/include/Core/System \
         -I$(SDK_DIR)/include/Core/UI \
         -I$(SDK_DIR)/include/Dynamic \
         -I$(SDK_DIR)/include/Libraries \
         -O2 -Wall
LDFLAGS = -L$(SDK_DIR)/lib

OBJS = $(patsubst %.c,$(BUILD_DIR)/%.o,$(SOURCES))
APP_BINARY = $(BUILD_DIR)/$(APP_NAME)
PRC_NAME = $(BUILD_DIR)/$(APP_NAME).prc

.PHONY: all build clean rebuild info

all: info

info:
	@echo "=== $(APP_NAME) - Palm OS Application ==="
	@echo ""
	@echo "  make build                 - Build fuer Palm OS 4 (68K)"
	@echo "  make build TARGET=palmos5  - Build fuer Palm OS 5 (ARM)"
	@echo "  make clean                 - Build-Artefakte loeschen"
	@echo "  make rebuild               - Clean + Build"
	@echo ""
	@echo "  Aktuelles Target: $(TARGET)"

build: $(PRC_NAME)
	@echo "=== Built $(PRC_NAME) ==="
	@ls -lh $(PRC_NAME)

$(PRC_NAME): $(APP_BINARY) $(BUILD_DIR)/.resources
	$(BUILD_PRC) -o $@ \
		-t appl \
		-c $(CREATOR_ID) \
		-n "$(APP_NAME)" \
		$(APP_BINARY) $(BUILD_DIR)/*.bin

$(APP_BINARY): $(OBJS)
	$(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) -o $@

$(BUILD_DIR)/%.o: %.c $(HEADERS)
	@mkdir -p $(BUILD_DIR)
	$(CC) $(CFLAGS) -c $< -o $@

$(BUILD_DIR)/.resources: $(RESOURCES) $(HEADERS)
	@mkdir -p $(BUILD_DIR)
	$(PILRC) $(RESOURCES) $(BUILD_DIR)
	@touch $@

clean:
	/bin/rm -rf build
	/bin/rm -f *.grc *~

rebuild: clean build

endif # palmos4

# =============================================================================
# Palm OS 5 (ARM-nativ mit 68K-Stub via PEAL)
#
# Build-Pipeline:
#   1. ARM kompilieren:  arm-palmos-gcc -> .o Dateien
#   2. ARM linken:       arm-palmos-gcc -> ARM ELF
#   3. Postlink:         peal-postlink -> .ro (armc-Ressourcen)
#   4. 68K kompilieren:  m68k-palmos-gcc -> Stub + PEAL Loader
#   5. 68K linken:       m68k-palmos-gcc -> 68K ELF
#   6. PilRC:            pilrc -> .bin Ressourcen
#   7. build-prc:        68K ELF + .bin + .ro -> .prc
# =============================================================================
ifeq ($(TARGET),palmos5)

SDK_DIR = $(SDK5_DIR)

# 68K-Compiler (fuer Stub + PEAL Loader)
CC_M68K = $(TOOLCHAIN_DIR)/bin/m68k-palmos-gcc
CFLAGS_M68K = -B$(TOOLCHAIN_DIR)/lib/gcc-lib/m68k-palmos/2.95.3-kgpd/ \
              -B$(TOOLCHAIN_DIR)/m68k-palmos/bin/ \
              -B$(TOOLCHAIN_DIR)/m68k-palmos/lib/ \
              -nostdinc \
              -I$(SDK_DIR)/include \
              -I$(SDK_DIR)/include/Core \
              -I$(SDK_DIR)/include/Core/Hardware \
              -I$(SDK_DIR)/include/Core/System \
              -I$(SDK_DIR)/include/Core/UI \
              -I$(SDK_DIR)/include/Dynamic \
              -I$(SDK_DIR)/include/Libraries \
              -I$(SDK_DIR)/include/Libraries/PalmOSGlue \
              -I$(PEAL_DIR)/m68k \
              -O2 -Wall
LDFLAGS_M68K = -L$(SDK_DIR)/lib -L$(SDK_DIR)/lib/m68k-palmos-coff
LDLIBS_M68K  = -lPalmOSGlue

# ARM-Compiler (fuer Hauptapplikation)
CC_ARM = $(TOOLCHAIN_DIR)/bin/arm-palmos-gcc
CFLAGS_ARM = -B$(TOOLCHAIN_DIR)/lib/gcc-lib/arm-palmos/3.3.1/ \
             -B$(TOOLCHAIN_DIR)/arm-palmos/bin/ \
             -B$(TOOLCHAIN_DIR)/arm-palmos/lib/ \
             -nostdinc \
             -I$(SDK_DIR)/include \
             -I$(SDK_DIR)/include/Core \
             -I$(SDK_DIR)/include/Core/Hardware \
             -I$(SDK_DIR)/include/Core/System \
             -I$(SDK_DIR)/include/Core/UI \
             -I$(SDK_DIR)/include/Dynamic \
             -I$(SDK_DIR)/include/Libraries \
             -I$(PEAL_DIR)/arm \
             -march=armv4 -mtune=xscale \
             -msingle-pic-base \
             -O2 -Wall
LDFLAGS_ARM = -nostartfiles \
              -Wl,--emit-relocs \
              -Wl,--split-by-file=63000

PEAL_POSTLINK = $(TOOLCHAIN_DIR)/bin/peal-postlink

# ARM-Objekte (pealstub.o muss zuerst!)
ARM_OBJS = $(BUILD_DIR)/arm/pealstub.o \
           $(patsubst %.c,$(BUILD_DIR)/arm/%.o,$(ARM_SOURCES))
ARM_ELF = $(BUILD_DIR)/arm/$(APP_NAME)_arm.elf
ARM_RO  = $(BUILD_DIR)/arm/$(APP_NAME)_arm.ro

# 68K-Objekte (Stub + PEAL Loader)
M68K_OBJS = $(BUILD_DIR)/m68k/stub_m68k.o \
            $(BUILD_DIR)/m68k/peal.o
M68K_ELF = $(BUILD_DIR)/m68k/$(APP_NAME)_stub

PRC_NAME = $(BUILD_DIR)/$(APP_NAME).prc

.PHONY: all build clean rebuild info

all: info

info:
	@echo "=== $(APP_NAME) - Palm OS Application ==="
	@echo ""
	@echo "  make build                 - Build fuer Palm OS 4 (68K)"
	@echo "  make build TARGET=palmos5  - Build fuer Palm OS 5 (ARM)"
	@echo "  make clean                 - Build-Artefakte loeschen"
	@echo "  make rebuild               - Clean + Build"
	@echo ""
	@echo "  Aktuelles Target: $(TARGET)"

build: $(PRC_NAME)
	@echo "=== Built $(PRC_NAME) (ARM-nativ mit 68K-Stub) ==="
	@ls -lh $(PRC_NAME)

# Schritt 7: Alles zusammenpacken
$(PRC_NAME): $(M68K_ELF) $(ARM_RO) $(BUILD_DIR)/.resources
	$(BUILD_PRC) -o $@ \
		-t appl \
		-c $(CREATOR_ID) \
		-n "$(APP_NAME)" \
		$(M68K_ELF) $(BUILD_DIR)/*.bin $(ARM_RO)

# Schritt 6: Resources kompilieren
$(BUILD_DIR)/.resources: $(RESOURCES) $(HEADERS)
	@mkdir -p $(BUILD_DIR)
	$(PILRC) $(RESOURCES) $(BUILD_DIR)
	@touch $@

# Schritt 5: 68K linken
$(M68K_ELF): $(M68K_OBJS)
	$(CC_M68K) $(CFLAGS_M68K) $(LDFLAGS_M68K) $(M68K_OBJS) $(LDLIBS_M68K) -o $@

# Schritt 4: 68K kompilieren (Stub)
$(BUILD_DIR)/m68k/stub_m68k.o: stub_m68k.c $(HEADERS)
	@mkdir -p $(BUILD_DIR)/m68k
	$(CC_M68K) $(CFLAGS_M68K) -c $< -o $@

# Schritt 4: 68K kompilieren (PEAL Loader)
$(BUILD_DIR)/m68k/peal.o: $(PEAL_DIR)/m68k/peal.c
	@mkdir -p $(BUILD_DIR)/m68k
	$(CC_M68K) $(CFLAGS_M68K) -c $< -o $@

# Schritt 3: ARM ELF -> Palm-OS-Ressource
$(ARM_RO): $(ARM_ELF)
	$(PEAL_POSTLINK) -s 1000 -o $@ $(ARM_ELF)

# Schritt 2: ARM linken (pealstub.o muss zuerst!)
$(ARM_ELF): $(ARM_OBJS)
	$(CC_ARM) $(CFLAGS_ARM) $(LDFLAGS_ARM) $(ARM_OBJS) -o $@

# Schritt 1: ARM kompilieren (pealstub)
$(BUILD_DIR)/arm/pealstub.o: $(PEAL_DIR)/arm/pealstub.c
	@mkdir -p $(BUILD_DIR)/arm
	$(CC_ARM) $(CFLAGS_ARM) -c $< -o $@

# Schritt 1: ARM kompilieren (App-Quellen)
$(BUILD_DIR)/arm/%.o: %.c $(HEADERS)
	@mkdir -p $(BUILD_DIR)/arm
	$(CC_ARM) $(CFLAGS_ARM) -I. -c $< -o $@

clean:
	/bin/rm -rf build
	/bin/rm -f *.grc *~

rebuild: clean build

endif # palmos5
