# Makefile for playing around with ATMega32

PROJECT=AVR_test
MCU=atmega32
TARGET= AVR_test.elf
CC=avr-gcc

# Options common to compile, link and assembly rules
COMMON = -mmcu=$(MCU)

# Compiler flags
CFLAGS = $(COMMON)
CFLAGS += -Wall -gdwarf-2 -std=gnu99 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields
CFLAGS += -fpack-struct -fshort-enums -MD -MP -MT $(*F).o -MF dep/$(@F).d

# Assembly flags
ASMFLAGS = $(COMMON)
ASMFLAGS += $(CFLAGS)
ASMFLAGS += -x -assembler-with-cpp -Wa,-gdwarf2

# Linker flags
LDFLAGS = $(COMMON)
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref

# Intel Hex file production flags
HEX_FLASH_FLAGS = -R .eeprom

HEX_EEPROM_FLAGS = -j .eeprom
HEX_EEPROM_FLAGS = --set-section-flags=.eeprom="alloc,load"
HEX_EEPROM_FLAGS = --change-section-lma .eeprom=0 --no-change-warnings

OBJECTS = $(PROJECT).o


# Build...
all: $(TARGET) $(PROJECT).hex $(PROJECT).eep $(PROJECT).lss size

# Compile
$(PROJECT).o: $(PROJECT).c
	$(CC) $(CFLAGS) -c $<


# Link

$(TARGET): $(OBJECTS)
	$(CC) $(LDFLAGES) $(OBJECTS) $(LINKONLYOBJECTS) $(LIBDIRS) -o $(TARGET)

%.hex: $(TARGET)
	avr-objcopy -O ihex $(HEX_FLASH_FLAGS) $< $@

%.eep: $(TARGET)
	avr-objcopy $(HEX_EEPROM_FLAGS) -O ihex $< $@ || exit 0

%.lss: $(TARGET)
	avr-objdump -h -S $< > $@

size: ${TARGET}
	@echo
	@avr-size -C --mcu=${MCU} ${TARGET}


# Clean...
clean:
	-rm -rf $(OBJECTS) $(PROJECT).elf $(PROJECT).hex $(PROJECT).eep $(PROJECT).lss $(PROJECT).map

# Progam...
program:
	sudo avrdude -p m32 -c usbasp -U flash:w:AVR_test.hex -P usb 
