X-Git-Url: http://git.linex4red.de/pub/lufa.git/blobdiff_plain/26cc2e9fa80c04ece990349383adc0206613f8ab..fc0ff2f97657a893db336dded648c8bd60582bc1:/LUFA/Build/lufa.build.in diff --git a/LUFA/Build/lufa.build.in b/LUFA/Build/lufa.build.in index 3f9d446e3..f77757819 100644 --- a/LUFA/Build/lufa.build.in +++ b/LUFA/Build/lufa.build.in @@ -6,11 +6,13 @@ # www.lufa-lib.org # -LUFA_BUILD_MODULES += BUILD -LUFA_BUILD_TARGETS += size checksource all elf hex clean +LUFA_BUILD_MODULES += BUILD +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 @@ -23,6 +25,8 @@ LUFA_BUILD_TARGETS += size checksource all elf hex clean # 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: @@ -42,47 +46,54 @@ LUFA_BUILD_TARGETS += size checksource all elf hex clean # C_STANDARD - C Language Standard to use # CPP_STANDARD - C++ Language Standard to use # F_CPU - Speed of the CPU, in Hz -# CC_FLAGS - Flags to pass to the compiler +# C_FLAGS - Flags to pass to the C compiler only +# CPP_FLAGS - Flags to pass to the C++ compiler only +# ASM_FLAGS - Flags to pass to the assembler only +# CC_FLAGS - Common flags to pass to the C/C++ compiler and +# assembler # LD_FLAGS - Flags to pass to the linker # # ----------------------------------------------------------------------------- -# 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 ?= c99 -CPP_STANDARD ?= c++98 +# 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)) @@ -90,30 +101,35 @@ 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- -else ifeq ($(ARCH),XMEGA) - CC_FLAGS += -mmcu=$(MCU) -gdwarf-2 -fshort-enums -fno-inline-small-functions -fpack-struct - CROSS = avr- -else ifeq ($(ARCH),UC3) - CC_FLAGS += -mpart=$(MCU) -g3 -masm-addr-pseudos - CROSS = avr32- +ifeq ($(ARCH), AVR8) + 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 +else ifeq ($(ARCH), UC3) + CC_FLAGS += -mpart=$(MCU) -g3 -masm-addr-pseudos endif - -CC_FLAGS += -fno-strict-aliasing -funsigned-char -funsigned-bitfields -ffunction-sections -CC_FLAGS += -Wall -Wstrict-prototypes -CC_FLAGS += -I. -I$(LUFA_PATH)/.. -pipe +CC_FLAGS += -Wall -fno-strict-aliasing -funsigned-char -funsigned-bitfields -ffunction-sections +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 += -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,--relax -Wl,--gc-sections -lm +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 # Create a list of unknown source file types, if any are found throw an error UNKNOWN_SOURCE = $(filter-out $(C_SOURCE) $(CPP_SOURCE) $(ASM_SOURCE), $(SRC)) @@ -122,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 \ @@ -146,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) -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) -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 \"$^\" - $(CROSS)gcc -c $(CC_FLAGS) -x assembler-with-cpp $< -o $@ + @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