CC=mipsel-unknown-elf-gcc
AS=mipsel-unknown-elf-as
LD=mipsel-unknown-elf-ld
DU=mipsel-unknown-elf-objdump

SYS_OBJS = reset.o \
           boot_handler.o \
	   giet.o \
	   switch.o \
	   common.o \
	   ctx_handler.o \
	   drivers.o \
	   exc_handler.o \
	   irq_handler.o \
	   sys_handler.o

PGCD_OBJS   = pgcd_stdio.o \
	      pgcd_main.o

HELLO_OBJS  = hello_stdio.o \
	      hello_main.o

FIFO_OBJS   = fifo_stdio.o \
	      fifo_main.o \
              fifo_mwmr.o

ROUTER_OBJS = router_stdio.o \
	      router_main.o \
              router_mwmr.o

SYS_PATH    = sys
HELLO_PATH  = hello
FIFO_PATH   = fifo
PGCD_PATH   = pgcd
ROUTER_PATH = router
MAP_PATH    = xml
LIBS_PATH   = libs

CFLAGS=-Wall -ffreestanding -mno-gpopt -mips32 

SYS_INCLUDE = -I$(SYS_PATH) -I$(MAP_PATH) -I$(LIBS_PATH) -I.
HELLO_INCLUDE= -I$(HELLO_PATH) -I$(LIBS_PATH)
FIFO_INCLUDE= -I$(FIFO_PATH) -I$(LIBS_PATH)
PGCD_INCLUDE= -I$(PGCD_PATH) -I$(LIBS_PATH)
ROUTER_INCLUDE= -I$(ROUTER_PATH) -I$(LIBS_PATH)

all: sys.bin hello.bin router.bin fifo.bin pgcd.bin map.bin

## mapping compilation

map.bin: map.xml
	xml/xml2bin map.xml map.bin

## system compilation

sys.bin: $(SYS_OBJS) $(SYS_PATH)/sys.ld
	$(LD) -o $@ -T $(SYS_PATH)/sys.ld $(SYS_OBJS)
	$(DU) -D $@ > $@.txt

switch.o: $(SYS_PATH)/switch.s giet_config.h
	$(AS) -g -mips32 -o $@ $<

giet.o: $(SYS_PATH)/giet.s giet_config.h
	$(AS) -g -mips32 -o $@ $<

reset.o: $(SYS_PATH)/reset.S giet_config.h
	$(CC) $(CFLAGS) $(SYS_INCLUDE) -c -o $@ $<
	$(DU) -D $@ > $@.txt

boot_handler.o: $(SYS_PATH)/boot_handler.c $(SYS_PATH)/boot_handler.h giet_config.h
	$(CC) $(CFLAGS) $(SYS_INCLUDE) -c -o $@ $<

ctx_handler.o: $(SYS_PATH)/ctx_handler.c $(SYS_PATH)/ctx_handler.h giet_config.h
	$(CC) $(CFLAGS) $(SYS_INCLUDE) -c -o $@ $<

exc_handler.o: $(SYS_PATH)/exc_handler.c $(SYS_PATH)/exc_handler.h giet_config.h
	$(CC) $(CFLAGS) $(SYS_INCLUDE) -c -o $@ $<

irq_handler.o: $(SYS_PATH)/irq_handler.c $(SYS_PATH)/irq_handler.h giet_config.h
	$(CC) $(CFLAGS) $(SYS_INCLUDE) -c -o $@ $<

sys_handler.o: $(SYS_PATH)/sys_handler.c $(SYS_PATH)/sys_handler.h giet_config.h
	$(CC) $(CFLAGS) $(SYS_INCLUDE) -c -o $@ $<

drivers.o: $(SYS_PATH)/drivers.c $(SYS_PATH)/drivers.h giet_config.h
	$(CC) $(CFLAGS) $(SYS_INCLUDE) -c -o $@ $<

common.o: $(SYS_PATH)/common.c $(SYS_PATH)/common.h giet_config.h
	$(CC) $(CFLAGS) $(SYS_INCLUDE) -c -o $@ $<

## application "hello" compilation

hello.bin: $(HELLO_OBJS) $(HELLO_PATH)/hello.ld
	$(LD) -o $@ -T $(HELLO_PATH)/hello.ld $(HELLO_OBJS)
	$(DU) -D $@ > $@.txt

hello_stdio.o: $(LIBS_PATH)/stdio.c $(LIBS_PATH)/stdio.h giet_config.h
	$(CC) $(CFLAGS) $(HELLO_INCLUDE) -c -o $@ $<

hello_main.o: $(HELLO_PATH)/main.c giet_config.h
	$(CC) $(CFLAGS) $(HELLO_INCLUDE) -c -o $@ $<

## application "fifo" compilation

fifo.bin: $(FIFO_OBJS) $(FIFO_PATH)/fifo.ld 
	$(LD) -o $@ -T $(FIFO_PATH)/fifo.ld $(FIFO_OBJS)
	$(DU) -D $@ > $@.txt

fifo_stdio.o: $(LIBS_PATH)/stdio.c $(LIBS_PATH)/stdio.h giet_config.h
	$(CC) $(CFLAGS) $(FIFO_INCLUDE) -c -o $@ $<

fifo_mwmr.o: $(LIBS_PATH)/mwmr.c $(LIBS_PATH)/mwmr.h giet_config.h
	$(CC) $(CFLAGS) $(FIFO_INCLUDE) -c -o $@ $<

fifo_main.o: $(FIFO_PATH)/main.c giet_config.h
	$(CC) $(CFLAGS) $(FIFO_INCLUDE) -c -o $@ $<

## application "router" compilation

router.bin: $(ROUTER_OBJS) $(ROUTER_PATH)/router.ld 
	$(LD) -o $@ -T $(ROUTER_PATH)/router.ld $(ROUTER_OBJS)
	$(DU) -D $@ > $@.txt

router_stdio.o: $(LIBS_PATH)/stdio.c $(LIBS_PATH)/stdio.h giet_config.h
	$(CC) $(CFLAGS) $(ROUTER_INCLUDE) -c -o $@ $<

router_mwmr.o: $(LIBS_PATH)/mwmr.c $(LIBS_PATH)/mwmr.h giet_config.h
	$(CC) $(CFLAGS) $(ROUTER_INCLUDE) -c -o $@ $<

router_main.o: $(ROUTER_PATH)/main.c giet_config.h
	$(CC) $(CFLAGS) $(ROUTER_INCLUDE) -c -o $@ $<

## application "pgcd" compilation

pgcd.bin: $(PGCD_OBJS) $(PGCD_PATH)/pgcd.ld 
	$(LD) -o $@ -T $(PGCD_PATH)/pgcd.ld $(PGCD_OBJS)
	$(DU) -D $@ > $@.txt

pgcd_stdio.o: $(LIBS_PATH)/stdio.c $(LIBS_PATH)/stdio.h giet_config.h
	$(CC) $(CFLAGS) $(PGCD_INCLUDE) -c -o $@ $<

pgcd_main.o: $(PGCD_PATH)/main.c giet_config.h
	$(CC) $(CFLAGS) $(PGCD_INCLUDE) -c -o $@ $<

### special rules

clean:
	rm -f *.o *.bin *.txt core *~ 
