# GNU 'make'
#
# 10.2 Catalogue of Built-In Rules
# ================================
#
# Compiling C programs
#      'N.o' is made automatically from 'N.c' with a recipe of the form
#      '$(CC) $(CPPFLAGS) $(CFLAGS) -c'.
#
# Assembling and preprocessing assembler programs
#      'N.o' is made automatically from 'N.s' by running the assembler,
#      'as'.  The precise recipe is '$(AS) $(ASFLAGS)'.
#
#      'N.s' is made automatically from 'N.S' by running the C
#      preprocessor, 'cpp'.  The precise recipe is '$(CPP) $(CPPFLAGS)'.

# Preprocessor
CPP := arm-none-eabi-cpp
CPPFLAGS :=

# Assembler
AS := arm-none-eabi-as
ASFLAGS :=

# C Compiler
CC := arm-none-eabi-gcc
CFLAGS := -march=armv7e-m+fp \
					-mtune=cortex-m4 \
					-mthumb \
					-mfloat-abi=hard \
					-std=gnu90 \
					-ffreestanding \
					-fsingle-precision-constant \
					-pedantic \
					-pedantic-errors \
					-Wall \
					-Wextra \
					-Wconversion \
					-Wstrict-prototypes \
					-Wshadow \
					-Wundef \
					-Wdouble-promotion

# Linker
LD := arm-none-eabi-ld
LDFLAGS := -nostdlib
LDLIBS :=

# objcopy
OC := arm-none-eabi-objcopy
OCFLAGS := --output-target=binary

# Build
objs := kernel.o
lds := kernel.ld
LDFLAGS += -T $(lds)

elf := kernel.elf
bin := kernel.bin

# Targets
all : $(bin)

clean :
	rm -f $(bin) $(elf) $(objs)

.PHONY : all clean

$(bin) : $(elf)
	$(OC) $(OCFLAGS) $< $@

$(elf) : $(objs) $(lds)
	$(LD) $(filter %.o,$^) $(LDFLAGS) $(LDLIBS) -o $@
