3 #     Copyright (C) Dean Camera, 2012. 
   5 #  dean [at] fourwalledcubicle [dot] com 
   9 LUFA_BUILD_MODULES         
+= BUILD
 
  10 LUFA_BUILD_TARGETS         
+= size check-source symbol-sizes 
all lib elf hex lss 
clean mostlyclean 
  11 LUFA_BUILD_MANDATORY_VARS  
+= TARGET ARCH MCU SRC F_USB LUFA_PATH
 
  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
 
  13 LUFA_BUILD_PROVIDED_VARS   
+=  
  14 LUFA_BUILD_PROVIDED_MACROS 
+=  
  16 # ----------------------------------------------------------------------------- 
  17 #               LUFA GCC Compiler Buildsystem Makefile Module. 
  18 # ----------------------------------------------------------------------------- 
  20 #   Provides a set of targets to build a C, C++ and/or Assembly application 
  21 #   via the AVR-GCC compiler. 
  22 # ----------------------------------------------------------------------------- 
  25 #    size                      - List built application size 
  26 #    symbol-sizes              - Print application symbols from the binary ELF 
  27 #                                file as a list sorted by size in bytes 
  28 #    check-source              - Print a list of SRC source files that cannot 
  30 #    all                       - Build application and list size 
  31 #    lib                       - Build and archive source files into a library 
  32 #    elf                       - Build application ELF debug object file 
  33 #    hex                       - Build application HEX object files 
  34 #    lss                       - Build application LSS assembly listing file 
  35 #    clean                     - Remove all project intermediatary and binary 
  37 #    mostlyclean               - Remove intermediatary output files, but 
  40 # MANDATORY PARAMETERS: 
  42 #    TARGET                    - Application name 
  43 #    ARCH                      - Device architecture name 
  44 #    MCU                       - Microcontroller device model name 
  45 #    SRC                       - List of input source files (*.c, *.cpp, *.S) 
  46 #    F_USB                     - Speed of the input clock of the USB controller 
  48 #    LUFA_PATH                 - Path to the LUFA library core 
  50 # OPTIONAL PARAMETERS: 
  52 #    BOARD                     - LUFA board hardware 
  53 #    OPTIMIZATION              - Optimization level 
  54 #    C_STANDARD                - C Language Standard to use 
  55 #    CPP_STANDARD              - C++ Language Standard to use 
  56 #    F_CPU                     - Speed of the CPU, in Hz 
  57 #    C_FLAGS                   - Flags to pass to the C compiler only 
  58 #    CPP_FLAGS                 - Flags to pass to the C++ compiler only 
  59 #    ASM_FLAGS                 - Flags to pass to the assembler only 
  60 #    CC_FLAGS                  - Common flags to pass to the C/C++ compiler and 
  62 #    LD_FLAGS                  - Flags to pass to the linker 
  63 #    OBJDIR                    - Directory for the output object and dependency 
  64 #                                files; if equal to ".", the output files will 
  65 #                                be generated in the same folder as the sources 
  66 #    OBJECT_FILES              - Extra object files to link in to the binaries 
  67 #    DEBUG_FORMAT              - Format of the debugging information to 
  68 #                                generate in the compiled object files 
  69 #    DEBUG_LEVEL               - Level the debugging information to generate in 
  70 #                                the compiled object files 
  80 # ----------------------------------------------------------------------------- 
  84 ERROR_IF_UNSET   ?
= $(if 
$(filter undefined
, $(origin $(strip $(1)))), $(error Makefile 
$(strip $(1)) value not set
)) 
  85 ERROR_IF_EMPTY   ?
= $(if 
$(strip $($(strip $(1)))), , $(error Makefile 
$(strip $(1)) option cannot be blank
)) 
  86 ERROR_IF_NONBOOL ?
= $(if 
$(filter Y N
, $($(strip $(1)))), , $(error Makefile 
$(strip $(1)) option must be Y or N
)) 
  88 # Default values of optionally user-supplied variables 
  93 CPP_STANDARD    ?
= gnu
++98 
 100 DEBUG_FORMAT    ?
