# Makefile
MCU=atmega328p
F_CPU=16000000UL
CC=avr-gcc
OBJCOPY=avr-objcopy
WFLAGS=-Wall -Wextra
CFLAGS=--std=c99 -g -Os -mmcu=$(MCU) -ffunction-sections -fdata-sections
CPPFLAGS=-DF_CPU=$(F_CPU) -Iinclude
IFLAGS=
LDFLAGS=-Wl,--gc-sections
TARGET=main
SERIAL=-P /dev/ttyUSB0 -b 115200

SRC_DIR=src
OBJ_DIR=build

SRC_FILES=main.c utils.c uart.c
OBJ_FILES=$(patsubst %.c,%.o,$(SRC_FILES))

SRC=$(addprefix $(SRC_DIR)/,$(SRC_FILES))
OBJ=$(addprefix $(OBJ_DIR)/,$(OBJ_FILES))

ELF_FILE=$(OBJ_DIR)/$(TARGET).elf
HEX_FILE=$(OBJ_DIR)/$(TARGET).hex

all: flash

re: fclean all

fclean: clean
	rm -f $(HEX_FILE)
	rm -f $(ELF_FILE)
clean:
	rm -rf $(OBJ_DIR)

hex: $(HEX_FILE)

flash: hex
	avrdude -p $(MCU) -c arduino -U flash:w:$(HEX_FILE):i $(SERIAL) 


$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c 
	@mkdir -p $(shell dirname $@)
	$(CC) $(CPPFLAGS) $(WFLAGS) $(CFLAGS) $(IFLAGS) -c $< -o $@

$(ELF_FILE): $(OBJ)
	$(CC) $(CFLAGS) $(LDFLAGS) $(OBJ) -o $@

$(HEX_FILE): $(ELF_FILE)
	$(OBJCOPY) -j .text -j .data -O ihex $< $@

print:
	@echo $(SRC)
	@echo $(OBJ)
	@echo $(ELF_FILE)
	@echo $(HEX_FILE)

