# -DLOADER_START=0x4000000
# must also be defined/changed in *.S files, since they do not parse defines
# REMEMBER in bcm2835
# MEM_COHERENT_REGION s defined now as 0x3f00000 !!!!

BUILD_DIR_PURE := build.baremetal
BUILD_DIR := $(BUILD_DIR_PURE)/

LIB_DIR :=../pitrex/baremetal
INC_DIR_PITREX := ../pitrex
INC_DIR_LIBRARY := $(LIB_DIR)/lib2835
PITREX_DIR := ../pitrex/pitrex/
VECTREX_DIR := ../pitrex/vectrex/
LOADER_DIR := ../piTrexBoot/

CFLAGS := -Ofast -I$(INC_DIR_PITREX) -I$(INC_DIR_LIBRARY) -L$(LIB_DIR) -mfloat-abi=hard -nostartfiles -mfpu=vfp -march=armv6zk -mtune=arm1176jzf-s -DRPI0 -DFREESTANDING -DPITREX_DEBUG -DMHZ1000 -DLOADER_START=0x4000000
CC	= arm-none-eabi-gcc
AS	= $(CC)
LD	= arm-none-eabi-ld
AR	= arm-none-eabi-ar

.PHONY: pitrexLib
.PHONY: dirCheck

#bootmsg.img doesn't make sense in baremetal

all:	dirCheck pitrexLib hello.img calibrate.img window.img  maze.img  perspective.img  pacman.img  cube.img
	echo All up to date

dirCheck:
	if [ ! -d $(BUILD_DIR_PURE) ]; then mkdir $(BUILD_DIR_PURE); fi

clean:
	$(RM) $(BUILD_DIR)*.* *~ hello.img calibrate.img window.img maze.img perspective.img cube.img pacman.img

pitrexLib:
	$(MAKE) -C $(PITREX_DIR) -f Makefile.baremetal all
	$(MAKE) -C $(VECTREX_DIR) -f Makefile.baremetal all
	$(MAKE) -C $(LOADER_DIR) -f Makefile all

$(BUILD_DIR)hello.o: hello.c
	$(CC) $(CFLAGS) -o $(BUILD_DIR)hello.o -c hello.c

hello.img: $(BUILD_DIR)hello.o # pitrexLib
	$(RM) hello.img
	$(CC) $(CFLAGS) -o $(BUILD_DIR)hello.elf.img \
	$(LOADER_DIR)$(BUILD_DIR)baremetalEntry.o \
	$(LOADER_DIR)$(BUILD_DIR)bareMetalMain.o \
	$(LOADER_DIR)$(BUILD_DIR)cstubs.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-armtimer.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-aux.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-gpio.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-interrupts.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-systimer.o \
	$(PITREX_DIR)$(BUILD_DIR)bcm2835.o \
	$(PITREX_DIR)$(BUILD_DIR)pitrexio-gpio.o \
	$(VECTREX_DIR)$(BUILD_DIR)vectrexInterface.o \
	$(VECTREX_DIR)$(BUILD_DIR)osWrapper.o \
	$(VECTREX_DIR)$(BUILD_DIR)baremetalUtil.o \
	$(BUILD_DIR)hello.o -lm -lff12c  -ldebug  -lhal -lutils -lconsole -lff12c -lbob -li2c -lbcm2835 -larm $(LIB_DIR)/linkerHeapDefBoot.ld
	arm-none-eabi-objcopy $(BUILD_DIR)hello.elf.img -O binary hello.img

$(BUILD_DIR)pacman.o: pacman.c
	$(CC) $(CFLAGS) -o $(BUILD_DIR)pacman.o -c pacman.c

