X-Git-Url: http://git.linex4red.de/pub/lufa.git/blobdiff_plain/ecdffe2e41f13cc245e2e7cfab18486ea66330a7..41b4c5b645ffe8ae3c22af00e6613c4dec8758be:/LUFA/Build/lufa.build.in diff --git a/LUFA/Build/lufa.build.in b/LUFA/Build/lufa.build.in index d1b82d824..115763ab4 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 all elf hex lss 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 @@ -20,11 +20,11 @@ LUFA_BUILD_OPTIONAL_VARS += BOARD OPTIMIZATION C_STANDARD CPP_STANDARD F_CPU C_ # ----------------------------------------------------------------------------- # TARGETS: # -# size - List application size -# checksource - Check existance of listed input source files +# size - List built application size # 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 # clean - Remove output files # # MANDATORY PARAMETERS: @@ -54,12 +54,25 @@ LUFA_BUILD_OPTIONAL_VARS += BOARD OPTIMIZATION C_STANDARD CPP_STANDARD F_CPU C_ # ----------------------------------------------------------------------------- # 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.) +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) + +ifeq ($(MCU),) + $(error Makefile MCU option cannot be blank) +endif +ifeq ($(TARGET),) + $(error Makefile TARGET option cannot be blank) +endif +ifeq ($(ARCH),) + $(error Makefile ARCH option cannot be blank) +endif +ifeq ($(F_USB),) + $(error Makefile F_USB option cannot be blank) +endif # Default values of optionally user-supplied variables BOARD ?= NONE @@ -72,15 +85,26 @@ 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 "$(ARCH)".) +endif + # 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] :' +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)) @@ -88,20 +112,16 @@ 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- -else - $(error Unsupported architecture.) endif CC_FLAGS += -Wall -fno-strict-aliasing -funsigned-char -funsigned-bitfields -ffunction-sections CC_FLAGS += -I. -I$(patsubst %/,%,$(LUFA_PATH))/.. @@ -111,11 +131,14 @@ ifneq ($(F_CPU),) 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 @@ -126,56 +149,67 @@ 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 "" -checksource: - @for f in $(SRC) $(CPPSRC) $(ASRC); do \ - if [ -f $$f ]; then \ - echo "Found Source File: $$f" ; \ - else \ - echo "Source File Not Found: $$f" ; \ +gcc_version: + @$(CROSS)gcc --version + +check_source: + @for f in $(SRC); do \ + if [ ! -f $$f ]; then \ + echo "Error: Source file not found: $$f"; \ + exit 1; \ fi; \ done 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 elf hex lss size end -all: begin elf hex lss size end +clean: + @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 + +all: begin check_source gcc_version elf hex lss size end elf: $(TARGET).elf hex: $(TARGET).hex $(TARGET).eep lss: $(TARGET).lss -%.o: %.c +%.o: %.c $(MAKEFILE_LIST) @echo $(MSG_COMPILE_CMD) Compiling C file \"$<\" - $(CROSS)gcc -c $(CC_FLAGS) $(C_FLAGS) -O$(OPTIMIZATION) -std=$(C_STANDARD) $< -o $@ + $(CROSS)gcc -c $(CC_FLAGS) $(C_FLAGS) $< -o $@ -%.o: %.cpp +%.o: %.cpp $(MAKEFILE_LIST) @echo $(MSG_COMPILE_CMD) Compiling C++ file \"$<\" - $(CROSS)gcc -c $(CC_FLAGS) $(CPP_FLAGS) -O$(OPTIMIZATION) -std=$(CPP_STANDARD) -x c++ $< -o $@ + $(CROSS)gcc -c $(CC_FLAGS) $(CPP_FLAGS) -x c++ $< -o $@ -%.o: %.S +%.o: %.S $(MAKEFILE_LIST) @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 \"$<\" @@ -189,8 +223,8 @@ lss: $(TARGET).lss @echo $(MSG_OBJDMP_CMD) Extracting LSS file data from \"$<\" $(CROSS)objdump -h -S -z $< > $@ -clean: - @echo $(MSG_REMOVE_CMD) Removing object files \"$(strip $(notdir $(OBJECT_FILES)))\" - rm -f $(OBJECT_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) + +# Phony build targets for this module +.PHONY: begin end gcc_version check_source size elf hex lss clean \ No newline at end of file