= dwarf-2
 
 103 # Sanity check user supplied values 
 104 $(foreach MANDATORY_VAR
, $(LUFA_BUILD_MANDATORY_VARS
), $(call ERROR_IF_UNSET
, $(MANDATORY_VAR
))) 
 105 $(call ERROR_IF_EMPTY
, MCU
) 
 106 $(call ERROR_IF_EMPTY
, TARGET
) 
 107 $(call ERROR_IF_EMPTY
, ARCH
) 
 108 $(call ERROR_IF_EMPTY
, F_USB
) 
 109 $(call ERROR_IF_EMPTY
, LUFA_PATH
) 
 110 $(call ERROR_IF_EMPTY
, BOARD
) 
 111 $(call ERROR_IF_EMPTY
, OPTIMIZATION
) 
 112 $(call ERROR_IF_EMPTY
, C_STANDARD
) 
 113 $(call ERROR_IF_EMPTY
, CPP_STANDARD
) 
 114 $(call ERROR_IF_EMPTY
, OBJDIR
) 
 115 $(call ERROR_IF_EMPTY
, DEBUG_FORMAT
) 
 116 $(call ERROR_IF_EMPTY
, DEBUG_LEVEL
) 
 118 # Determine the utility prefix to use for the selected architecture 
 121 else ifeq ($(ARCH
), XMEGA
) 
 123    $(warning The XMEGA device support is currently EXPERIMENTAL 
(incomplete and
/or non-functional
), and is included for preview purposes only.
) 
 124 else ifeq ($(ARCH
), UC3
) 
 126    $(warning The UC3 device support is currently EXPERIMENTAL 
(incomplete and
/or non-functional
), and is included for preview purposes only.
) 
 128    $(error Unsupported architecture 
"$(ARCH)") 
 132 MSG_COMPILE_CMD  
:= ' [GCC]     :' 
 133 MSG_ASSEMBLE_CMD 
:= ' [GAS]     :' 
 134 MSG_NM_CMD       
:= ' [NM]      :' 
 135 MSG_REMOVE_CMD   
:= ' [RM]      :' 
 136 MSG_LINK_CMD     
:= ' [LNK]     :' 
 137 MSG_ARCHIVE_CMD  
:= ' [AR]      :' 
 138 MSG_SIZE_CMD     
:= ' [SIZE]    :' 
 139 MSG_OBJCPY_CMD   
:= ' [OBJCPY]  :' 
 140 MSG_OBJDMP_CMD   
:= ' [OBJDMP]  :' 
 142 # Convert input source file list to differentiate them by type 
 143 C_SOURCE   
:= $(filter %.c
, $(SRC
)) 
 144 CPP_SOURCE 
:= $(filter %.
cpp, $(SRC
)) 
 145 ASM_SOURCE 
:= $(filter %.S
, $(SRC
)) 
 147 # Create a list of unknown source file types, if any are found throw an error 
 148 UNKNOWN_SOURCE 
:= $(filter-out $(C_SOURCE
) $(CPP_SOURCE
) $(ASM_SOURCE
), $(SRC
)) 
 149 ifneq ($(UNKNOWN_SOURCE
),) 
 150    $(error Unknown input source file formats
: $(UNKNOWN_SOURCE
)) 
 153 # Convert input source filenames into a list of required output object files 
 154 OBJECT_FILES 
+= $(addsuffix .o
, $(basename $(SRC
))) 
 156    $(shell mkdir 
$(OBJDIR
) 2> /dev
/null
)    
 157    VPATH           
+= $(dir $(SRC
)) 
 158    OBJECT_FILES    
:= $(addprefix $(patsubst %/,%,$(OBJDIR
))/, $(notdir $(OBJECT_FILES
))) 
 160    # Check if any object file (without path) appears more than once in the object file list 
 161    ifneq ($(words $(sort $(OBJECT_FILES
))), $(words $(OBJECT_FILES
))) 
 162        $(error Cannot build with OBJDIR parameter set 
- one or more object file name is not unique
) 
 166 # Create a list of dependency files from the list of object files 
 167 DEPENDENCY_FILES 
:= $(OBJECT_FILES
:%.o
=%.d
) 
 169 # Create a list of common flags to pass to the compiler/linker/assembler 
 170 BASE_CC_FLAGS    
:= -pipe 
-g
$(DEBUG_FORMAT
) -g
$(DEBUG_LEVEL
) 
 172    BASE_CC_FLAGS 
+= -mmcu
=$(MCU
) -fshort-enums 
-fno-inline-small-functions 
-fpack-struct
 
 173 else ifeq ($(ARCH
), XMEGA
) 
 174    BASE_CC_FLAGS 
+= -mmcu
=$(MCU
) -fshort-enums 
-fno-inline-small-functions 
-fpack-struct
 
 175 else ifeq ($(ARCH
), UC3
) 
 176    BASE_CC_FLAGS 
+= -mpart
=$(MCU
:at32
%=%) -masm-addr-pseudos
 
 178 BASE_CC_FLAGS 
+= -Wall 
-fno-strict-aliasing 
-funsigned-char 
-funsigned-bitfields 
-ffunction-sections
 
 179 BASE_CC_FLAGS 
+= -I. 
-I
$(patsubst %/,%,$(LUFA_PATH
))/..
 
 180 BASE_CC_FLAGS 
+= -DARCH
=ARCH_
$(ARCH
) -DBOARD
=BOARD_
$(BOARD
) -DF_USB
=$(F_USB
)UL
 
 182    BASE_CC_FLAGS 
+= -DF_CPU
=$(F_CPU
)UL
 
 185 # Additional language specific compiler flags 
 186 BASE_C_FLAGS   
:= -x c 
-O
$(OPTIMIZATION
) -std
=$(C_STANDARD
) -Wstrict-prototypes
 
 187 BASE_CPP_FLAGS 
:= -x c
++ -O
$(OPTIMIZATION
) -std
=$(CPP_STANDARD
) 
 188 BASE_ASM_FLAGS 
:= -x assembler-with-cpp
 
 190 # Create a list of flags to pass to the linker 
 191 BASE_LD_FLAGS 
:= -lm 
-Wl
,-Map
=$(TARGET
).map
,--cref 
-Wl
,--gc-sections 
-Wl
,--relax 
 
 193    BASE_LD_FLAGS 
+= -mmcu
=$(MCU
) 
 194 else ifeq ($(ARCH
), XMEGA
) 
 195    BASE_LD_FLAGS 
+= -mmcu
=$(MCU
) 
 196 else ifeq ($(ARCH
), UC3
) 
 197    BASE_LD_FLAGS 
+= -mpart
=$(MCU
:at32
%=%) --rodata-writable 
--direct-data
 
 200 # Determine flags to pass to the size utility based on its reported features (only invoke if size target required) 
 201 size
: SIZE_MCU_FLAG    
:= $(shell $(CROSS
)-size 
--help | grep 
-- --mcu 
> /dev
/null 
&& echo 
--mcu
=$(MCU
) ) 
 202 size
: SIZE_FORMAT_FLAG 
:= $(shell $(CROSS
)-size 
--help | grep 
-- --format
=.
*avr 
> /dev
/null 
&& echo 
--format
=avr 
) 
 207         @echo Begin compilation of project 
\"$(TARGET
)\"...
 
 211         @echo Finished building project 
\"$(TARGET
)\".
 
 215         @
$(CROSS
)-gcc 
--version
 
 218         @for f in 
$(SRC
); do \
 
 219                 if 
[ ! -f 
$$f ]; then \
 
 220                         echo 
"Error: Source file not found: $$f"; \
 
 226         @echo 
$(MSG_SIZE_CMD
) Determining size of 
\"$<\" 
 228         $(CROSS
)-size 
$(SIZE_MCU_FLAG
) $(SIZE_FORMAT_FLAG
) $< ; 2>/dev
/null
; 
 230 symbol-sizes
: $(TARGET
).elf
 
 231         @echo 
$(MSG_NM_CMD
) Extracting 
\"$<\" symbols with decimal byte sizes
 
 232         $(CROSS
)-nm 
--size-sort 
--demangle 
--radix
=d 
$< 
 235         @echo 
$(MSG_REMOVE_CMD
) Removing object files of 
\"$(TARGET
)\" 
 236         rm -f 
$(OBJECT_FILES
) 
 237         @echo 