pacman.img: $(BUILD_DIR)pacman.o # pitrexLib
	$(RM) pacman.img
	$(CC) $(CFLAGS) -o $(BUILD_DIR)pacman.elf.img \
	$(LOADER_DIR)$(BUILD_DIR)baremetalEntry.o \
	$(LOADER_DIR)$(BUILD_DIR)bareMetalMain.o \
	$(LOADER_DIR)$(BUILD_DIR)cstubs.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-armtimer.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-aux.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-gpio.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-interrupts.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-systimer.o \
	$(PITREX_DIR)$(BUILD_DIR)bcm2835.o \
	$(PITREX_DIR)$(BUILD_DIR)pitrexio-gpio.o \
	$(VECTREX_DIR)$(BUILD_DIR)vectrexInterface.o \
	$(VECTREX_DIR)$(BUILD_DIR)osWrapper.o \
	$(VECTREX_DIR)$(BUILD_DIR)baremetalUtil.o \
	$(BUILD_DIR)pacman.o -lm -lff12c  -ldebug  -lhal -lutils -lconsole -lff12c -lbob -li2c -lbcm2835 -larm $(LIB_DIR)/linkerHeapDefBoot.ld
	arm-none-eabi-objcopy $(BUILD_DIR)pacman.elf.img -O binary pacman.img

$(BUILD_DIR)window.o: window.c
	$(CC) $(CFLAGS) -o $(BUILD_DIR)window.o -c window.c

$(BUILD_DIR)calibrate.o: calibrate.c
	$(CC) -DMAIN $(CFLAGS) -o $(BUILD_DIR)calibrate.o -c calibrate.c

calibrate.img: $(BUILD_DIR)calibrate.o $(BUILD_DIR)window.o # pitrexLib
	$(RM) calibrate.img
	$(CC) $(CFLAGS) -o $(BUILD_DIR)calibrate.elf.img \
	$(LOADER_DIR)$(BUILD_DIR)baremetalEntry.o \
	$(LOADER_DIR)$(BUILD_DIR)bareMetalMain.o \
	$(LOADER_DIR)$(BUILD_DIR)cstubs.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-armtimer.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-aux.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-gpio.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-interrupts.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-systimer.o \
	$(PITREX_DIR)$(BUILD_DIR)bcm2835.o \
	$(PITREX_DIR)$(BUILD_DIR)pitrexio-gpio.o \
	$(VECTREX_DIR)$(BUILD_DIR)vectrexInterface.o \
	$(VECTREX_DIR)$(BUILD_DIR)osWrapper.o \
	$(VECTREX_DIR)$(BUILD_DIR)baremetalUtil.o \
	$(BUILD_DIR)window.o \
	$(BUILD_DIR)calibrate.o -lm -lff12c  -ldebug  -lhal -lutils -lconsole -lff12c -lbob -li2c -lbcm2835 -larm $(LIB_DIR)/linkerHeapDefBoot.ld
	arm-none-eabi-objcopy $(BUILD_DIR)calibrate.elf.img -O binary calibrate.img

$(BUILD_DIR)windowmain.o: window.c
	$(CC) -DMAIN $(CFLAGS) -o $(BUILD_DIR)windowmain.o -c window.c

window.img: $(BUILD_DIR)windowmain.o # pitrexLib
	$(RM) window.img
	$(CC) $(CFLAGS) -o $(BUILD_DIR)window.elf.img \
	$(LOADER_DIR)$(BUILD_DIR)baremetalEntry.o \
	$(LOADER_DIR)$(BUILD_DIR)bareMetalMain.o \
	$(LOADER_DIR)$(BUILD_DIR)cstubs.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-armtimer.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-aux.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-gpio.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-interrupts.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-systimer.o \
	$(PITREX_DIR)$(BUILD_DIR)bcm2835.o \
	$(PITREX_DIR)$(BUILD_DIR)pitrexio-gpio.o \
	$(VECTREX_DIR)$(BUILD_DIR)vectrexInterface.o \
	$(VECTREX_DIR)$(BUILD_DIR)osWrapper.o \
	$(VECTREX_DIR)$(BUILD_DIR)baremetalUtil.o \
	$(BUILD_DIR)windowmain.o -lm -lff12c  -ldebug  -lhal -lutils -lconsole -lff12c -lbob -li2c -lbcm2835 -larm $(LIB_DIR)/linkerHeapDefBoot.ld
	arm-none-eabi-objcopy $(BUILD_DIR)window.elf.img -O binary window.img

$(BUILD_DIR)maze.o: maze.c
	$(CC) $(CFLAGS) -o $(BUILD_DIR)maze.o -c maze.c

