X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/84fadb255e21d3f5d75f2a3aef0b771b8ac0da2c..c9db3f0aa9364284158c208740cce3bb73f72f7e:/LUFA/Build/lufa_build.mk?ds=inline diff --git a/LUFA/Build/lufa_build.mk b/LUFA/Build/lufa_build.mk index f363c8c10..9f1125d99 100644 --- a/LUFA/Build/lufa_build.mk +++ b/LUFA/Build/lufa_build.mk @@ -1,17 +1,17 @@ # # LUFA Library -# Copyright (C) Dean Camera, 2012. +# Copyright (C) Dean Camera, 2015. # # dean [at] fourwalledcubicle [dot] com # www.lufa-lib.org # LUFA_BUILD_MODULES += BUILD -LUFA_BUILD_TARGETS += size check-source symbol-sizes all lib elf hex lss clean mostlyclean +LUFA_BUILD_TARGETS += size symbol-sizes all lib elf bin hex lss clean mostlyclean LUFA_BUILD_MANDATORY_VARS += TARGET ARCH MCU SRC F_USB LUFA_PATH -LUFA_BUILD_OPTIONAL_VARS += BOARD OPTIMIZATION C_STANDARD CPP_STANDARD F_CPU C_FLAGS CPP_FLAGS ASM_FLAGS CC_FLAGS LD_FLAGS OBJDIR OBJECT_FILES DEBUG_TYPE DEBUG_LEVEL -LUFA_BUILD_PROVIDED_VARS += -LUFA_BUILD_PROVIDED_MACROS += +LUFA_BUILD_OPTIONAL_VARS += BOARD OPTIMIZATION C_STANDARD CPP_STANDARD F_CPU C_FLAGS CPP_FLAGS ASM_FLAGS CC_FLAGS LD_FLAGS OBJDIR OBJECT_FILES DEBUG_TYPE DEBUG_LEVEL LINKER_RELAXATIONS COMPILER_PATH +LUFA_BUILD_PROVIDED_VARS += +LUFA_BUILD_PROVIDED_MACROS += # ----------------------------------------------------------------------------- # LUFA GCC Compiler Buildsystem Makefile Module. @@ -25,17 +25,18 @@ LUFA_BUILD_PROVIDED_MACROS += # size - List built application size # symbol-sizes - Print application symbols from the binary ELF # file as a list sorted by size in bytes -# check-source - Print a list of SRC source files that cannot -# be found # all - Build application and list size # lib - Build and archive source files into a library # elf - Build application ELF debug object file -# hex - Build application HEX object files +# bin - Build application BIN binary object file +# hex - Build application HEX object file # lss - Build application LSS assembly listing file -# clean - Remove all project intermediatary and binary +# clean - Remove all project intermediary and binary # output files -# mostlyclean - Remove intermediatary output files, but +# mostlyclean - Remove intermediary output files, but # preserve binaries +# .s - Compile C/C++ source file into an assembly file +# for manual code inspection # # MANDATORY PARAMETERS: # @@ -60,6 +61,9 @@ LUFA_BUILD_PROVIDED_MACROS += # CC_FLAGS - Common flags to pass to the C/C++ compiler and # assembler # LD_FLAGS - Flags to pass to the linker +# LINKER_RELAXATIONS - Enable or disable linker relaxations to +# decrease binary size (note: can cause link +# failures on systems with an unpatched binutils) # OBJDIR - Directory for the output object and dependency # files; if equal to ".", the output files will # be generated in the same folder as the sources @@ -68,6 +72,7 @@ LUFA_BUILD_PROVIDED_MACROS += # generate in the compiled object files # DEBUG_LEVEL - Level the debugging information to generate in # the compiled object files +# COMPILER_PATH - Location of the GCC toolchain to use # # PROVIDED VARIABLES: # @@ -86,19 +91,21 @@ ERROR_IF_EMPTY ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $ ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N)) # Default values of optionally user-supplied variables -BOARD ?= NONE -OPTIMIZATION ?= s -F_CPU ?= -C_STANDARD ?= gnu99 -CPP_STANDARD ?= gnu++98 -C_FLAGS ?= -CPP_FLAGS ?= -ASM_FLAGS ?= -CC_FLAGS ?= -OBJDIR ?= . -OBJECT_FILES ?= -DEBUG_FORMAT ?= dwarf-2 -DEBUG_LEVEL ?= 2 +COMPILER_PATH ?= +BOARD ?= NONE +OPTIMIZATION ?= s +F_CPU ?= +C_STANDARD ?= gnu99 +CPP_STANDARD ?= gnu++98 +C_FLAGS ?= +CPP_FLAGS ?= +ASM_FLAGS ?= +CC_FLAGS ?= +OBJDIR ?= . +OBJECT_FILES ?= +DEBUG_FORMAT ?= dwarf-2 +DEBUG_LEVEL ?= 2 +LINKER_RELAXATIONS ?= Y # Sanity check user supplied values $(foreach MANDATORY_VAR, $(LUFA_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) @@ -114,15 +121,16 @@ $(call ERROR_IF_EMPTY, CPP_STANDARD) $(call ERROR_IF_EMPTY, OBJDIR) $(call ERROR_IF_EMPTY, DEBUG_FORMAT) $(call ERROR_IF_EMPTY, DEBUG_LEVEL) +$(call ERROR_IF_NONBOOL, LINKER_RELAXATIONS) # Determine the utility prefix to use for the selected architecture ifeq ($(ARCH), AVR8) - CROSS := avr + CROSS := $(COMPILER_PATH)avr else ifeq ($(ARCH), XMEGA) - CROSS := avr + CROSS := $(COMPILER_PATH)avr $(warning The XMEGA device support is currently EXPERIMENTAL (incomplete and/or non-functional), and is included for preview purposes only.) else ifeq ($(ARCH), UC3) - CROSS := avr32 + CROSS := $(COMPILER_PATH)avr32 $(warning The UC3 device support is currently EXPERIMENTAL (incomplete and/or non-functional), and is included for preview purposes only.) else $(error Unsupported architecture "$(ARCH)") @@ -158,14 +166,14 @@ OBJECT_FILES += $(addsuffix .o, $(basename $(SRC))) ifneq ($(OBJDIR),.) # Prefix all the object filenames with the output object file directory path OBJECT_FILES := $(addprefix $(patsubst %/,%,$(OBJDIR))/, $(notdir $(OBJECT_FILES))) - + # Check if any object file (without path) appears more than once in the object file list ifneq ($(words $(sort $(OBJECT_FILES))), $(words $(OBJECT_FILES))) $(error Cannot build with OBJDIR parameter set - one or more object file name is not unique) endif # Create the output object file directory if it does not exist and add it to the virtual path list - $(shell mkdir $(OBJDIR) 2> /dev/null) + $(shell mkdir $(OBJDIR) 2> /dev/null) VPATH += $(dir $(SRC)) endif @@ -187,6 +195,15 @@ BASE_CC_FLAGS += -DARCH=ARCH_$(ARCH) -DBOARD=BOARD_$(BOARD) -DF_USB=$(F_USB)UL ifneq ($(F_CPU),) BASE_CC_FLAGS += -DF_CPU=$(F_CPU)UL endif +ifeq ($(LINKER_RELAXATIONS), Y) +BASE_CC_FLAGS += -mrelax +endif + +# This flag is required for bootloaders as GCC will emit invalid jump table +# assembly code for devices with large amounts of flash; the jump table target +# is extracted from FLASH without using the correct ELPM instruction, resulting +# in a pseudo-random jump target. +BASE_CC_FLAGS += -fno-jump-tables # Additional language specific compiler flags BASE_C_FLAGS := -x c -O$(OPTIMIZATION) -std=$(C_STANDARD) -Wstrict-prototypes @@ -194,7 +211,10 @@ BASE_CPP_FLAGS := -x c++ -O$(OPTIMIZATION) -std=$(CPP_STANDARD) BASE_ASM_FLAGS := -x assembler-with-cpp # Create a list of flags to pass to the linker -BASE_LD_FLAGS := -lm -Wl,-Map=$(TARGET).map,--cref -Wl,--gc-sections -Wl,--relax +BASE_LD_FLAGS := -lm -Wl,-Map=$(TARGET).map,--cref -Wl,--gc-sections +ifeq ($(LINKER_RELAXATIONS), Y) + BASE_LD_FLAGS += -Wl,--relax +endif ifeq ($(ARCH), AVR8) BASE_LD_FLAGS += -mmcu=$(MCU) else ifeq ($(ARCH), XMEGA) @@ -204,96 +224,122 @@ else ifeq ($(ARCH), UC3) endif # Determine flags to pass to the size utility based on its reported features (only invoke if size target required) +# and on an architecture where this non-standard patch is available +ifneq ($(ARCH), UC3) size: SIZE_MCU_FLAG := $(shell $(CROSS)-size --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) size: SIZE_FORMAT_FLAG := $(shell $(CROSS)-size --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) +endif +# Pre-build informational target, to give compiler and project name information when building build_begin: @echo $(MSG_INFO_MESSAGE) Begin compilation of project \"$(TARGET)\"... @echo "" @$(CROSS)-gcc --version - + +# Post-build informational target, to project name information when building has completed build_end: @echo $(MSG_INFO_MESSAGE) Finished building project \"$(TARGET)\". -check-source: - @for f in $(SRC); do \ - if [ ! -f $$f ]; then \ - echo "Error: Source file not found: $$f"; \ - exit 1; \ - fi; \ - done - +# Prints size information of a compiled application (FLASH, RAM and EEPROM usages) size: $(TARGET).elf @echo $(MSG_SIZE_CMD) Determining size of \"$<\" @echo "" - $(CROSS)-size $(SIZE_MCU_FLAG) $(SIZE_FORMAT_FLAG) $< ; 2>/dev/null; + $(CROSS)-size $(SIZE_MCU_FLAG) $(SIZE_FORMAT_FLAG) $< +# Prints size information on the symbols within a compiled application in decimal bytes symbol-sizes: $(TARGET).elf @echo $(MSG_NM_CMD) Extracting \"$<\" symbols with decimal byte sizes $(CROSS)-nm --size-sort --demangle --radix=d $< +# Cleans intermediary build files, leaving only the compiled application files mostlyclean: @echo $(MSG_REMOVE_CMD) Removing object files of \"$(TARGET)\" rm -f $(OBJECT_FILES) @echo $(MSG_REMOVE_CMD) Removing dependency files of \"$(TARGET)\" rm -f $(DEPENDENCY_FILES) +# Cleans all build files, leaving only the original source code clean: mostlyclean @echo $(MSG_REMOVE_CMD) Removing output files of \"$(TARGET)\" - rm -f $(TARGET).elf $(TARGET).hex $(TARGET).eep $(TARGET).map $(TARGET).lss $(TARGET).sym $(TARGET).a + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).bin $(TARGET).eep $(TARGET).map $(TARGET).lss $(TARGET).sym lib$(TARGET).a -all: build_begin check-source elf hex lss sym size build_end +# Performs a complete build of the user application and prints size information afterwards +all: build_begin elf hex bin lss sym size build_end +# Helper targets, to build a specific type of output file without having to know the project target name lib: lib$(TARGET).a elf: $(TARGET).elf hex: $(TARGET).hex $(TARGET).eep +bin: $(TARGET).bin lss: $(TARGET).lss sym: $(TARGET).sym +# Default target to *create* the user application's specified source files; if this rule is executed by +# make, the input source file doesn't exist and an error needs to be presented to the user +$(SRC): + $(error Source file does not exist: $@) + +# Compiles an input C source file and generates an assembly listing for it %.s: %.c $(MAKEFILE_LIST) @echo $(MSG_COMPILE_CMD) Generating assembly from C file \"$(notdir $<)\" $(CROSS)-gcc -S $(BASE_CC_FLAGS) $(BASE_C_FLAGS) $(CC_FLAGS) $(C_FLAGS) $< -o $@ +# Compiles an input C++ source file and generates an assembly listing for it %.s: %.cpp $(MAKEFILE_LIST) @echo $(MSG_COMPILE_CMD) Generating assembly from C++ file \"$(notdir $<)\" $(CROSS)-gcc -S $(BASE_CC_FLAGS) $(BASE_CPP_FLAGS) $(CC_FLAGS) $(CPP_FLAGS) $< -o $@ +# Compiles an input C source file and generates a linkable object file for it $(OBJDIR)/%.o: %.c $(MAKEFILE_LIST) @echo $(MSG_COMPILE_CMD) Compiling C file \"$(notdir $<)\" $(CROSS)-gcc -c $(BASE_CC_FLAGS) $(BASE_C_FLAGS) $(CC_FLAGS) $(C_FLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -o $@ +# Compiles an input C++ source file and generates a linkable object file for it $(OBJDIR)/%.o: %.cpp $(MAKEFILE_LIST) @echo $(MSG_COMPILE_CMD) Compiling C++ file \"$(notdir $<)\" $(CROSS)-gcc -c $(BASE_CC_FLAGS) $(BASE_CPP_FLAGS) $(CC_FLAGS) $(CPP_FLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -o $@ - + +# Assembles an input ASM source file and generates a linkable object file for it $(OBJDIR)/%.o: %.S $(MAKEFILE_LIST) @echo $(MSG_ASSEMBLE_CMD) Assembling \"$(notdir $<)\" $(CROSS)-gcc -c $(BASE_CC_FLAGS) $(BASE_ASM_FLAGS) $(CC_FLAGS) $(ASM_FLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -o $@ +# Generates a library archive file from the user application, which can be linked into other applications .PRECIOUS : $(OBJECT_FILES) .SECONDARY : %.a %.a: $(OBJECT_FILES) @echo $(MSG_ARCHIVE_CMD) Archiving object files into \"$@\" $(CROSS)-ar rcs $@ $(OBJECT_FILES) +# Generates an ELF debug file from the user application, which can be further processed for FLASH and EEPROM data +# files, or used for programming and debugging directly .PRECIOUS : $(OBJECT_FILES) .SECONDARY : %.elf %.elf: $(OBJECT_FILES) @echo $(MSG_LINK_CMD) Linking object files into \"$@\" - $(CROSS)-gcc $(BASE_LD_FLAGS) $(LD_FLAGS) $^ -o $@ + $(CROSS)-gcc $^ -o $@ $(BASE_LD_FLAGS) $(LD_FLAGS) +# Extracts out the loadable FLASH memory data from the project ELF file, and creates an Intel HEX format file of it %.hex: %.elf @echo $(MSG_OBJCPY_CMD) Extracting HEX file data from \"$<\" $(CROSS)-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature $< $@ +# Extracts out the loadable FLASH memory data from the project ELF file, and creates an Binary format file of it +%.bin: %.elf + @echo $(MSG_OBJCPY_CMD) Extracting BIN file data from \"$<\" + $(CROSS)-objcopy -O binary -R .eeprom -R .fuse -R .lock -R .signature $< $@ + +# Extracts out the loadable EEPROM memory data from the project ELF file, and creates an Intel HEX format file of it %.eep: %.elf @echo $(MSG_OBJCPY_CMD) Extracting EEP file data from \"$<\" - $(CROSS)-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex $< $@ || exit 0 + $(CROSS)-objcopy -O ihex -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings $< $@ || exit 0 +# Creates an assembly listing file from an input project ELF file, containing interleaved assembly and source data %.lss: %.elf @echo $(MSG_OBJDMP_CMD) Extracting LSS file data from \"$<\" - $(CROSS)-objdump -h -S -z $< > $@ + $(CROSS)-objdump -h -d -S -z $< > $@ +# Creates a symbol file listing the loadable and discarded symbols from an input project ELF file %.sym: %.elf @echo $(MSG_NM_CMD) Extracting SYM file data from \"$<\" $(CROSS)-nm -n $< > $@ @@ -302,4 +348,4 @@ $(OBJDIR)/%.o: %.S $(MAKEFILE_LIST) -include $(DEPENDENCY_FILES) # Phony build targets for this module -.PHONY: build_begin build_end check-source size symbol-sizes lib elf hex lss clean mostlyclean +.PHONY: build_begin build_end size symbol-sizes lib elf hex lss clean mostlyclean