X-Git-Url: http://git.linex4red.de/pub/lufa.git/blobdiff_plain/3d39cbe94bce078455b8cb835e24a9ef157d1eed..5d9403fde4e0d89313121fcd5fa4cfc6c4ddfc4e:/LUFA/Build/lufa.build.in diff --git a/LUFA/Build/lufa.build.in b/LUFA/Build/lufa.build.in index 47d3276c4..91c54f969 100644 --- a/LUFA/Build/lufa.build.in +++ b/LUFA/Build/lufa.build.in @@ -7,7 +7,7 @@ # LUFA_BUILD_MODULES += BUILD -LUFA_BUILD_TARGETS += size symbol-sizes all elf hex lss clean +LUFA_BUILD_TARGETS += size check-source symbol-sizes all lib elf 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 LUFA_BUILD_PROVIDED_VARS += @@ -25,11 +25,17 @@ 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 # lss - Build application LSS assembly listing file -# clean - Remove output files +# clean - Remove all project intermediatary and binary +# output files +# mostlyclean - Remove intermediatary output files, but +# preserve binaries # # MANDATORY PARAMETERS: # @@ -68,9 +74,11 @@ LUFA_BUILD_PROVIDED_MACROS += # # ----------------------------------------------------------------------------- -ERROR_IF_UNSET = $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set)) -ERROR_IF_EMPTY = $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank)) -ERROR_IF_NONBOOL = $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N)) +SHELL = /bin/sh + +ERROR_IF_UNSET ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set)) +ERROR_IF_EMPTY ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank)) +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 @@ -99,53 +107,52 @@ $(call ERROR_IF_EMPTY, OBJDIR) # Determine the utility prefix to use for the selected architecture ifeq ($(ARCH), AVR8) - CROSS := avr- + CROSS := avr else ifeq ($(ARCH), XMEGA) - CROSS := avr- + CROSS := 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 := 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)") endif # Output Messages -MSG_BUILD_BEGIN := Begin compilation of project \"$(TARGET)\"... -MSG_BUILD_END := Finished building project \"$(TARGET)\". -MSG_COMPILE_CMD := ' [CC] :' -MSG_ASSEMBLE_CMD := ' [AS] :' +MSG_COMPILE_CMD := ' [GCC] :' +MSG_ASSEMBLE_CMD := ' [GAS] :' MSG_NM_CMD := ' [NM] :' MSG_REMOVE_CMD := ' [RM] :' -MSG_LINKER_CMD := ' [LNK] :' +MSG_LINK_CMD := ' [LNK] :' +MSG_ARCHIVE_CMD := ' [AR] :' 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)) -CPP_SOURCE = $(filter %.cpp, $(SRC)) -ASM_SOURCE = $(filter %.S, $(SRC)) +C_SOURCE := $(filter %.c, $(SRC)) +CPP_SOURCE := $(filter %.cpp, $(SRC)) +ASM_SOURCE := $(filter %.S, $(SRC)) # 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)) +UNKNOWN_SOURCE := $(filter-out $(C_SOURCE) $(CPP_SOURCE) $(ASM_SOURCE), $(SRC)) ifneq ($(UNKNOWN_SOURCE),) - $(error Unknown input source formats: $(UNKNOWN_SOURCE)) + $(error Unknown input source file formats: $(UNKNOWN_SOURCE)) endif # 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 := $(addsuffix .o, $(basename $(SRC))) ifneq ($(OBJDIR),.) - $(shell mkdir $(OBJDIR) 2>&1 | /dev/null) + $(shell mkdir $(OBJDIR) 2>&1 > /dev/null) VPATH += $(dir $(SRC)) - OBJECT_FILES := $(addprefix $(patsubst %/,%,$(OBJDIR))/, $(notdir $(OBJECT_FILES))) endif -DEPENDENCY_FILES = $(OBJECT_FILES:%.o=%.d) +# Create a list of dependency files from the list of object files +DEPENDENCY_FILES := $(OBJECT_FILES:%.o=%.d) # Create a list of common flags to pass to the compiler/linker/assembler -BASE_CC_FLAGS := +BASE_CC_FLAGS := -pipe ifeq ($(ARCH), AVR8) BASE_CC_FLAGS += -mmcu=$(MCU) -gdwarf-2 -fshort-enums -fno-inline-small-functions -fpack-struct else ifeq ($(ARCH), XMEGA) @@ -174,23 +181,23 @@ else endif # Determine flags to pass to the size utility based on its reported features -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 ) +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 ) build_begin: @echo "" - @echo $(MSG_BUILD_BEGIN) + @echo Begin compilation of project \"$(TARGET)\"... @echo "" build_end: - @echo $(MSG_BUILD_END) + @echo Finished building project \"$(TARGET)\". @echo "" -gcc_version: - @$(CROSS)gcc --version +gcc-version: + @$(CROSS)-gcc --version -check_source: +check-source: @for f in $(SRC); do \ if [ ! -f $$f ]; then \ echo "Error: Source file not found: $$f"; \ @@ -201,22 +208,25 @@ check_source: 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) $< ; 2>/dev/null; symbol-sizes: $(TARGET).elf @echo $(MSG_NM_CMD) Extracting \"$<\" symbols with decimal byte sizes - avr-nm --size-sort --demangle --radix=d $< + $(CROSS)-nm --size-sort --demangle --radix=d $< -clean: +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) + +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 + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).eep $(TARGET).map $(TARGET).lss $(TARGET).sym $(TARGET).a -all: build_begin check_source gcc_version elf hex lss sym size build_end +all: build_begin check-source gcc-version elf hex lss sym size build_end +lib: $(TARGET).a elf: $(TARGET).elf hex: $(TARGET).hex $(TARGET).eep lss: $(TARGET).lss @@ -224,40 +234,46 @@ sym: $(TARGET).sym $(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 $@ + $(CROSS)-gcc -c $(BASE_CC_FLAGS) $(BASE_C_FLAGS) $(CC_FLAGS) $(C_FLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -o $@ $(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 $@ + $(CROSS)-gcc -c $(BASE_CC_FLAGS) $(BASE_CPP_FLAGS) $(CC_FLAGS) $(CPP_FLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -o $@ $(OBJDIR)/%.o: %.S $(MAKEFILE_LIST) @echo $(MSG_ASSEMBLE_CMD) Assembling \"$(notdir $<)\" - $(CROSS)gcc -c $(BASE_CC_FLAGS) $(BASE_ASM_FLAGS) $(CC_FLAGS) $(ASM_FLAGS) $< -o $@ + $(CROSS)-gcc -c $(BASE_CC_FLAGS) $(BASE_ASM_FLAGS) $(CC_FLAGS) $(ASM_FLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -o $@ + +.PRECIOUS : $(OBJECT_FILES) +.SECONDARY : %.a +%.a: $(OBJECT_FILES) + @echo $(MSG_ARCHIVE_CMD) Archiving object files into \"$@\" + $(CROSS)-ar rcs $@ $(OBJECT_FILES) .PRECIOUS : $(OBJECT_FILES) .SECONDARY : %.elf %.elf: $(OBJECT_FILES) - @echo $(MSG_LINKER_CMD) Linking object files into \"$@\" - $(CROSS)gcc $(BASE_CC_FLAGS) $(BASE_LD_FLAGS) $(CC_FLAGS) $(LD_FLAGS) $^ -o $@ + @echo $(MSG_LINK_CMD) Linking object files into \"$@\" + $(CROSS)-gcc $(BASE_CC_FLAGS) $(BASE_LD_FLAGS) $(CC_FLAGS) $(LD_FLAGS) $^ -o $@ %.hex: %.elf @echo $(MSG_OBJCPY_CMD) Extracting HEX file data from \"$<\" - $(CROSS)objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature $< $@ + $(CROSS)-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature $< $@ %.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 -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 \"$<\" - $(CROSS)objdump -h -S -z $< > $@ + $(CROSS)-objdump -h -S -z $< > $@ %.sym: %.elf @echo $(MSG_NM_CMD) Extracting SYM file data from \"$<\" - $(CROSS)nm -n $< > $@ + $(CROSS)-nm -n $< > $@ # Include build dependency files -include $(DEPENDENCY_FILES) # Phony build targets for this module -.PHONY: build_begin build_end gcc_version check_source size symbol-sizes elf hex lss clean +.PHONY: build_begin build_end gcc-version check-source size symbol-sizes lib elf hex lss clean mostlyclean