
ARMGNU ?= arm-none-eabi

AOPS = --warn --fatal-warnings -mcpu=arm1176jzf-s -march=armv6
COPS0 = -Wall -O1 -nostdlib -nostartfiles -ffreestanding 
COPS1 = -Wall -O2 -nostdlib -nostartfiles -ffreestanding 
COPS2 = -Wall -O3 -nostdlib -nostartfiles -ffreestanding 
COPS3 = -Wall -O2 -nostdlib -nostartfiles -ffreestanding -mcpu=arm1176jzf-s 
COPS4 = -Wall -O2 -nostdlib -nostartfiles -ffreestanding -mcpu=arm1176jzf-s -mtune=arm1176jzf-s
COPS5 = -Wall -O3 -nostdlib -nostartfiles -ffreestanding -mcpu=arm1176jzf-s -mtune=arm1176jzf-s
COPS = $(COPS5)

gcc : twain.gcc.hex twain.gcc.bin

all : gcc clang

clean :
	rm -f *.o
	rm -f *.bin
	rm -f *.hex
	rm -f *.elf
	rm -f *.list
	rm -f *.img
	rm -f *.bc
	rm -f *.clang.s


vectors.o : vectors.s
	$(ARMGNU)-as $(AOPS) vectors.s -o vectors.o


ZOBJSDEF = compress.o deflate.o trees.o
ZOBJS = uncompr.o inflate.o crc32.o adler32.o inffast.o inftrees.o zutil.o $(ZOBJSDEF)

twain.o : twain.c twaindef.h
	$(ARMGNU)-gcc $(COPS) -c twain.c -o twain.o

uart.o : uart.c
	$(ARMGNU)-gcc $(COPS) -c uart.c -o uart.o


uncompr.o : uncompr.c
	$(ARMGNU)-gcc $(COPS) -c uncompr.c -o uncompr.o

inflate.o : inflate.c
	$(ARMGNU)-gcc $(COPS) -c inflate.c -o inflate.o

crc32.o : crc32.c
	$(ARMGNU)-gcc $(COPS) -c crc32.c -o crc32.o

adler32.o : adler32.c
	$(ARMGNU)-gcc $(COPS) -c adler32.c -o adler32.o

inffast.o : inffast.c
	$(ARMGNU)-gcc $(COPS) -c inffast.c -o inffast.o

inftrees.o : inftrees.c
	$(ARMGNU)-gcc $(COPS) -c inftrees.c -o inftrees.o

zutil.o : zutil.c
	$(ARMGNU)-gcc $(COPS) -c zutil.c -o zutil.o



compress.o : compress.c
	$(ARMGNU)-gcc $(COPS) -c compress.c -o compress.o

deflate.o : deflate.c
	$(ARMGNU)-gcc $(COPS) -c deflate.c -o deflate.o

trees.o : trees.c
	$(ARMGNU)-gcc $(COPS) -c trees.c -o trees.o


twain.gcc.elf : memmap vectors.o uart.o twain.o $(ZOBJS)
	$(ARMGNU)-ld vectors.o uart.o twain.o $(ZOBJS) -T memmap -o twain.gcc.elf
	$(ARMGNU)-objdump -D twain.gcc.elf > twain.gcc.list

twain.gcc.bin : twain.gcc.elf
	$(ARMGNU)-objcopy twain.gcc.elf -O binary twain.gcc.bin

twain.gcc.hex : twain.gcc.elf
	$(ARMGNU)-objcopy twain.gcc.elf -O ihex twain.gcc.hex



ZBCSDEF = compress.bc deflate.bc trees.bc
ZBCS = uncompr.bc inflate.bc crc32.bc adler32.bc inffast.bc inftrees.bc zutil.bc $(ZBCSDEF)


LOPS = -Wall -m32 -emit-llvm -ccc-host-triple $(ARMGNU) 
LLCOPS0 = -march=arm -mtriple=$(ARMGNU)
LLCOPS1 = -march=arm -mtriple=$(ARMGNU) -mcpu=arm1176jzf-s
LLCOPS = $(LLCOPS1)


OOPS = -std-compile-opts -disable-simplify-libcalls

clang : twain.clang.hex twain.clang.bin 



twain.bc : twain.c twaindef.h
	clang $(LOPS) -c twain.c -o twain.bc

uart.bc : uart.c
	clang $(LOPS) -c uart.c -o uart.bc


uncompr.bc : uncompr.c
	clang $(LOPS) -c uncompr.c -o uncompr.bc

inflate.bc : inflate.c
	clang $(LOPS) -c inflate.c -o inflate.bc

crc32.bc : crc32.c
	clang $(LOPS) -c crc32.c -o crc32.bc

adler32.bc : adler32.c
	clang $(LOPS) -c adler32.c -o adler32.bc

inffast.bc : inffast.c
	clang $(LOPS) -c inffast.c -o inffast.bc

inftrees.bc : inftrees.c
	clang $(LOPS) -c inftrees.c -o inftrees.bc

zutil.bc : zutil.c
	clang $(LOPS) -c zutil.c -o zutil.bc



compress.bc : compress.c
	clang $(LOPS) -c compress.c -o compress.bc

deflate.bc : deflate.c
	clang $(LOPS) -c deflate.c -o deflate.bc

trees.bc : trees.c
	clang $(LOPS) -c trees.c -o trees.bc


twain.clang.bc : twain.bc uart.bc $(ZBCS)
	llvm-link -o twain.clang.bc twain.bc uart.bc $(ZBCS)

twain.clang.elf : memmap vectors.o twain.clang.bc
	opt $(OOPS) twain.clang.bc -o twain.clang.bc
	llc $(LLCOPS) twain.clang.bc -o twain.clang.s
	$(ARMGNU)-as $(AOPS) twain.clang.s -o twain.clang.o
	$(ARMGNU)-ld -o twain.clang.elf -T memmap vectors.o twain.clang.o
	$(ARMGNU)-objdump -D twain.clang.elf > twain.clang.list

twain.clang.hex : twain.clang.elf
	$(ARMGNU)-objcopy twain.clang.elf twain.clang.hex -O ihex

twain.clang.bin : twain.clang.elf
	$(ARMGNU)-objcopy twain.clang.elf twain.clang.bin -O binary





