/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,
24
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25
# THE SOFTWARE.
26
#
27
#_______________________________________________________________________________
28
#
29
#
30
# This is a general purpose makefile for use with Arduino (arduino.cc)
31
# hardware and software.  It works with the arduino-1.0 release and
2 by edam
fixed build (missing library), tested upload, and made the .elf file an intermediate file (the .hex file is now the target)
32
# requires that to be downloaded separately.  It can be downloaded
33
# from http://ed.am/dev/make/arduino-makefile where you can also find
34
# more information and documentation on it's use.  The following text
35
# can only really be considered a reference to it's use.
1 by edam
initial commit
36
#
37
# There are two ways to use this file, an automatic mode and a manual
38
# mode.  In automatic mode, you simply copy this makefile to your
39
# arduino project directory, rename it "Makefile" and type make.  The
40
# project directory is expected to contain an .ino or .pde file, which
41
# will automatically be used automatically, along with any other .c,
42
# .cc or .cpp files in the project directory and any subdirectory
43
# named "utility".  In this way, this makefile should act as a drop-in
44
# replacement for the Arduino IDE's build process and can build a
45
# project automatically from the files in a project directory.
46
#
47
# Alternatively, you can manually specify what files should be
48
# inclided in a build.  To use this makefile manually, you might be
49
# better to keep it somewhere and include it in your project's
50
# Makefile after having defined certain parameters that control the
51
# build.  As an example, consider the following Makefile:
52
#
53
#       TARGET = my_program
54
#       SOURCES = main.cc foo.cc
55
#		BOARD = nano
56
#		SERIALDEV = /dev/ttyACM0
57
#       include ~/src/arduino.mk
58
#
59
# In both manual and automatic modes, the standard Arduino main.cpp's
60
# main() is included, which expects to be able to call init() and
61
# loop() in your code.  The main difference is that, in manual mode,
62
# these would typically be placed in a .cc or .cpp file.
63
#
64
# When using manual mode, the following variables can be used:
65
#
66
# TARGET       The name of the target file.  This is typically the same name
67
#              as the project directory for an arduino project and, if
68
#              unspecified, that is used as a default.
69
#
70
# SOURCES      A list of all source files of whatever language. The language
71
#              type is determined by the file extension.
72
#
73
# BOARD        Specify a target board type.  These are defined in boards.txt,
74
#              which came with your arduino installation.  If unspecified,
75
#              a default is used.  (See below).
76
#
77
# SERIALDEV    The unix device of the device where the arduino can be found.
78
#              If unspecified, a default is used.  (See below).
79
#
80
# This general-purpose makefile also defines the following goals for use on the
81
# command line when you run make:
82
#
83
# all          This is the default if no goal is specified. It builds the
84
#              target and uploads it.
85
#
86
# target       Builds the target of your Makefile.
87
#
88
# upload       Uploads the target to an attached arduino.
89
#
90
# clean        Deletes temporary files.
91
#
92
# <file>       Builds the specified file, either an object file or the target,
93
#              from those that that would be built for the project.
94
#
95
#_______________________________________________________________________________
96
#                                                                       SETTINGS
97
98
# The full path to the arduino software, from arduino.cc
99
ARDUINODIR := $(wildcard ~/opt/arduino-1.0)
100
101
# The board name to build for and upload to. For a complete list of available
102
# boards, see hardware/arduino/boards.txt in your arduino software directory.
103
# Here is a list of available boards at time of writing:
104
#   uno         Arduino Uno
105
#   atmega328   Arduino Duemilanove w/ ATmega328
106
#   diecimila   Arduino Diecimila or Duemilanove w/ ATmega168
107
#   nano328     Arduino Nano w/ ATmega328
108
#   nano        Arduino Nano w/ ATmega168
109
#   mega2560    Arduino Mega 2560 or Mega ADK
110
#   mega        Arduino Mega (ATmega1280)
111
#   mini328     Arduino Mini w/ ATmega328
112
#   mini        Arduino Mini w/ ATmega168
113
#   fio         Arduino Fio
114
#   bt328       Arduino BT w/ ATmega328
115
#   bt          Arduino BT w/ ATmega168
116
#   lilypad328  LilyPad Arduino w/ ATmega328
117
#   lilypad     LilyPad Arduino w/ ATmega168
118
#   pro5v328    Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328
119
#   pro5v       Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega168
120
#   pro328      Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328
121
#   pro         Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega168
122
#   atmega168   Arduino NG or older w/ ATmega168
123
#   atmega8     Arduino NG or older w/ ATmega8
124
ifndef BOARD
125
BOARD := nano
126
endif
127
128
# The name of the serial device that the arduino is at. For example,
129
# /dev/ttyACM0 (Uno), or /dev/ttyUSB0 (Duemilanove)
130
ifndef SERIALDEV
131
SERIALDEV := /dev/ttyACM0
132
endif
133
134
#_______________________________________________________________________________
135
#
136
137
# auto mode?
138
INOFILE := $(wildcard *.ino *.pde)
139
ifdef INOFILE
140
ifneq ($(words $(INOFILE)), 1)
141
$(error There is more than one .pde or .ino file in the directory!)
142
endif
143
TARGET := $(basename $(INOFILE))
144
SOURCES := $(INOFILE) \
145
	$(wildcard *.c *.cc *.cpp $(addprefix utility/, *.c *.cc *.cpp))
