lufa.build.in 6.67 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#
#             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))
89
CPP_SOURCE = $(filter %.cpp, $(SRC))
90
91
92
ASM_SOURCE = $(filter %.S, $(SRC))

# Convert input source filenames into a list of required output object files
93
OBJECT_FILES = $(filter %.o, $(C_SOURCE:%.c=%.o) $(CPP_SOURCE:%.cpp=%.o) $(ASM_SOURCE:%.S=%.o))
94
95

# Create a list of flags to pass to the compiler
96
97
98
99
100
101
102
103
104
105
106
107
ifeq ($(ARCH),AVR8)
 CC_FLAGS += -mmcu=$(MCU) -gdwarf-2 -fshort-enums -fno-inline-small-functions -fpack-struct
 CROSS     = avr-
else ifeq ($(ARCH),XMEGA)
 CC_FLAGS += -mmcu=$(MCU) -gdwarf-2 -fshort-enums -fno-inline-small-functions -fpack-struct
 CROSS     = avr-
else ifeq ($(ARCH),UC3)
 CC_FLAGS += -mpart=$(MCU) -g3 -masm-addr-pseudos
 CROSS     = avr32-
endif

CC_FLAGS += -fno-strict-aliasing -funsigned-char -funsigned-bitfields -ffunction-sections
108
CC_FLAGS += -Wall -Wstrict-prototypes
109
CC_FLAGS += -I. -I$(LUFA_PATH)/.. -pipe
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
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 \"$^\"
161
	$(CROSS)gcc -c $(CC_FLAGS) -O$(OPTIMIZATION) --std=$(C_STANDARD) $< -o $@
162
163
164

%.o: %.cpp
	@echo $(MSG_COMPILE_CMD) Compiling C++ file \"$^\"
165
	$(CROSS)gcc -c $(CC_FLAGS) -O$(OPTIMIZATION) --std=$(CPP_STANDARD) -x c++ $< -o $@
166
167
168
	
%.o: %.S
	@echo $(MSG_COMPILE_CMD) Assembling \"$^\"
169
	$(CROSS)gcc -c $(CC_FLAGS) -x assembler-with-cpp $< -o $@
170
171
172
173

.PRECIOUS : $(OBJECT_FILES)
%.elf: $(OBJECT_FILES)
	@echo $(MSG_LINKER_CMD) Linking object files into \"$@\"
174
	$(CROSS)gcc $^ $(CC_FLAGS) $(LD_FLAGS) -o $@
175
176
177

%.hex: %.elf
	@echo $(MSG_OBJCPY_CMD) Extracting HEX file data from \"$@\"
178
	$(CROSS)objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature $< $@
179
180
181

%.eep: %.elf
	@echo $(MSG_OBJCPY_CMD) Extracting EEP file data from \"$@\"
182
	$(CROSS)objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex $< $@ || exit 0
183
184
185

%.lss: %.elf
	@echo $(MSG_OBJDMP_CMD) Extracting LSS file data from \"$@\"
186
	$(CROSS)objdump -h -S -z $< > $@
187
188
189
190
191
192

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