]> git.donarmstrong.com Git - qmk_firmware.git/blob - protocol/lufa/LUFA-120730/LUFA/Build/lufa_build.mk
Squashed 'tmk_core/' content from commit 05caacc
[qmk_firmware.git] / protocol / lufa / LUFA-120730 / LUFA / Build / lufa_build.mk
1 #\r
2 #             LUFA Library\r
3 #     Copyright (C) Dean Camera, 2012.\r
4 #\r
5 #  dean [at] fourwalledcubicle [dot] com\r
6 #           www.lufa-lib.org\r
7 #\r
8 \r
9 LUFA_BUILD_MODULES         += BUILD\r
10 LUFA_BUILD_TARGETS         += size check-source symbol-sizes all lib elf hex lss clean mostlyclean\r
11 LUFA_BUILD_MANDATORY_VARS  += TARGET ARCH MCU SRC F_USB LUFA_PATH\r
12 LUFA_BUILD_OPTIONAL_VARS   += BOARD OPTIMIZATION C_STANDARD CPP_STANDARD F_CPU C_FLAGS CPP_FLAGS ASM_FLAGS CC_FLAGS LD_FLAGS OBJDIR OBJECT_FILES DEBUG_TYPE DEBUG_LEVEL\r
13 LUFA_BUILD_PROVIDED_VARS   += \r
14 LUFA_BUILD_PROVIDED_MACROS += \r
15 \r
16 # -----------------------------------------------------------------------------\r
17 #               LUFA GCC Compiler Buildsystem Makefile Module.\r
18 # -----------------------------------------------------------------------------\r
19 # DESCRIPTION:\r
20 #   Provides a set of targets to build a C, C++ and/or Assembly application\r
21 #   via the AVR-GCC compiler.\r
22 # -----------------------------------------------------------------------------\r
23 # TARGETS:\r
24 #\r
25 #    size                      - List built application size\r
26 #    symbol-sizes              - Print application symbols from the binary ELF\r
27 #                                file as a list sorted by size in bytes\r
28 #    check-source              - Print a list of SRC source files that cannot\r
29 #                                be found\r
30 #    all                       - Build application and list size\r
31 #    lib                       - Build and archive source files into a library\r
32 #    elf                       - Build application ELF debug object file\r
33 #    hex                       - Build application HEX object files\r
34 #    lss                       - Build application LSS assembly listing file\r
35 #    clean                     - Remove all project intermediatary and binary\r
36 #                                output files\r
37 #    mostlyclean               - Remove intermediatary output files, but\r
38 #                                preserve binaries\r
39 #\r
40 # MANDATORY PARAMETERS:\r
41 #\r
42 #    TARGET                    - Application name\r
43 #    ARCH                      - Device architecture name\r
44 #    MCU                       - Microcontroller device model name\r
45 #    SRC                       - List of input source files (*.c, *.cpp, *.S)\r
46 #    F_USB                     - Speed of the input clock of the USB controller\r
47 #                                in Hz\r
48 #    LUFA_PATH                 - Path to the LUFA library core\r
49 #\r
50 # OPTIONAL PARAMETERS:\r
51 #\r
52 #    BOARD                     - LUFA board hardware\r
53 #    OPTIMIZATION              - Optimization level\r
54 #    C_STANDARD                - C Language Standard to use\r
55 #    CPP_STANDARD              - C++ Language Standard to use\r
56 #    F_CPU                     - Speed of the CPU, in Hz\r
57 #    C_FLAGS                   - Flags to pass to the C compiler only\r
58 #    CPP_FLAGS                 - Flags to pass to the C++ compiler only\r
59 #    ASM_FLAGS                 - Flags to pass to the assembler only\r
60 #    CC_FLAGS                  - Common flags to pass to the C/C++ compiler and\r
61 #                                assembler\r
62 #    LD_FLAGS                  - Flags to pass to the linker\r
63 #    OBJDIR                    - Directory for the output object and dependency\r
64 #                                files; if equal to ".", the output files will\r
65 #                                be generated in the same folder as the sources\r
66 #    OBJECT_FILES              - Extra object files to link in to the binaries\r
67 #    DEBUG_FORMAT              - Format of the debugging information to\r
68 #                                generate in the compiled object files\r
69 #    DEBUG_LEVEL               - Level the debugging information to generate in\r
70 #                                the compiled object files\r
71 #\r
72 # PROVIDED VARIABLES:\r
73 #\r
74 #    (None)\r
75 #\r
76 # PROVIDED MACROS:\r
77 #\r
78 #    (None)\r
79 #\r
80 # -----------------------------------------------------------------------------\r
81 \r
82 SHELL = /bin/sh\r
83 \r
84 ERROR_IF_UNSET   ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set))\r
85 ERROR_IF_EMPTY   ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank))\r
86 ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N))\r
87 \r
88 # Default values of optionally user-supplied variables\r
89 BOARD           ?= NONE\r
90 OPTIMIZATION    ?= s\r
91 F_CPU           ?=\r
92 C_STANDARD      ?= gnu99\r
93 CPP_STANDARD    ?= gnu++98\r
94 C_FLAGS         ?=\r
95 CPP_FLAGS       ?=\r
96 ASM_FLAGS       ?=\r
97 CC_FLAGS        ?=\r
98 OBJDIR          ?= .\r
99 OBJECT_FILES    ?=\r
100 DEBUG_FORMAT    ?= dwarf-2\r
101 DEBUG_LEVEL     ?= 3\r
102 \r
103 # Sanity check user supplied values\r
104 $(foreach MANDATORY_VAR, $(LUFA_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR)))\r
105 $(call ERROR_IF_EMPTY, MCU)\r
106 $(call ERROR_IF_EMPTY, TARGET)\r
107 $(call ERROR_IF_EMPTY, ARCH)\r
108 $(call ERROR_IF_EMPTY, F_USB)\r
109 $(call ERROR_IF_EMPTY, LUFA_PATH)\r
110 $(call ERROR_IF_EMPTY, BOARD)\r
111 $(call ERROR_IF_EMPTY, OPTIMIZATION)\r
112 $(call ERROR_IF_EMPTY, C_STANDARD)\r
113 $(call ERROR_IF_EMPTY, CPP_STANDARD)\r
114 $(call ERROR_IF_EMPTY, OBJDIR)\r
115 $(call ERROR_IF_EMPTY, DEBUG_FORMAT)\r
116 $(call ERROR_IF_EMPTY, DEBUG_LEVEL)\r
117 \r
118 # Determine the utility prefix to use for the selected architecture\r
119 ifeq ($(ARCH), AVR8)\r
120    CROSS        := avr\r
121 else ifeq ($(ARCH), XMEGA)\r
122    CROSS        := avr\r
123    $(warning The XMEGA device support is currently EXPERIMENTAL (incomplete and/or non-functional), and is included for preview purposes only.)\r
124 else ifeq ($(ARCH), UC3)\r
125    CROSS        := avr32\r
126    $(warning The UC3 device support is currently EXPERIMENTAL (incomplete and/or non-functional), and is included for preview purposes only.)\r
127 else\r
128    $(error Unsupported architecture "$(ARCH)")\r
129 endif\r
130 \r
131 # Output Messages\r
132 MSG_COMPILE_CMD  := ' [GCC]     :'\r
133 MSG_ASSEMBLE_CMD := ' [GAS]     :'\r
134 MSG_NM_CMD       := ' [NM]      :'\r
135 MSG_REMOVE_CMD   := ' [RM]      :'\r
136 MSG_LINK_CMD     := ' [LNK]     :'\r
137 MSG_ARCHIVE_CMD  := ' [AR]      :'\r
138 MSG_SIZE_CMD     := ' [SIZE]    :'\r
139 MSG_OBJCPY_CMD   := ' [OBJCPY]  :'\r
140 MSG_OBJDMP_CMD   := ' [OBJDMP]  :'\r
141 \r
142 # Convert input source file list to differentiate them by type\r
143 C_SOURCE   := $(filter %.c, $(SRC))\r
144 CPP_SOURCE := $(filter %.cpp, $(SRC))\r
145 ASM_SOURCE := $(filter %.S, $(SRC))\r
146 \r
147 # Create a list of unknown source file types, if any are found throw an error\r
148 UNKNOWN_SOURCE := $(filter-out $(C_SOURCE) $(CPP_SOURCE) $(ASM_SOURCE), $(SRC))\r
149 ifneq ($(UNKNOWN_SOURCE),)\r
150    $(error Unknown input source file formats: $(UNKNOWN_SOURCE))\r
151 endif\r
152 \r
153 # Convert input source filenames into a list of required output object files\r
154 OBJECT_FILES += $(addsuffix .o, $(basename $(SRC)))\r
155 ifneq ($(OBJDIR),.)\r
156    $(shell mkdir $(OBJDIR) 2> /dev/null)   \r
157    VPATH           += $(dir $(SRC))\r
158    OBJECT_FILES    := $(addprefix $(patsubst %/,%,$(OBJDIR))/, $(notdir $(OBJECT_FILES)))\r
159    \r
160    # Check if any object file (without path) appears more than once in the object file list\r
161    ifneq ($(words $(sort $(OBJECT_FILES))), $(words $(OBJECT_FILES)))\r
162        $(error Cannot build with OBJDIR parameter set - one or more object file name is not unique)\r
163    endif\r
164 endif\r
165 \r
166 # Create a list of dependency files from the list of object files\r
167 DEPENDENCY_FILES := $(OBJECT_FILES:%.o=%.d)\r
168 \r
169 # Create a list of common flags to pass to the compiler/linker/assembler\r
170 BASE_CC_FLAGS    := -pipe -g$(DEBUG_FORMAT) -g$(DEBUG_LEVEL)\r
171 ifeq ($(ARCH), AVR8)\r
172    BASE_CC_FLAGS += -mmcu=$(MCU) -fshort-enums -fno-inline-small-functions -fpack-struct\r
173 else ifeq ($(ARCH), XMEGA)\r
174    BASE_CC_FLAGS += -mmcu=$(MCU) -fshort-enums -fno-inline-small-functions -fpack-struct\r
175 else ifeq ($(ARCH), UC3)\r
176    BASE_CC_FLAGS += -mpart=$(MCU:at32%=%) -masm-addr-pseudos\r
177 endif\r
178 BASE_CC_FLAGS += -Wall -fno-strict-aliasing -funsigned-char -funsigned-bitfields -ffunction-sections\r
179 BASE_CC_FLAGS += -I. -I$(patsubst %/,%,$(LUFA_PATH))/..\r
180 BASE_CC_FLAGS += -DARCH=ARCH_$(ARCH) -DBOARD=BOARD_$(BOARD) -DF_USB=$(F_USB)UL\r
181 ifneq ($(F_CPU),)\r
182    BASE_CC_FLAGS += -DF_CPU=$(F_CPU)UL\r
183 endif\r
184 \r
185 # Additional language specific compiler flags\r
186 BASE_C_FLAGS   := -x c -O$(OPTIMIZATION) -std=$(C_STANDARD) -Wstrict-prototypes\r
187 BASE_CPP_FLAGS := -x c++ -O$(OPTIMIZATION) -std=$(CPP_STANDARD)\r
188 BASE_ASM_FLAGS := -x assembler-with-cpp\r
189 \r
190 # Create a list of flags to pass to the linker\r
191 BASE_LD_FLAGS := -lm -Wl,-Map=$(TARGET).map,--cref -Wl,--gc-sections -Wl,--relax \r
192 ifeq ($(ARCH), AVR8)\r
193    BASE_LD_FLAGS += -mmcu=$(MCU)\r
194 else ifeq ($(ARCH), XMEGA)\r
195    BASE_LD_FLAGS += -mmcu=$(MCU)\r
196 else ifeq ($(ARCH), UC3)\r
197    BASE_LD_FLAGS += -mpart=$(MCU:at32%=%) --rodata-writable --direct-data\r
198 endif\r
199 \r
200 # Determine flags to pass to the size utility based on its reported features (only invoke if size target required)\r
201 size: SIZE_MCU_FLAG    := $(shell $(CROSS)-size --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) )\r
202 size: SIZE_FORMAT_FLAG := $(shell $(CROSS)-size --help | grep -- --format=.*avr > /dev/null && echo --format=avr )\r
203 \r
204 \r
205 build_begin:\r
206         @echo ""\r
207         @echo Begin compilation of project \"$(TARGET)\"...\r
208         @echo ""\r
209         \r
210 build_end:\r
211         @echo Finished building project \"$(TARGET)\".\r
212         @echo ""\r
213 \r
214 gcc-version:\r
215         @$(CROSS)-gcc --version\r
216 \r
217 check-source:\r
218         @for f in $(SRC); do \\r
219                 if [ ! -f $$f ]; then \\r
220                         echo "Error: Source file not found: $$f"; \\r
221                         exit 1; \\r
222                 fi; \\r
223          done\r
224 \r
225 size: $(TARGET).elf\r
226         @echo $(MSG_SIZE_CMD) Determining size of \"$<\"\r
227         @echo ""\r
228         $(CROSS)-size $(SIZE_MCU_FLAG) $(SIZE_FORMAT_FLAG) $< ; 2>/dev/null;\r
229 \r
230 symbol-sizes: $(TARGET).elf\r
231         @echo $(MSG_NM_CMD) Extracting \"$<\" symbols with decimal byte sizes\r
232         $(CROSS)-nm --size-sort --demangle --radix=d $<\r
233 \r
234 mostlyclean:\r
235         @echo $(MSG_REMOVE_CMD) Removing object files of \"$(TARGET)\"\r
236         rm -f $(OBJECT_FILES)\r
237         @echo $(MSG_REMOVE_CMD) Removing dependency files of \"$(TARGET)\"\r
238         rm -f $(DEPENDENCY_FILES)\r
239 \r
240 clean: mostlyclean\r
241         @echo $(MSG_REMOVE_CMD) Removing output files of \"$(TARGET)\"\r
242         rm -f $(TARGET).elf $(TARGET).hex $(TARGET).eep $(TARGET).map $(TARGET).lss $(TARGET).sym $(TARGET).a\r
243 \r
244 all: build_begin check-source gcc-version elf hex lss sym size build_end\r
245 \r
246 lib: lib$(TARGET).a\r
247 elf: $(TARGET).elf\r
248 hex: $(TARGET).hex $(TARGET).eep\r
249 lss: $(TARGET).lss\r
250 sym: $(TARGET).sym\r
251 \r
252 $(OBJDIR)/%.o: %.c $(MAKEFILE_LIST)\r
253         @echo $(MSG_COMPILE_CMD) Compiling C file \"$(notdir $<)\"\r
254         $(CROSS)-gcc -c $(BASE_CC_FLAGS) $(BASE_C_FLAGS) $(CC_FLAGS) $(C_FLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -o $@\r
255 \r
256 $(OBJDIR)/%.o: %.cpp $(MAKEFILE_LIST)\r
257         @echo $(MSG_COMPILE_CMD) Compiling C++ file \"$(notdir $<)\"\r
258         $(CROSS)-gcc -c $(BASE_CC_FLAGS) $(BASE_CPP_FLAGS) $(CC_FLAGS) $(CPP_FLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -o $@\r
259         \r
260 $(OBJDIR)/%.o: %.S $(MAKEFILE_LIST)\r
261         @echo $(MSG_ASSEMBLE_CMD) Assembling \"$(notdir $<)\"\r
262         $(CROSS)-gcc -c $(BASE_CC_FLAGS) $(BASE_ASM_FLAGS) $(CC_FLAGS) $(ASM_FLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -o $@\r
263 \r
264 .PRECIOUS  : $(OBJECT_FILES)\r
265 .SECONDARY : %.a\r
266 %.a: $(OBJECT_FILES)\r
267         @echo $(MSG_ARCHIVE_CMD) Archiving object files into \"$@\"\r
268         $(CROSS)-ar rcs $@ $(OBJECT_FILES)\r
269 \r
270 .PRECIOUS  : $(OBJECT_FILES)\r
271 .SECONDARY : %.elf\r
272 %.elf: $(OBJECT_FILES)\r
273         @echo $(MSG_LINK_CMD) Linking object files into \"$@\"\r
274         $(CROSS)-gcc $(BASE_LD_FLAGS) $(LD_FLAGS) $^ -o $@\r
275 \r
276 %.hex: %.elf\r
277         @echo $(MSG_OBJCPY_CMD) Extracting HEX file data from \"$<\"\r
278         $(CROSS)-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature $< $@\r
279 \r
280 %.eep: %.elf\r
281         @echo $(MSG_OBJCPY_CMD) Extracting EEP file data from \"$<\"\r
282         $(CROSS)-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex $< $@ || exit 0\r
283 \r
284 %.lss: %.elf\r
285         @echo $(MSG_OBJDMP_CMD) Extracting LSS file data from \"$<\"\r
286         $(CROSS)-objdump -h -S -z $< > $@\r
287 \r
288 %.sym: %.elf\r
289         @echo $(MSG_NM_CMD) Extracting SYM file data from \"$<\"\r
290         $(CROSS)-nm -n $< > $@\r
291 \r
292 # Include build dependency files\r
293 -include $(DEPENDENCY_FILES)\r
294 \r
295 # Phony build targets for this module\r
296 .PHONY: build_begin build_end gcc-version check-source size symbol-sizes lib elf hex lss clean mostlyclean\r