146
endif
147
148
# files
149
OBJECTS := $(addsuffix .o, $(basename $(SOURCES)))
150
ifdef INOFILE
151
OBJECT += main.o
152
endif
153
ARDUINOSRCDIR := $(ARDUINODIR)/hardware/arduino/cores/arduino
154
ARDUINOLIB := _arduino.a
155
ARDUINOLIBTMP := _arduino.a.tmp
3 by edam
minor optimisations
156
ARDUINOSOURCES := $(wildcard $(ARDUINOSRCDIR)/*.c $(ARDUINOSRCDIR)/*.cpp)
1 by edam
initial commit
157
ARDUINOOBJECTS := $(addsuffix .o, $(addprefix $(ARDUINOLIBTMP)/, $(basename \
3 by edam
minor optimisations
158
	$(notdir $(ARDUINOSOURCES)))))
1 by edam
initial commit
159
2 by edam
fixed build (missing library), tested upload, and made the .elf file an intermediate file (the .hex file is now the target)
160
# obtain board parameters from the arduino boards.txt file
1 by edam
initial commit
161
BOARDS_FILE := $(ARDUINODIR)/hardware/arduino/boards.txt
162
BOARD_BUILD_MCU := \
163
	$(shell sed -ne "s/$(BOARD).build.mcu=\(.*\)/\1/p" $(BOARDS_FILE))
164
BOARD_BUILD_FCPU := \
165
	$(shell sed -ne "s/$(BOARD).build.f_cpu=\(.*\)/\1/p" $(BOARDS_FILE))
166
BOARD_BUILD_VARIANT := \
167
	$(shell sed -ne "s/$(BOARD).build.variant=\(.*\)/\1/p" $(BOARDS_FILE))
168
BOARD_UPLOAD_SPEED := \
169
	$(shell sed -ne "s/$(BOARD).upload.speed=\(.*\)/\1/p" $(BOARDS_FILE))
170
BOARD_UPLOAD_PROTOCOL := \
171
	$(shell sed -ne "s/$(BOARD).upload.protocol=\(.*\)/\1/p" $(BOARDS_FILE))
172
173
# software
174
CC := avr-gcc
175
CXX := avr-g++
176
LD := avr-ld
177
AR := avr-ar
178
OBJCOPY := avr-objcopy
2 by edam
fixed build (missing library), tested upload, and made the .elf file an intermediate file (the .hex file is now the target)
179
AVRDUDE := avrdude
180
#$(ARDUINODIR)/hardware/tools/avrdude
1 by edam
initial commit
181
182
# flags
183
CPPFLAGS = -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections
184
CPPFLAGS += -mmcu=$(BOARD_BUILD_MCU) -DF_CPU=$(BOARD_BUILD_FCPU)
185
CPPFLAGS += -I. -Iutility -I$(ARDUINOSRCDIR)
186
CPPFLAGS += -I$(ARDUINODIR)/hardware/arduino/variants/$(BOARD_BUILD_VARIANT)/
2 by edam
fixed build (missing library), tested upload, and made the .elf file an intermediate file (the .hex file is now the target)
187
AVRDUDEFLAGS = -C $(ARDUINODIR)/hardware/tools/avrdude.conf -DV
1 by edam
initial commit
188
AVRDUDEFLAGS += -p $(BOARD_BUILD_MCU) -P $(SERIALDEV)
189
AVRDUDEFLAGS += -c $(BOARD_UPLOAD_PROTOCOL) -b $(BOARD_UPLOAD_SPEED)
2 by edam
fixed build (missing library), tested upload, and made the .elf file an intermediate file (the .hex file is now the target)
190
LINKFLAGS = -Os -Wl,--gc-sections -mmcu=$(BOARD_BUILD_MCU)
1 by edam
initial commit
191
192
# checks
193
ifeq ($(TARGET),)
194
$(error No target defined!)
195
endif
196
197
# default rule
198
.DEFAULT_GOAL := all
199
200
#_______________________________________________________________________________
201
#                                                                          RULES
202
203
.PHONY:	all target upload clean
204
205
all: target upload
206
2 by edam
fixed build (missing library), tested upload, and made the .elf file an intermediate file (the .hex file is now the target)
207
target: $(TARGET).hex
1 by edam
initial commit
208
209
upload:
210
	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)
211
	$(AVRDUDE) $(AVRDUDEFLAGS) -U flash:w:$(TARGET).hex:i
1 by edam
initial commit
212
213
clean:
214
	rm -f $(OBJECTS)
215
	rm -f $(TARGET).elf $(TARGET).hex $(ARDUINOLIB) *~
216
	rm -rf $(ARDUINOLIBTMP)
217
218
# building the target
219
2 by edam
fixed build (missing library), tested upload, and made the .elf file an intermediate file (the .hex file is now the target)
220
$(TARGET).hex: $(TARGET).elf
221
	$(OBJCOPY) -O ihex -R .eeprom $< $@
222
223
.INTERMEDIATE: $(TARGET).elf
224
1 by edam
initial commit
225
$(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)
226
	$(CC) $(LINKFLAGS) $(OBJECTS) $(ARDUINOLIB) -o $@
1 by edam
initial commit
227
228
%.o: %.ino
229
	$(COMPILE.cpp) -o $@ -x c++ -include $(ARDUINOSRCDIR)/Arduino.h $<
230
231
%.o: %.pde
232
	$(COMPILE.cpp) -o $@ -x c++ -include $(ARDUINOSRCDIR)/Arduino.h $<
233
234
# building the arduino library
235
236
$(ARDUINOLIB): $(ARDUINOOBJECTS)
237
	$(AR) rcs $@ $?
238
	rm -rf $(ARDUINOLIBTMP)
239
240
.INTERMEDIATE: $(ARDUINOOBJECTS)
241
242
$(ARDUINOLIBTMP)/%.o: $(ARDUINOSRCDIR)/%.c
243
	@test -d $(ARDUINOLIBTMP) || mkdir $(ARDUINOLIBTMP)
244
	$(COMPILE.c) -o $@ $<
245
246
$(ARDUINOLIBTMP)/%.o: $(ARDUINOSRCDIR)/%.cpp
247
	@test -d $(ARDUINOLIBTMP) || mkdir $(ARDUINOLIBTMP)
248
	$(COMPILE.cpp) -o $@ $<