/make/arduino-mk

To get this branch, use:
bzr branch http://bzr.ed.am/make/arduino-mk
1 by edam
initial commit
1
#_______________________________________________________________________________
2
#
3
#                         edam's arduino makefile
4
#_______________________________________________________________________________
5
#                                                                    version 0.1
6
#
7
# Copyright (c) 2011 Tim Marston <tim@ed.am>.
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
10 by edam
formatting, and changed default for ARDUINODIR
31
# software.  It works with the arduino-1.0 release and requires that software
32
# to be downloaded separately (see http://arduino.cc/).  To download the latest
33
# version of this makefile, visit the following website, where you can also
34
# find more information and documentation on it's use.  The following text can
35
# only really be considered a reference to it's use.
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
#
10 by edam
formatting, and changed default for ARDUINODIR
39
# This makefile can be used as a drop-in replacement for the Arduino IDE's
12 by edam
cleaned up comments
40
# build system.  To use it, save arduino.mk somewhere (I keep mine at
41
# ~/src/arduino.mk) and create a symlink to it in your project directory named
42
# "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.
43
#
7 by edam
fixed comments for publishing
44
#   $ 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.
45
#
16 by edam
spellcheck, and added check for missing GNU screen
46
# You also need to set up a couple of environment variables. ARDUINODIR should
12 by edam
cleaned up comments
47
# be set to the path where you unpacked the arduino software from arduino.cc
48
# (it defaults to ~/opt/arduino if unset).  You might be best to set this in
49
# your ~/.profile by adding something like this:
50
#
51
#   export ARDUINODIR=~/somewhere/arduino-1.0
52
#
53
# You will also need to set BOARD to the type of arduino you're using.  This
54
# can be done when running make (or you could set a default in ~/.profile and
16 by edam
spellcheck, and added check for missing GNU screen
55
# override it as necessary).  For example:
12 by edam
cleaned up comments
56
#
57
#   $ export BOARD=uno
58
#   $ make
59
#
60
# You may also need to set SERIALDEV if it is not detected correctly.
61
#
18 by edam
downplay importance of .pde files
62
# 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
63
# determine values for SOURCES, TARGET and LIBRARIES.  Any .c, .cc and .cpp
64
# files in the project directory (or any "util" or "utility" subdirectories)
65
# are automatically included in the build and are scanned for Arduino libraries
18 by edam
downplay importance of .pde files
66
# that have been #included. Note, there can only be one .ino (or .pde) file.
5 by edam
updated comments; added checks for missing or misconfigured variables; use a default TARGET; attempt to autodetect SERIALDEV; added 'boards' goal; fixed use of 'util' project subdirectory.
67
#
10 by edam
formatting, and changed default for ARDUINODIR
68
# Alternatively, if you want to manually specify build variables, create a
16 by edam
spellcheck, and added check for missing GNU screen
69
# Makefile that defines SOURCES and LIBRARIES and then includes arduino.mk.
12 by edam
cleaned up comments
70
# (There is no need to define TARGET).  Here is an example Makefile:
5 by edam
updated comments; added checks for missing or misconfigured variables; use a default TARGET; attempt to autodetect SERIALDEV; added 'boards' goal; fixed use of 'util' project subdirectory.
71
#
12 by edam
cleaned up comments
72
#   SOURCES := main.cc other.cc
7 by edam
fixed comments for publishing
73
#   LIBRARIES := EEPROM
74
#   include ~/src/arduino.mk
1 by edam
initial commit
75
#
8 by edam
broke out ARDUINODIR, so it is not configured in the makefile
76
# Here is a complete list of configuration parameters:
77
#
10 by edam
formatting, and changed default for ARDUINODIR
78
# ARDUINODIR   The path where you have installed/unpacked the arduino software
79
#              (from http://arduino.cc/)
4 by edam
added included-library autodetection and updated comments
80
#
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
81
# ARDUINOCONST The arduino software version, as an integer, used to define the
82
#              ARDUINO version constant. This defaults to 100 if unset.
83
#
84
# AVRTOOLSPATH A space-separated list of directories to search in order when
85
#              lookin for the avr build tools. This defaults to the system PATH
86
#              followed by subdirectories in ARDUINODIR if unset.
87
#
12 by edam
cleaned up comments
88
# BOARD        Specify a target board type.  Run `make boards` to see available
89
#              board types.
4 by edam
added included-library autodetection and updated comments
90
#
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
91
# LIBRARIES    A list of arduino libraries to build and include.  This is set
92
#              automatically if a .ino (or .pde) is found.
93
#
16 by edam
spellcheck, and added check for missing GNU screen
94
# SERIALDEV    The unix device name of the serial device that is the arduino.
10 by edam
formatting, and changed default for ARDUINODIR
95
#              If unspecified, an attempt is made to determine the name of a
96
#              connected arduino's serial device.
97
#
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
98
# SOURCES      A list of all source files of whatever language.  The language
99
#              type is determined by the file extension.  This is set
100
#              automatically if a .ino (or .pde) is found.
101
#
10 by edam
formatting, and changed default for ARDUINODIR
102
# TARGET       The name of the target file.  This is set automatically if a
18 by edam
downplay importance of .pde files
103
#              .ino (or .pde) is found, but it is not necessary to set it
10 by edam
formatting, and changed default for ARDUINODIR
104
#              otherwise.
105
#
12 by edam
cleaned up comments
106
# This makefile also defines the following goals for use on the command line
107
# 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.
108
#
12 by edam
cleaned up comments
109
# all          This is the default if no goal is specified.  It builds the
10 by edam
formatting, and changed default for ARDUINODIR
110
#              target and uploads it.
1 by edam
initial commit
111
#
12 by edam
cleaned up comments
112
# target       Builds the target.
113
#
114
# upload       Uploads the last built target to an attached arduino.
115
#
116
# clean        Deletes files created during the build.
1 by edam
initial commit
117
#
10 by edam
formatting, and changed default for ARDUINODIR
118
# boards       Display a list of available board names, so that you can set the
119
#              BOARD environment variable appropriately.
120
#
16 by edam
spellcheck, and added check for missing GNU screen
121
# monitor      Start `screen` on the serial device.  This is meant to be an
122
#              equivalent to the arduino serial monitor.
10 by edam
formatting, and changed default for ARDUINODIR
123
#
124
# <file>       Builds the specified file, either an object file or the target,
125
#              from those that that would be built for the project.
1 by edam
initial commit
126
#_______________________________________________________________________________
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.
127
#
1 by edam
initial commit
128
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
129
# default arduino software directory, check software exists
8 by edam
broke out ARDUINODIR, so it is not configured in the makefile
130
ifndef ARDUINODIR
10 by edam
formatting, and changed default for ARDUINODIR
131
ARDUINODIR := $(wildcard ~/opt/arduino)
8 by edam
broke out ARDUINODIR, so it is not configured in the makefile
132
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.
133
ifeq ($(wildcard $(ARDUINODIR)/hardware/arduino/boards.txt), )
8 by edam
broke out ARDUINODIR, so it is not configured in the makefile
134
$(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.
135
endif
1 by edam
initial commit
136
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
137
# default arduino version
138
ARDUINOCONST ?= 100
139
140
# default path for avr tools
141
ifndef AVRTOOLSPATH
142
AVRTOOLSPATH := $(subst :, , $(PATH))
143
AVRTOOLSPATH += $(ARDUINODIR)/hardware/tools
144
AVRTOOLSPATH += $(ARDUINODIR)/hardware/tools/avr/bin
145
endif
146
1 by edam
initial commit
147
# auto mode?
148
INOFILE := $(wildcard *.ino *.pde)
149
ifdef INOFILE
150
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.
151
$(error There is more than one .pde or .ino file in this directory!)
1 by edam
initial commit
152
endif
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
153
154
# automatically determine sources and targeet
1 by edam
initial commit
155
TARGET := $(basename $(INOFILE))
156
SOURCES := $(INOFILE) \
4 by edam
added included-library autodetection and updated comments
157
	$(wildcard *.c *.cc *.cpp) \
158
	$(wildcard $(addprefix util/, *.c *.cc *.cpp)) \
159
	$(wildcard $(addprefix utility/, *.c *.cc *.cpp))
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
160
4 by edam
added included-library autodetection and updated comments
161
# automatically determine included libraries
162
ARDUINOLIBSAVAIL := $(notdir $(wildcard $(ARDUINODIR)/libraries/*))
163
LIBRARIES := $(filter $(ARDUINOLIBSAVAIL), \
164
	$(shell sed -ne "s/^ *\# *include *[<\"]\(.*\)\.h[>\"]/\1/p" $(SOURCES)))
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
165
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.
166
endif
167
168
# no board? oh dear...
169
ifndef BOARD
170
ifneq "$(MAKECMDGOALS)" "boards"
171
ifneq "$(MAKECMDGOALS)" "clean"
172
$(error BOARD is unset.  Type 'make boards' to see possible values)
173
endif
174
endif
175
endif
176
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
177
# no serial device? make a poor attempt to detect an arduino
178
ifeq ($(SERIALDEV), )
179
SERIALDEV := $(firstword $(wildcard /dev/ttyACM? /dev/ttyUSB?))
180
endif
181
182
# software
183
findsoftware = $(firstword $(wildcard $(addsuffix /$(1), $(AVRTOOLSPATH))))
184
CC := $(call findsoftware,avr-gcc)
185
CXX := $(call findsoftware,avr-g++)
186
LD := $(call findsoftware,avr-ld)
187
AR := $(call findsoftware,avr-ar)
188
OBJCOPY := $(call findsoftware,avr-objcopy)
189
AVRDUDE := $(call findsoftware,avrdude)
190
1 by edam
initial commit
191
# files
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
192
TARGET := $(if $(TARGET), $(TARGET), a.out)
1 by edam
initial commit
193
OBJECTS := $(addsuffix .o, $(basename $(SOURCES)))
194
ARDUINOSRCDIR := $(ARDUINODIR)/hardware/arduino/cores/arduino
15 by edam
fixed detection of env. vars. and a typo in a rule that caused it not to work
195
ARDUINOLIBSDIR := $(ARDUINODIR)/libraries
1 by edam
initial commit
196
ARDUINOLIB := _arduino.a
14 by Dan
search for software in ARDUINODIR; include library/*/utility code in core lib
197
ARDUINOLIBTMP := $(ARDUINOLIB).tmp
4 by edam
added included-library autodetection and updated comments
198
ARDUINOLIBOBJS := $(patsubst %, $(ARDUINOLIBTMP)/%.o, $(basename $(notdir \
199
	$(wildcard $(addprefix $(ARDUINOSRCDIR)/, *.c *.cpp)))))
200
ARDUINOLIBOBJS += $(foreach lib, $(LIBRARIES), \
201
	$(patsubst %, $(ARDUINOLIBTMP)/%.o, $(basename $(notdir \
15 by edam
fixed detection of env. vars. and a typo in a rule that caused it not to work
202
	$(wildcard $(addprefix $(ARDUINOLIBSDIR)/$(lib)/, *.c *.cpp)) \
203
	$(wildcard $(addprefix $(ARDUINOLIBSDIR)/$(lib)/utility/, *.c *.cpp)) ))))
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
204
AVRDUDECONF := $(wildcard $(AVRDUDE).conf)
1 by edam
initial commit
205
2 by edam
fixed build (missing library), tested upload, and made the .elf file an intermediate file (the .hex file is now the target)
206
# obtain board parameters from the arduino boards.txt file
1 by edam
initial commit
207
BOARDS_FILE := $(ARDUINODIR)/hardware/arduino/boards.txt
208
BOARD_BUILD_MCU := \
209
	$(shell sed -ne "s/$(BOARD).build.mcu=\(.*\)/\1/p" $(BOARDS_FILE))
210
BOARD_BUILD_FCPU := \
211
	$(shell sed -ne "s/$(BOARD).build.f_cpu=\(.*\)/\1/p" $(BOARDS_FILE))
212
BOARD_BUILD_VARIANT := \
213
	$(shell sed -ne "s/$(BOARD).build.variant=\(.*\)/\1/p" $(BOARDS_FILE))
214
BOARD_UPLOAD_SPEED := \
215
	$(shell sed -ne "s/$(BOARD).upload.speed=\(.*\)/\1/p" $(BOARDS_FILE))
216
BOARD_UPLOAD_PROTOCOL := \
217
	$(shell sed -ne "s/$(BOARD).upload.protocol=\(.*\)/\1/p" $(BOARDS_FILE))
218
219
# flags
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
220
CPPFLAGS := -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections
20 by edam
add some signed and packing gcc options
221
CPPFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
19 by edam
added fixed arduino software version
222
CPPFLAGS += -mmcu=$(BOARD_BUILD_MCU)
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
223
CPPFLAGS += -DF_CPU=$(BOARD_BUILD_FCPU) -DARDUINO=$(ARDUINOCONST)
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.
224
CPPFLAGS += -I. -Iutil -Iutility -I$(ARDUINOSRCDIR)
1 by edam
initial commit
225
CPPFLAGS += -I$(ARDUINODIR)/hardware/arduino/variants/$(BOARD_BUILD_VARIANT)/
9 by edam
added "monitor" goal; documented boards and monitor goals
226
CPPFLAGS += $(addprefix -I$(ARDUINODIR)/libraries/, $(LIBRARIES))
227
CPPFLAGS += $(patsubst %, -I$(ARDUINODIR)/libraries/%/utility, $(LIBRARIES))
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
228
AVRDUDEFLAGS := $(addprefix -C , $(AVRDUDECONF)) -DV
1 by edam
initial commit
229
AVRDUDEFLAGS += -p $(BOARD_BUILD_MCU) -P $(SERIALDEV)
230
AVRDUDEFLAGS += -c $(BOARD_UPLOAD_PROTOCOL) -b $(BOARD_UPLOAD_SPEED)
23 by edam
added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types
231
LINKFLAGS := -Os -Wl,--gc-sections -mmcu=$(BOARD_BUILD_MCU)
1 by edam
initial commit
232
233
# default rule
234
.DEFAULT_GOAL := all
235
236
#_______________________________________________________________________________
237
#                                                                          RULES
238
9 by edam
added "monitor" goal; documented boards and monitor goals
239
.PHONY:	all target upload clean boards monitor
1 by edam
initial commit
240
241
all: target upload
242
2 by edam
fixed build (missing library), tested upload, and made the .elf file an intermediate file (the .hex file is now the target)
243
target: $(TARGET).hex
1 by edam
initial commit
244
245
upload:
13 by edam
announce that we're uploading and error on SERIALDEV blank
246
	@echo "\nUploading to board..."
247
	@test -n "$(SERIALDEV)" || { \
248
		echo "error: SERIALDEV could not be determined automatically." >&2; \
249
		exit 1; }
1 by edam
initial commit
250
	stty -F $(SERIALDEV) hupcl
2 by edam
fixed build (missing library), tested upload, and made the .elf file an intermediate file (the .hex file is now the target)
251
	$(AVRDUDE) $(AVRDUDEFLAGS) -U flash:w:$(TARGET).hex:i
1 by edam
initial commit
252
253
clean:
254
	rm -f $(OBJECTS)
255
	rm -f $(TARGET).elf $(TARGET).hex $(ARDUINOLIB) *~
256
	rm -rf $(ARDUINOLIBTMP)
257
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.
258
boards:
259
	@echo Available values for BOARD:
260
	@sed -ne '/^#/d;s/^\(.*\).name=\(.*\)/\1            \2/;T' \
261
		-e 's/\(.\{12\}\) *\(.*\)/\1 \2/;p' $(BOARDS_FILE)
262
9 by edam
added "monitor" goal; documented boards and monitor goals
263
monitor:
13 by edam
announce that we're uploading and error on SERIALDEV blank
264
	@test -n "$(SERIALDEV)" || { \
265
		echo "error: SERIALDEV could not be determined automatically." >&2; \
266
		exit 1; }
16 by edam
spellcheck, and added check for missing GNU screen
267
	@test -n `which screen` || { \
268
		echo "error: can't find GNU screen, you might need to install it." >&2 \
269
		ecit 1; }
9 by edam
added "monitor" goal; documented boards and monitor goals
270
	screen $(SERIALDEV)
271
1 by edam
initial commit
272
# building the target
273
2 by edam
fixed build (missing library), tested upload, and made the .elf file an intermediate file (the .hex file is now the target)
274
$(TARGET).hex: $(TARGET).elf
275
	$(OBJCOPY) -O ihex -R .eeprom $< $@
276
277
.INTERMEDIATE: $(TARGET).elf
278
1 by edam
initial commit
279
$(TARGET).elf: $(ARDUINOLIB) $(OBJECTS)
2 by edam
fixed build (missing library), tested upload, and made the .elf file an intermediate file (the .hex file is now the target)
280
	$(CC) $(LINKFLAGS) $(OBJECTS) $(ARDUINOLIB) -o $@
1 by edam
initial commit
281
282
%.o: %.ino
283
	$(COMPILE.cpp) -o $@ -x c++ -include $(ARDUINOSRCDIR)/Arduino.h $<
284
285
%.o: %.pde
286
	$(COMPILE.cpp) -o $@ -x c++ -include $(ARDUINOSRCDIR)/Arduino.h $<
287
288
# building the arduino library
289
4 by edam
added included-library autodetection and updated comments
290
$(ARDUINOLIB): $(ARDUINOLIBOBJS)
1 by edam
initial commit
291
	$(AR) rcs $@ $?
292
	rm -rf $(ARDUINOLIBTMP)
293
4 by edam
added included-library autodetection and updated comments
294
.INTERMEDIATE: $(ARDUINOLIBOBJS)
1 by edam
initial commit
295
296
$(ARDUINOLIBTMP)/%.o: $(ARDUINOSRCDIR)/%.c
297
	@test -d $(ARDUINOLIBTMP) || mkdir $(ARDUINOLIBTMP)
298
	$(COMPILE.c) -o $@ $<
299
300
$(ARDUINOLIBTMP)/%.o: $(ARDUINOSRCDIR)/%.cpp
301
	@test -d $(ARDUINOLIBTMP) || mkdir $(ARDUINOLIBTMP)
302
	$(COMPILE.cpp) -o $@ $<
4 by edam
added included-library autodetection and updated comments
303
304
$(ARDUINOLIBTMP)/%.o: $(ARDUINODIR)/libraries/*/%.c
305
	@test -d $(ARDUINOLIBTMP) || mkdir $(ARDUINOLIBTMP)
306
	$(COMPILE.c) -o $@ $<
307
308
$(ARDUINOLIBTMP)/%.o: $(ARDUINODIR)/libraries/*/%.cpp
309
	@test -d $(ARDUINOLIBTMP) || mkdir $(ARDUINOLIBTMP)
310
	$(COMPILE.cpp) -o $@ $<
14 by Dan
search for software in ARDUINODIR; include library/*/utility code in core lib
311
312
$(ARDUINOLIBTMP)/%.o: $(ARDUINODIR)/libraries/*/utility/%.c
313
	@test -d $(ARDUINOLIBTMP) || mkdir $(ARDUINOLIBTMP)
15 by edam
fixed detection of env. vars. and a typo in a rule that caused it not to work
314
	$(COMPILE.c) -o $@ $<
14 by Dan
search for software in ARDUINODIR; include library/*/utility code in core lib
315
316
$(ARDUINOLIBTMP)/%.o: $(ARDUINODIR)/libraries/*/utility/%.cpp
317
	@test -d $(ARDUINOLIBTMP) || mkdir $(ARDUINOLIBTMP)
318
	$(COMPILE.cpp) -o $@ $<