X-Git-Url: http://git.linex4red.de/pub/lufa.git/blobdiff_plain/79ee9e755f1ca58d9b8c30d676ca117b5ae3d9f4..fc0ff2f97657a893db336dded648c8bd60582bc1:/LUFA/Build/lufa.build.in diff --git a/LUFA/Build/lufa.build.in b/LUFA/Build/lufa.build.in index c05104280..f77757819 100644 --- a/LUFA/Build/lufa.build.in +++ b/LUFA/Build/lufa.build.in @@ -7,12 +7,12 @@ # LUFA_BUILD_MODULES += BUILD -LUFA_BUILD_TARGETS += size checksource all elf hex clean +LUFA_BUILD_TARGETS += size checksource all elf hex lss gcc_version clean 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 # ----------------------------------------------------------------------------- -# LUFA Compiler Buildsystem Makefile Module. +# LUFA GCC Compiler Buildsystem Makefile Module. # ----------------------------------------------------------------------------- # DESCRIPTION: # Provides a set of targets to build a C, C++ and/or Assembly application @@ -25,6 +25,8 @@ LUFA_BUILD_OPTIONAL_VARS += BOARD OPTIMIZATION C_STANDARD CPP_STANDARD F_CPU C_ # all - Build application and list size # elf - Build application ELF debug object file # hex - Build application HEX object files +# lss - Build application LSS assembly listing file +# gcc_version - Print version of GCC used # clean - Remove output files # # MANDATORY PARAMETERS: @@ -53,46 +55,45 @@ LUFA_BUILD_OPTIONAL_VARS += BOARD OPTIMIZATION C_STANDARD CPP_STANDARD F_CPU C_ # # ----------------------------------------------------------------------------- -# Output Messages -MSG_BUILD_BEGIN = Begin compilation of project \"$(TARGET)\"... -MSG_BUILD_END = Finished building project \"$(TARGET)\"... -MSG_COMPILE_CMD = ' [CC] :' -MSG_REMOVE_CMD = ' [RM] :' -MSG_LINKER_CMD = ' [LNK] :' -MSG_SIZE_CMD = ' [SIZE] :' -MSG_OBJCPY_CMD = ' [OBJCPY] :' -MSG_OBJDMP_CMD = ' [OBJDMP] :' - -# Sanity check the user MCU, TARGET, ARCH, SRC, F_USB and LUFA_PATH makefile options -ifeq ($(TARGET),) - $(error Makefile TARGET value not set.) -endif -ifeq ($(ARCH),) - $(error Makefile ARCH value not set.) -endif -ifeq ($(MCU),) - $(error Makefile MCU value not set.) -endif -ifeq ($(SRC),) - $(error Makefile SRC value not set.) -endif -ifeq ($(F_USB),) - $(error Makefile F_USB value not set.) -endif -ifeq ($(LUFA_PATH),) - $(error Makefile LUFA_PATH value not set.) +# Sanity-check values of mandatory user-supplied variables +MCU ?= $(error Makefile MCU value not set.) +TARGET ?= $(error Makefile TARGET value not set.) +ARCH ?= $(error Makefile ARCH value not set.) +SRC ?= $(error Makefile SRC value not set.) +F_USB ?= $(error Makefile F_USB value not set.) +LUFA_PATH ?= $(error Makefile LUFA_PATH value not set.) + +# 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 ?= + +# Determine the utility prefix to use for the selected architecture +ifeq ($(ARCH), AVR8) + CROSS := avr- +else ifeq ($(ARCH), XMEGA) + CROSS := avr- +else ifeq ($(ARCH), UC3) + CROSS := avr32- +else + $(error Unsupported architecture.) endif -# Default values of user-supplied variables -BOARD ?= NONE -OPTIMIZATION ?= s -F_CPU ?= -C_STANDARD ?= gnu99 -CPP_STANDARD ?= gnu++98 -C_FLAGS ?= -CPP_FLAGS ?= -ASM_FLAGS ?= -CC_FLAGS ?= +# Output Messages +MSG_BUILD_BEGIN := Begin compilation of project \"$(TARGET)\"... +MSG_BUILD_END := Finished building project \"$(TARGET)\". +MSG_COMPILE_CMD := ' [CC] :' +MSG_REMOVE_CMD := ' [RM] :' +MSG_LINKER_CMD := ' [LNK] :' +MSG_SIZE_CMD := ' [SIZE] :' +MSG_OBJCPY_CMD := ' [OBJCPY] :' +MSG_OBJDMP_CMD := ' [OBJDMP] :' # Convert input source file list to differentiate them by type C_SOURCE = $(filter %.c, $(SRC)) @@ -100,34 +101,33 @@ CPP_SOURCE = $(filter %.cpp, $(SRC)) ASM_SOURCE = $(filter %.S, $(SRC)) # Convert input source filenames into a list of required output object files -OBJECT_FILES = $(filter %.o, $(C_SOURCE:%.c=%.o) $(CPP_SOURCE:%.cpp=%.o) $(ASM_SOURCE:%.S=%.o)) +OBJECT_FILES = $(filter %.o, $(C_SOURCE:%.c=%.o) $(CPP_SOURCE:%.cpp=%.o) $(ASM_SOURCE:%.S=%.o)) +DEPENDENCY_FILES = $(OBJECT_FILES:%=%.d) # Create a list of flags to pass to the compiler ifeq ($(ARCH), AVR8) - CC_FLAGS += -mmcu=$(MCU) -gdwarf-2 -fshort-enums -fno-inline-small-functions -fpack-struct - CROSS = avr- + CC_FLAGS += -mmcu=$(MCU) -gdwarf-2 -fshort-enums -fno-inline-small-functions -fpack-struct else ifeq ($(ARCH), XMEGA) - CC_FLAGS += -mmcu=$(MCU) -gdwarf-2 -fshort-enums -fno-inline-small-functions -fpack-struct - CROSS = avr- + CC_FLAGS += -mmcu=$(MCU) -gdwarf-2 -fshort-enums -fno-inline-small-functions -fpack-struct else ifeq ($(ARCH), UC3) - CC_FLAGS += -mpart=$(MCU) -g3 -masm-addr-pseudos - CROSS = avr32- -else - $(error Unsupported architecture.) + CC_FLAGS += -mpart=$(MCU) -g3 -masm-addr-pseudos endif CC_FLAGS += -Wall -fno-strict-aliasing -funsigned-char -funsigned-bitfields -ffunction-sections -CC_FLAGS += -I. -I$(LUFA_PATH)/.. +CC_FLAGS += -I. -I$(patsubst %/,%,$(LUFA_PATH))/.. CC_FLAGS += -DARCH=ARCH_$(ARCH) -DBOARD=BOARD_$(BOARD) -DF_USB=$(F_USB)UL ifneq ($(F_CPU),) CC_FLAGS += -DF_CPU=$(F_CPU)UL endif # Additional language specific compiler flags -C_FLAGS += -Wstrict-prototypes +C_FLAGS += -O$(OPTIMIZATION) -std=$(C_STANDARD) -MMD -MP -MF $@.d -Wstrict-prototypes +CPP_FLAGS += -O$(OPTIMIZATION) -std=$(CPP_STANDARD) -MMD -MP -MF $@.d # Create a list of flags to pass to the linker -LD_FLAGS += -Wl,-Map=$(TARGET).map,--cref -Wl,--gc-sections -lm -ifneq ($(F_CPU), UC3) +LD_FLAGS += -lm -Wl,-Map=$(TARGET).map,--cref -Wl,--gc-sections +ifeq ($(ARCH), UC3) + LD_FLAGS += --rodata-writable --direct-data +else LD_FLAGS += -Wl,--relax endif @@ -138,18 +138,23 @@ ifneq ($(UNKNOWN_SOURCE),) endif # Determine flags to pass to the size utility based on its reported features -SIZE_MCU_FLAG = $(shell avr-size --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) -SIZE_FORMAT_FLAG = $(shell avr-size --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) +SIZE_MCU_FLAG := $(shell $(CROSS)size --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) +SIZE_FORMAT_FLAG := $(shell $(CROSS)size --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) begin: @echo "" @echo $(MSG_BUILD_BEGIN) + @echo "" end: + @echo "" @echo $(MSG_BUILD_END) @echo "" +gcc_version: + @$(CROSS)gcc --version + checksource: @for f in $(SRC) $(CPPSRC) $(ASRC); do \ if [ -f $$f ]; then \ @@ -162,47 +167,52 @@ checksource: size: @echo $(MSG_SIZE_CMD) Determining size of \"$(TARGET).elf\" @if test -f $(TARGET).elf; then \ - avr-size $(SIZE_MCU_FLAG) $(SIZE_FORMAT_FLAG) $(TARGET).elf ; 2>/dev/null; \ + $(CROSS)size $(SIZE_MCU_FLAG) $(SIZE_FORMAT_FLAG) $(TARGET).elf ; 2>/dev/null; \ fi -.PHONY: begin hex lss end size -all: begin hex end size +.PHONY: begin gcc_version elf hex lss size end +all: begin gcc_version elf hex lss size end elf: $(TARGET).elf hex: $(TARGET).hex $(TARGET).eep lss: $(TARGET).lss %.o: %.c - @echo $(MSG_COMPILE_CMD) Compiling C file \"$^\" - $(CROSS)gcc -c $(CC_FLAGS) $(C_FLAGS) -O$(OPTIMIZATION) -std=$(C_STANDARD) $< -o $@ + @echo $(MSG_COMPILE_CMD) Compiling C file \"$<\" + $(CROSS)gcc -c $(CC_FLAGS) $(C_FLAGS) $< -o $@ %.o: %.cpp - @echo $(MSG_COMPILE_CMD) Compiling C++ file \"$^\" - $(CROSS)gcc -c $(CC_FLAGS) $(CPP_FLAGS) -O$(OPTIMIZATION) -std=$(CPP_STANDARD) -x c++ $< -o $@ + @echo $(MSG_COMPILE_CMD) Compiling C++ file \"$<\" + $(CROSS)gcc -c $(CC_FLAGS) $(CPP_FLAGS) -x c++ $< -o $@ %.o: %.S - @echo $(MSG_COMPILE_CMD) Assembling \"$^\" + @echo $(MSG_COMPILE_CMD) Assembling \"$<\" $(CROSS)gcc -c $(CC_FLAGS) $(ASM_FLAGS) -x assembler-with-cpp $< -o $@ .PRECIOUS : $(OBJECT_FILES) %.elf: $(OBJECT_FILES) @echo $(MSG_LINKER_CMD) Linking object files into \"$@\" - $(CROSS)gcc $^ $(CC_FLAGS) $(LD_FLAGS) -o $@ + $(CROSS)gcc $(CC_FLAGS) $(LD_FLAGS) $^ -o $@ %.hex: %.elf - @echo $(MSG_OBJCPY_CMD) Extracting HEX file data from \"$@\" + @echo $(MSG_OBJCPY_CMD) Extracting HEX file data from \"$<\" $(CROSS)objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature $< $@ %.eep: %.elf - @echo $(MSG_OBJCPY_CMD) Extracting EEP file data from \"$@\" + @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 %.lss: %.elf - @echo $(MSG_OBJDMP_CMD) Extracting LSS file data from \"$@\" + @echo $(MSG_OBJDMP_CMD) Extracting LSS file data from \"$<\" $(CROSS)objdump -h -S -z $< > $@ clean: - @echo $(MSG_REMOVE_CMD) Removing object files \"$(OBJECT_FILES)\" + @echo $(MSG_REMOVE_CMD) Removing object files \"$(strip $(notdir $(OBJECT_FILES)))\" rm -f $(OBJECT_FILES) + @echo $(MSG_REMOVE_CMD) Removing dependency files \"$(strip $(notdir $(DEPENDENCY_FILES)))\" + rm -f $(DEPENDENCY_FILES) @echo $(MSG_REMOVE_CMD) Removing output files \"$(TARGET).elf $(TARGET).hex $(TARGET).eep $(TARGET).map $(TARGET).lss\" rm -f $(TARGET).elf $(TARGET).hex $(TARGET).eep $(TARGET).map $(TARGET).lss + +# Include build dependency files +-include $(DEPENDENCY_FILES) \ No newline at end of file