rendered paste body# controller
MCU = atmega8
# frequency
F_CPU = 16000000UL
#we assume 8bit or int variables
CFLAGS += -mint8
# main application name (without .hex)
# eg 'test' when the main function is defined in 'test.c'
TARGET = main
# c sourcecode files
# eg. 'test.c foo.c foobar/baz.c'
SRC = $(TARGET).c
# asm sourcecode files
# eg. 'interrupts.S foobar/another.S'
ASRC =
# headers which should be considered when recompiling
# eg. 'global.h foobar/important.h'
HEADERS =
# include directories (used for both, c and asm)
# eg '. lol/'
INCLUDES =
# use more debug-flags when compiling
DEBUG = 1
# avrdude programmer protocol
PROG = usbasp
# avrdude programmer device
DEV = usb
# further flags for avrdude
AVRDUDE_FLAGS =
####################################################
# 'make' configuration
####################################################
CC = avr-gcc
OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump
AS = avr-as
SIZE = avr-size
CP = cp
RM = rm -f
RMDIR = rm -rf
MKDIR = mkdir
AVRDUDE = avrdude
# flags for automatic dependency handling
DEPFLAGS = -MD -MP -MF .dep/$(@F).d
# flags for the compiler (for .c files)
CFLAGS += -g -Os -mmcu=$(MCU) -DF_CPU=$(F_CPU) -std=gnu99 -fshort-enums $(DEPFLAGS)
CFLAGS += $(addprefix -I,$(INCLUDES))
# flags for the compiler (for .S files)
ASFLAGS += -g -mmcu=$(MCU) -DF_CPU=$(F_CPU) -x assembler-with-cpp $(DEPFLAGS)
ASFLAGS += $(addprefix -I,$(INCLUDES))
# flags for the linker
LDFLAGS += -mmcu=$(MCU)
# fill in object files
OBJECTS += $(SRC:.c=.o)
OBJECTS += $(ASRC:.S=.o)
# include config file
-include $(CURDIR)/config.mk
# include more debug flags, if $(DEBUG) is 1
ifeq ($(DEBUG),1)
CFLAGS += -Wall -W -Wchar-subscripts -Wmissing-prototypes
CFLAGS += -Wmissing-declarations -Wredundant-decls
CFLAGS += -Wstrict-prototypes -Wshadow -Wbad-function-cast
CFLAGS += -Winline -Wpointer-arith -Wsign-compare
CFLAGS += -Wunreachable-code -Wdisabled-optimization
CFLAGS += -Wcast-align -Wwrite-strings -Wnested-externs -Wundef
CFLAGS += -Wa,-adhlns=$(basename $@).lst
CFLAGS += -DDEBUG
endif
####################################################
# avrdude configuration
####################################################
ifeq ($(MCU),atmega8)
AVRDUDE_MCU=m8
endif
ifeq ($(MCU),atmega48)
AVRDUDE_MCU=m48
endif
ifeq ($(MCU),atmega88)
AVRDUDE_MCU=m88
endif
ifeq ($(MCU),atmega168)
AVRDUDE_MCU=m168
endif
ifeq ($(MCU),atmega32)
AVRDUDE_MCU=m32
endif
ifeq ($(MCU),atmega16)
AVRDUDE_MCU=m16
endif
AVRDUDE_FLAGS += -p $(AVRDUDE_MCU)
####################################################
# make targets
####################################################
.PHONY: all clean distclean avrdude-terminal
# main rule
all: $(TARGET).hex
$(TARGET).elf: $(OBJECTS)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^
# all objects (.o files)
$(OBJECTS): $(HEADERS)
# remove all compiled files
clean:
$(RM) $(foreach ext,elf hex eep.hex map,$(TARGET).$(ext)) \
$(foreach file,$(patsubst %.o,%,$(OBJECTS)),$(foreach ext,o lst lss,$(file).$(ext)))
# additionally remove the dependency makefile
distclean: clean
$(RMDIR) .dep
# avrdude-related targets
install program: program-$(TARGET)
avrdude-terminal:
$(AVRDUDE) $(AVRDUDE_FLAGS) -c $(PROG) -P $(DEV) -t
program-%: %.hex
$(AVRDUDE) $(AVRDUDE_FLAGS) -c $(PROG) -P $(DEV) -U flash:w:$<
program-eeprom-%: %.eep.hex
$(AVRDUDE) $(AVRDUDE_FLAGS) -c $(PROG) -P $(DEV) -U eeprom:w:$<
# special programming targets
%.hex: %.elf
$(OBJCOPY) -O ihex -R .eeprom $< $@
@echo "========================================"
@echo "$@ compiled for: $(MCU)"
@echo -n "size for $< is "
@$(SIZE) -A $@ | grep '\.sec1' | tr -s ' ' | cut -d" " -f2
@echo "========================================"
%.eep.hex: %.elf
$(OBJCOPY) --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex -j .eeprom $< $@
%.lss: %.elf
$(OBJDUMP) -h -S $< > $@
-include $(shell $(MKDIR) .dep 2>/dev/null) $(wildcard .dep/*)