aboutsummaryrefslogtreecommitdiffstats
path: root/LUFA/Build/lufa.build.in
diff options
context:
space:
mode:
Diffstat (limited to 'LUFA/Build/lufa.build.in')
-rw-r--r--LUFA/Build/lufa.build.in182
1 files changed, 182 insertions, 0 deletions
diff --git a/LUFA/Build/lufa.build.in b/LUFA/Build/lufa.build.in
new file mode 100644
index 000000000..e9921efb7
--- /dev/null
+++ b/LUFA/Build/lufa.build.in
@@ -0,0 +1,182 @@
+#
+# LUFA Library
+# Copyright (C) Dean Camera, 2012.
+#
+# dean [at] fourwalledcubicle [dot] com
+# www.lufa-lib.org
+#
+
+LUFA_BUILD_MODULES += BUILD
+LUFA_BUILD_TARGETS += size checksource all elf hex clean
+
+# -----------------------------------------------------------------------------
+# LUFA Compiler Buildsystem Makefile Module.
+# -----------------------------------------------------------------------------
+# DESCRIPTION:
+# Provides a set of targets to build a C, C++ and/or Assembly application
+# via the AVR-GCC compiler.
+# -----------------------------------------------------------------------------
+# TARGETS:
+#
+# size - List application size
+# checksource - Check existance of listed input source files
+# all - Build application and list size
+# elf - Build application ELF debug object file
+# hex - Build application HEX object files
+# clean - Remove output files
+#
+# MANDATORY PARAMETERS:
+#
+# TARGET - Application name
+# ARCH - Device architecture name
+# MCU - Microcontroller device model name
+# SRC - List of input source files (.c, .cpp/.c++, .S)
+# F_USB - Speed of the input clock of the USB controller
+# in Hz
+# LUFA_PATH - Path to the LUFA library core
+#
+# OPTIONAL PARAMETERS:
+#
+# BOARD - LUFA board hardware
+# OPTIMIZATION - Optimization level
+# 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
+# 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.)
+endif
+
+# Default values of user-supplied variables
+BOARD ?= NONE
+OPTIMIZATION ?= s
+F_CPU ?=
+C_STANDARD ?= c99
+CPP_STANDARD ?= c++98
+
+# Convert input source file list to differentiate them by type
+C_SOURCE = $(filter %.c, $(SRC))
+CPP_SOURCE = $(filter %.cpp, $(SRC)) $(filter %.c++, $(SRC))
+ASM_SOURCE = $(filter %.S, $(SRC))
+
+# Convert input source filenames into a list of required output object files
+OBJECT_FILES = $(C_SOURCE:%.c=%.o) $(CPP_SOURCE:%.c++=%.o) $(CPP_SOURCE:%.c++=%.o) $(ASM_SOURCE:%.S=%.o)
+
+# Create a list of flags to pass to the compiler
+CC_FLAGS += -mmcu=$(MCU) -I. -I$(LUFA_PATH)/.. -gdwarf-2 -pipe
+CC_FLAGS += -Wall -Wstrict-prototypes
+CC_FLAGS += -fno-strict-aliasing -funsigned-char -funsigned-bitfields -ffunction-sections -fshort-enums -fno-inline-small-functions -fpack-struct -fshort-enums
+CC_FLAGS += -DARCH=ARCH_$(ARCH) -DBOARD=BOARD_$(BOARD) -DF_USB=$(F_USB)UL
+ifneq ($(F_CPU),)
+ CC_FLAGS += -DF_CPU=$(F_CPU)UL
+endif
+
+# Create a list of flags to pass to the linker
+LD_FLAGS += -Wl,-Map=$(TARGET).map,--cref -Wl,--relax -Wl,--gc-sections -lm
+
+# 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))
+ifneq ($(UNKNOWN_SOURCE),)
+ $(error Unknown input source formats: $(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 )
+
+
+begin:
+ @echo ""
+ @echo $(MSG_BUILD_BEGIN)
+
+end:
+ @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" ; \
+ 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; \
+ fi
+
+.PHONY: begin hex lss end size
+all: begin hex end size
+
+elf: $(TARGET).elf
+hex: $(TARGET).hex $(TARGET).eep
+lss: $(TARGET).lss
+
+%.o: %.c
+ @echo $(MSG_COMPILE_CMD) Compiling C file \"$^\"
+ avr-gcc -c $(CC_FLAGS) -O$(OPTIMIZATION) --std=$(C_STANDARD) $< -o $@
+
+%.o: %.cpp
+%.o: %.c++
+ @echo $(MSG_COMPILE_CMD) Compiling C++ file \"$^\"
+ avr-gcc -c $(CC_FLAGS) -O$(OPTIMIZATION) --std=$(CPP_STANDARD) -x c++ $< -o $@
+
+%.o: %.S
+ @echo $(MSG_COMPILE_CMD) Assembling \"$^\"
+ avr-gcc -c $(CC_FLAGS) -x assembler-with-cpp $< -o $@
+
+.PRECIOUS : $(OBJECT_FILES)
+%.elf: $(OBJECT_FILES)
+ @echo $(MSG_LINKER_CMD) Linking object files into \"$@\"
+ avr-gcc $^ $(CC_FLAGS) $(LD_FLAGS) -o $@
+
+%.hex: %.elf
+ @echo $(MSG_OBJCPY_CMD) Extracting HEX file data from \"$@\"
+ avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature $< $@
+
+%.eep: %.elf
+ @echo $(MSG_OBJCPY_CMD) Extracting EEP file data from \"$@\"
+ avr-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 \"$@\"
+ avr-objdump -h -S -z $< > $@
+
+clean:
+ @echo $(MSG_REMOVE_CMD) Removing object files \"$(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