Fix up non-relative header file include paths (thanks to Kim Blomqvist).
[pub/lufa.git] / LUFA / Build / lufa.build.in
index 47d3276..91c54f9 100644 (file)
@@ -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