/make/arduino-mk

To get this branch, use:
bzr branch http://bzr.ed.am/make/arduino-mk
1 by edam
initial commit
1
#_______________________________________________________________________________
2
#
32 by edam
typos/spelling
3
#                         edam's Arduino makefile
1 by edam
initial commit
4
#_______________________________________________________________________________
59 by edam
bump version no.
5
#                                                                 version 0.5dev
1 by edam
initial commit
6
#
54 by edam
bump version to 0.4
7
# Copyright (C) 2011, 2012 Tim Marston <tim@ed.am>.
1 by edam
initial commit
8
#
9
# Permission is hereby granted, free of charge, to any person obtaining a copy
10
# of this software and associated documentation files (the "Software"), to deal
11
# in the Software without restriction, including without limitation the rights
12
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
# copies of the Software, and to permit persons to whom the Software is
14
# furnished to do so, subject to the following conditions:
15
#
16
# The above copyright notice and this permission notice shall be included in
17
# all copies or substantial portions of the Software.
18
#
19
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
10 by edam
formatting, and changed default for ARDUINODIR
24
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
# SOFTWARE.
1 by edam
initial commit
26
#
27
#_______________________________________________________________________________
28
#
29
#
7 by edam
fixed comments for publishing
30
# This is a general purpose makefile for use with Arduino hardware and
30 by edam
added THANKS, fixed ARDUINODIR default to look in /usr/share/arduino and capitalised the use of "Arduino" where appropriate.
31
# software.  It works with the arduino-1.0 software release.  To download the
32
# latest version of this makefile, visit the following website, where you can
33
# also find more information and documentation on it's use.  The following text
34
# can only really be considered a reference to it's use.
7 by edam
fixed comments for publishing
35
#
11 by edam
fixed URL
36
#   http://ed.am/dev/make/arduino-mk
5 by edam
updated comments; added checks for missing or misconfigured variables; use a default TARGET; attempt to autodetect SERIALDEV; added 'boards' goal; fixed use of 'util' project subdirectory.
37
#
10 by edam
formatting, and changed default for ARDUINODIR
38
# This makefile can be used as a drop-in replacement for the Arduino IDE's
12 by edam
cleaned up comments
39
# build system.  To use it, save arduino.mk somewhere (I keep mine at
40
# ~/src/arduino.mk) and create a symlink to it in your project directory named
41
# "Makefile".  For example:
5 by edam
updated comments; added checks for missing or misconfigured variables; use a default TARGET; attempt to autodetect SERIALDEV; added 'boards' goal; fixed use of 'util' project subdirectory.
42
#
7 by edam
fixed comments for publishing
43
#   $ ln -s ~/src/arduino.mk Makefile
5 by edam
updated comments; added checks for missing or misconfigured variables; use a default TARGET; attempt to autodetect SERIALDEV; added 'boards' goal; fixed use of 'util' project subdirectory.
44
#
30 by edam
added THANKS, fixed ARDUINODIR default to look in /usr/share/arduino and capitalised the use of "Arduino" where appropriate.
45
# The Arduino software (version 1.0 or later) is required.  If you are using
46
# Debian (or a derivative), type `apt-get install arduino`.  Otherwise, you
32 by edam
typos/spelling
47
# will have to download the Arduino software manually from http://arduino.cc/.
30 by edam
added THANKS, fixed ARDUINODIR default to look in /usr/share/arduino and capitalised the use of "Arduino" where appropriate.
48
# It is suggested that you install it at ~/opt/arduino if you are unsure.
49
#
50
# If you downloaded the Arduino software manually and unpacked it somewhere
51
# other than ~/opt/arduino, you will need to set up ARDUINODIR to be the path
52
# where you unpacked it.  (If unset, ARDUINODIR defaults to ~/opt/arduino and
53
# then /usr/share/arduino, in that order.)  You might be best to set this in
12 by edam
cleaned up comments
54
# your ~/.profile by adding something like this:
55
#
56
#   export ARDUINODIR=~/somewhere/arduino-1.0
57
#
30 by edam
added THANKS, fixed ARDUINODIR default to look in /usr/share/arduino and capitalised the use of "Arduino" where appropriate.
58
# You will also need to set BOARD to the type of Arduino you're building for.
32 by edam
typos/spelling
59
# Type `make boards` for a list of acceptable values.  You could set a default
60
# in your ~/.profile if you want, but it is suggested that you specify this at
61
# build time, especially if you work with different types of Arduino.  For
62
# example:
12 by edam
cleaned up comments
63
#
64
#   $ export BOARD=uno
65
#   $ make
66
#
67
# You may also need to set SERIALDEV if it is not detected correctly.
68
#
18 by edam
downplay importance of .pde files
69
# The presence of a .ino (or .pde) file causes the arduino.mk to automatically
16 by edam
spellcheck, and added check for missing GNU screen
70
# determine values for SOURCES, TARGET and LIBRARIES.  Any .c, .cc and .cpp
71
# files in the project directory (or any "util" or "utility" subdirectories)
72
# are automatically included in the build and are scanned for Arduino libraries
63 by edam
documented AVRDUDEFLAGS, CPPFLAGS, LINKFLAGS and LINBRARYPATH, cleaned up a
73
# that have been #included.  Note, there can only be one .ino (or .pde) file.
5 by edam
updated comments; added checks for missing or misconfigured variables; use a default TARGET; attempt to autodetect SERIALDEV; added 'boards' goal; fixed use of 'util' project subdirectory.
74
#
10 by edam
formatting, and changed default for ARDUINODIR
75
# Alternatively, if you want to manually specify build variables, create a
16 by edam
spellcheck, and added check for missing GNU screen
76
# Makefile that defines SOURCES and LIBRARIES and then includes arduino.mk.
12 by edam
cleaned up comments
77
# (There is no need to define TARGET).  Here is an example Makefile:
5 by edam
updated comments; added checks for missing or misconfigured variables; use a default TARGET; attempt to autodetect SERIALDEV; added 'boards' goal; fixed use of 'util' project subdirectory.
78
#
12 by edam
cleaned up comments
79
#   SOURCES := main.cc other.cc
7 by edam
fixed comments for publishing
80
#   LIBRARIES := EEPROM
81
#   include ~/src/arduino.mk
1 by edam
initial commit
82
#
8 by edam
broke out ARDUINODIR, so it is not configured in the makefile
83
# Here is a complete list of configuration parameters:
84
#
30 by edam
added THANKS, fixed ARDUINODIR default to look in /usr/share/arduino and capitalised the use of "Arduino" where appropriate.
85
# ARDUINODIR   The path where the Arduino software is installed on your system.
4 by edam
added included-library autodetection and updated comments
86
#
30 by edam
added THANKS, fixed ARDUINODIR default to look in /usr/share/arduino and capitalised the use of "Arduino" where appropriate.
87
# ARDUINOCONST The Arduino software version, as an integer, used to define the
63 by edam
documented AVRDUDEFLAGS, CPPFLAGS, LINKFLAGS and LINBRARYPATH, cleaned up a
88
#              ARDUINO version constant.  This defaults to 100 if undefined.
25 by edam
added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error
89
#
63 by edam
documented AVRDUDEFLAGS, CPPFLAGS, LINKFLAGS and LINBRARYPATH, cleaned up a
90
# AVRDUDECONF  The avrdude.conf to use.  If undefined, this defaults to a guess
91
#              based on where the avrdude in use is.  If empty, no avrdude.conf
25 by edam
added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error
92
#              is passed to avrdude (to the system default is used).
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
93
#
63 by edam
documented AVRDUDEFLAGS, CPPFLAGS, LINKFLAGS and LINBRARYPATH, cleaned up a
94
# AVRDUDEFLAGS Specify any additional flags for avrdude.  The usual flags,
95
#              required to build the project, will be appended to this.
96
#
97
# AVRTOOLSPATH A space-separated list of directories that is searched in order
98
#              when looking for the avr build tools.  This defaults to PATH,
99
#              followed by subdirectories in ARDUINODIR.
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
100
#
12 by edam
cleaned up comments
101
# BOARD        Specify a target board type.  Run `make boards` to see available
102
#              board types.
4 by edam
added included-library autodetection and updated comments
103
#
63 by edam
documented AVRDUDEFLAGS, CPPFLAGS, LINKFLAGS and LINBRARYPATH, cleaned up a
104
# CPPFLAGS     Specify any additional flags for the compiler.  The usual flags,
105
#              required to build the project, will be appended to this.
106
#
107
# LINKFLAGS    Specify any additional flags for the linker.  The usual flags,
108
#              required to build the project, will be appended to this.
109
#
30 by edam
added THANKS, fixed ARDUINODIR default to look in /usr/share/arduino and capitalised the use of "Arduino" where appropriate.
110
# LIBRARIES    A list of Arduino libraries to build and include.  This is set
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
111
#              automatically if a .ino (or .pde) is found.
112
#
63 by edam
documented AVRDUDEFLAGS, CPPFLAGS, LINKFLAGS and LINBRARYPATH, cleaned up a
113
# LIBRARYPATH  A space-separated list of directories that is searched in order
114
#              when looking for Arduino libraries.  This defaults to "libs",
115
#              "libraries" and then the Arduino software's libraries directory.
116
#
30 by edam
added THANKS, fixed ARDUINODIR default to look in /usr/share/arduino and capitalised the use of "Arduino" where appropriate.
117
# SERIALDEV    The unix device name of the serial device that is the Arduino.
10 by edam
formatting, and changed default for ARDUINODIR
118
#              If unspecified, an attempt is made to determine the name of a
30 by edam
added THANKS, fixed ARDUINODIR default to look in /usr/share/arduino and capitalised the use of "Arduino" where appropriate.
119
#              connected Arduino's serial device.
10 by edam
formatting, and changed default for ARDUINODIR
120
#
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
121
# SOURCES      A list of all source files of whatever language.  The language
122
#              type is determined by the file extension.  This is set
123
#              automatically if a .ino (or .pde) is found.
124
#
10 by edam
formatting, and changed default for ARDUINODIR
125
# TARGET       The name of the target file.  This is set automatically if a
18 by edam
downplay importance of .pde files
126
#              .ino (or .pde) is found, but it is not necessary to set it
10 by edam
formatting, and changed default for ARDUINODIR
127
#              otherwise.
128
#
12 by edam
cleaned up comments
129
# This makefile also defines the following goals for use on the command line
130
# when you run make:
5 by edam
updated comments; added checks for missing or misconfigured variables; use a default TARGET; attempt to autodetect SERIALDEV; added 'boards' goal; fixed use of 'util' project subdirectory.
131
#
12 by edam
cleaned up comments
132
# all          This is the default if no goal is specified.  It builds the
35 by edam
build arduino static lib in .lib using full pathnames in object files (so files of the same name but in different locations can co-exist)
133
#              target.
1 by edam
initial commit
134
#
12 by edam
cleaned up comments
135
# target       Builds the target.
136
#
30 by edam
added THANKS, fixed ARDUINODIR default to look in /usr/share/arduino and capitalised the use of "Arduino" where appropriate.
137
# upload       Uploads the last built target to an attached Arduino.
12 by edam
cleaned up comments
138
#
139
# clean        Deletes files created during the build.
1 by edam
initial commit
140
#
10 by edam
formatting, and changed default for ARDUINODIR
141
# boards       Display a list of available board names, so that you can set the
142
#              BOARD environment variable appropriately.
143
#
16 by edam
spellcheck, and added check for missing GNU screen
144
# monitor      Start `screen` on the serial device.  This is meant to be an
30 by edam
added THANKS, fixed ARDUINODIR default to look in /usr/share/arduino and capitalised the use of "Arduino" where appropriate.
145
#              equivalent to the Arduino serial monitor.
10 by edam
formatting, and changed default for ARDUINODIR
146
#
72 by edam
typo
147
# size         Displays size information about the built target.
34 by Tim Marston
added 'size' goal
148
#
69 by edam
added support for burning bootloaders
149
# bootloader   Burns the bootloader for your board to it.
150
#
10 by edam
formatting, and changed default for ARDUINODIR
151
# <file>       Builds the specified file, either an object file or the target,
152
#              from those that that would be built for the project.
1 by edam
initial commit
153
#_______________________________________________________________________________
5 by edam
updated comments; added checks for missing or misconfigured variables; use a default TARGET; attempt to autodetect SERIALDEV; added 'boards' goal; fixed use of 'util' project subdirectory.
154
#
1 by edam
initial commit
155
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
156
# default arduino software directory, check software exists
8 by edam
broke out ARDUINODIR, so it is not configured in the makefile
157
ifndef ARDUINODIR
73 by Tim Marston
fixed default ARDUINODIR and PREFERENCESFILE locations for Macs
158
ARDUINODIR := $(firstword $(wildcard ~/opt/arduino /usr/share/arduino \
159
	/Applications/Arduino.app/Contents/Resources/Java \
160
	$(HOME)/Applications/Arduino.app/Contents/Resources/Java))
8 by edam
broke out ARDUINODIR, so it is not configured in the makefile
161
endif
25 by edam
added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error
162
ifeq "$(wildcard $(ARDUINODIR)/hardware/arduino/boards.txt)" ""
8 by edam
broke out ARDUINODIR, so it is not configured in the makefile
163
$(error ARDUINODIR is not set correctly; arduino software not found)
5 by edam
updated comments; added checks for missing or misconfigured variables; use a default TARGET; attempt to autodetect SERIALDEV; added 'boards' goal; fixed use of 'util' project subdirectory.
164
endif
1 by edam
initial commit
165
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
166
# default arduino version
167
ARDUINOCONST ?= 100
168
169
# default path for avr tools
67 by edam
added support for the user's sketchbook libraries directory
170
AVRTOOLSPATH ?= $(subst :, , $(PATH)) $(ARDUINODIR)/hardware/tools \
171
	$(ARDUINODIR)/hardware/tools/avr/bin
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
172
62 by edam
added support for third party libraries and fixed support for .C c++ files
173
# default path to find libraries
67 by edam
added support for the user's sketchbook libraries directory
174
LIBRARYPATH ?= libraries libs $(SKETCHBOOKDIR)/libraries $(ARDUINODIR)/libraries
62 by edam
added support for third party libraries and fixed support for .C c++ files
175
69 by edam
added support for burning bootloaders
176
# default serial device to a poor guess (something that might be an arduino)
177
SERIALDEVGUESS := 0
178
ifndef SERIALDEV
179
SERIALDEV := $(firstword $(wildcard \
180
	/dev/ttyACM? /dev/ttyUSB? /dev/tty.usbserial* /dev/tty.usbmodem*))
181
SERIALDEVGUESS := 1
182
endif
183
184
# no board?
185
ifndef BOARD
186
ifneq "$(MAKECMDGOALS)" "boards"
187
ifneq "$(MAKECMDGOALS)" "clean"
188
$(error BOARD is unset.  Type 'make boards' to see possible values)
189
endif
190
endif
191
endif
192
193
# obtain board parameters from the arduino boards.txt file
194
BOARDSFILE := $(ARDUINODIR)/hardware/arduino/boards.txt
195
readboardsparam = $(shell sed -ne "s/$(BOARD).$(1)=\(.*\)/\1/p" $(BOARDSFILE))
196
BOARD_BUILD_MCU := $(call readboardsparam,build.mcu)
197
BOARD_BUILD_FCPU := $(call readboardsparam,build.f_cpu)
198
BOARD_BUILD_VARIANT := $(call readboardsparam,build.variant)
199
BOARD_UPLOAD_SPEED := $(call readboardsparam,upload.speed)
200
BOARD_UPLOAD_PROTOCOL := $(call readboardsparam,upload.protocol)
201
BOARD_USB_VID := $(call readboardsparam,build.vid)
202
BOARD_USB_PID := $(call readboardsparam,build.pid)
203
BOARD_BOOTLOADER_UNLOCK := $(call readboardsparam,bootloader.unlock_bits)
204
BOARD_BOOTLOADER_LOCK := $(call readboardsparam,bootloader.lock_bits)
205
BOARD_BOOTLOADER_LFUSES := $(call readboardsparam,bootloader.low_fuses)
206
BOARD_BOOTLOADER_HFUSES := $(call readboardsparam,bootloader.high_fuses)
207
BOARD_BOOTLOADER_EFUSES := $(call readboardsparam,bootloader.extended_fuses)
208
BOARD_BOOTLOADER_PATH := $(call readboardsparam,bootloader.path)
209
BOARD_BOOTLOADER_FILE := $(call readboardsparam,bootloader.file)
210
211
# obtain preferences from the IDE's preferences.txt
73 by Tim Marston
fixed default ARDUINODIR and PREFERENCESFILE locations for Macs
212
PREFERENCESFILE := $(firstword $(wildcard \
213
	$(HOME)/.arduino/preferences.txt $(HOME)/Library/Arduino/preferences.txt))
69 by edam
added support for burning bootloaders
214
ifneq "$(PREFERENCESFILE)" ""
215
readpreferencesparam = $(shell sed -ne "s/$(1)=\(.*\)/\1/p" $(PREFERENCESFILE))
216
SKETCHBOOKDIR := $(call readpreferencesparam,sketchbook.path)
217
endif
218
219
# invalid board?
220
ifeq "$(BOARD_BUILD_MCU)" ""
221
ifneq "$(MAKECMDGOALS)" "boards"
222
ifneq "$(MAKECMDGOALS)" "clean"
223
$(error BOARD is invalid.  Type 'make boards' to see possible values)
224
endif
225
endif
226
endif
227
1 by edam
initial commit
228
# auto mode?
229
INOFILE := $(wildcard *.ino *.pde)
230
ifdef INOFILE
25 by edam
added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error
231
ifneq "$(words $(INOFILE))" "1"
5 by edam
updated comments; added checks for missing or misconfigured variables; use a default TARGET; attempt to autodetect SERIALDEV; added 'boards' goal; fixed use of 'util' project subdirectory.
232
$(error There is more than one .pde or .ino file in this directory!)
1 by edam
initial commit
233
endif
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
234
235
# automatically determine sources and targeet
1 by edam
initial commit
236
TARGET := $(basename $(INOFILE))
237
SOURCES := $(INOFILE) \
62 by edam
added support for third party libraries and fixed support for .C c++ files
238
	$(wildcard *.c *.cc *.cpp *.C) \
239
	$(wildcard $(addprefix util/, *.c *.cc *.cpp *.C)) \
240
	$(wildcard $(addprefix utility/, *.c *.cc *.cpp *.C))
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
241
4 by edam
added included-library autodetection and updated comments
242
# automatically determine included libraries
63 by edam
documented AVRDUDEFLAGS, CPPFLAGS, LINKFLAGS and LINBRARYPATH, cleaned up a
243
LIBRARIES := $(filter $(notdir $(wildcard $(addsuffix /*, $(LIBRARYPATH)))), \
4 by edam
added included-library autodetection and updated comments
244
	$(shell sed -ne "s/^ *\# *include *[<\"]\(.*\)\.h[>\"]/\1/p" $(SOURCES)))
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
245
5 by edam
updated comments; added checks for missing or misconfigured variables; use a default TARGET; attempt to autodetect SERIALDEV; added 'boards' goal; fixed use of 'util' project subdirectory.
246
endif
247
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
248
# software
249
findsoftware = $(firstword $(wildcard $(addsuffix /$(1), $(AVRTOOLSPATH))))
250
CC := $(call findsoftware,avr-gcc)
251
CXX := $(call findsoftware,avr-g++)
252
LD := $(call findsoftware,avr-ld)
253
AR := $(call findsoftware,avr-ar)
254
OBJCOPY := $(call findsoftware,avr-objcopy)
255
AVRDUDE := $(call findsoftware,avrdude)
34 by Tim Marston
added 'size' goal
256
AVRSIZE := $(call findsoftware,avr-size)
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
257
63 by edam
documented AVRDUDEFLAGS, CPPFLAGS, LINKFLAGS and LINBRARYPATH, cleaned up a
258
# directories
259
ARDUINOCOREDIR := $(ARDUINODIR)/hardware/arduino/cores/arduino
260
LIBRARYDIRS := $(foreach lib, $(LIBRARIES), \
261
	$(firstword $(wildcard $(addsuffix /$(lib), $(LIBRARYPATH)))))
262
LIBRARYDIRS += $(addsuffix /utility, $(LIBRARYDIRS))
263
1 by edam
initial commit
264
# files
25 by edam
added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error
265
TARGET := $(if $(TARGET),$(TARGET),a.out)
1 by edam
initial commit
266
OBJECTS := $(addsuffix .o, $(basename $(SOURCES)))
36 by edam
added dependency generation to project files
267
DEPFILES := $(patsubst %, .dep/%.dep, $(SOURCES))
35 by edam
build arduino static lib in .lib using full pathnames in object files (so files of the same name but in different locations can co-exist)
268
ARDUINOLIB := .lib/arduino.a
63 by edam
documented AVRDUDEFLAGS, CPPFLAGS, LINKFLAGS and LINBRARYPATH, cleaned up a
269
ARDUINOLIBOBJS := $(foreach dir, $(ARDUINOCOREDIR) $(LIBRARYDIRS), \
35 by edam
build arduino static lib in .lib using full pathnames in object files (so files of the same name but in different locations can co-exist)
270
	$(patsubst %, .lib/%.o, $(wildcard $(addprefix $(dir)/, *.c *.cpp))))
70 by edam
bootloader may not be specified in boards.txt
271
BOOTLOADERHEX := $(addprefix \
272
	$(ARDUINODIR)/hardware/arduino/bootloaders/$(BOARD_BOOTLOADER_PATH)/, \
273
	$(BOARD_BOOTLOADER_FILE))
62 by edam
added support for third party libraries and fixed support for .C c++ files
274
275
# avrdude confifuration
25 by edam
added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error
276
ifeq "$(AVRDUDECONF)" ""
277
ifeq "$(AVRDUDE)" "$(ARDUINODIR)/hardware/tools/avr/bin/avrdude"
278
AVRDUDECONF := $(ARDUINODIR)/hardware/tools/avr/etc/avrdude.conf
279
else
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
280
AVRDUDECONF := $(wildcard $(AVRDUDE).conf)
25 by edam
added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error
281
endif
282
endif
283
1 by edam
initial commit
284
# flags
61 by Tim Marston
make it possible to add to CPPFLAGS, AVRDUDEFLAGS and LINKFLAGS
285
CPPFLAGS += -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections
36 by edam
added dependency generation to project files
286
CPPFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
287
CPPFLAGS += -mmcu=$(BOARD_BUILD_MCU)
288
CPPFLAGS += -DF_CPU=$(BOARD_BUILD_FCPU) -DARDUINO=$(ARDUINOCONST)
49 by edam
added support for the Leonardo
289
CPPFLAGS += -DUSB_VID=$(BOARD_USB_VID) -DUSB_PID=$(BOARD_USB_PID)
45 by edam
fixed CPPFLAGS -I parameters so that path expansion of '~' in ARDUINODIR works
290
CPPFLAGS += -I. -Iutil -Iutility -I $(ARDUINOCOREDIR)
291
CPPFLAGS += -I $(ARDUINODIR)/hardware/arduino/variants/$(BOARD_BUILD_VARIANT)/
63 by edam
documented AVRDUDEFLAGS, CPPFLAGS, LINKFLAGS and LINBRARYPATH, cleaned up a
292
CPPFLAGS += $(addprefix -I , $(LIBRARYDIRS))
36 by edam
added dependency generation to project files
293
CPPDEPFLAGS = -MMD -MP -MF .dep/$<.dep
294
CPPINOFLAGS := -x c++ -include $(ARDUINOCOREDIR)/Arduino.h
61 by Tim Marston
make it possible to add to CPPFLAGS, AVRDUDEFLAGS and LINKFLAGS
295
AVRDUDEFLAGS += $(addprefix -C , $(AVRDUDECONF)) -DV
1 by edam
initial commit
296
AVRDUDEFLAGS += -p $(BOARD_BUILD_MCU) -P $(SERIALDEV)
297
AVRDUDEFLAGS += -c $(BOARD_UPLOAD_PROTOCOL) -b $(BOARD_UPLOAD_SPEED)
61 by Tim Marston
make it possible to add to CPPFLAGS, AVRDUDEFLAGS and LINKFLAGS
298
LINKFLAGS += -Os -Wl,--gc-sections -mmcu=$(BOARD_BUILD_MCU)
1 by edam
initial commit
299
43 by edam
fixed check for stty switch, so that it works with busybox
300
# figure out which arg to use with stty (for OS X, GNU and busybox stty)
301
STTYFARG := $(shell stty --help 2>&1 | \
302
	grep -q 'illegal option' && echo -f || echo -F)
25 by edam
added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error
303
36 by edam
added dependency generation to project files
304
# include dependencies
305
ifneq "$(MAKECMDGOALS)" "clean"
306
-include $(DEPFILES)
307
endif
308
1 by edam
initial commit
309
# default rule
310
.DEFAULT_GOAL := all
311
312
#_______________________________________________________________________________
313
#                                                                          RULES
314
69 by edam
added support for burning bootloaders
315
.PHONY:	all target upload clean boards monitor size bootloader
1 by edam
initial commit
316
35 by edam
build arduino static lib in .lib using full pathnames in object files (so files of the same name but in different locations can co-exist)
317
all: target
1 by edam
initial commit
318
2 by edam
fixed build (missing library), tested upload, and made the .elf file an intermediate file (the .hex file is now the target)
319
target: $(TARGET).hex
1 by edam
initial commit
320
40 by Tim Marston
upload now depends on target (added dev to version no.)
321
upload: target
13 by edam
announce that we're uploading and error on SERIALDEV blank
322
	@echo "\nUploading to board..."
323
	@test -n "$(SERIALDEV)" || { \
324
		echo "error: SERIALDEV could not be determined automatically." >&2; \
325
		exit 1; }
27 by edam
fixed test not returning 0
326
	@test 0 -eq $(SERIALDEVGUESS) || { \
25 by edam
added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error
327
		echo "*GUESSING* at serial device:" $(SERIALDEV); \
328
		echo; }
66 by edam
fixed resetting Leonardos before upload
329
ifeq "$(BOARD_BOOTLOADER_PATH)" "caterina"
330
	stty $(STTYFARG) $(SERIALDEV) speed 1200
331
	sleep 1
332
endif
25 by edam
added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error
333
	stty $(STTYFARG) $(SERIALDEV) hupcl
2 by edam
fixed build (missing library), tested upload, and made the .elf file an intermediate file (the .hex file is now the target)
334
	$(AVRDUDE) $(AVRDUDEFLAGS) -U flash:w:$(TARGET).hex:i
1 by edam
initial commit
335
336
clean:
337
	rm -f $(OBJECTS)
338
	rm -f $(TARGET).elf $(TARGET).hex $(ARDUINOLIB) *~
36 by edam
added dependency generation to project files
339
	rm -rf .lib .dep
1 by edam
initial commit
340
5 by edam
updated comments; added checks for missing or misconfigured variables; use a default TARGET; attempt to autodetect SERIALDEV; added 'boards' goal; fixed use of 'util' project subdirectory.
341
boards:
69 by edam
added support for burning bootloaders
342
	@echo "Available values for BOARD:"
343
	@sed -nEe '/^#/d; /^[^.]+\.name=/p' $(BOARDSFILE) | \
41 by edam
updated boards goal to work on OS X (explicitly use extended REs)
344
		sed -Ee 's/([^.]+)\.name=(.*)/\1            \2/' \
345
			-e 's/(.{12}) *(.*)/\1 \2/'
5 by edam
updated comments; added checks for missing or misconfigured variables; use a default TARGET; attempt to autodetect SERIALDEV; added 'boards' goal; fixed use of 'util' project subdirectory.
346
9 by edam
added "monitor" goal; documented boards and monitor goals
347
monitor:
13 by edam
announce that we're uploading and error on SERIALDEV blank
348
	@test -n "$(SERIALDEV)" || { \
349
		echo "error: SERIALDEV could not be determined automatically." >&2; \
350
		exit 1; }
16 by edam
spellcheck, and added check for missing GNU screen
351
	@test -n `which screen` || { \
352
		echo "error: can't find GNU screen, you might need to install it." >&2 \
63 by edam
documented AVRDUDEFLAGS, CPPFLAGS, LINKFLAGS and LINBRARYPATH, cleaned up a
353
		exit 1; }
27 by edam
fixed test not returning 0
354
	@test 0 -eq $(SERIALDEVGUESS) || { \
25 by edam
added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error
355
		echo "*GUESSING* at serial device:" $(SERIALDEV); \
356
		echo; }
9 by edam
added "monitor" goal; documented boards and monitor goals
357
	screen $(SERIALDEV)
358
34 by Tim Marston
added 'size' goal
359
size: $(TARGET).elf
360
	echo && $(AVRSIZE) --format=avr --mcu=$(BOARD_BUILD_MCU) $(TARGET).elf
361
69 by edam
added support for burning bootloaders
362
bootloader:
363
	@echo "Burning bootloader to board..."
364
	@test -n "$(SERIALDEV)" || { \
365
		echo "error: SERIALDEV could not be determined automatically." >&2; \
366
		exit 1; }
367
	@test 0 -eq $(SERIALDEVGUESS) || { \
368
		echo "*GUESSING* at serial device:" $(SERIALDEV); \
369
		echo; }
370
	stty $(STTYFARG) $(SERIALDEV) hupcl
371
	$(AVRDUDE) $(AVRDUDEFLAGS) -U lock:w:$(BOARD_BOOTLOADER_UNLOCK):m
70 by edam
bootloader may not be specified in boards.txt
372
	$(AVRDUDE) $(AVRDUDEFLAGS) -eU lfuse:w:$(BOARD_BOOTLOADER_LFUSES):m
373
	$(AVRDUDE) $(AVRDUDEFLAGS) -U hfuse:w:$(BOARD_BOOTLOADER_HFUSES):m
374
ifneq "$(BOARD_BOOTLOADER_EFUSES)" ""
375
	$(AVRDUDE) $(AVRDUDEFLAGS) -U efuse:w:$(BOARD_BOOTLOADER_EFUSES):m
376
endif
377
ifneq "$(BOOTLOADERHEX)" ""
69 by edam
added support for burning bootloaders
378
	$(AVRDUDE) $(AVRDUDEFLAGS) -U flash:w:$(BOOTLOADERHEX):i
70 by edam
bootloader may not be specified in boards.txt
379
endif
69 by edam
added support for burning bootloaders
380
	$(AVRDUDE) $(AVRDUDEFLAGS) -U lock:w:$(BOARD_BOOTLOADER_LOCK):m
381
1 by edam
initial commit
382
# building the target
383
2 by edam
fixed build (missing library), tested upload, and made the .elf file an intermediate file (the .hex file is now the target)
384
$(TARGET).hex: $(TARGET).elf
385
	$(OBJCOPY) -O ihex -R .eeprom $< $@
386
387
.INTERMEDIATE: $(TARGET).elf
388
1 by edam
initial commit
389
$(TARGET).elf: $(ARDUINOLIB) $(OBJECTS)
48 by edam
use a more sensible command-line oprdering when linking
390
	$(CC) $(LINKFLAGS) $(OBJECTS) $(ARDUINOLIB) -lm -o $@
1 by edam
initial commit
391
36 by edam
added dependency generation to project files
392
%.o: %.c
393
	mkdir -p .dep/$(dir $<)
394
	$(COMPILE.c) $(CPPDEPFLAGS) -o $@ $<
395
396
%.o: %.cpp
397
	mkdir -p .dep/$(dir $<)
398
	$(COMPILE.cpp) $(CPPDEPFLAGS) -o $@ $<
399
400
%.o: %.cc
401
	mkdir -p .dep/$(dir $<)
402
	$(COMPILE.cpp) $(CPPDEPFLAGS) -o $@ $<
403
404
%.o: %.C
405
	mkdir -p .dep/$(dir $<)
406
	$(COMPILE.cpp) $(CPPDEPFLAGS) -o $@ $<
35 by edam
build arduino static lib in .lib using full pathnames in object files (so files of the same name but in different locations can co-exist)
407
1 by edam
initial commit
408
%.o: %.ino
36 by edam
added dependency generation to project files
409
	mkdir -p .dep/$(dir $<)
410
	$(COMPILE.cpp) $(CPPDEPFLAGS) -o $@ $(CPPINOFLAGS) $<
1 by edam
initial commit
411
412
%.o: %.pde
36 by edam
added dependency generation to project files
413
	mkdir -p .dep/$(dir $<)
62 by edam
added support for third party libraries and fixed support for .C c++ files
414
	$(COMPILE.cpp) $(CPPDEPFLAGS) -o $@ $(CPPINOFLAGS) $<
1 by edam
initial commit
415
416
# building the arduino library
417
4 by edam
added included-library autodetection and updated comments
418
$(ARDUINOLIB): $(ARDUINOLIBOBJS)
1 by edam
initial commit
419
	$(AR) rcs $@ $?
35 by edam
build arduino static lib in .lib using full pathnames in object files (so files of the same name but in different locations can co-exist)
420
421
.lib/%.c.o: %.c
422
	mkdir -p $(dir $@)
423
	$(COMPILE.c) -o $@ $<
424
425
.lib/%.cpp.o: %.cpp
426
	mkdir -p $(dir $@)
427
	$(COMPILE.cpp) -o $@ $<
428
429
.lib/%.cc.o: %.cc
430
	mkdir -p $(dir $@)
431
	$(COMPILE.cpp) -o $@ $<
432
433
.lib/%.C.o: %.C
434
	mkdir -p $(dir $@)
14 by Dan
search for software in ARDUINODIR; include library/*/utility code in core lib
435
	$(COMPILE.cpp) -o $@ $<