# Шаблон % - последовательность любых символов произвольной длины
# $@ - имя цели обрабатываемого правила
# $< - имя первой зависимости обрабатываемого правила
# $^ - список всех зависимостей обрабатываемого правила
# $(MAKE) - имя программы make с путем
# Опции gcc для линкера: -Wl,опции_с_тире
# Для gcc: -nostartfiles: не использовать стандартные стартовые файлы при линковке
#          -ffreestanding
# -fno-common: по умолчанию, если глобальная неинициализированная переменная
#              определена в нескольких файлах без extern, то компилятор
#              помещает ее в common block. Она становится общей для нескольких
#              файлов. С этой опцией при сборке возникнет ошибка.
# -flto: включить link time optimisation (иногда бывают проблемы)
NAME=c8051prg
CFLAGS = -Wall -Wno-main -Os -mcpu=cortex-m3 -mthumb -fno-common\
-ffunction-sections -fdata-sections -nostartfiles -ffreestanding -I./mcu
#Флаги для окончательной сборки
#--specs=nano.specs: использовать библиотеку newlib-nano
LFLAGS = -Wl,--gc-sections,-Map=$(NAME).map --specs=nano.specs
CC := arm-none-eabi-gcc

all: $(NAME).bin $(NAME).srec

$(NAME).bin: $(NAME).elf
	arm-none-eabi-objcopy -Obinary -j.text -j.data $< $@

$(NAME).srec: $(NAME).elf
	arm-none-eabi-objcopy -Osrec -j.text -j.data $< $@

$(NAME).elf: startup_ram.o init.o main.o utils.o buffer.o c2.o
#	$(CC) -v $(CFLAGS) -Wl,--verbose -o $@ $^ -T ram.ld
	$(CC) $(CFLAGS) $(LFLAGS) -o $@ $^ -Tram.ld

main.o: main.c utils.h errors.h buffer.h c2.h
	$(CC) $(CFLAGS) -c -o $@ $<

buffer.o: buffer.c buffer.h errors.h utils.h
	$(CC) $(CFLAGS) -c -o $@ $<

utils.o: utils.c utils.h
	$(CC) $(CFLAGS) -c -o $@ $<
	
init.o: init.c
	$(CC) $(CFLAGS) -c -o $@ $<

c2.o: c2.c c2.h errors.h buffer.h utils.h
	$(CC) $(CFLAGS) -c -o $@ $<

startup_ram.o: startup_ram.s
	$(CC) $(CFLAGS) -c -o $@ $<

clean:
	rm -f *.o *.elf $(NAME).map

