##### AVR Makefile ##### Supports C, C++ and Assembly source files. ##### make - compile project ##### make disasm - disassembly ##### make stats - status ##### make hex - create hex output ##### make writeflash - write to flash (only with connected programmer) ##### make gdbinit - create gdbinit file ##### make simulavr - start simulavr ##### make ddd - start ddd for debugging ##### or make clean - clean target ##### ##### See the http://electrons.psychogenic.com/ ##### website for detailed instructions # Name of target controller # (e.g. 'at90s8515', see the available avr-gcc mmcu # options for possible values) MCU=at90s8515 # Name of our project # (use a single word, e.g. 'myproject') PROJECTNAME=my_project # Source files # List C/C++/Assembly source files: # (list all files to compile, eg 'a.c b.cpp as.S') # Use .cc, .cpp or .C suffix for C++ files, use .S # (NOT .s !!!) for assembly source code files. PRJSRC=kr.c # additional includes (e.g. -I/path/to/mydir) INC= # libraries to link in (e.g. -lmylib) LIBS= # Optimization level, # use s (size opt), 1, 2, 3 or 0 (off) OPTLEVEL=0 ##### AVR Dude 'writeflash' options ##### ##### If you are using the avrdude program ##### (http://www.bsdhome.com/avrdude/) to write ##### to the MCU, you can set the following config ##### options and use 'make writeflash' to program ##### the device. # programmer id--check the avrdude for complete list # of available opts. These should include stk500, # avr910, avrisp, bsd, pony and more. Set this to # one of the valid "-c PROGRAMMER-ID" values # described in the avrdude info page. # AVRDUDE_PROGRAMMERID=stk500 # port--serial or parallel port to which your # hardware programmer is attached # AVRDUDE_PORT=/dev/ttyS0 #################################################### ##### Config Done ##### ##### ##### ##### You shouldn't need to edit anything ##### ##### below to use the makefile but may wish ##### ##### to override a few of the flags ##### ##### nonetheless ##### ##### ##### #################################################### ##### Flags #### # HEXFORMAT -- format for .hex file output HEXFORMAT=ihex # compiler CFLAGS=-I. $(INC) -g -mmcu=$(MCU) -O$(OPTLEVEL) \ -fpack-struct -fshort-enums \ -funsigned-bitfields -funsigned-char \ -Wall -Wstrict-prototypes \ -Wa,-ahlms=$(firstword \ $(filter %.lst, $(<:.c=.lst))) # c++ specific flags CPPFLAGS=-fno-exceptions \ -Wa,-ahlms=$(firstword \ $(filter %.lst, $(<:.cpp=.lst))\ $(filter %.lst, $(<:.cc=.lst)) \ $(filter %.lst, $(<:.C=.lst))) # assembler ASMFLAGS =-I. $(INC) -mmcu=$(MCU) \ -x assembler-with-cpp \ -Wa,-gstabs,-ahlms=$(firstword \ $(<:.S=.lst) $(<.s=.lst)) # linker LDFLAGS=-Wl,-Map,$(TRG).map -lm $(LIBS) ##### executables #### CC=avr-gcc OBJCOPY=avr-objcopy OBJDUMP=avr-objdump SIZE=avr-size AVRDUDE=avrdude REMOVE=rm -f ##### automatic target names #### TRG=$(PROJECTNAME).out DUMPTRG=$(PROJECTNAME).s HEXROMTRG=$(PROJECTNAME).hex HEXTRG=$(HEXROMTRG) $(PROJECTNAME).ee.hex GDBINITFILE=gdbinit-$(PROJECTNAME) # Define all object files. # Start by splitting source files by type # C++ CPPFILES=$(filter %.cpp, $(PRJSRC)) CCFILES=$(filter %.cc, $(PRJSRC)) BIGCFILES=$(filter %.C, $(PRJSRC)) # C CFILES=$(filter %.c, $(PRJSRC)) # Assembly ASMFILES=$(filter %.S, $(PRJSRC)) # List all object files we need to create OBJDEPS=$(CFILES:.c=.o) \ $(CPPFILES:.cpp=.o)\ $(BIGCFILES:.C=.o) \ $(CCFILES:.cc=.o) \ $(ASMFILES:.S=.o) # Define all lst files. LST=$(filter %.lst, $(OBJDEPS:.o=.lst)) # All the possible generated assembly # files (.s files) GENASMFILES=$(filter %.s, $(OBJDEPS:.o=.s)) .SUFFIXES : .c .cc .cpp .C .o .out .s .S \ .hex .ee.hex .h .hh .hpp .PHONY: writeflash clean stats gdbinit stats # Make targets: # all, disasm, stats, hex, writeflash/install, clean all: $(TRG) disasm: $(DUMPTRG) stats stats: $(TRG) $(OBJDUMP) -h $(TRG) $(SIZE) $(TRG) hex: $(HEXTRG) writeflash: hex $(AVRDUDE) -c $(AVRDUDE_PROGRAMMERID) \ -p $(MCU) -P $(AVRDUDE_PORT) -e \ -U flash:w:$(HEXROMTRG) install: writeflash $(DUMPTRG): $(TRG) $(OBJDUMP) -S $< > $@ $(TRG): $(OBJDEPS) $(CC) $(LDFLAGS) -o $(TRG) $(OBJDEPS) #### Generating assembly #### # asm from C %.s: %.c $(CC) -S $(CFLAGS) $< -o $@ # asm from (hand coded) asm %.s: %.S $(CC) -S $(ASMFLAGS) $< > $@ # asm from C++ .cpp.s .cc.s .C.s : $(CC) -S $(CFLAGS) $(CPPFLAGS) $< -o $@ #### Generating object files #### # object from C .c.o: $(CC) $(CFLAGS) -c $< # object from C++ (.cc, .cpp, .C files) .cc.o .cpp.o .C.o : $(CC) $(CFLAGS) $(CPPFLAGS) -c $< # object from asm .S.o : $(CC) $(ASMFLAGS) -c $< -o $@ #### Generating hex files #### # hex files from elf ##### Generating a gdb initialisation file ##### .out.hex: $(OBJCOPY) -j .text \ -j .data \ -O $(HEXFORMAT) $< $@ .out.ee.hex: $(OBJCOPY) -j .eeprom \ --change-section-lma .eeprom=0 \ -O $(HEXFORMAT) $< $@ ##### Generating a gdb initialisation file ##### ##### Use by launching simulavr and avr-gdb: ##### ##### avr-gdb -x gdbinit-myproject ##### # debugging-related targets ddd: gdbinit ddd --debugger "avr-gdb -x $(GDBINITFILE)" gdbserver: gdbinit simulavr --gdbserver --device $(MCU) gdbinit: $(GDBINITFILE) $(GDBINITFILE): $(TRG) @echo "file $(TRG)" > $(GDBINITFILE) @echo "target remote localhost:1212" \ >> $(GDBINITFILE) @echo "load" >> $(GDBINITFILE) @echo "break main" >> $(GDBINITFILE) @echo "continue" >> $(GDBINITFILE) @echo @echo "Use 'avr-gdb -x $(GDBINITFILE)'" #### Cleanup #### clean: $(REMOVE) $(TRG) $(TRG).map $(DUMPTRG) $(REMOVE) $(OBJDEPS) $(REMOVE) $(LST) $(GDBINITFILE) $(REMOVE) $(GENASMFILES) $(REMOVE) $(HEXTRG) ##### EOF #####