maze.img: $(BUILD_DIR)maze.o # pitrexLib
	$(RM) maze.img
	$(CC) $(CFLAGS) -o $(BUILD_DIR)maze.elf.img \
	$(LOADER_DIR)$(BUILD_DIR)baremetalEntry.o \
	$(LOADER_DIR)$(BUILD_DIR)bareMetalMain.o \
	$(LOADER_DIR)$(BUILD_DIR)cstubs.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-armtimer.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-aux.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-gpio.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-interrupts.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-systimer.o \
	$(PITREX_DIR)$(BUILD_DIR)bcm2835.o \
	$(PITREX_DIR)$(BUILD_DIR)pitrexio-gpio.o \
	$(VECTREX_DIR)$(BUILD_DIR)vectrexInterface.o \
	$(VECTREX_DIR)$(BUILD_DIR)osWrapper.o \
	$(VECTREX_DIR)$(BUILD_DIR)baremetalUtil.o \
	$(BUILD_DIR)maze.o -lm -lff12c  -ldebug  -lhal -lutils -lconsole -lff12c -lbob -li2c -lbcm2835 -larm $(LIB_DIR)/linkerHeapDefBoot.ld
	arm-none-eabi-objcopy $(BUILD_DIR)maze.elf.img -O binary maze.img

$(BUILD_DIR)perspective.o: perspective.c
	$(CC) $(CFLAGS) -o $(BUILD_DIR)perspective.o -c perspective.c

perspective.img: $(BUILD_DIR)perspective.o # pitrexLib
	$(RM) perspective.img
	$(CC) $(CFLAGS) -o $(BUILD_DIR)perspective.elf.img \
	$(LOADER_DIR)$(BUILD_DIR)baremetalEntry.o \
	$(LOADER_DIR)$(BUILD_DIR)bareMetalMain.o \
	$(LOADER_DIR)$(BUILD_DIR)cstubs.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-armtimer.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-aux.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-gpio.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-interrupts.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-systimer.o \
	$(PITREX_DIR)$(BUILD_DIR)bcm2835.o \
	$(PITREX_DIR)$(BUILD_DIR)pitrexio-gpio.o \
	$(VECTREX_DIR)$(BUILD_DIR)vectrexInterface.o \
	$(VECTREX_DIR)$(BUILD_DIR)osWrapper.o \
	$(VECTREX_DIR)$(BUILD_DIR)baremetalUtil.o \
	$(BUILD_DIR)perspective.o -lm -lff12c  -ldebug  -lhal -lutils -lconsole -lff12c -lbob -li2c -lbcm2835 -larm $(LIB_DIR)/linkerHeapDefBoot.ld
	arm-none-eabi-objcopy $(BUILD_DIR)perspective.elf.img -O binary perspective.img

$(BUILD_DIR)cube.o: cube.c
	$(CC) $(CFLAGS) -o $(BUILD_DIR)cube.o -c cube.c

cube.img: $(BUILD_DIR)cube.o # pitrexLib
	$(RM) cube.img
	$(CC) $(CFLAGS) -o $(BUILD_DIR)cube.elf.img \
	$(LOADER_DIR)$(BUILD_DIR)baremetalEntry.o \
	$(LOADER_DIR)$(BUILD_DIR)bareMetalMain.o \
	$(LOADER_DIR)$(BUILD_DIR)cstubs.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-armtimer.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-aux.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-gpio.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-interrupts.o \
	$(LOADER_DIR)$(BUILD_DIR)rpi-systimer.o \
	$(PITREX_DIR)$(BUILD_DIR)bcm2835.o \
	$(PITREX_DIR)$(BUILD_DIR)pitrexio-gpio.o \
	$(VECTREX_DIR)$(BUILD_DIR)vectrexInterface.o \
	$(VECTREX_DIR)$(BUILD_DIR)osWrapper.o \
	$(VECTREX_DIR)$(BUILD_DIR)baremetalUtil.o \
	$(BUILD_DIR)cube.o -lm -lff12c  -ldebug  -lhal -lutils -lconsole -lff12c -lbob -li2c -lbcm2835 -larm $(LIB_DIR)/linkerHeapDefBoot.ld
	arm-none-eabi-objcopy $(BUILD_DIR)cube.elf.img -O binary cube.img

