TOOLCHAIN		?=	m68k-none-elf-
SDK				?=	../../SDK
PILRC			?=	pilrc
X86TOOLCHAIN		?=	i686-linux-gnu-
X86VARIANT		?=	DLL
CC				=	$(TOOLCHAIN)gcc
LD				=	$(TOOLCHAIN)gcc
OBJCOPY			=	$(TOOLCHAIN)objcopy
X86CC			=	$(X86TOOLCHAIN)gcc
X86LD			=	$(X86TOOLCHAIN)gcc
X86OBJCOPY		=	$(X86TOOLCHAIN)objcopy
COMMON			=	-Wmissing-prototypes -Wstrict-prototypes -Wall -Wextra -Werror
LTO				=	-flto
X86LTO			=	-flto
M68KCOMMON		=	$(COMMON) -Wno-multichar -funsafe-math-optimizations -Os -m68000 -mno-align-int -mpcrel -fpic -fshort-enums -mshort -fvisibility=hidden -Wno-attributes -g -ggdb3
X86COMMON		=	$(COMMON) -Os -m32 -fno-pic -fno-pie -no-pie -fno-semantic-interposition -fcf-protection=none -Wno-attributes -Wl,--no-dynamic-linker --static -nostdlib -march=i586 -mtune=i586 -fno-stack-protector -fno-asynchronous-unwind-tables -fno-plt -ffreestanding -fno-builtin -fvisibility=hidden -Wno-multichar -fno-jump-tables -mregparm=0 -mno-rtd
WARN			=	-Wsign-compare -Wextra -Wall -Wno-unused-parameter -Wno-old-style-declaration -Wno-unused-function -Wno-unused-variable -Wno-error=cpp -Wno-switch  -Wno-implicit-fallthrough
LKR				=	68k.lkr
X86LKR			=	x86.lkr

CCFLAGS			=	$(LTO) $(WARN) $(M68KCOMMON) -I. -ffunction-sections -fdata-sections
LDFLAGS			=	$(LTO) $(WARN) $(M68KCOMMON) -Wl,--gc-sections -Wl,-T $(LKR)

X86CCFLAGS		=	$(X86LTO) $(WARN) $(X86COMMON) -I. -ffunction-sections -fdata-sections -nolibc -Wno-missing-prototypes
X86LDFLAGS		=	$(X86LTO) $(WARN) $(X86COMMON) -Wl,--gc-sections -Wl,-T $(X86LKR)

SRCS-68k		=   m68kMain.c
SRCS-x86		=	x86Main.c x86patches.c pace.c osCalls.c helpers.c emulator.c

TARGET			=	ArmForSim


#add PalmOS SDK
INCS			+=	-I"gccisms"
INCS			+=	-isystem "$(SDK)"
INCS			+=	-isystem "$(SDK)/Core"
INCS			+=	-isystem "$(SDK)/Core/Hardware"
INCS			+=	-isystem "$(SDK)/Core/System"
INCS			+=	-isystem "$(SDK)/Core/UI"
INCS			+=	-isystem "$(SDK)/Dynamic"
INCS			+=	-isystem "$(SDK)/Libraries"


OBJS-68k		=	$(patsubst %.S,%.68k.o,$(patsubst %.c,%.68k.o,$(SRCS-68k)))
OBJS-x86		=	$(patsubst %.S,%.x86.o,$(patsubst %.c,%.x86.o,$(SRCS-x86)))

HFILES			=	$(wildcard Src/*.h)

all: $(TARGET).prc

$(TARGET).prc: code0001.68k.bin x86c0001.x86.bin res.rcp
	$(PILRC) -ro -o $(TARGET).prc -creator SimA -type appl -name $(TARGET) res.rcp

%.rcp.real.rcp: %.rcp Makefile $(HFILES)
	# PilRC's macro abilities are pitiful, so we call upon CPP :)
	cpp -o $@ $< -ISrc -I. -P $(RSRC_CPP_FLAGS)


%.68k.bin: %.68k.elf
	$(OBJCOPY) -O binary $< $@ -j.vec -j.text -j.rodata

%.68k.elf: $(OBJS-68k)
	$(LD) -o $@ $(LDFLAGS) $^

%.68k.o : %.c Makefile $(HFILES)
	$(CC) $(CCFLAGS) $(INCS) -c $< -o $@

%.68k.o : %.S Makefile $(HFILES)
	$(CC) $(CCFLAGS) $(INCS) -c $< -o $@



%.x86.bin: %.x86.elf
	$(X86OBJCOPY) -O binary $< $@ -j.text -j.rodata

%.x86.elf: $(OBJS-x86)
	$(X86LD) -o $@ $(X86LDFLAGS) $^

%.x86.o : %.c Makefile $(HFILES)
	$(X86CC) $(X86CCFLAGS) $(INCS) -c $< -o $@

%.x86.o : %.S Makefile $(HFILES)
	$(X86CC) $(X86CCFLAGS) $(INCS) -c $< -o $@



.ONESHELL:
.PHONY: clean
clean:
	rm -rf *.o *.prc *.elf *.bin
