/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
#_______________________________________________________________________________
82 by Tim Marston
updated version no. to dev state
5
#                                                                 version 0.6dev
1 by edam
initial commit
6
#
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
7
# Copyright (C) 2011 to 2013 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,
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
21
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
1 by edam
initial commit
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
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
31
# software.  It is intended to be a drop-in replacement for the Arduino IDE's
32
# build system.  It works with the Arduino 1.0 and 1.5 software releases, on
33
# GNU/Linux and OS X.  To download the latest version of this makefile visit
34
# the following website where you can also find documentation on it's use.
35
# (The following text can only really be considered a reference.)
7 by edam
fixed comments for publishing
36
#
11 by edam
fixed URL
37
#   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.
38
#
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
39
# To use this makefile, copy arduino.mk in to your project directory.  Or, you
40
# could save it somewhere (I keep mine at ~/src/arduino.mk) and create a
41
# symlink to it in your project directory, named "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
#
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
45
# The Arduino software is required, version 1.0 or later, including version 1.5
46
# (which is in BETA at time of release of this makefile).  On GNU/Linux you can
47
# probably install the software from your package manager.  If you are using
48
# Debian (or a derivative), try `apt-get install arduino`.  Otherwise, you can
49
# download the latest Arduino software manually from http://arduino.cc/.  In
50
# case you're unsure, install it at ~/opt/arduino (or /Applications on OS X).
30 by edam
added THANKS, fixed ARDUINODIR default to look in /usr/share/arduino and capitalised the use of "Arduino" where appropriate.
51
#
52
# If you downloaded the Arduino software manually and unpacked it somewhere
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
53
# *other* than ~/opt/arduino (or /Applications), you will need to set up the
54
# ARDUINODIR environment variable to be the directory where you unpacked it.
55
# (If unset, ARDUINODIR defaults to some sensible places).  You could set this
56
# in your ~/.profile by adding something like this:
12 by edam
cleaned up comments
57
#
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
58
#   export ARDUINODIR=~/somewhere/arduino-1.0.5
12 by edam
cleaned up comments
59
#
75 by Tim Marston
updated reference documentation
60
# For each project, you will also need to set BOARD to the type of Arduino
61
# you're building for.  Type `make boards` for a list of acceptable values.
62
# For example:
12 by edam
cleaned up comments
63
#
64
#   $ export BOARD=uno
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
65
#
66
# Note that if you're using the newer 1.5 Arduino software and the board you
67
# want to use is availble with different processors, you will also need to
68
# specify one.  For example:
69
#
70
#   $ export BOARD=mini.atmega328
71
#
72
# You may also need to set SERIALDEV if your Arduino is not detected correctly.
12 by edam
cleaned up comments
73
#
18 by edam
downplay importance of .pde files
74
# The presence of a .ino (or .pde) file causes the arduino.mk to automatically
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
75
# determine values for SOURCES, TARGET and which libraries to pull-in to the
76
# build (although you can still override thius by setting LIBRARIES).  Any .c,
77
# .cc and .cpp files in the project directory (or any "util" or "utility"
78
# subdirectories) are automatically included in the build and are scanned for
79
# Arduino libraries that have been #included.  Note, there can only be one .ino
80
# (or .pde) file in a project directory and if you want to be compatible with
81
# the Arduino IDE, it should be called the same as the directory name.
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.
82
#
10 by edam
formatting, and changed default for ARDUINODIR
83
# Alternatively, if you want to manually specify build variables, create a
16 by edam
spellcheck, and added check for missing GNU screen
84
# Makefile that defines SOURCES and LIBRARIES and then includes arduino.mk.
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
85
# (You don't need to define TARGET).  You can also specify the BOARD here, if
75 by Tim Marston
updated reference documentation
86
# the project has a specific one.  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.
87
#
12 by edam
cleaned up comments
88
#   SOURCES := main.cc other.cc
7 by edam
fixed comments for publishing
89
#   LIBRARIES := EEPROM
75 by Tim Marston
updated reference documentation
90
#   BOARD := pro5v
7 by edam
fixed comments for publishing
91
#   include ~/src/arduino.mk
1 by edam
initial commit
92
#
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
93
# Here is a complete list of environment variables that affect the build:
8 by edam
broke out ARDUINODIR, so it is not configured in the makefile
94
#
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
95
# ARDUINODIR   The directory where the Arduino software resides on your system.
4 by edam
added included-library autodetection and updated comments
96
#
30 by edam
added THANKS, fixed ARDUINODIR default to look in /usr/share/arduino and capitalised the use of "Arduino" where appropriate.
97
# ARDUINOCONST The Arduino software version, as an integer, used to define the
63 by edam
documented AVRDUDEFLAGS, CPPFLAGS, LINKFLAGS and LINBRARYPATH, cleaned up a
98
#              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
99
#
63 by edam
documented AVRDUDEFLAGS, CPPFLAGS, LINKFLAGS and LINBRARYPATH, cleaned up a
100
# AVRDUDECONF  The avrdude.conf to use.  If undefined, this defaults to a guess
75 by Tim Marston
updated reference documentation
101
#              based on where avrdude is.  If set empty, no avrdude.conf is
102
#              passed to avrdude (so the system default is used).
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
103
#
63 by edam
documented AVRDUDEFLAGS, CPPFLAGS, LINKFLAGS and LINBRARYPATH, cleaned up a
104
# AVRDUDEFLAGS Specify any additional flags for avrdude.  The usual flags,
105
#              required to build the project, will be appended to this.
106
#
107
# AVRTOOLSPATH A space-separated list of directories that is searched in order
108
#              when looking for the avr build tools.  This defaults to PATH,
109
#              followed by subdirectories in ARDUINODIR.
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
110
#
12 by edam
cleaned up comments
111
# BOARD        Specify a target board type.  Run `make boards` to see available
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
112
#              board types.  For Arduino 1.5, you will also need to specify a
113
#              processor if the board supports multiple processors (see above).
4 by edam
added included-library autodetection and updated comments
114
#
63 by edam
documented AVRDUDEFLAGS, CPPFLAGS, LINKFLAGS and LINBRARYPATH, cleaned up a
115
# CPPFLAGS     Specify any additional flags for the compiler.  The usual flags,
116
#              required to build the project, will be appended to this.
117
#
118
# LINKFLAGS    Specify any additional flags for the linker.  The usual flags,
119
#              required to build the project, will be appended to this.
120
#
30 by edam
added THANKS, fixed ARDUINODIR default to look in /usr/share/arduino and capitalised the use of "Arduino" where appropriate.
121
# 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
122
#              automatically if a .ino (or .pde) is found.
123
#
63 by edam
documented AVRDUDEFLAGS, CPPFLAGS, LINKFLAGS and LINBRARYPATH, cleaned up a
124
# LIBRARYPATH  A space-separated list of directories that is searched in order
125
#              when looking for Arduino libraries.  This defaults to "libs",
75 by Tim Marston
updated reference documentation
126
#              "libraries" (in the project directory), then your sketchbook
127
#              "libraries" directory, then the Arduino libraries directory.
63 by edam
documented AVRDUDEFLAGS, CPPFLAGS, LINKFLAGS and LINBRARYPATH, cleaned up a
128
#
75 by Tim Marston
updated reference documentation
129
# SERIALDEV    The POSIX device name of the serial device that is the Arduino.
130
#              If unspecified, an attempt is made to guess the name of a
131
#              connected Arduino's serial device, which may work in some cases.
10 by edam
formatting, and changed default for ARDUINODIR
132
#
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
133
# SOURCES      A list of all source files of whatever language.  The language
134
#              type is determined by the file extension.  This is set
135
#              automatically if a .ino (or .pde) is found.
136
#
10 by edam
formatting, and changed default for ARDUINODIR
137
# TARGET       The name of the target file.  This is set automatically if a
18 by edam
downplay importance of .pde files
138
#              .ino (or .pde) is found, but it is not necessary to set it
10 by edam
formatting, and changed default for ARDUINODIR
139
#              otherwise.
140
#
12 by edam
cleaned up comments
141
# This makefile also defines the following goals for use on the command line
142
# 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.
143
#
12 by edam
cleaned up comments
144
# 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)
145
#              target.
1 by edam
initial commit
146
#
12 by edam
cleaned up comments
147
# target       Builds the target.
148
#
75 by Tim Marston
updated reference documentation
149
# upload       Uploads the target (building it, as necessary) to an attached
150
#              Arduino.
12 by edam
cleaned up comments
151
#
152
# clean        Deletes files created during the build.
1 by edam
initial commit
153
#
10 by edam
formatting, and changed default for ARDUINODIR
154
# boards       Display a list of available board names, so that you can set the
155
#              BOARD environment variable appropriately.
156
#
16 by edam
spellcheck, and added check for missing GNU screen
157
# 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.
158
#              equivalent to the Arduino serial monitor.
10 by edam
formatting, and changed default for ARDUINODIR
159
#
72 by edam
typo
160
# size         Displays size information about the built target.
34 by Tim Marston
added 'size' goal
161
#
69 by edam
added support for burning bootloaders
162
# bootloader   Burns the bootloader for your board to it.
163
#
10 by edam
formatting, and changed default for ARDUINODIR
164
# <file>       Builds the specified file, either an object file or the target,
165
#              from those that that would be built for the project.
1 by edam
initial commit
166
#_______________________________________________________________________________
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.
167
#
1 by edam
initial commit
168
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
169
# default arduino software directory
8 by edam
broke out ARDUINODIR, so it is not configured in the makefile
170
ifndef ARDUINODIR
73 by Tim Marston
fixed default ARDUINODIR and PREFERENCESFILE locations for Macs
171
ARDUINODIR := $(firstword $(wildcard ~/opt/arduino /usr/share/arduino \
172
	/Applications/Arduino.app/Contents/Resources/Java \
173
	$(HOME)/Applications/Arduino.app/Contents/Resources/Java))
