bzr branch
http://bzr.ed.am/make/arduino-mk
| 1
by edam initial commit | 1 | #_______________________________________________________________________________ | 
| 2 | # | |
| 3 | # edam's arduino makefile | |
| 4 | #_______________________________________________________________________________ | |
| 28
by edam bump version no. | 5 | # version 0.2 | 
| 1
by edam initial commit | 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 | 
| 25
by edam added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error | 82 | # ARDUINO version constant. This defaults to 100 if undefined. | 
| 83 | # | |
| 84 | # AVRDUDECONF The avrdude.conf to use. If undefined, this defaults to a guess | |
| 85 | # based on where the avrdude in use is. If empty, no avrdude.conf | |
| 86 | # is passed to avrdude (to the system default is used). | |
| 23
by edam added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types | 87 | # | 
| 88 | # AVRTOOLSPATH A space-separated list of directories to search in order when | |
| 89 | # lookin for the avr build tools. This defaults to the system PATH | |
| 25
by edam added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error | 90 | # followed by subdirectories in ARDUINODIR if undefined. | 
| 23
by edam added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types | 91 | # | 
| 12
by edam cleaned up comments | 92 | # BOARD Specify a target board type. Run `make boards` to see available | 
| 93 | # board types. | |
| 4
by edam added included-library autodetection and updated comments | 94 | # | 
| 23
by edam added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types | 95 | # LIBRARIES A list of arduino libraries to build and include. This is set | 
| 96 | # automatically if a .ino (or .pde) is found. | |
| 97 | # | |
| 16
by edam spellcheck, and added check for missing GNU screen | 98 | # SERIALDEV The unix device name of the serial device that is the arduino. | 
| 10
by edam formatting, and changed default for ARDUINODIR | 99 | # If unspecified, an attempt is made to determine the name of a | 
| 100 | # connected arduino's serial device. | |
| 101 | # | |
| 23
by edam added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types | 102 | # SOURCES A list of all source files of whatever language. The language | 
| 103 | # type is determined by the file extension. This is set | |
| 104 | # automatically if a .ino (or .pde) is found. | |
| 105 | # | |
| 10
by edam formatting, and changed default for ARDUINODIR | 106 | # TARGET The name of the target file. This is set automatically if a | 
| 18
by edam downplay importance of .pde files | 107 | # .ino (or .pde) is found, but it is not necessary to set it | 
| 10
by edam formatting, and changed default for ARDUINODIR | 108 | # otherwise. | 
| 109 | # | |
| 12
by edam cleaned up comments | 110 | # This makefile also defines the following goals for use on the command line | 
| 111 | # 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. | 112 | # | 
| 12
by edam cleaned up comments | 113 | # all This is the default if no goal is specified. It builds the | 
| 10
by edam formatting, and changed default for ARDUINODIR | 114 | # target and uploads it. | 
| 1
by edam initial commit | 115 | # | 
| 12
by edam cleaned up comments | 116 | # target Builds the target. | 
| 117 | # | |
| 118 | # upload Uploads the last built target to an attached arduino. | |
| 119 | # | |
| 120 | # clean Deletes files created during the build. | |
| 1
by edam initial commit | 121 | # | 
| 10
by edam formatting, and changed default for ARDUINODIR | 122 | # boards Display a list of available board names, so that you can set the | 
| 123 | # BOARD environment variable appropriately. | |
| 124 | # | |
| 16
by edam spellcheck, and added check for missing GNU screen | 125 | # monitor Start `screen` on the serial device. This is meant to be an | 
| 126 | # equivalent to the arduino serial monitor. | |
| 10
by edam formatting, and changed default for ARDUINODIR | 127 | # | 
| 128 | # <file> Builds the specified file, either an object file or the target, | |
| 129 | # from those that that would be built for the project. | |
| 1
by edam initial commit | 130 | #_______________________________________________________________________________ | 
| 5
by edam updated comments; added checks for missing or misconfigured variables; use a default TARGET; attempt to autodetect SERIALDEV; added 'boards' goal; fixed use of 'util' project subdirectory. | 131 | # | 
| 1
by edam initial commit | 132 | |
| 23
by edam added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types | 133 | # default arduino software directory, check software exists | 
| 8
by edam broke out ARDUINODIR, so it is not configured in the makefile | 134 | ifndef ARDUINODIR | 
| 10
by edam formatting, and changed default for ARDUINODIR | 135 | ARDUINODIR := $(wildcard ~/opt/arduino) | 
| 8
by edam broke out ARDUINODIR, so it is not configured in the makefile | 136 | endif | 
| 25
by edam added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error | 137 | ifeq "$(wildcard $(ARDUINODIR)/hardware/arduino/boards.txt)" "" | 
| 8
by edam broke out ARDUINODIR, so it is not configured in the makefile | 138 | $(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. | 139 | endif | 
| 1
by edam initial commit | 140 | |
| 23
by edam added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types | 141 | # default arduino version | 
| 142 | ARDUINOCONST ?= 100 | |
| 143 | ||
| 144 | # default path for avr tools | |
| 145 | ifndef AVRTOOLSPATH | |
| 146 | AVRTOOLSPATH := $(subst :, , $(PATH)) | |
| 147 | AVRTOOLSPATH += $(ARDUINODIR)/hardware/tools | |
| 148 | AVRTOOLSPATH += $(ARDUINODIR)/hardware/tools/avr/bin | |
| 149 | endif | |
| 150 | ||
| 1
by edam initial commit | 151 | # auto mode? | 
| 152 | INOFILE := $(wildcard *.ino *.pde) | |
| 153 | ifdef INOFILE | |
| 25
by edam added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error | 154 | 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. | 155 | $(error There is more than one .pde or .ino file in this directory!) | 
| 1
by edam initial commit | 156 | endif | 
| 23
by edam added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types | 157 | |
| 158 | # automatically determine sources and targeet | |
| 1
by edam initial commit | 159 | TARGET := $(basename $(INOFILE)) | 
| 160 | SOURCES := $(INOFILE) \ | |
| 4
by edam added included-library autodetection and updated comments | 161 | $(wildcard *.c *.cc *.cpp) \ | 
| 162 | $(wildcard $(addprefix util/, *.c *.cc *.cpp)) \ | |
| 163 | $(wildcard $(addprefix utility/, *.c *.cc *.cpp)) | |
| 23
by edam added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types | 164 | |
| 4
by edam added included-library autodetection and updated comments | 165 | # automatically determine included libraries | 
| 166 | ARDUINOLIBSAVAIL := $(notdir $(wildcard $(ARDUINODIR)/libraries/*)) | |
| 167 | LIBRARIES := $(filter $(ARDUINOLIBSAVAIL), \ | |
| 168 | $(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 | 169 | |
| 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 | 
| 171 | ||
| 23
by edam added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types | 172 | # no serial device? make a poor attempt to detect an arduino | 
| 25
by edam added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error | 173 | SERIALDEVGUESS := 0 | 
| 174 | ifeq "$(SERIALDEV)" "" | |
| 175 | SERIALDEV := $(firstword $(wildcard \ | |
| 176 | /dev/ttyACM? /dev/ttyUSB? /dev/tty.usbmodem*)) | |
| 177 | SERIALDEVGUESS := 1 | |
| 23
by edam added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types | 178 | endif | 
| 179 | ||
| 180 | # software | |
| 181 | findsoftware = $(firstword $(wildcard $(addsuffix /$(1), $(AVRTOOLSPATH)))) | |
| 182 | CC := $(call findsoftware,avr-gcc) | |
| 183 | CXX := $(call findsoftware,avr-g++) | |
| 184 | LD := $(call findsoftware,avr-ld) | |
| 185 | AR := $(call findsoftware,avr-ar) | |
| 186 | OBJCOPY := $(call findsoftware,avr-objcopy) | |
| 187 | AVRDUDE := $(call findsoftware,avrdude) | |
| 188 | ||
| 1
by edam initial commit | 189 | # files | 
| 25
by edam added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error | 190 | TARGET := $(if $(TARGET),$(TARGET),a.out) | 
| 1
by edam initial commit | 191 | OBJECTS := $(addsuffix .o, $(basename $(SOURCES))) | 
| 192 | 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 | 193 | ARDUINOLIBSDIR := $(ARDUINODIR)/libraries | 
| 1
by edam initial commit | 194 | ARDUINOLIB := _arduino.a | 
| 14
by Dan search for software in ARDUINODIR; include library/*/utility code in core lib | 195 | ARDUINOLIBTMP := $(ARDUINOLIB).tmp | 
| 4
by edam added included-library autodetection and updated comments | 196 | ARDUINOLIBOBJS := $(patsubst %, $(ARDUINOLIBTMP)/%.o, $(basename $(notdir \ | 
| 197 | $(wildcard $(addprefix $(ARDUINOSRCDIR)/, *.c *.cpp))))) | |
| 198 | ARDUINOLIBOBJS += $(foreach lib, $(LIBRARIES), \ | |
| 199 | $(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 | 200 | $(wildcard $(addprefix $(ARDUINOLIBSDIR)/$(lib)/, *.c *.cpp)) \ | 
| 201 | $(wildcard $(addprefix $(ARDUINOLIBSDIR)/$(lib)/utility/, *.c *.cpp)) )))) | |
| 25
by edam added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error | 202 | ifeq "$(AVRDUDECONF)" "" | 
| 203 | ifeq "$(AVRDUDE)" "$(ARDUINODIR)/hardware/tools/avr/bin/avrdude" | |
| 204 | AVRDUDECONF := $(ARDUINODIR)/hardware/tools/avr/etc/avrdude.conf | |
| 205 | else | |
| 23
by edam added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types | 206 | AVRDUDECONF := $(wildcard $(AVRDUDE).conf) | 
| 25
by edam added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error | 207 | endif | 
| 208 | endif | |
| 209 | ||
| 210 | # no board? | |
| 211 | ifndef BOARD | |
| 212 | ifneq "$(MAKECMDGOALS)" "boards" | |
| 213 | ifneq "$(MAKECMDGOALS)" "clean" | |
| 214 | $(error BOARD is unset. Type 'make boards' to see possible values) | |
| 215 | endif | |
| 216 | endif | |
| 217 | endif | |
| 1
by edam initial commit | 218 | |
| 2
by edam fixed build (missing library), tested upload, and made the .elf file an intermediate file (the .hex file is now the target) | 219 | # obtain board parameters from the arduino boards.txt file | 
| 1
by edam initial commit | 220 | BOARDS_FILE := $(ARDUINODIR)/hardware/arduino/boards.txt | 
| 221 | BOARD_BUILD_MCU := \ | |
| 222 | $(shell sed -ne "s/$(BOARD).build.mcu=\(.*\)/\1/p" $(BOARDS_FILE)) | |
| 223 | BOARD_BUILD_FCPU := \ | |
| 224 | $(shell sed -ne "s/$(BOARD).build.f_cpu=\(.*\)/\1/p" $(BOARDS_FILE)) | |
| 225 | BOARD_BUILD_VARIANT := \ | |
| 226 | $(shell sed -ne "s/$(BOARD).build.variant=\(.*\)/\1/p" $(BOARDS_FILE)) | |
| 227 | BOARD_UPLOAD_SPEED := \ | |
| 228 | $(shell sed -ne "s/$(BOARD).upload.speed=\(.*\)/\1/p" $(BOARDS_FILE)) | |
| 229 | BOARD_UPLOAD_PROTOCOL := \ | |
| 230 | $(shell sed -ne "s/$(BOARD).upload.protocol=\(.*\)/\1/p" $(BOARDS_FILE)) | |
| 231 | ||
| 25
by edam added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error | 232 | # invalid board? | 
| 233 | ifeq "$(BOARD_BUILD_MCU)" "" | |
| 234 | ifneq "$(MAKECMDGOALS)" "boards" | |
| 235 | ifneq "$(MAKECMDGOALS)" "clean" | |
| 236 | $(error BOARD is invalid. Type 'make boards' to see possible values) | |
| 237 | endif | |
| 238 | endif | |
| 239 | endif | |
| 240 | ||
| 1
by edam initial commit | 241 | # flags | 
| 23
by edam added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types | 242 | CPPFLAGS := -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections | 
| 20
by edam add some signed and packing gcc options | 243 | CPPFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums | 
| 19
by edam added fixed arduino software version | 244 | CPPFLAGS += -mmcu=$(BOARD_BUILD_MCU) | 
| 23
by edam added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types | 245 | 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. | 246 | CPPFLAGS += -I. -Iutil -Iutility -I$(ARDUINOSRCDIR) | 
| 1
by edam initial commit | 247 | CPPFLAGS += -I$(ARDUINODIR)/hardware/arduino/variants/$(BOARD_BUILD_VARIANT)/ | 
| 9
by edam added "monitor" goal; documented boards and monitor goals | 248 | CPPFLAGS += $(addprefix -I$(ARDUINODIR)/libraries/, $(LIBRARIES)) | 
| 249 | CPPFLAGS += $(patsubst %, -I$(ARDUINODIR)/libraries/%/utility, $(LIBRARIES)) | |
| 23
by edam added ARDUINOCONST, AVRTOOLSPATH, detection of avrdude.conf and cleaned up make variable types | 250 | AVRDUDEFLAGS := $(addprefix -C , $(AVRDUDECONF)) -DV | 
| 1
by edam initial commit | 251 | AVRDUDEFLAGS += -p $(BOARD_BUILD_MCU) -P $(SERIALDEV) | 
| 252 | 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 | 253 | LINKFLAGS := -Os -Wl,--gc-sections -mmcu=$(BOARD_BUILD_MCU) | 
| 1
by edam initial commit | 254 | |
| 25
by edam added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error | 255 | # figure out which arg to use with stty | 
| 256 | STTYFARG := $(shell stty --help > /dev/null 2>&1 && echo -F || echo -f) | |
| 257 | ||
| 1
by edam initial commit | 258 | # default rule | 
| 259 | .DEFAULT_GOAL := all | |
| 260 | ||
| 261 | #_______________________________________________________________________________ | |
| 262 | # RULES | |
| 263 | ||
| 9
by edam added "monitor" goal; documented boards and monitor goals | 264 | .PHONY: all target upload clean boards monitor | 
| 1
by edam initial commit | 265 | |
| 266 | all: target upload | |
| 267 | ||
| 2
by edam fixed build (missing library), tested upload, and made the .elf file an intermediate file (the .hex file is now the target) | 268 | target: $(TARGET).hex | 
| 1
by edam initial commit | 269 | |
| 270 | upload: | |
| 13
by edam announce that we're uploading and error on SERIALDEV blank | 271 | @echo "\nUploading to board..." | 
| 272 | 	@test -n "$(SERIALDEV)" || { \
 | |
| 273 | echo "error: SERIALDEV could not be determined automatically." >&2; \ | |
| 274 | exit 1; } | |
| 27
by edam fixed test not returning 0 | 275 | 	@test 0 -eq $(SERIALDEVGUESS) || { \
 | 
| 25
by edam added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error | 276 | echo "*GUESSING* at serial device:" $(SERIALDEV); \ | 
| 277 | echo; } | |
| 278 | stty $(STTYFARG) $(SERIALDEV) hupcl | |
| 2
by edam fixed build (missing library), tested upload, and made the .elf file an intermediate file (the .hex file is now the target) | 279 | $(AVRDUDE) $(AVRDUDEFLAGS) -U flash:w:$(TARGET).hex:i | 
| 1
by edam initial commit | 280 | |
| 281 | clean: | |
| 282 | rm -f $(OBJECTS) | |
| 283 | rm -f $(TARGET).elf $(TARGET).hex $(ARDUINOLIB) *~ | |
| 284 | rm -rf $(ARDUINOLIBTMP) | |
| 285 | ||
| 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. | 286 | boards: | 
| 287 | @echo Available values for BOARD: | |
| 288 | @sed -ne '/^#/d;s/^\(.*\).name=\(.*\)/\1 \2/;T' \ | |
| 289 | 		-e 's/\(.\{12\}\) *\(.*\)/\1 \2/;p' $(BOARDS_FILE)
 | |
| 290 | ||
| 9
by edam added "monitor" goal; documented boards and monitor goals | 291 | monitor: | 
| 13
by edam announce that we're uploading and error on SERIALDEV blank | 292 | 	@test -n "$(SERIALDEV)" || { \
 | 
| 293 | echo "error: SERIALDEV could not be determined automatically." >&2; \ | |
| 294 | exit 1; } | |
| 16
by edam spellcheck, and added check for missing GNU screen | 295 | 	@test -n `which screen` || { \
 | 
| 296 | echo "error: can't find GNU screen, you might need to install it." >&2 \ | |
| 297 | ecit 1; } | |
| 27
by edam fixed test not returning 0 | 298 | 	@test 0 -eq $(SERIALDEVGUESS) || { \
 | 
| 25
by edam added AVRDUDECONF variable; fixed some OS X issues; added SERIALDEV guess warning and invalid BOARD value error | 299 | echo "*GUESSING* at serial device:" $(SERIALDEV); \ | 
| 300 | echo; } | |
| 9
by edam added "monitor" goal; documented boards and monitor goals | 301 | screen $(SERIALDEV) | 
| 302 | ||
| 1
by edam initial commit | 303 | # building the target | 
| 304 | ||
| 2
by edam fixed build (missing library), tested upload, and made the .elf file an intermediate file (the .hex file is now the target) | 305 | $(TARGET).hex: $(TARGET).elf | 
| 306 | $(OBJCOPY) -O ihex -R .eeprom $< $@ | |
| 307 | ||
| 308 | .INTERMEDIATE: $(TARGET).elf | |
| 309 | ||
| 1
by edam initial commit | 310 | $(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) | 311 | $(CC) $(LINKFLAGS) $(OBJECTS) $(ARDUINOLIB) -o $@ | 
| 1
by edam initial commit | 312 | |
| 313 | %.o: %.ino | |
| 314 | $(COMPILE.cpp) -o $@ -x c++ -include $(ARDUINOSRCDIR)/Arduino.h $< | |
| 315 | ||
| 316 | %.o: %.pde | |
| 317 | $(COMPILE.cpp) -o $@ -x c++ -include $(ARDUINOSRCDIR)/Arduino.h $< | |
| 318 | ||
| 319 | # building the arduino library | |
| 320 | ||
| 4
by edam added included-library autodetection and updated comments | 321 | $(ARDUINOLIB): $(ARDUINOLIBOBJS) | 
| 1
by edam initial commit | 322 | $(AR) rcs $@ $? | 
| 323 | rm -rf $(ARDUINOLIBTMP) | |
| 324 | ||
| 4
by edam added included-library autodetection and updated comments | 325 | .INTERMEDIATE: $(ARDUINOLIBOBJS) | 
| 1
by edam initial commit | 326 | |
| 327 | $(ARDUINOLIBTMP)/%.o: $(ARDUINOSRCDIR)/%.c | |
| 328 | @test -d $(ARDUINOLIBTMP) || mkdir $(ARDUINOLIBTMP) | |
| 329 | $(COMPILE.c) -o $@ $< | |
| 330 | ||
| 331 | $(ARDUINOLIBTMP)/%.o: $(ARDUINOSRCDIR)/%.cpp | |
| 332 | @test -d $(ARDUINOLIBTMP) || mkdir $(ARDUINOLIBTMP) | |
| 333 | $(COMPILE.cpp) -o $@ $< | |
| 4
by edam added included-library autodetection and updated comments | 334 | |
| 335 | $(ARDUINOLIBTMP)/%.o: $(ARDUINODIR)/libraries/*/%.c | |
| 336 | @test -d $(ARDUINOLIBTMP) || mkdir $(ARDUINOLIBTMP) | |
| 337 | $(COMPILE.c) -o $@ $< | |
| 338 | ||
| 339 | $(ARDUINOLIBTMP)/%.o: $(ARDUINODIR)/libraries/*/%.cpp | |
| 340 | @test -d $(ARDUINOLIBTMP) || mkdir $(ARDUINOLIBTMP) | |
| 341 | $(COMPILE.cpp) -o $@ $< | |
| 14
by Dan search for software in ARDUINODIR; include library/*/utility code in core lib | 342 | |
| 343 | $(ARDUINOLIBTMP)/%.o: $(ARDUINODIR)/libraries/*/utility/%.c | |
| 344 | @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 | 345 | $(COMPILE.c) -o $@ $< | 
| 14
by Dan search for software in ARDUINODIR; include library/*/utility code in core lib | 346 | |
| 347 | $(ARDUINOLIBTMP)/%.o: $(ARDUINODIR)/libraries/*/utility/%.cpp | |
| 348 | @test -d $(ARDUINOLIBTMP) || mkdir $(ARDUINOLIBTMP) | |
| 349 | $(COMPILE.cpp) -o $@ $< |