/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
#
94 by Tim Marston
minor changes to comments
45
# The Arduino software (version 1.0 or later, including the new 1.5 BETA) is
46
# required.  On GNU/Linux you can probably install the software from your
47
# package manager.  If you are using Debian (or a derivative), try `apt-get
48
# install arduino`.  Otherwise, you can download the Arduino software manually
49
# from http://arduino.cc/.  It is suggested that you install it at
50
# ~/opt/arduino (or /Applications on OS X) if you are unsure.
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
94 by Tim Marston
minor changes to comments
176
# check ARDUINODIR (and determine which backends are available)
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
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)
98 by Tim Marston
if perl is installed, do case-insensitive matching of BOARD name; increase
197
ifeq "$(ARDUINOBACKENDS)" "/"
198
readboardsparam = $(shell sed -ne "s/^$(BOARD)\\.$(1)=\(.*\)/\1/p" \
199
        $(BOARDSFILES))
200
else
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
201
readboardsparam = $(firstword \
98 by Tim Marston
if perl is installed, do case-insensitive matching of BOARD name; increase
202
	$(call readboardsmenuparam,$(1),$(basename $(BOARD)),$(suffix $(BOARD))) \
97 by Tim Marston
make usage of sed more portable (and tested on OS X); switch 1.5 support to
203
	$(shell sed -ne "s/^$(basename $(BOARD))\\.$(1)=\(.*\)/\1/p" \
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
204
		$(BOARDSFILES)))
98 by Tim Marston
if perl is installed, do case-insensitive matching of BOARD name; increase
205
ifneq "$(wildcard /usr/bin/perl)" ""
206
readboardsmenuparam = $(shell perl -ne \
207
	'/^$(2)\.menu\.cpu/ && s/.*$(3)\.$(1)=(.*)/\1/i && print' $(BOARDSFILES))
208
else
209
readboardsmenuparam = $(shell sed -ne '/^$(2)\.menu\.cpu/ {' \
210
	-e 's/.*$(3)\.$(1)=\(.*\)/\1/p' -e '}' $(BOARDSFILES))
211
endif
212
endif
69 by edam
added support for burning bootloaders
213
BOARD_BUILD_MCU := $(call readboardsparam,build.mcu)
214
BOARD_BUILD_FCPU := $(call readboardsparam,build.f_cpu)
215
BOARD_BUILD_VARIANT := $(call readboardsparam,build.variant)
83 by Tim Marston
read and use the build.core parameter in boards.txt
216
BOARD_BUILD_CORE := $(call readboardsparam,build.core)
98 by Tim Marston
if perl is installed, do case-insensitive matching of BOARD name; increase
217
BOARD_BUILD_BOARD := $(call readboardsparam,build.board)
69 by edam
added support for burning bootloaders
218
BOARD_UPLOAD_SPEED := $(call readboardsparam,upload.speed)
219
BOARD_UPLOAD_PROTOCOL := $(call readboardsparam,upload.protocol)
220
BOARD_USB_VID := $(call readboardsparam,build.vid)
221
BOARD_USB_PID := $(call readboardsparam,build.pid)
222
BOARD_BOOTLOADER_UNLOCK := $(call readboardsparam,bootloader.unlock_bits)
223
BOARD_BOOTLOADER_LOCK := $(call readboardsparam,bootloader.lock_bits)
224
BOARD_BOOTLOADER_LFUSES := $(call readboardsparam,bootloader.low_fuses)
225
BOARD_BOOTLOADER_HFUSES := $(call readboardsparam,bootloader.high_fuses)
226
BOARD_BOOTLOADER_EFUSES := $(call readboardsparam,bootloader.extended_fuses)
227
BOARD_BOOTLOADER_PATH := $(call readboardsparam,bootloader.path)
228
BOARD_BOOTLOADER_FILE := $(call readboardsparam,bootloader.file)
229
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
230
# invalid board?
231
ifeq "$(BOARD_BUILD_MCU)" ""
232
ifneq "$(MAKECMDGOALS)" "boards"
233
ifneq "$(MAKECMDGOALS)" "clean"
234
$(error BOARD is invalid.  Type 'make boards' to see possible values)
235
endif
236
endif
237
endif
238
69 by edam
added support for burning bootloaders
239
# obtain preferences from the IDE's preferences.txt
73 by Tim Marston
fixed default ARDUINODIR and PREFERENCESFILE locations for Macs
240
PREFERENCESFILE := $(firstword $(wildcard \
241
	$(HOME)/.arduino/preferences.txt $(HOME)/Library/Arduino/preferences.txt))
69 by edam
added support for burning bootloaders
242
ifneq "$(PREFERENCESFILE)" ""
243
readpreferencesparam = $(shell sed -ne "s/$(1)=\(.*\)/\1/p" $(PREFERENCESFILE))
244
SKETCHBOOKDIR := $(call readpreferencesparam,sketchbook.path)
245
endif
246
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
247
# arduino directories
248
ARDUINOBACKENDDIR := $(strip $(foreach dir, $(ARDUINOBACKENDS), \
249
	$(if $(shell grep ^$(basename $(BOARD))\\.name \
250
		$(ARDUINODIR)/hardware/arduino$(dir)/boards.txt), \
251
	$(ARDUINODIR)/hardware/arduino$(dir))))
98 by Tim Marston
if perl is installed, do case-insensitive matching of BOARD name; increase
252
ARDUINOBACKENDARCH=AVR
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
253
ARDUINOCOREDIR := $(ARDUINOBACKENDDIR)/cores/$(BOARD_BUILD_CORE)
254
255
# default library path (places to look for libraries)
256
LIBRARYPATH ?= libraries libs $(SKETCHBOOKDIR)/libraries \
257
	$(ARDUINODIR)/libraries $(ARDUINOBACKENDDIR)/libraries
69 by edam
added support for burning bootloaders
258
1 by edam
initial commit
259
# auto mode?
260
INOFILE := $(wildcard *.ino *.pde)
261
ifdef INOFILE
25 by edam
added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error
262
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.
263
$(error There is more than one .pde or .ino file in this directory!)
1 by edam
initial commit
264
endif
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
265
89 by Tim Marston
detect which libraries to pull in the same way as the IDE; fixes 3
266
# automatically determine sources and target
1 by edam
initial commit
267
TARGET := $(basename $(INOFILE))
268
SOURCES := $(INOFILE) \
88 by Tim Marston
added support for assembly sources
269
	$(wildcard *.c *.cc *.cpp *.C *.s *.S) \
270
	$(wildcard $(addprefix util/, *.c *.cc *.cpp *.C *.s *.S)) \
271
	$(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
272
89 by Tim Marston
detect which libraries to pull in the same way as the IDE; fixes 3
273
# automatically determine library directories (to pull library sources in from)
97 by Tim Marston
make usage of sed more portable (and tested on OS X); switch 1.5 support to
274
# by matching included headers in project sources to headers that exist in the
89 by Tim Marston
detect which libraries to pull in the same way as the IDE; fixes 3
275
# roots of any library directories, giving priority to libraries in the order
276
# they're in LIBRARYPATH, and then to the alphabetically-greater named library
277
# (this is a really stupid way of doing it, but it's how the IDE works -- if
278
# it's causing problems, you can override it by setting LIBRARIES manually)
98 by Tim Marston
if perl is installed, do case-insensitive matching of BOARD name; increase
279
INCLUDEDHEADERS := $(shell sed -ne '/^[ \t]*\#[ \t]*include[ \t<"]/ {' \
280
	 -e 's/^.*[<"]\(.*\)[>"].*/\1/p' -e '}' $(SOURCES))
89 by Tim Marston
detect which libraries to pull in the same way as the IDE; fixes 3
281
reverse = $(if $(1),$(call reverse,$(wordlist 2,$(words $(1)),$(1)))) \
282
	$(firstword $(1))
283
LIBRARYHEADERS := $(foreach dir, $(LIBRARYPATH), \
284
	$(call reverse, $(sort $(wildcard $(dir)/*))))
285
LIBRARYHEADERS := $(foreach dir, $(LIBRARYHEADERS), $(wildcard $(dir)/*.h))
286
LIBRARYDIRS := $(foreach hdr, $(INCLUDEDHEADERS), $(patsubst %/$(hdr), %, \
287
	$(firstword $(filter %/$(hdr), $(LIBRARYHEADERS)))))
288
289
endif
290
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
291
# 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
292
ifneq "$(LIBRARIES)" ""
293
LIBRARYDIRS := $(foreach lib, $(LIBRARIES), \
294
	$(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.
295
endif
98 by Tim Marston
if perl is installed, do case-insensitive matching of BOARD name; increase
296
LIBRARYDIRS := $(LIBRARYDIRS) \
297
	$(addsuffix /utility, $(LIBRARYDIRS)) \
298
	$(addsuffix /src, $(LIBRARYDIRS))
63 by edam
documented AVRDUDEFLAGS, CPPFLAGS, LINKFLAGS and LINBRARYPATH, cleaned up a
299
1 by edam
initial commit
300
# files
25 by edam
added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error
301
TARGET := $(if $(TARGET),$(TARGET),a.out)
1 by edam
initial commit
302
OBJECTS := $(addsuffix .o, $(basename $(SOURCES)))
36 by edam
added dependency generation to project files
303
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)
304
ARDUINOLIB := .lib/arduino.a
63 by edam
documented AVRDUDEFLAGS, CPPFLAGS, LINKFLAGS and LINBRARYPATH, cleaned up a
305
ARDUINOLIBOBJS := $(foreach dir, $(ARDUINOCOREDIR) $(LIBRARYDIRS), \
88 by Tim Marston
added support for assembly sources
306
	$(patsubst %, .lib/%.o, $(wildcard $(addprefix $(dir)/, \
307
		*.c *.cc *.cpp *.C *.s *.S))))
70 by edam
bootloader may not be specified in boards.txt
308
BOOTLOADERHEX := $(addprefix \
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
309
	$(ARDUINOBACKENDDIR)/bootloaders/$(BOARD_BOOTLOADER_PATH)/, \
70 by edam
bootloader may not be specified in boards.txt
310
	$(BOARD_BOOTLOADER_FILE))
62 by edam
added support for third party libraries and fixed support for .C c++ files
311
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
312
# software
313
BUILDTOOLSPATH ?= $(subst :, , $(PATH)) $(ARDUINODIR)/hardware/tools \
314
	$(ARDUINODIR)/hardware/tools/avr/bin
315
findsoftware = $(firstword $(wildcard $(addsuffix /$(1), $(BUILDTOOLSPATH))))
316
CC := $(call findsoftware,avr-gcc)
317
CXX := $(call findsoftware,avr-g++)
318
LD := $(call findsoftware,avr-ld)
319
AR := $(call findsoftware,avr-ar)
320
AS := $(call findsoftware,avr-as)
321
OBJCOPY := $(call findsoftware,avr-objcopy)
322
AVRDUDE := $(call findsoftware,avrdude)
323
AVRSIZE := $(call findsoftware,avr-size)
324
325
# default arduino version
326
ARDUINOCONST ?= $(if $(filter /, $(ARDUINOBACKENDS)),100,150)
327
328
# default serial device to a poor guess (something that might be an arduino)
329
SERIALDEVGUESS := 0
330
ifndef SERIALDEV
331
SERIALDEV := $(firstword $(wildcard \
332
	/dev/ttyACM? /dev/ttyUSB? /dev/tty.usbserial* /dev/tty.usbmodem*))
333
SERIALDEVGUESS := 1
334
endif
335
62 by edam
added support for third party libraries and fixed support for .C c++ files
336
# avrdude confifuration
25 by edam
added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error
337
ifeq "$(AVRDUDECONF)" ""
338
ifeq "$(AVRDUDE)" "$(ARDUINODIR)/hardware/tools/avr/bin/avrdude"
339
AVRDUDECONF := $(ARDUINODIR)/hardware/tools/avr/etc/avrdude.conf
340
else
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
341
AVRDUDECONF := $(wildcard $(AVRDUDE).conf)
25 by edam
added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error
342
endif
343
endif
344
1 by edam
initial commit
345
# flags
61 by Tim Marston
make it possible to add to CPPFLAGS, AVRDUDEFLAGS and LINKFLAGS
346
CPPFLAGS += -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections
36 by edam
added dependency generation to project files
347
CPPFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
98 by Tim Marston
if perl is installed, do case-insensitive matching of BOARD name; increase
348
CPPFLAGS += -fpermissive -mmcu=$(BOARD_BUILD_MCU)
36 by edam
added dependency generation to project files
349
CPPFLAGS += -DF_CPU=$(BOARD_BUILD_FCPU) -DARDUINO=$(ARDUINOCONST)
98 by Tim Marston
if perl is installed, do case-insensitive matching of BOARD name; increase
350
CPPFLAGS += -DARDUINO_$(BOARD_BUILD_BOARD) -DARDUINO_ARCH_$(ARDUINOBACKENDARCH)
49 by edam
added support for the Leonardo
351
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
352
CPPFLAGS += -I. -Iutil -Iutility -I $(ARDUINOCOREDIR)
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
353
CPPFLAGS += -I $(ARDUINOBACKENDDIR)/variants/$(BOARD_BUILD_VARIANT)/
63 by edam
documented AVRDUDEFLAGS, CPPFLAGS, LINKFLAGS and LINBRARYPATH, cleaned up a
354
CPPFLAGS += $(addprefix -I , $(LIBRARYDIRS))
36 by edam
added dependency generation to project files
355
CPPDEPFLAGS = -MMD -MP -MF .dep/$<.dep
356
CPPINOFLAGS := -x c++ -include $(ARDUINOCOREDIR)/Arduino.h
61 by Tim Marston
make it possible to add to CPPFLAGS, AVRDUDEFLAGS and LINKFLAGS
357
AVRDUDEFLAGS += $(addprefix -C , $(AVRDUDECONF)) -DV
85 by Tim Marston
added support for optional board upload speed
358
AVRDUDEFLAGS += -p$(BOARD_BUILD_MCU) -P$(SERIALDEV) -c$(BOARD_UPLOAD_PROTOCOL)
359
AVRDUDEFLAGS += $(addprefix -b, $(BOARD_UPLOAD_SPEED))
61 by Tim Marston
make it possible to add to CPPFLAGS, AVRDUDEFLAGS and LINKFLAGS
360
LINKFLAGS += -Os -Wl,--gc-sections -mmcu=$(BOARD_BUILD_MCU)
1 by edam
initial commit
361
43 by edam
fixed check for stty switch, so that it works with busybox
362
# figure out which arg to use with stty (for OS X, GNU and busybox stty)
363
STTYFARG := $(shell stty --help 2>&1 | \
364
	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
365
36 by edam
added dependency generation to project files
366
# include dependencies
367
ifneq "$(MAKECMDGOALS)" "clean"
368
-include $(DEPFILES)
369
endif
370
1 by edam
initial commit
371
# default rule
372
.DEFAULT_GOAL := all
373
374
#_______________________________________________________________________________
375
#                                                                          RULES
376
69 by edam
added support for burning bootloaders
377
.PHONY:	all target upload clean boards monitor size bootloader
1 by edam
initial commit
378
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)
379
all: target
1 by edam
initial commit
380
2 by edam
fixed build (missing library), tested upload, and made the .elf file an intermediate file (the .hex file is now the target)
381
target: $(TARGET).hex
1 by edam
initial commit
382
40 by Tim Marston
upload now depends on target (added dev to version no.)
383
upload: target
13 by edam
announce that we're uploading and error on SERIALDEV blank
384
	@echo "\nUploading to board..."
385
	@test -n "$(SERIALDEV)" || { \
386
		echo "error: SERIALDEV could not be determined automatically." >&2; \
387
		exit 1; }
27 by edam
fixed test not returning 0
388
	@test 0 -eq $(SERIALDEVGUESS) || { \
25 by edam
added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error
389
		echo "*GUESSING* at serial device:" $(SERIALDEV); \
390
		echo; }
66 by edam
fixed resetting Leonardos before upload
391
ifeq "$(BOARD_BOOTLOADER_PATH)" "caterina"
392
	stty $(STTYFARG) $(SERIALDEV) speed 1200
393
	sleep 1
92 by Tim Marston
added usb:* support (should have been committed with previous commit!)
394
else ifeq "" "$(filter net:% usb:%,$(SERIALDEV))"
77 by Tim Marston
prevent unnecessary hupcl when uploading to the caterina bootloader
395
	stty $(STTYFARG) $(SERIALDEV) hupcl
66 by edam
fixed resetting Leonardos before upload
396
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)
397
	$(AVRDUDE) $(AVRDUDEFLAGS) -U flash:w:$(TARGET).hex:i
1 by edam
initial commit
398
399
clean:
400
	rm -f $(OBJECTS)
401
	rm -f $(TARGET).elf $(TARGET).hex $(ARDUINOLIB) *~
36 by edam
added dependency generation to project files
402
	rm -rf .lib .dep
1 by edam
initial commit
403
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.
404
boards:
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
405
	@echo "Available BOARD values:"
97 by Tim Marston
make usage of sed more portable (and tested on OS X); switch 1.5 support to
406
	@sed -ne '/[[:alnum:]]*\.name=/p' \
407
		-e '/^[[:alnum:]]*\.menu\.cpu\.[[:alnum:]]*=/p' $(BOARDSFILES) | \
408
		sed -e 's/\([[:alnum:]]*\)\.name=\(.*\)/\1                   \2/' \
409
			-e 's/^.*\(\.[[:alnum:]]*\)=\(.*\)/  \1                  --\2/' \
410
			-e 's/\(.\{19\}\) *\(.*\)/  \1 \2/' -e 's/--/  ...with /'
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
411
ifneq "$(ARDUINOBACKENDS)" "/"
412
	@echo
413
	@echo "NOTE: where a board supports multiple CPUs, you must specify" \
414
		"one.  For example,"
415
	@echo "'uno' is OK, and so is 'pro.16mhzatmega328'.  But 'pro', on" \
416
		"its own, is not."
417
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.
418
9 by edam
added "monitor" goal; documented boards and monitor goals
419
monitor:
13 by edam
announce that we're uploading and error on SERIALDEV blank
420
	@test -n "$(SERIALDEV)" || { \
421
		echo "error: SERIALDEV could not be determined automatically." >&2; \
422
		exit 1; }
16 by edam
spellcheck, and added check for missing GNU screen
423
	@test -n `which screen` || { \
424
		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
425
		exit 1; }
27 by edam
fixed test not returning 0
426
	@test 0 -eq $(SERIALDEVGUESS) || { \
25 by edam
added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error
427
		echo "*GUESSING* at serial device:" $(SERIALDEV); \
428
		echo; }
9 by edam
added "monitor" goal; documented boards and monitor goals
429
	screen $(SERIALDEV)
430
34 by Tim Marston
added 'size' goal
431
size: $(TARGET).elf
90 by Tim Marston
initial support for arduino 1.5 (but compiling with the sam backend is broken)
432
	echo "\n" && $(AVRSIZE) --format=avr --mcu=$(BOARD_BUILD_MCU) $(TARGET).elf
34 by Tim Marston
added 'size' goal
433
69 by edam
added support for burning bootloaders
434
bootloader:
435
	@echo "Burning bootloader to board..."
436
	@test -n "$(SERIALDEV)" || { \
437
		echo "error: SERIALDEV could not be determined automatically." >&2; \
438
		exit 1; }
439
	@test 0 -eq $(SERIALDEVGUESS) || { \
440
		echo "*GUESSING* at serial device:" $(SERIALDEV); \
441
		echo; }
442
	stty $(STTYFARG) $(SERIALDEV) hupcl
443
	$(AVRDUDE) $(AVRDUDEFLAGS) -U lock:w:$(BOARD_BOOTLOADER_UNLOCK):m
70 by edam
bootloader may not be specified in boards.txt
444
	$(AVRDUDE) $(AVRDUDEFLAGS) -eU lfuse:w:$(BOARD_BOOTLOADER_LFUSES):m
445
	$(AVRDUDE) $(AVRDUDEFLAGS) -U hfuse:w:$(BOARD_BOOTLOADER_HFUSES):m
446
ifneq "$(BOARD_BOOTLOADER_EFUSES)" ""
447
	$(AVRDUDE) $(AVRDUDEFLAGS) -U efuse:w:$(BOARD_BOOTLOADER_EFUSES):m
448
endif
449
ifneq "$(BOOTLOADERHEX)" ""
69 by edam
added support for burning bootloaders
450
	$(AVRDUDE) $(AVRDUDEFLAGS) -U flash:w:$(BOOTLOADERHEX):i
70 by edam
bootloader may not be specified in boards.txt
451
endif
69 by edam
added support for burning bootloaders
452
	$(AVRDUDE) $(AVRDUDEFLAGS) -U lock:w:$(BOARD_BOOTLOADER_LOCK):m
453
1 by edam
initial commit
454
# building the target
455
2 by edam
fixed build (missing library), tested upload, and made the .elf file an intermediate file (the .hex file is now the target)
456
$(TARGET).hex: $(TARGET).elf
457
	$(OBJCOPY) -O ihex -R .eeprom $< $@
458
459
.INTERMEDIATE: $(TARGET).elf
460
1 by edam
initial commit
461
$(TARGET).elf: $(ARDUINOLIB) $(OBJECTS)
48 by edam
use a more sensible command-line oprdering when linking
462
	$(CC) $(LINKFLAGS) $(OBJECTS) $(ARDUINOLIB) -lm -o $@
1 by edam
initial commit
463
88 by Tim Marston
added support for assembly sources
464
%.o: %.ino
96 by Tim Marston
strip ./ from the path to the current file we're compiling so that, when
465
	mkdir -p .dep/$(pathsubst ./%,%,$(dir $<))
88 by Tim Marston
added support for assembly sources
466
	$(COMPILE.cpp) $(CPPDEPFLAGS) -o $@ $(CPPINOFLAGS) $<
467
468
%.o: %.pde
96 by Tim Marston
strip ./ from the path to the current file we're compiling so that, when
469
	mkdir -p .dep/$(pathsubst ./%,%,$(dir $<))
88 by Tim Marston
added support for assembly sources
470
	$(COMPILE.cpp) $(CPPDEPFLAGS) -o $@ $(CPPINOFLAGS) $<
471
36 by edam
added dependency generation to project files
472
%.o: %.c
96 by Tim Marston
strip ./ from the path to the current file we're compiling so that, when
473
	mkdir -p .dep/$(pathsubst ./%,%,$(dir $<))
36 by edam
added dependency generation to project files
474
	$(COMPILE.c) $(CPPDEPFLAGS) -o $@ $<
475
476
%.o: %.cpp
96 by Tim Marston
strip ./ from the path to the current file we're compiling so that, when
477
	mkdir -p .dep/$(pathsubst ./%,%,$(dir $<))
36 by edam
added dependency generation to project files
478
	$(COMPILE.cpp) $(CPPDEPFLAGS) -o $@ $<
479
480
%.o: %.cc
96 by Tim Marston
strip ./ from the path to the current file we're compiling so that, when
481
	mkdir -p .dep/$(pathsubst ./%,%,$(dir $<))
36 by edam
added dependency generation to project files
482
	$(COMPILE.cpp) $(CPPDEPFLAGS) -o $@ $<
483
484
%.o: %.C
96 by Tim Marston
strip ./ from the path to the current file we're compiling so that, when
485
	mkdir -p .dep/$(pathsubst ./%,%,$(dir $<))
36 by edam
added dependency generation to project files
486
	$(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)
487
88 by Tim Marston
added support for assembly sources
488
%.o: %.S
96 by Tim Marston
strip ./ from the path to the current file we're compiling so that, when
489
	mkdir -p .dep/$(pathsubst ./%,%,$(dir $<))
88 by Tim Marston
added support for assembly sources
490
	$(COMPILE.S) $(CPPDEPFLAGS) -o $@ $<
1 by edam
initial commit
491
492
# building the arduino library
493
4 by edam
added included-library autodetection and updated comments
494
$(ARDUINOLIB): $(ARDUINOLIBOBJS)
1 by edam
initial commit
495
	$(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)
496
497
.lib/%.c.o: %.c
498
	mkdir -p $(dir $@)
499
	$(COMPILE.c) -o $@ $<
500
501
.lib/%.cpp.o: %.cpp
502
	mkdir -p $(dir $@)
503
	$(COMPILE.cpp) -o $@ $<
504
505
.lib/%.cc.o: %.cc
506
	mkdir -p $(dir $@)
507
	$(COMPILE.cpp) -o $@ $<
508
509
.lib/%.C.o: %.C
510
	mkdir -p $(dir $@)
14 by Dan
search for software in ARDUINODIR; include library/*/utility code in core lib
511
	$(COMPILE.cpp) -o $@ $<
74 by Tim Marston
added emacs formatting variables and updated TODO
512
88 by Tim Marston
added support for assembly sources
513
.lib/%.s.o: %.s
514
	mkdir -p $(dir $@)
515
	$(COMPILE.s) -o $@ $<
516
517
.lib/%.S.o: %.S
518
	mkdir -p $(dir $@)
519
	$(COMPILE.S) -o $@ $<
520
74 by Tim Marston
added emacs formatting variables and updated TODO
521
# Local Variables:
522
# mode: makefile
523
# tab-width: 4
524
# End: