Fix up non-relative header file include paths (thanks to Kim Blomqvist).
[pub/lufa.git] / LUFA / Build / lufa.build.in
index 7eb6587..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
@@ -111,38 +119,37 @@ else
 endif
 
 # Output Messages
-MSG_BUILD_BEGIN  := Begin compilation of project \"$(TARGET)\"...
-MSG_BUILD_END    := Finished building project \"$(TARGET)\".
 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    := -pipe
@@ -180,17 +187,17 @@ SIZE_FORMAT_FLAG := $(shell $(CROSS)-size --help | grep -- --format=.*avr > /dev
 
 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:
+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"; \
@@ -205,18 +212,21 @@ size: $(TARGET).elf
 
 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
@@ -232,12 +242,18 @@ $(OBJDIR)/%.o: %.cpp $(MAKEFILE_LIST)
        
 $(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 \"$@\"
+       @echo $(MSG_LINK_CMD) Linking object files into \"$@\"
        $(CROSS)-gcc $(BASE_CC_FLAGS) $(BASE_LD_FLAGS) $(CC_FLAGS) $(LD_FLAGS) $^ -o $@
 
 %.hex: %.elf
@@ -260,4 +276,4 @@ $(OBJDIR)/%.o: %.S $(MAKEFILE_LIST)
 -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