$(MSG_REMOVE_CMD
) Removing dependency files of 
\"$(TARGET
)\" 
 238         rm -f 
$(DEPENDENCY_FILES
) 
 241         @echo 
$(MSG_REMOVE_CMD
) Removing output files of 
\"$(TARGET
)\" 
 242         rm -f 
$(TARGET
).elf 
$(TARGET
).hex 
$(TARGET
).eep 
$(TARGET
).map 
$(TARGET
).lss 
$(TARGET
).sym 
$(TARGET
).a
 
 244 all: build_begin check-source gcc-version elf hex lss sym size build_end
 
 248 hex
: $(TARGET
).hex 
$(TARGET
).eep
 
 252 $(OBJDIR
)/%.o
: %.c 
$(MAKEFILE_LIST
) 
 253         @echo 
$(MSG_COMPILE_CMD
) Compiling C file 
\"$(notdir $<)\" 
 254         $(CROSS
)-gcc 
-c 
$(BASE_CC_FLAGS
) $(BASE_C_FLAGS
) $(CC_FLAGS
) $(C_FLAGS
) -MMD 
-MP 
-MF 
$(@
:%.o
=%.d
) $< -o 
$@
 
 256 $(OBJDIR
)/%.o
: %.
cpp $(MAKEFILE_LIST
) 
 257         @echo 
$(MSG_COMPILE_CMD
) Compiling C
++ file 
\"$(notdir $<)\" 
 258         $(CROSS
)-gcc 
-c 
$(BASE_CC_FLAGS
) $(BASE_CPP_FLAGS
) $(CC_FLAGS
) $(CPP_FLAGS
) -MMD 
-MP 
-MF 
$(@
:%.o
=%.d
) $< -o 
$@
 
 260 $(OBJDIR
)/%.o
: %.S 
$(MAKEFILE_LIST
) 
 261         @echo 
$(MSG_ASSEMBLE_CMD
) Assembling 
\"$(notdir $<)\" 
 262         $(CROSS
)-gcc 
-c 
$(BASE_CC_FLAGS
) $(BASE_ASM_FLAGS
) $(CC_FLAGS
) $(ASM_FLAGS
) -MMD 
-MP 
-MF 
$(@
:%.o
=%.d
) $< -o 
$@
 
 264 .PRECIOUS  
: $(OBJECT_FILES
) 
 267         @echo 
$(MSG_ARCHIVE_CMD
) Archiving object files into 
\"$@
\" 
 268         $(CROSS
)-ar rcs 
$@ 
$(OBJECT_FILES
) 
 270 .PRECIOUS  
: $(OBJECT_FILES
) 
 272 %.elf
: $(OBJECT_FILES
) 
 273         @echo 
$(MSG_LINK_CMD
) Linking object files into 
\"$@
\" 
 274         $(CROSS
)-gcc 
$(BASE_LD_FLAGS
) $(LD_FLAGS
) $^ 
-o 
$@
 
 277         @echo 
$(MSG_OBJCPY_CMD
) Extracting HEX file data from 
\"$<\" 
 278         $(CROSS
)-objcopy 
-O ihex 
-R .eeprom 
-R .fuse 
-R .lock 
-R .signature 
$< $@
 
 281         @echo 
$(MSG_OBJCPY_CMD
) Extracting EEP file data from 
\"$<\" 
 282         $(CROSS
)-objcopy 
-j .eeprom 
--set-section-flags
=.eeprom
="alloc,load" --change-section-lma .eeprom
=0 --no-change-warnings 
-O ihex 
$< $@ || exit 
0 
 285         @echo 
$(MSG_OBJDMP_CMD
) Extracting LSS file data from 
\"$<\" 
 286         $(CROSS
)-objdump 
-h 
-S 
-z 
$< > $@
 
 289         @echo 
$(MSG_NM_CMD
) Extracting SYM file data from 
\"$<\" 
 290         $(CROSS
)-nm 
-n 
$< > $@
 
 292 # Include build dependency files 
 293 -include $(DEPENDENCY_FILES
) 
 295 # Phony build targets for this module 
 296 .PHONY
: build_begin build_end gcc-version check-source size symbol-sizes lib elf hex lss 
clean mostlyclean