# Hey Emacs, this is a -*- makefile -*- # Goals available on make command line: # # [all] Default goal: build the project. # clean Clean up the project. # rebuild Rebuild the project. # ccversion Display CC version information. # cppfiles file.i Generate preprocessed files from C source files. # asfiles file.x Generate preprocessed assembler files from C and assembler source files. # objfiles file.o Generate object files from C and assembler source files. # a file.a Archive: create A output file from object files. # elf file.elf Link: create ELF output file from object files. # lss file.lss Create extended listing from target output file. # sym file.sym Create symbol table from target output file. # hex file.hex Create Intel HEX image from ELF output file. # bin file.bin Create binary image from ELF output file. # sizes Display target size information. # isp Use ISP instead of JTAGICE mkII when programming. # cpuinfo Get CPU information. # halt Stop CPU execution. # chiperase Perform a JTAG Chip Erase command. # erase Perform a flash chip erase. # program Program MCU memory from ELF output file. # secureflash Protect chip by setting security bit. # reset Reset MCU. # debug Open a debug connection with the MCU. # run Start CPU execution. # readregs Read CPU registers. # doc Build the documentation. # cleandoc Clean up the documentation. # rebuilddoc Rebuild the documentation. # verbose Display main executed commands. # Copyright (c) 2007, Atmel Corporation All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation and/ # or other materials provided with the distribution. # # 3. The name of ATMEL may not be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND # SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # ** ** ** *** ** ** ** ** ** ** ** ** ** ** ** # ENVIRONMENT SETTINGS # ** ** ** *** ** ** ** ** ** ** ** ** ** ** ** FirstWord = $(if $(1),$(word 1,$(1))) LastWord = $(if $(1),$(word $(words $(1)),$(1))) MAKE = make MAKECFG = config.mk TGTTYPE = $(suffix $(TARGET)) RM = rm -Rf AR = avr32-ar ARFLAGS = rcs CPP = $(CC) -E CPPFLAGS = -march=$(ARCH) -mpart=$(PART) $(WARNINGS) $(DEFS) \ $(PLATFORM_INC_PATH:%=-I%) $(INC_PATH:%=-I%) $(CPP_EXTRA_FLAGS) DPNDFILES = $(CSRCS:.c=.d) $(ASSRCS:.S=.d) CPPFILES = $(CSRCS:.c=.i) CC = avr32-gcc CFLAGS = $(DEBUG) $(OPTIMIZATION) $(C_EXTRA_FLAGS) \ $(PLATFORM_INC_PATH:%=-Wa,-I%) $(INC_PATH:%=-Wa,-I%) $(AS_EXTRA_FLAGS) ASFILES = $(CSRCS:.c=.x) $(ASSRCS:.S=.x) AS = avr32-as ASFLAGS = $(DEBUG) \ $(PLATFORM_INC_PATH:%=-Wa,-I%) $(INC_PATH:%=-Wa,-I%) $(AS_EXTRA_FLAGS) OBJFILES = $(CSRCS:.c=.o) $(ASSRCS:.S=.o) LD = avr32-ld LDFLAGS = -march=$(ARCH) -mpart=$(PART) \ $(LIB_PATH:%=-L%) $(LINKER_SCRIPT:%=-T%) $(LD_EXTRA_FLAGS) LOADLIBES = LDLIBS = $(LIBS:%=-l%) OBJDUMP = avr32-objdump LSS = $(TARGET:$(TGTTYPE)=.lss) NM = avr32-nm SYM = $(TARGET:$(TGTTYPE)=.sym) OBJCOPY = avr32-objcopy HEX = $(TARGET:$(TGTTYPE)=.hex) BIN = $(TARGET:$(TGTTYPE)=.bin) SIZE = avr32-size SLEEP = sleep SLEEPUSB = 9 PROGRAM = avr32program ISP = batchisp ISPFLAGS = -device at32$(PART) -hardware usb -operation DBGPROXY = avr32gdbproxy DOCGEN = doxygen # ** ** ** *** ** ** ** ** ** ** ** ** ** ** ** # MESSAGES # ** ** ** *** ** ** ** ** ** ** ** ** ** ** ** ERR_TARGET_TYPE = Target type not supported: `$(TGTTYPE)' MSG_CLEANING = Cleaning project. MSG_PREPROCESSING = Preprocessing \`$<\' to \`$@\'. MSG_COMPILING = Compiling \`$<\' to \`$@\'. MSG_ASSEMBLING = Assembling \`$<\' to \`$@\'. MSG_ARCHIVING = Archiving to \`$@\'. MSG_LINKING = Linking to \`$@\'. MSG_EXTENDED_LISTING = Creating extended listing to \`$@\'. MSG_SYMBOL_TABLE = Creating symbol table to \`$@\'. MSG_IHEX_IMAGE = Creating Intel HEX image to \`$@\'. MSG_BINARY_IMAGE = Creating binary image to \`$@\'. MSG_GETTING_CPU_INFO = Getting CPU information. MSG_HALTING = Stopping CPU execution. MSG_ERASING_CHIP = Performing a JTAG Chip Erase command. MSG_ERASING = Performing a flash chip erase. MSG_PROGRAMMING = Programming MCU memory from \`$(TARGET)\'. MSG_SECURING_FLASH = Protecting chip by setting security bit. MSG_RESETTING = Resetting MCU. MSG_DEBUGGING = Opening debug connection with MCU. MSG_RUNNING = Starting CPU execution. MSG_READING_CPU_REGS = Reading CPU registers. MSG_CLEANING_DOC = Cleaning documentation. MSG_GENERATING_DOC = Generating documentation to \`$(DOC_PATH)\'. # ** ** ** *** ** ** ** ** ** ** ** ** ** ** ** # MAKE RULES # ** ** ** *** ** ** ** ** ** ** ** ** ** ** ** # Include the make configuration file. include $(MAKECFG) # ** ** TOP-LEVEL RULES ** ** # Default goal: build the project. ifeq ($(TGTTYPE),.a) .PHONY: all all: ccversion a lss sym sizes else ifeq ($(TGTTYPE),.elf) .PHONY: all all: ccversion elf lss sym hex bin sizes else $(error $(ERR_TARGET_TYPE)) endif endif # Clean up the project. .PHONY: clean clean: @echo $(MSG_CLEANING) -$(VERBOSE_CMD)$(RM) $(BIN) -$(VERBOSE_CMD)$(RM) $(HEX) -$(VERBOSE_CMD)$(RM) $(SYM) -$(VERBOSE_CMD)$(RM) $(LSS) -$(VERBOSE_CMD)$(RM) $(TARGET) -$(VERBOSE_CMD)$(RM) $(OBJFILES) -$(VERBOSE_CMD)$(RM) $(ASFILES) -$(VERBOSE_CMD)$(RM) $(CPPFILES) -$(VERBOSE_CMD)$(RM) $(DPNDFILES) $(VERBOSE_NL) # Rebuild the project. .PHONY: rebuild rebuild: clean all # Display CC version information. .PHONY: ccversion ccversion: @echo @echo @$(CC) --version # Generate preprocessed files from C source files. .PHONY: cppfiles cppfiles: $(CPPFILES) # Generate preprocessed assembler files from C and assembler source files. .PHONY: asfiles asfiles: $(ASFILES) # Generate object files from C and assembler source files. .PHONY: objfiles objfiles: $(OBJFILES) ifeq ($(TGTTYPE),.a) # Archive: create A output file from object files. .PHONY: a a: $(TARGET) else ifeq ($(TGTTYPE),.elf) # Link: create ELF output file from object files. .PHONY: elf elf: $(TARGET) endif endif # Create extended listing from target output file. .PHONY: lss lss: $(LSS) # Create symbol table from target output file. .PHONY: sym sym: $(SYM) ifeq ($(TGTTYPE),.elf) # Create Intel HEX image from ELF output file. .PHONY: hex hex: $(HEX) # Create binary image from ELF output file. .PHONY: bin bin: $(BIN) endif # Display target size information. .PHONY: sizes sizes: $(TARGET) @echo @echo ifeq ($(TGTTYPE),.a) @$(SIZE) -Bxt $< else ifeq ($(TGTTYPE),.elf) @$(SIZE) -Ax $< @$(SIZE) -Bx $< endif endif @echo @echo ifeq ($(TGTTYPE),.elf) # Use ISP instead of JTAGICE mkII when programming. .PHONY: isp ifeq ($(filter-out isp verbose,$(MAKECMDGOALS)),) isp: all else isp: @: endif ifeq ($(findstring isp,$(MAKECMDGOALS)),) # Get CPU information. .PHONY: cpuinfo cpuinfo: @echo @echo $(MSG_GETTING_CPU_INFO) $(VERBOSE_CMD)$(PROGRAM) cpuinfo ifneq ($(call LastWord,$(filter cpuinfo chiperase erase program secureflash reset debug run readregs,$(MAKECMDGOALS))),cpuinfo) @$(SLEEP) $(SLEEPUSB) else @echo endif # Stop CPU execution. .PHONY: halt halt: ifeq ($(filter cpuinfo chiperase erase program secureflash reset run readregs,$(MAKECMDGOALS)),) @echo @echo $(MSG_HALTING) $(VERBOSE_CMD)$(PROGRAM) halt ifneq ($(call LastWord,$(filter halt debug,$(MAKECMDGOALS))),halt) @$(SLEEP) $(SLEEPUSB) else @echo endif else @: endif # Perform a JTAG Chip Erase command. .PHONY: chiperase chiperase: @echo @echo $(MSG_ERASING_CHIP) $(VERBOSE_CMD)$(PROGRAM) chiperase ifneq ($(call LastWord,$(filter cpuinfo chiperase program secureflash reset debug run readregs,$(MAKECMDGOALS))),chiperase) @$(SLEEP) $(SLEEPUSB) else @echo endif # Perform a flash chip erase. .PHONY: erase erase: ifeq ($(filter chiperase program,$(MAKECMDGOALS)),) @echo @echo $(MSG_ERASING) $(VERBOSE_CMD)$(PROGRAM) erase $(FLASH:%=-f%) ifneq ($(call LastWord,$(filter cpuinfo erase secureflash reset debug run readregs,$(MAKECMDGOALS))),erase) @$(SLEEP) $(SLEEPUSB) else @echo endif else @: endif # Program MCU memory from ELF output file. .PHONY: program program: all @echo @echo $(MSG_PROGRAMMING) $(VERBOSE_CMD)$(PROGRAM) program $(FLASH:%=-f%) $(PROG_CLOCK:%=-c%) -e -v -R $(if $(findstring run,$(MAKECMDGOALS)),-r) $(TARGET) ifneq ($(call LastWord,$(filter cpuinfo chiperase program secureflash debug readregs,$(MAKECMDGOALS))),program) @$(SLEEP) $(SLEEPUSB) else @echo endif # Protect chip by setting security bit. .PHONY: secureflash secureflash: @echo @echo $(MSG_SECURING_FLASH) $(VERBOSE_CMD)$(PROGRAM) secureflash ifneq ($(call LastWord,$(filter cpuinfo chiperase erase program secureflash reset debug run readregs,$(MAKECMDGOALS))),secureflash) @$(SLEEP) $(SLEEPUSB) else @echo endif # Reset MCU. .PHONY: reset reset: ifeq ($(filter program run,$(MAKECMDGOALS)),) @echo @echo $(MSG_RESETTING) $(VERBOSE_CMD)$(PROGRAM) reset ifneq ($(call LastWord,$(filter cpuinfo chiperase erase secureflash reset debug readregs,$(MAKECMDGOALS))),reset) @$(SLEEP) $(SLEEPUSB) else @echo endif else @: endif # Open a debug connection with the MCU. .PHONY: debug debug: @echo @echo $(MSG_DEBUGGING) $(VERBOSE_CMD)$(DBGPROXY) $(FLASH:%=-f%) ifneq ($(call LastWord,$(filter cpuinfo halt chiperase erase program secureflash reset debug run readregs,$(MAKECMDGOALS))),debug) @$(SLEEP) $(SLEEPUSB) else @echo endif # Start CPU execution. .PHONY: run run: ifeq ($(findstring program,$(MAKECMDGOALS)),) @echo @echo $(MSG_RUNNING) $(VERBOSE_CMD)$(PROGRAM) run $(if $(findstring reset,$(MAKECMDGOALS)),-R) ifneq ($(call LastWord,$(filter cpuinfo chiperase erase secureflash debug run readregs,$(MAKECMDGOALS))),run) @$(SLEEP) $(SLEEPUSB) else @echo endif else @: endif # Read CPU registers. .PHONY: readregs readregs: @echo @echo $(MSG_READING_CPU_REGS) $(VERBOSE_CMD)$(PROGRAM) readregs ifneq ($(call LastWord,$(filter cpuinfo chiperase erase program secureflash reset debug run readregs,$(MAKECMDGOALS))),readregs) @$(SLEEP) $(SLEEPUSB) else @echo endif else # Perform a flash chip erase. .PHONY: erase erase: ifeq ($(findstring program,$(MAKECMDGOALS)),) @echo @echo $(MSG_ERASING) $(VERBOSE_CMD)$(ISP) $(ISPFLAGS) erase f memory flash blankcheck ifeq ($(call LastWord,$(filter erase secureflash debug run,$(MAKECMDGOALS))),erase) @echo endif else @: endif # Program MCU memory from ELF output file. .PHONY: program program: all @echo @echo $(MSG_PROGRAMMING) $(VERBOSE_CMD)$(ISP) $(ISPFLAGS) erase f memory flash blankcheck loadbuffer $(TARGET) program verify $(if $(findstring run,$(MAKECMDGOALS)),$(if $(findstring secureflash,$(MAKECMDGOALS)),,start $(if $(findstring reset,$(MAKECMDGOALS)),,no)reset 0)) ifeq ($(call LastWord,$(filter program secureflash debug,$(MAKECMDGOALS))),program) @echo endif # Protect chip by setting security bit. .PHONY: secureflash secureflash: @echo @echo $(MSG_SECURING_FLASH) $(VERBOSE_CMD)$(ISP) $(ISPFLAGS) memory security addrange 0x0 0x0 fillbuffer 0x01 program $(if $(findstring run,$(MAKECMDGOALS)),start $(if $(findstring reset,$(MAKECMDGOALS)),,no)reset 0) ifeq ($(call LastWord,$(filter erase program secureflash debug,$(MAKECMDGOALS))),secureflash) @echo endif # Reset MCU. .PHONY: reset reset: @: # Open a debug connection with the MCU. .PHONY: debug debug: @echo @echo $(MSG_DEBUGGING) $(VERBOSE_CMD)$(DBGPROXY) $(FLASH:%=-f%) ifeq ($(call LastWord,$(filter erase program secureflash debug run,$(MAKECMDGOALS))),debug) @echo endif # Start CPU execution. .PHONY: run run: ifeq ($(filter program secureflash,$(MAKECMDGOALS)),) @echo @echo $(MSG_RUNNING) $(VERBOSE_CMD)$(ISP) $(ISPFLAGS) start $(if $(findstring reset,$(MAKECMDGOALS)),,no)reset 0 ifeq ($(call LastWord,$(filter erase debug run,$(MAKECMDGOALS))),run) @echo endif else @: endif endif endif # Build the documentation. .PHONY: doc doc: @echo @echo $(MSG_GENERATING_DOC) $(VERBOSE_CMD)cd $(dir $(DOC_CFG)) && $(DOCGEN) $(notdir $(DOC_CFG)) @echo # Clean up the documentation. .PHONY: cleandoc cleandoc: @echo $(MSG_CLEANING_DOC) -$(VERBOSE_CMD)$(RM) $(DOC_PATH) $(VERBOSE_NL) # Rebuild the documentation. .PHONY: rebuilddoc rebuilddoc: cleandoc doc # Display main executed commands. .PHONY: verbose ifeq ($(filter-out isp verbose,$(MAKECMDGOALS)),) verbose: all else verbose: @: endif ifneq ($(findstring verbose,$(MAKECMDGOALS)),) # Prefix displaying the following command if and only if verbose is a goal. VERBOSE_CMD = # New line displayed if and only if verbose is a goal. VERBOSE_NL = @echo else VERBOSE_CMD = @ VERBOSE_NL = endif # ** ** COMPILATION RULES ** ** # Include silently the dependency files. -include $(DPNDFILES) # The dependency files are not built alone but along with first generation files. $(DPNDFILES): # First generation files depend on make files. $(CPPFILES) $(ASFILES) $(OBJFILES): Makefile $(MAKECFG) ifeq ($(TGTTYPE),.elf) # Files resulting from linking depend on linker script. $(TARGET): $(LINKER_SCRIPT) endif # Preprocess: create preprocessed files from C source files. %.i: %.c %.d @echo $(MSG_PREPROCESSING) $(VERBOSE_CMD)$(CPP) $(CPPFLAGS) -MD -MP -MT '$*.i $*.x $*.o' -o $@ $< @touch $*.d @touch $@ $(VERBOSE_NL) # Preprocess & compile: create assembler files from C source files. %.x: %.c %.d @echo $(MSG_COMPILING) $(VERBOSE_CMD)$(CC) -S $(CPPFLAGS) -MD -MP -MT '$*.i $*.o' $(CFLAGS) -o $@ $< @touch $*.d @touch $@ $(VERBOSE_NL) # Preprocess: create preprocessed files from assembler source files. %.x: %.S %.d @echo $(MSG_PREPROCESSING) $(VERBOSE_CMD)$(CPP) $(CPPFLAGS) -MD -MP -MT '$*.x $*.o' -o $@ $< @touch $*.d @touch $@ $(VERBOSE_NL) # Preprocess, compile & assemble: create object files from C source files. %.o: %.c %.d @echo $(MSG_COMPILING) $(VERBOSE_CMD)$(CC) -c $(CPPFLAGS) -MD -MP -MT '$*.i $*.x' $(CFLAGS) -o $@ $< @touch $*.d @touch $@ $(VERBOSE_NL) # Preprocess & assemble: create object files from assembler source files. %.o: %.S %.d @echo $(MSG_ASSEMBLING) $(VERBOSE_CMD)$(CC) -c $(CPPFLAGS) -MD -MP -MT '$*.x' $(ASFLAGS) -o $@ $< @touch $*.d @touch $@ $(VERBOSE_NL) .PRECIOUS: $(OBJFILES) ifeq ($(TGTTYPE),.a) # Archive: create A output file from object files. .SECONDARY: $(TARGET) $(TARGET): $(OBJFILES) @echo $(MSG_ARCHIVING) $(VERBOSE_CMD)$(AR) $(ARFLAGS) $@ $(filter %.o,$+) $(VERBOSE_NL) else ifeq ($(TGTTYPE),.elf) # Link: create ELF output file from object files. .SECONDARY: $(TARGET) $(TARGET): $(OBJFILES) @echo $(MSG_LINKING) $(VERBOSE_CMD)$(CC) $(LDFLAGS) $(filter %.o,$+) $(LOADLIBES) $(LDLIBS) -o $@ $(VERBOSE_NL) endif endif # Create extended listing from target output file. $(LSS): $(TARGET) @echo $(MSG_EXTENDED_LISTING) $(VERBOSE_CMD)$(OBJDUMP) -h -S $< > $@ $(VERBOSE_NL) # Create symbol table from target output file. $(SYM): $(TARGET) @echo $(MSG_SYMBOL_TABLE) $(VERBOSE_CMD)$(NM) -n $< > $@ $(VERBOSE_NL) ifeq ($(TGTTYPE),.elf) # Create Intel HEX image from ELF output file. $(HEX): $(TARGET) @echo $(MSG_IHEX_IMAGE) $(VERBOSE_CMD)$(OBJCOPY) -O ihex $< $@ $(VERBOSE_NL) # Create binary image from ELF output file. $(BIN): $(TARGET) @echo $(MSG_BINARY_IMAGE) $(VERBOSE_CMD)$(OBJCOPY) -O binary $< $@ $(VERBOSE_NL) endif