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