8 by edam
broke out ARDUINODIR, so it is not configured in the makefile
174
endif
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
175
176
# check arduino software exists and determine available backends
177
ifneq "" "$(wildcard $(ARDUINODIR)/hardware/arduino/boards.txt)"
178
ARDUINOBACKENDS := /
179
else ifneq "" "$(wildcard $(ARDUINODIR)/hardware/arduino/avr/boards.txt)"
180
ARDUINOBACKENDS := /avr /sam
181
else
8 by edam
broke out ARDUINODIR, so it is not configured in the makefile
182
$(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.
183
endif
1 by edam
initial commit
184
69 by edam
added support for burning bootloaders
185
# no board?
186
ifndef BOARD
187
ifneq "$(MAKECMDGOALS)" "boards"
188
ifneq "$(MAKECMDGOALS)" "clean"
189
$(error BOARD is unset.  Type 'make boards' to see possible values)
190
endif
191
endif
192
endif
193
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
194
# obtain board parameters from the arduino boards.txt file(s)
195
BOARDSFILES := $(foreach dir, $(ARDUINOBACKENDS), \
196
	$(ARDUINODIR)/hardware/arduino$(dir)/boards.txt)
197
readboardsparam = $(firstword \
198
	$(shell sed -ne "s/^menu\\.cpu\\.$(BOARD)\\.$(1)=\(.*\)/\1/Ip" \
199
		$(BOARDSFILES)) \
200
	$(shell sed -ne "s/^$(basename $(BOARD))\\.$(1)=\(.*\)/\1/Ip" \
201
		$(BOARDSFILES)))
69 by edam
added support for burning bootloaders
202
BOARD_BUILD_MCU := $(call readboardsparam,build.mcu)
203
BOARD_BUILD_FCPU := $(call readboardsparam,build.f_cpu)
204
BOARD_BUILD_VARIANT := $(call readboardsparam,build.variant)
83 by Tim Marston
read and use the build.core parameter in boards.txt
205
BOARD_BUILD_CORE := $(call readboardsparam,build.core)
69 by edam
added support for burning bootloaders
206
BOARD_UPLOAD_SPEED := $(call readboardsparam,upload.speed)
207
BOARD_UPLOAD_PROTOCOL := $(call readboardsparam,upload.protocol)
208
BOARD_USB_VID := $(call readboardsparam,build.vid)
209
BOARD_USB_PID := $(call readboardsparam,build.pid)
210
BOARD_BOOTLOADER_UNLOCK := $(call readboardsparam,bootloader.unlock_bits)
211
BOARD_BOOTLOADER_LOCK := $(call readboardsparam,bootloader.lock_bits)
212
BOARD_BOOTLOADER_LFUSES := $(call readboardsparam,bootloader.low_fuses)
213
BOARD_BOOTLOADER_HFUSES := $(call readboardsparam,bootloader.high_fuses)
214
BOARD_BOOTLOADER_EFUSES := $(call readboardsparam,bootloader.extended_fuses)
215
BOARD_BOOTLOADER_PATH := $(call readboardsparam,bootloader.path)
216
BOARD_BOOTLOADER_FILE := $(call readboardsparam,bootloader.file)
217
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
218
# invalid board?
219
ifeq "$(BOARD_BUILD_MCU)" ""
220
ifneq "$(MAKECMDGOALS)" "boards"
221
ifneq "$(MAKECMDGOALS)" "clean"
222
$(error BOARD is invalid.  Type 'make boards' to see possible values)
223
endif
224
endif
225
endif
226
69 by edam
added support for burning bootloaders
227
# obtain preferences from the IDE's preferences.txt
73 by Tim Marston
fixed default ARDUINODIR and PREFERENCESFILE locations for Macs
228
PREFERENCESFILE := $(firstword $(wildcard \
229
	$(HOME)/.arduino/preferences.txt $(HOME)/Library/Arduino/preferences.txt))
69 by edam
added support for burning bootloaders
230
ifneq "$(PREFERENCESFILE)" ""
231
readpreferencesparam = $(shell sed -ne "s/$(1)=\(.*\)/\1/p" $(PREFERENCESFILE))
232
SKETCHBOOKDIR := $(call readpreferencesparam,sketchbook.path)
233
endif
234
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
235
# arduino directories
236
ARDUINOBACKENDDIR := $(strip $(foreach dir, $(ARDUINOBACKENDS), \
237
	$(if $(shell grep ^$(basename $(BOARD))\\.name \
238
		$(ARDUINODIR)/hardware/arduino$(dir)/boards.txt), \
239
	$(ARDUINODIR)/hardware/arduino$(dir))))
240
ARDUINOCOREDIR := $(ARDUINOBACKENDDIR)/cores/$(BOARD_BUILD_CORE)
241
242
# default library path (places to look for libraries)
243
LIBRARYPATH ?= libraries libs $(SKETCHBOOKDIR)/libraries \
244
	$(ARDUINODIR)/libraries $(ARDUINOBACKENDDIR)/libraries
69 by edam
added support for burning bootloaders
245
1 by edam
initial commit
246
# auto mode?
247
INOFILE := $(wildcard *.ino *.pde)
248
ifdef INOFILE
25 by edam
added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error
249
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.
250
$(error There is more than one .pde or .ino file in this directory!)
1 by edam
initial commit
251
endif
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
252
89 by Tim Marston
detect which libraries to pull in the same way as the IDE; fixes 3
253
# automatically determine sources and target
1 by edam
initial commit
254
TARGET := $(basename $(INOFILE))
255
SOURCES := $(INOFILE) \
88 by Tim Marston
added support for assembly sources
256
	$(wildcard *.c *.cc *.cpp *.C *.s *.S) \
257
	$(wildcard $(addprefix util/, *.c *.cc *.cpp *.C *.s *.S)) \
258
	$(wildcard $(addprefix utility/, *.c *.cc *.cpp *.C *.s *.S))
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
259
89 by Tim Marston
detect which libraries to pull in the same way as the IDE; fixes 3
260
# automatically determine library directories (to pull library sources in from)
261
# by matching included headers in poject sources to headers that exist in the
262
# roots of any library directories, giving priority to libraries in the order
263
# they're in LIBRARYPATH, and then to the alphabetically-greater named library
264
# (this is a really stupid way of doing it, but it's how the IDE works -- if
265
# it's causing problems, you can override it by setting LIBRARIES manually)
266
INCLUDEDHEADERS := \
267
	$(shell sed -nre "s/^\s*\#\s*include\s*[<\"](\S+\.h)[>\"].*/\1/p" \
268
	$(SOURCES))
269
reverse = $(if $(1),$(call reverse,$(wordlist 2,$(words $(1)),$(1)))) \
270
	$(firstword $(1))
271
LIBRARYHEADERS := $(foreach dir, $(LIBRARYPATH), \
272
	$(call reverse, $(sort $(wildcard $(dir)/*))))
273
LIBRARYHEADERS := $(foreach dir, $(LIBRARYHEADERS), $(wildcard $(dir)/*.h))
274
LIBRARYDIRS := $(foreach hdr, $(INCLUDEDHEADERS), $(patsubst %/$(hdr), %, \
275
	$(firstword $(filter %/$(hdr), $(LIBRARYHEADERS)))))
276
277
endif
278
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
279
# expand LIBRARYDIRS (initialised from LIBRARIES, if specified)
89 by Tim Marston
detect which libraries to pull in the same way as the IDE; fixes 3
280
ifneq "$(LIBRARIES)" ""
281
LIBRARYDIRS := $(foreach lib, $(LIBRARIES), \
282
	$(firstword $(wildcard $(addsuffix /$(lib), $(LIBRARYPATH)))))
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.
283
endif
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
284
LIBRARYDIRS := $(LIBRARYDIRS) $(addsuffix /utility, $(LIBRARYDIRS))
63 by edam
documented AVRDUDEFLAGS, CPPFLAGS, LINKFLAGS and LINBRARYPATH, cleaned up a
285
1 by edam
initial commit
286
# files
25 by edam
added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error
287
TARGET := $(if $(TARGET),$(TARGET),a.out)
1 by edam
initial commit
288
OBJECTS := $(addsuffix .o, $(basename $(SOURCES)))
36 by edam
added dependency generation to project files
289
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)
290
ARDUINOLIB := .lib/arduino.a
63 by edam
documented AVRDUDEFLAGS, CPPFLAGS, LINKFLAGS and LINBRARYPATH, cleaned up a
291
ARDUINOLIBOBJS := $(foreach dir, $(ARDUINOCOREDIR) $(LIBRARYDIRS), \
88 by Tim Marston
added support for assembly sources
292
	$(patsubst %, .lib/%.o, $(wildcard $(addprefix $(dir)/, \
293
		*.c *.cc *.cpp *.C *.s *.S))))
70 by edam
bootloader may not be specified in boards.txt
294
BOOTLOADERHEX := $(addprefix \
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
295
	$(ARDUINOBACKENDDIR)/bootloaders/$(BOARD_BOOTLOADER_PATH)/, \
70 by edam
bootloader may not be specified in boards.txt
296
	$(BOARD_BOOTLOADER_FILE))
62 by edam
added support for third party libraries and fixed support for .C c++ files
297
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
298
# software
299
BUILDTOOLSPATH ?= $(subst :, , $(PATH)) $(ARDUINODIR)/hardware/tools \
300
	$(ARDUINODIR)/hardware/tools/avr/bin
301
findsoftware = $(firstword $(wildcard $(addsuffix /$(1), $(BUILDTOOLSPATH))))
302
CC := $(call findsoftware,avr-gcc)
303
CXX := $(call findsoftware,avr-g++)
304
LD := $(call findsoftware,avr-ld)
305
AR := $(call findsoftware,avr-ar)
306
AS := $(call findsoftware,avr-as)
307
OBJCOPY := $(call findsoftware,avr-objcopy)
308
AVRDUDE := $(call findsoftware,avrdude)
309
AVRSIZE := $(call findsoftware,avr-size)
310
311
# default arduino version
312
ARDUINOCONST ?= $(if $(filter /, $(ARDUINOBACKENDS)),100,150)
313
314
# default serial device to a poor guess (something that might be an arduino)
315
SERIALDEVGUESS := 0
316
ifndef SERIALDEV
317
SERIALDEV := $(firstword $(wildcard \
318
	/dev/ttyACM? /dev/ttyUSB? /dev/tty.usbserial* /dev/tty.usbmodem*))
319
SERIALDEVGUESS := 1
320
endif
321
62 by edam
added support for third party libraries and fixed support for .C c++ files
322
# avrdude confifuration
25 by edam
added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error
323
ifeq "$(AVRDUDECONF)" ""
324
ifeq "$(AVRDUDE)" "$(ARDUINODIR)/hardware/tools/avr/bin/avrdude"
325
AVRDUDECONF := $(ARDUINODIR)/hardware/tools/avr/etc/avrdude.conf
326
else
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
327
AVRDUDECONF := $(wildcard $(AVRDUDE).conf)
25 by edam
added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error
328
endif
329
endif
330
1 by edam
initial commit
331
# flags
61 by Tim Marston
make it possible to add to CPPFLAGS, AVRDUDEFLAGS and LINKFLAGS
332
CPPFLAGS += -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections
36 by edam
added dependency generation to project files
333
CPPFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
334
CPPFLAGS += -mmcu=$(BOARD_BUILD_MCU)
335
CPPFLAGS += -DF_CPU=$(BOARD_BUILD_FCPU) -DARDUINO=$(ARDUINOCONST)
49 by edam
added support for the Leonardo
336
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
337
CPPFLAGS += -I. -Iutil -Iutility -I $(ARDUINOCOREDIR)
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
338
CPPFLAGS += -I $(ARDUINOBACKENDDIR)/variants/$(BOARD_BUILD_VARIANT)/
63 by edam
documented AVRDUDEFLAGS, CPPFLAGS, LINKFLAGS and LINBRARYPATH, cleaned up a
339
CPPFLAGS += $(addprefix -I , $(LIBRARYDIRS))
36 by edam
added dependency generation to project files
340
CPPDEPFLAGS = -MMD -MP -MF .dep/$<.dep
341
CPPINOFLAGS := -x c++ -include $(ARDUINOCOREDIR)/Arduino.h
61 by Tim Marston
make it possible to add to CPPFLAGS, AVRDUDEFLAGS and LINKFLAGS
342
AVRDUDEFLAGS += $(addprefix -C , $(AVRDUDECONF)) -DV
85 by Tim Marston
added support for optional board upload speed
343
AVRDUDEFLAGS += -p$(BOARD_BUILD_MCU) -P$(SERIALDEV) -c$(BOARD_UPLOAD_PROTOCOL)
344
AVRDUDEFLAGS += $(addprefix -b, $(BOARD_UPLOAD_SPEED))
61 by Tim Marston
make it possible to add to CPPFLAGS, AVRDUDEFLAGS and LINKFLAGS
345
LINKFLAGS += -Os -Wl,--gc-sections -mmcu=$(BOARD_BUILD_MCU)
1 by edam
initial commit
346
43 by edam
fixed check for stty switch, so that it works with busybox
347
# figure out which arg to use with stty (for OS X, GNU and busybox stty)
348
STTYFARG := $(shell stty --help 2>&1 | \
349
	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
350
36 by edam
added dependency generation to project files
351
# include dependencies
352
ifneq "$(MAKECMDGOALS)" "clean"
353
-include $(DEPFILES)
354
endif
355
1 by edam
initial commit
356
# default rule
357
.DEFAULT_GOAL := all
358
359
#_______________________________________________________________________________
360
#                                                                          RULES
361
69 by edam
added support for burning bootloaders
362
.PHONY:	all target upload clean boards monitor size bootloader
1 by edam
initial commit
363
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)
364
all: target
1 by edam
initial commit
365
2 by edam
fixed build (missing library), tested upload, and made the .elf file an intermediate file (the .hex file is now the target)
366
target: $(TARGET).hex
1 by edam
initial commit
367
40 by Tim Marston
upload now depends on target (added dev to version no.)
368
upload: target
13 by edam
announce that we're uploading and error on SERIALDEV blank
369
	@echo "\nUploading to board..."
370
	@test -n "$(SERIALDEV)" || { \
371
		echo "error: SERIALDEV could not be determined automatically." >&2; \
372
		exit 1; }
27 by edam
fixed test not returning 0
373
	@test 0 -eq $(SERIALDEVGUESS) || { \
25 by edam
added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error
374
		echo "*GUESSING* at serial device:" $(SERIALDEV); \
375
		echo; }
66 by edam
fixed resetting Leonardos before upload
376
ifeq "$(BOARD_BOOTLOADER_PATH)" "caterina"
377
	stty $(STTYFARG) $(SERIALDEV) speed 1200
378
	sleep 1
77 by Tim Marston
prevent unnecessary hupcl when uploading to the caterina bootloader
379
else
380
	stty $(STTYFARG) $(SERIALDEV) hupcl
66 by edam
fixed resetting Leonardos before upload
381
endif
2 by edam
fixed build (missing library), tested upload, and made the .elf file an intermediate file (the .hex file is now the target)
382
	$(AVRDUDE) $(AVRDUDEFLAGS) -U flash:w:$(TARGET).hex:i
1 by edam
initial commit
383
384
clean:
385
	rm -f $(OBJECTS)
386
	rm -f $(TARGET).elf $(TARGET).hex $(ARDUINOLIB) *~
36 by edam
added dependency generation to project files
387
	rm -rf .lib .dep
1 by edam
initial commit
388
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.
389
boards:
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
390
	@echo "Available BOARD values:"
391
	@sed -nre '/^\w+\.name=/p; /^menu\.cpu\.\w+\.\w+=/p;' $(BOARDSFILES) | \
392
		sed -re 's/(\w+)\.name=(.*)/\1                   \2/' \
393
			-e 's/menu.cpu.\w+(\.\w+)=(.*)/  \1                  --\2/' \
394
			-e 's/(.{19}) *(.*)/  \1 \2/; s/--/  w\/ /;'
395
ifneq "$(ARDUINOBACKENDS)" "/"
396
	@echo
397
	@echo "NOTE: where a board supports multiple CPUs, you must specify" \
398
		"one.  For example,"
399
	@echo "'uno' is OK, and so is 'pro.16mhzatmega328'.  But 'pro', on" \
400
		"its own, is not."
401
endif
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.
402
9 by edam
added "monitor" goal; documented boards and monitor goals
403
monitor:
13 by edam
announce that we're uploading and error on SERIALDEV blank
404
	@test -n "$(SERIALDEV)" || { \
405
		echo "error: SERIALDEV could not be determined automatically." >&2; \
406
		exit 1; }
16 by edam
spellcheck, and added check for missing GNU screen
407
	@test -n `which screen` || { \
408
		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
409
		exit 1; }
27 by edam
fixed test not returning 0
410
	@test 0 -eq $(SERIALDEVGUESS) || { \
25 by edam
added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error
411
		echo "*GUESSING* at serial device:" $(SERIALDEV); \
412
		echo; }
9 by edam
added "monitor" goal; documented boards and monitor goals
413
	screen $(SERIALDEV)
414
34 by Tim Marston
added 'size' goal
415
size: $(TARGET).elf
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
416
	echo "\n" && $(AVRSIZE) --format=avr --mcu=$(BOARD_BUILD_MCU) $(TARGET).elf
34 by Tim Marston
added 'size' goal
417
69 by edam
added support for burning bootloaders
418
bootloader:
419
	@echo "Burning bootloader to board..."
420
	@test -n "$(SERIALDEV)" || { \
421
		echo "error: SERIALDEV could not be determined automatically." >&2; \
422
		exit 1; }
423
	@test 0 -eq $(SERIALDEVGUESS) || { \
424
		echo "*GUESSING* at serial device:" $(SERIALDEV); \
425
		echo; }
426
	stty $(STTYFARG) $(SERIALDEV) hupcl
427
	$(AVRDUDE) $(AVRDUDEFLAGS) -U lock:w:$(BOARD_BOOTLOADER_UNLOCK):m
70 by edam
bootloader may not be specified in boards.txt
428
	$(AVRDUDE) $(AVRDUDEFLAGS) -eU lfuse:w:$(BOARD_BOOTLOADER_LFUSES):m
429
	$(AVRDUDE) $(AVRDUDEFLAGS) -U hfuse:w:$(BOARD_BOOTLOADER_HFUSES):m
430
ifneq "$(BOARD_BOOTLOADER_EFUSES)" ""
431
	$(AVRDUDE) $(AVRDUDEFLAGS) -U efuse:w:$(BOARD_BOOTLOADER_EFUSES):m
432
endif
433
ifneq "$(BOOTLOADERHEX)" ""
69 by edam
added support for burning bootloaders
434
	$(AVRDUDE) $(AVRDUDEFLAGS) -U flash:w:$(BOOTLOADERHEX):i
70 by edam
bootloader may not be specified in boards.txt
435
endif
69 by edam
added support for burning bootloaders
436
	$(AVRDUDE) $(AVRDUDEFLAGS) -U lock:w:$(BOARD_BOOTLOADER_LOCK):m
437
1 by edam
initial commit
438
# building the target
439
2 by edam
fixed build (missing library), tested upload, and made the .elf file an intermediate file (the .hex file is now the target)
440
$(TARGET).hex: $(TARGET).elf
441
	$(OBJCOPY) -O ihex -R .eeprom $< $@
442
443
.INTERMEDIATE: $(TARGET).elf
444
1 by edam
initial commit
445
$(TARGET).elf: $(ARDUINOLIB) $(OBJECTS)
48 by edam
use a more sensible command-line oprdering when linking
446
	$(CC) $(LINKFLAGS) $(OBJECTS) $(ARDUINOLIB) -lm -o $@
1 by edam
initial commit
447
88 by Tim Marston
added support for assembly sources
448
%.o: %.ino
449
	mkdir -p .dep/$(dir $<)
450
	$(COMPILE.cpp) $(CPPDEPFLAGS) -o $@ $(CPPINOFLAGS) $<
451
452
%.o: %.pde
453
	mkdir -p .dep/$(dir $<)
454
	$(COMPILE.cpp) $(CPPDEPFLAGS) -o $@ $(CPPINOFLAGS) $<
455
36 by edam
added dependency generation to project files
456
%.o: %.c
457
	mkdir -p .dep/$(dir $<)
458
	$(COMPILE.c) $(CPPDEPFLAGS) -o $@ $<
459
460
%.o: %.cpp
461
	mkdir -p .dep/$(dir $<)
462
	$(COMPILE.cpp) $(CPPDEPFLAGS) -o $@ $<
463
464
%.o: %.cc
465
	mkdir -p .dep/$(dir $<)
466
	$(COMPILE.cpp) $(CPPDEPFLAGS) -o $@ $<
467
468
%.o: %.C
469
	mkdir -p .dep/$(dir $<)
470
	$(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)
471
88 by Tim Marston
added support for assembly sources
472
%.o: %.S
473
	mkdir -p .dep/$(dir $<)
474
	$(COMPILE.S) $(CPPDEPFLAGS) -o $@ $<
1 by edam
initial commit
475
476
# building the arduino library
477
4 by edam
added included-library autodetection and updated comments
478
$(ARDUINOLIB): $(ARDUINOLIBOBJS)
1 by edam
initial commit
479
	$(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)
480
481
.lib/%.c.o: %.c
482
	mkdir -p $(dir $@)
483
	$(COMPILE.c) -o $@ $<
484
485
.lib/%.cpp.o: %.cpp
486
	mkdir -p $(dir $@)
487
	$(COMPILE.cpp) -o $@ $<
488
489
.lib/%.cc.o: %.cc
490
	mkdir -p $(dir $@)
491
	$(COMPILE.cpp) -o $@ $<
492
493
.lib/%.C.o: %.C
494
	mkdir -p $(dir $@)
14 by Dan
search for software in ARDUINODIR; include library/*/utility code in core lib
495
	$(COMPILE.cpp) -o $@ $<
74 by Tim Marston
added emacs formatting variables and updated TODO
496
88 by Tim Marston
added support for assembly sources
497
.lib/%.s.o: %.s
498
	mkdir -p $(dir $@)
499
	$(COMPILE.s) -o $@ $<
500
501
.lib/%.S.o: %.S
502
	mkdir -p $(dir $@)
503
	$(COMPILE.S) -o $@ $<
504
74 by Tim Marston
added emacs formatting variables and updated TODO
505
# Local Variables:
506
# mode: makefile
507
# tab-width: 4
508
# End: