summaryrefslogtreecommitdiff
path: root/datasources/arduino/arduinoAnalogSerial/Arduino.mk
diff options
context:
space:
mode:
Diffstat (limited to 'datasources/arduino/arduinoAnalogSerial/Arduino.mk')
-rwxr-xr-xdatasources/arduino/arduinoAnalogSerial/Arduino.mk720
1 files changed, 720 insertions, 0 deletions
diff --git a/datasources/arduino/arduinoAnalogSerial/Arduino.mk b/datasources/arduino/arduinoAnalogSerial/Arduino.mk
new file mode 100755
index 0000000..09819ac
--- /dev/null
+++ b/datasources/arduino/arduinoAnalogSerial/Arduino.mk
@@ -0,0 +1,720 @@
+########################################################################
+#
+# Arduino command line tools Makefile
+# System part (i.e. project independent)
+#
+# Copyright (C) 2010,2011,2012 Martin Oldfield <m@mjo.tc>, based on
+# work that is copyright Nicholas Zambetti, David A. Mellis & Hernando
+# Barragan.
+#
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation; either version 2.1 of the
+# License, or (at your option) any later version.
+#
+# Adapted from Arduino 0011 Makefile by M J Oldfield
+#
+# Original Arduino adaptation by mellis, eighthave, oli.keller
+#
+# Version 0.1 17.ii.2009 M J Oldfield
+#
+# 0.2 22.ii.2009 M J Oldfield
+# - fixes so that the Makefile actually works!
+# - support for uploading via ISP
+# - orthogonal choices of using the Arduino for
+# tools, libraries and uploading
+#
+# 0.3 21.v.2010 M J Oldfield
+# - added proper license statement
+# - added code from Philip Hands to reset
+# Arduino prior to upload
+#
+# 0.4 25.v.2010 M J Oldfield
+# - tweaked reset target on Philip Hands' advice
+#
+# 0.5 23.iii.2011 Stefan Tomanek
+# - added ad-hoc library building
+# 17.v.2011 M J Oldfield
+# - grabbed said version from Ubuntu
+#
+# 0.6 22.vi.2011 M J Oldfield
+# - added ard-parse-boards supports
+# - added -lc to linker opts,
+# on Fabien Le Lez's advice
+#
+# 0.7 12.vii.2011 M J Oldfield
+# - moved -lm to the end of linker opts,
+# to solve Frank Knopf's problem;
+# - added -F to stty opts: Craig Hollabaugh
+# reckons it's good for Ubuntu
+#
+# 0.8 12.ii.2012 M J Oldfield
+# - Patches for Arduino 1.0 IDE:
+# support .ino files;
+# handle board 'variants';
+# tweaked compile flags.
+# - Build a library from all the system
+# supplied code rather than linking the .o
+# files directly.
+# - Let TARGET default to current directory
+# as per Daniele Vergini's patch.
+# - Add support for .c files in system
+# libraries: Dirk-Willem van Gulik and Evan
+# Goldenberg both reported this and
+# provided patches in the same spirit.
+#
+# 0.9 26.iv.2012 M J Oldfield
+# - Allow the punter to specify boards.txt
+# file and parser independently (after
+# Peplin and Brotchie on github)
+# - Support user libraries (Peplin's patch)
+# - Remove main.cpp if NO_CORE_MAIN_CPP is
+# defined (ex Peplin)
+# - Added a monitor target which talks to the
+# Arduino serial port (Peplin's suggestion)
+# - Rejigged PATH calculations for general
+# tidiness (ex Peplin)
+# - Moved the reset target to Perl for
+# clarity and better error handling (ex
+# Daniele Vergini)
+#
+# 0.10 17.ix.12 M J Oldfield
+# - Added installation notes for Fedora (ex Rickard Lindberg).
+# - Changed size target so that it looks at the ELF object,
+# not the hexfile (ex Jared Szechy and Scott Howard).
+# - Fixed ARDUNIO typo in README.md (ex Kalin Kozhuharov).
+# - Tweaked OBJDIR handling (ex Matthias Urlichs and Scott Howard).
+# - Changed the name of the Debian/Ubuntu package (ex
+# Scott Howard).
+# - Only set AVRDUDE_CONF if it's not set (ex Tom Hall).
+# - Added support for USB_PID/VID used by the Leonardo (ex Dan
+# Villiom Podlaski Christiansen and Marc Plano-Lesay).
+#
+########################################################################
+#
+# PATHS YOU NEED TO SET UP
+#
+# I've reworked the way paths to executables are constructed in this
+# version (0.9) of the Makefile.
+#
+# We need to worry about three different sorts of file:
+#
+# 1. Things which are included in this distribution e.g. ard-parse-boards
+# => ARDMK_DIR
+#
+# 2. Things which are always in the Arduino distribution e.g.
+# boards.txt, libraries, &c.
+# => ARDUINO_DIR
+#
+# 3. Things which might be bundled with the Arduino distribution, but
+# might come from the system. Most of the toolchain is like this:
+# on Linux it's supplied by the system.
+# => AVR_TOOLS_DIR
+#
+# Having set these three variables, we can work out the rest assuming
+# that things are canonically arranged beneath the directories defined
+# above.
+#
+# On the Mac you might want to set:
+#
+# ARDUINO_DIR = /Applications/Arduino.app/Contents/Resources/Java
+# ARDMK_DIR = /usr/local
+#
+# On Linux, you might prefer:
+#
+# ARDUINO_DIR = /usr/share/arduino
+# ARDMK_DIR = /usr/local
+# AVR_TOOLS_DIR = /usr
+#
+# You can either set these up in the Makefile, or put them in your
+# environment e.g. in your .bashrc
+#
+# If you don't install the ard-... binaries to /usr/local/bin, but
+# instead copy them to e.g. /home/mjo/arduino.mk/bin then set
+# ARDML_DIR = /home/mjo/arduino.mk
+#
+########################################################################
+#
+# DEPENDENCIES
+#
+# The Perl programs need a couple of libraries:
+# YAML
+# Device::SerialPort
+#
+########################################################################
+#
+# STANDARD ARDUINO WORKFLOW
+#
+# Given a normal sketch directory, all you need to do is to create
+# a small Makefile which defines a few things, and then includes this one.
+#
+# For example:
+#
+# ARDUINO_LIBS = Ethernet Ethernet/utility SPI
+# BOARD_TAG = uno
+# ARDUINO_PORT = /dev/cu.usb*
+#
+# include /usr/local/share/Arduino.mk
+#
+# Hopefully these will be self-explanatory but in case they're not:
+#
+# ARDUINO_LIBS - A list of any libraries used by the sketch (we
+# assume these are in
+# $(ARDUINO_DIR)/hardware/libraries
+#
+# ARDUINO_PORT - The port where the Arduino can be found (only needed
+# when uploading
+#
+# BOARD_TAG - The ard-parse-boards tag for the board e.g. uno or mega
+# 'make show_boards' shows a list
+#
+# Once this file has been created the typical workflow is just
+#
+# $ make upload
+#
+# All of the object files are created in the build-cli subdirectory
+# All sources should be in the current directory and can include:
+# - at most one .pde or .ino file which will be treated as C++ after
+# the standard Arduino header and footer have been affixed.
+# - any number of .c, .cpp, .s and .h files
+#
+# Included libraries are built in the build-cli/libs subdirectory.
+#
+# Besides make upload you can also
+# make - no upload
+# make clean - remove all our dependencies
+# make depends - update dependencies
+# make reset - reset the Arduino by tickling DTR on the serial port
+# make raw_upload - upload without first resetting
+# make show_boards - list all the boards defined in boards.txt
+# make monitor - connect to the Arduino's serial port
+#
+########################################################################
+#
+# SERIAL MONITOR
+#
+# The serial monitor just invokes the GNU screen program with suitable
+# options. For more information see screen (1) and search for
+# 'character special device'.
+#
+# The really useful thing to know is that ^A-k gets you out!
+#
+# The fairly useful thing to know is that you can bind another key to
+# escape too, by creating $HOME{.screenrc} containing e.g.
+#
+# bindkey ^C kill
+#
+# If you want to change the baudrate, just set MONITOR_BAUDRATE. If you
+# don't set it, it defaults to 9600 baud.
+#
+########################################################################
+#
+# PATHS
+#
+# I've reworked the way paths to executables are constructed in this
+# version of Makefile.
+#
+# We need to worry about three different sorts of file:
+#
+# 1. Things which are included in this distribution e.g. ard-parse-boards
+# => ARDMK_DIR
+#
+# 2. Things which are always in the Arduino distribution e.g.
+# boards.txt, libraries, &c.
+# => ARDUINO_DIR
+#
+# 3. Things which might be bundled with the Arduino distribution, but
+# might come from the system. Most of the toolchain is like this:
+# on Linux it's supplied by the system.
+# => AVR_TOOLS_DIR
+#
+# Having set these three variables, we can work out the rest assuming
+# that things are canonically arranged beneath the directories defined
+# above.
+#
+# So, on the Mac you might want to set:
+#
+# ARDUINO_DIR = /Applications/Arduino.app/Contents/Resources/Java
+# ARDMK_DIR = /usr/local
+#
+# On Linux, you might prefer:
+#
+# ARDUINO_DIR = /usr/share/arduino
+# ARDMK_DIR = /usr/local
+# AVR_TOOLS_DIR = /usr
+#
+#
+#
+#
+########################################################################
+#
+# ARDUINO WITH ISP
+#
+# You need to specify some details of your ISP programmer and might
+# also need to specify the fuse values:
+#
+# ISP_PROG = -c stk500v2
+# ISP_PORT = /dev/ttyACM0
+#
+# You might also need to set the fuse bits, but typically they'll be
+# read from boards.txt, based on the BOARD_TAG variable:
+#
+# ISP_LOCK_FUSE_PRE = 0x3f
+# ISP_LOCK_FUSE_POST = 0xcf
+# ISP_HIGH_FUSE = 0xdf
+# ISP_LOW_FUSE = 0xff
+# ISP_EXT_FUSE = 0x01
+#
+# I think the fuses here are fine for uploading to the ATmega168
+# without bootloader.
+#
+# To actually do this upload use the ispload target:
+#
+# make ispload
+#
+#
+########################################################################
+
+########################################################################
+#
+# Default TARGET to cwd (ex Daniele Vergini)
+ifndef TARGET
+TARGET = $(notdir $(CURDIR))
+endif
+
+########################################################################
+
+#
+# Arduino version number
+ifndef ARDUINO_VERSION
+ARDUINO_VERSION = 100
+endif
+
+########################################################################
+# Arduino and system paths
+#
+ifdef ARDUINO_DIR
+
+ifndef AVR_TOOLS_DIR
+AVR_TOOLS_DIR = $(ARDUINO_DIR)/hardware/tools/avr
+# The avrdude bundled with Arduino can't find its config
+ifndef AVRDUDE_CONF
+AVRDUDE_CONF = $(AVR_TOOLS_DIR)/etc/avrdude.conf
+endif
+endif
+
+ifndef AVR_TOOLS_PATH
+AVR_TOOLS_PATH = $(AVR_TOOLS_DIR)/bin
+endif
+
+ARDUINO_LIB_PATH = $(ARDUINO_DIR)/libraries
+ARDUINO_CORE_PATH = $(ARDUINO_DIR)/hardware/arduino/cores/arduino
+ARDUINO_VAR_PATH = $(ARDUINO_DIR)/hardware/arduino/variants
+
+else
+
+echo $(error "ARDUINO_DIR is not defined")
+
+endif
+
+########################################################################
+# Makefile distribution path
+#
+ifdef ARDMK_DIR
+
+ifndef ARDMK_PATH
+ARDMK_PATH = $(ARDMK_DIR)/bin
+endif
+
+else
+
+echo $(error "ARDMK_DIR is not defined")
+
+endif
+
+########################################################################
+# Miscellanea
+#
+ifndef ARDUINO_SKETCHBOOK
+ARDUINO_SKETCHBOOK = $(HOME)/sketchbook
+endif
+
+ifndef USER_LIB_PATH
+USER_LIB_PATH = $(ARDUINO_SKETCHBOOK)/libraries
+endif
+
+########################################################################
+# Serial monitor (just a screen wrapper)
+#
+# Quite how to construct the monitor command seems intimately tied
+# to the command we're using (here screen). So, read the screen docs
+# for more information (search for 'character special device').
+#
+ifndef MONITOR_BAUDRATE
+MONITOR_BAUDRATE = 9600
+endif
+
+ifndef MONITOR_CMD
+MONITOR_CMD = screen
+endif
+
+########################################################################
+# Reset
+ifndef RESET_CMD
+RESET_CMD = $(ARDMK_PATH)/ard-reset-arduino $(ARD_RESET_OPTS)
+endif
+
+########################################################################
+# boards.txt parsing
+#
+ifndef BOARD_TAG
+BOARD_TAG = uno
+endif
+
+ifndef BOARDS_TXT
+BOARDS_TXT = $(ARDUINO_DIR)/hardware/arduino/boards.txt
+endif
+
+ifndef PARSE_BOARD
+PARSE_BOARD = $(ARDMK_PATH)/ard-parse-boards
+endif
+
+ifndef PARSE_BOARD_OPTS
+PARSE_BOARD_OPTS = --boards_txt=$(BOARDS_TXT)
+endif
+
+ifndef PARSE_BOARD_CMD
+PARSE_BOARD_CMD = $(PARSE_BOARD) $(PARSE_BOARD_OPTS)
+endif
+
+# Which variant ? This affects the include path
+ifndef VARIANT
+VARIANT = $(shell $(PARSE_BOARD_CMD) $(BOARD_TAG) build.variant)
+endif
+
+# processor stuff
+ifndef MCU
+MCU = $(shell $(PARSE_BOARD_CMD) $(BOARD_TAG) build.mcu)
+endif
+
+ifndef F_CPU
+F_CPU = $(shell $(PARSE_BOARD_CMD) $(BOARD_TAG) build.f_cpu)
+endif
+
+# USB IDs for the Leonardo
+ifndef USB_VID
+USB_VID = $(shell $(PARSE_BOARD_CMD) $(BOARD_TAG) build.vid)
+endif
+
+ifndef USB_PID
+USB_PID = $(shell $(PARSE_BOARD_CMD) $(BOARD_TAG) build.pid)
+endif
+
+# normal programming info
+ifndef AVRDUDE_ARD_PROGRAMMER
+AVRDUDE_ARD_PROGRAMMER = $(shell $(PARSE_BOARD_CMD) $(BOARD_TAG) upload.protocol)
+endif
+
+ifndef AVRDUDE_ARD_BAUDRATE
+AVRDUDE_ARD_BAUDRATE = $(shell $(PARSE_BOARD_CMD) $(BOARD_TAG) upload.speed)
+endif
+
+# fuses if you're using e.g. ISP
+ifndef ISP_LOCK_FUSE_PRE
+ISP_LOCK_FUSE_PRE = $(shell $(PARSE_BOARD_CMD) $(BOARD_TAG) bootloader.unlock_bits)
+endif
+
+ifndef ISP_LOCK_FUSE_POST
+ISP_LOCK_FUSE_POST = $(shell $(PARSE_BOARD_CMD) $(BOARD_TAG) bootloader.lock_bits)
+endif
+
+ifndef ISP_HIGH_FUSE
+ISP_HIGH_FUSE = $(shell $(PARSE_BOARD_CMD) $(BOARD_TAG) bootloader.high_fuses)
+endif
+
+ifndef ISP_LOW_FUSE
+ISP_LOW_FUSE = $(shell $(PARSE_BOARD_CMD) $(BOARD_TAG) bootloader.low_fuses)
+endif
+
+ifndef ISP_EXT_FUSE
+ISP_EXT_FUSE = $(shell $(PARSE_BOARD_CMD) $(BOARD_TAG) bootloader.extended_fuses)
+endif
+
+# Everything gets built in here (include BOARD_TAG now)
+ifndef OBJDIR
+OBJDIR = build-$(BOARD_TAG)
+endif
+
+########################################################################
+# Local sources
+#
+LOCAL_C_SRCS = $(wildcard *.c)
+LOCAL_CPP_SRCS = $(wildcard *.cpp)
+LOCAL_CC_SRCS = $(wildcard *.cc)
+LOCAL_PDE_SRCS = $(wildcard *.pde)
+LOCAL_INO_SRCS = $(wildcard *.ino)
+LOCAL_AS_SRCS = $(wildcard *.S)
+LOCAL_OBJ_FILES = $(LOCAL_C_SRCS:.c=.o) $(LOCAL_CPP_SRCS:.cpp=.o) \
+ $(LOCAL_CC_SRCS:.cc=.o) $(LOCAL_PDE_SRCS:.pde=.o) \
+ $(LOCAL_INO_SRCS:.ino=.o) $(LOCAL_AS_SRCS:.S=.o)
+LOCAL_OBJS = $(patsubst %,$(OBJDIR)/%,$(LOCAL_OBJ_FILES))
+
+# Dependency files
+DEPS = $(LOCAL_OBJS:.o=.d)
+
+# core sources
+ifeq ($(strip $(NO_CORE)),)
+ifdef ARDUINO_CORE_PATH
+CORE_C_SRCS = $(wildcard $(ARDUINO_CORE_PATH)/*.c)
+CORE_CPP_SRCS = $(wildcard $(ARDUINO_CORE_PATH)/*.cpp)
+
+ifneq ($(strip $(NO_CORE_MAIN_CPP)),)
+CORE_CPP_SRCS := $(filter-out %main.cpp, $(CORE_CPP_SRCS))
+endif
+
+CORE_OBJ_FILES = $(CORE_C_SRCS:.c=.o) $(CORE_CPP_SRCS:.cpp=.o)
+CORE_OBJS = $(patsubst $(ARDUINO_CORE_PATH)/%, \
+ $(OBJDIR)/%,$(CORE_OBJ_FILES))
+endif
+endif
+
+
+########################################################################
+# Rules for making stuff
+#
+
+# The name of the main targets
+TARGET_HEX = $(OBJDIR)/$(TARGET).hex
+TARGET_ELF = $(OBJDIR)/$(TARGET).elf
+TARGETS = $(OBJDIR)/$(TARGET).*
+CORE_LIB = $(OBJDIR)/libcore.a
+
+# A list of dependencies
+DEP_FILE = $(OBJDIR)/depends.mk
+
+# Names of executables
+CC = $(AVR_TOOLS_PATH)/avr-gcc
+CXX = $(AVR_TOOLS_PATH)/avr-g++
+OBJCOPY = $(AVR_TOOLS_PATH)/avr-objcopy
+OBJDUMP = $(AVR_TOOLS_PATH)/avr-objdump
+AR = $(AVR_TOOLS_PATH)/avr-ar
+SIZE = $(AVR_TOOLS_PATH)/avr-size
+NM = $(AVR_TOOLS_PATH)/avr-nm
+REMOVE = rm -f
+MV = mv -f
+CAT = cat
+ECHO = echo
+
+# General arguments
+SYS_LIBS = $(patsubst %,$(ARDUINO_LIB_PATH)/%,$(ARDUINO_LIBS))
+USER_LIBS = $(patsubst %,$(USER_LIB_PATH)/%,$(ARDUINO_LIBS))
+SYS_INCLUDES = $(patsubst %,-I%,$(SYS_LIBS))
+USER_INCLUDES = $(patsubst %,-I%,$(USER_LIBS))
+LIB_C_SRCS = $(wildcard $(patsubst %,%/*.c,$(SYS_LIBS)))
+LIB_CPP_SRCS = $(wildcard $(patsubst %,%/*.cpp,$(SYS_LIBS)))
+USER_LIB_CPP_SRCS = $(wildcard $(patsubst %,%/*.cpp,$(USER_LIBS)))
+USER_LIB_C_SRCS = $(wildcard $(patsubst %,%/*.c,$(USER_LIBS)))
+LIB_OBJS = $(patsubst $(ARDUINO_LIB_PATH)/%.c,$(OBJDIR)/libs/%.o,$(LIB_C_SRCS)) \
+ $(patsubst $(ARDUINO_LIB_PATH)/%.cpp,$(OBJDIR)/libs/%.o,$(LIB_CPP_SRCS))
+USER_LIB_OBJS = $(patsubst $(USER_LIB_PATH)/%.cpp,$(OBJDIR)/libs/%.o,$(USER_LIB_CPP_SRCS)) \
+ $(patsubst $(USER_LIB_PATH)/%.c,$(OBJDIR)/libs/%.o,$(USER_LIB_C_SRCS))
+
+CPPFLAGS = -mmcu=$(MCU) -DF_CPU=$(F_CPU) -DARDUINO=$(ARDUINO_VERSION) \
+ -I. -I$(ARDUINO_CORE_PATH) -I$(ARDUINO_VAR_PATH)/$(VARIANT) \
+ $(SYS_INCLUDES) $(USER_INCLUDES) -g -Os -w -Wall \
+ -DUSB_VID=$(USB_VID) -DUSB_PID=$(USB_PID) \
+ -ffunction-sections -fdata-sections
+
+CFLAGS = -std=gnu99
+CXXFLAGS = -fno-exceptions
+ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp
+LDFLAGS = -mmcu=$(MCU) -Wl,--gc-sections -Os
+
+# Expand and pick the first port
+ARD_PORT = $(firstword $(wildcard $(ARDUINO_PORT)))
+
+# Implicit rules for building everything (needed to get everything in
+# the right directory)
+#
+# Rather than mess around with VPATH there are quasi-duplicate rules
+# here for building e.g. a system C++ file and a local C++
+# file. Besides making things simpler now, this would also make it
+# easy to change the build options in future
+
+# library sources
+$(OBJDIR)/libs/%.o: $(ARDUINO_LIB_PATH)/%.c
+ mkdir -p $(dir $@)
+ $(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@
+
+$(OBJDIR)/libs/%.o: $(ARDUINO_LIB_PATH)/%.cpp
+ mkdir -p $(dir $@)
+ $(CC) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@
+
+$(OBJDIR)/libs/%.o: $(USER_LIB_PATH)/%.cpp
+ mkdir -p $(dir $@)
+ $(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@
+
+$(OBJDIR)/libs/%.o: $(USER_LIB_PATH)/%.c
+ mkdir -p $(dir $@)
+ $(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@
+
+# normal local sources
+# .o rules are for objects, .d for dependency tracking
+# there seems to be an awful lot of duplication here!!!
+$(OBJDIR)/%.o: %.c
+ $(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@
+
+$(OBJDIR)/%.o: %.cc
+ $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@
+
+$(OBJDIR)/%.o: %.cpp
+ $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@
+
+$(OBJDIR)/%.o: %.S
+ $(CC) -c $(CPPFLAGS) $(ASFLAGS) $< -o $@
+
+$(OBJDIR)/%.o: %.s
+ $(CC) -c $(CPPFLAGS) $(ASFLAGS) $< -o $@
+
+$(OBJDIR)/%.d: %.c
+ $(CC) -MM $(CPPFLAGS) $(CFLAGS) $< -MF $@ -MT $(@:.d=.o)
+
+$(OBJDIR)/%.d: %.cc
+ $(CXX) -MM $(CPPFLAGS) $(CXXFLAGS) $< -MF $@ -MT $(@:.d=.o)
+
+$(OBJDIR)/%.d: %.cpp
+ $(CXX) -MM $(CPPFLAGS) $(CXXFLAGS) $< -MF $@ -MT $(@:.d=.o)
+
+$(OBJDIR)/%.d: %.S
+ $(CC) -MM $(CPPFLAGS) $(ASFLAGS) $< -MF $@ -MT $(@:.d=.o)
+
+$(OBJDIR)/%.d: %.s
+ $(CC) -MM $(CPPFLAGS) $(ASFLAGS) $< -MF $@ -MT $(@:.d=.o)
+
+# the pde -> cpp -> o file
+$(OBJDIR)/%.cpp: %.pde
+ $(ECHO) '#include "WProgram.h"' > $@
+ $(CAT) $< >> $@
+
+# the ino -> cpp -> o file
+$(OBJDIR)/%.cpp: %.ino
+ $(ECHO) '#include <Arduino.h>' > $@
+ $(CAT) $< >> $@
+
+$(OBJDIR)/%.o: $(OBJDIR)/%.cpp
+ $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@
+
+$(OBJDIR)/%.d: $(OBJDIR)/%.cpp
+ $(CXX) -MM $(CPPFLAGS) $(CXXFLAGS) $< -MF $@ -MT $(@:.d=.o)
+
+# core files
+$(OBJDIR)/%.o: $(ARDUINO_CORE_PATH)/%.c
+ $(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@
+
+$(OBJDIR)/%.o: $(ARDUINO_CORE_PATH)/%.cpp
+ $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@
+
+# various object conversions
+$(OBJDIR)/%.hex: $(OBJDIR)/%.elf
+ $(OBJCOPY) -O ihex -R .eeprom $< $@
+
+$(OBJDIR)/%.eep: $(OBJDIR)/%.elf
+ -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
+ --change-section-lma .eeprom=0 -O ihex $< $@
+
+$(OBJDIR)/%.lss: $(OBJDIR)/%.elf
+ $(OBJDUMP) -h -S $< > $@
+
+$(OBJDIR)/%.sym: $(OBJDIR)/%.elf
+ $(NM) -n $< > $@
+
+########################################################################
+#
+# Avrdude
+#
+ifndef AVRDUDE
+AVRDUDE = $(AVR_TOOLS_PATH)/avrdude
+endif
+
+AVRDUDE_COM_OPTS = -q -V -p $(MCU)
+ifdef AVRDUDE_CONF
+AVRDUDE_COM_OPTS += -C $(AVRDUDE_CONF)
+endif
+
+AVRDUDE_ARD_OPTS = -c $(AVRDUDE_ARD_PROGRAMMER) -b $(AVRDUDE_ARD_BAUDRATE) -P $(ARD_PORT)
+
+ifndef ISP_PROG
+ISP_PROG = -c stk500v2
+endif
+
+AVRDUDE_ISP_OPTS = -P $(ISP_PORT) $(ISP_PROG)
+
+
+########################################################################
+#
+# Explicit targets start here
+#
+
+all: $(OBJDIR) $(TARGET_HEX)
+
+$(OBJDIR):
+ mkdir $(OBJDIR)
+
+$(TARGET_ELF): $(LOCAL_OBJS) $(CORE_LIB) $(OTHER_OBJS)
+ $(CC) $(LDFLAGS) -o $@ $(LOCAL_OBJS) $(CORE_LIB) $(OTHER_OBJS) -lc -lm
+
+$(CORE_LIB): $(CORE_OBJS) $(LIB_OBJS) $(USER_LIB_OBJS)
+ $(AR) rcs $@ $(CORE_OBJS) $(LIB_OBJS) $(USER_LIB_OBJS)
+
+$(DEP_FILE): $(OBJDIR) $(DEPS)
+ cat $(DEPS) > $(DEP_FILE)
+
+upload: reset raw_upload
+
+raw_upload: $(TARGET_HEX)
+ $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ARD_OPTS) \
+ -U flash:w:$(TARGET_HEX):i
+
+reset:
+ $(RESET_CMD) $(ARD_PORT)
+
+# stty on MacOS likes -F, but on Debian it likes -f redirecting
+# stdin/out appears to work but generates a spurious error on MacOS at
+# least. Perhaps it would be better to just do it in perl ?
+reset_stty:
+ for STTYF in 'stty -F' 'stty --file' 'stty -f' 'stty <' ; \
+ do $$STTYF /dev/tty >/dev/null 2>/dev/null && break ; \
+ done ;\
+ $$STTYF $(ARD_PORT) hupcl ;\
+ (sleep 0.1 || sleep 1) ;\
+ $$STTYF $(ARD_PORT) -hupcl
+
+ispload: $(TARGET_HEX)
+ $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ISP_OPTS) -e \
+ -U lock:w:$(ISP_LOCK_FUSE_PRE):m \
+ -U hfuse:w:$(ISP_HIGH_FUSE):m \
+ -U lfuse:w:$(ISP_LOW_FUSE):m \
+ -U efuse:w:$(ISP_EXT_FUSE):m
+ $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ISP_OPTS) -D \
+ -U flash:w:$(TARGET_HEX):i
+ $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ISP_OPTS) \
+ -U lock:w:$(ISP_LOCK_FUSE_POST):m
+
+clean:
+ $(REMOVE) $(LOCAL_OBJS) $(CORE_OBJS) $(LIB_OBJS) $(CORE_LIB) $(TARGETS) $(DEP_FILE) $(DEPS) $(USER_LIB_OBJS)
+
+depends: $(DEPS)
+ cat $(DEPS) > $(DEP_FILE)
+
+size: $(OBJDIR) $(TARGET_ELF)
+ $(SIZE) -C --mcu=$(MCU) $(TARGET_ELF)
+
+show_boards:
+ $(PARSE_BOARD_CMD) --boards
+
+monitor:
+ $(MONITOR_CMD) $(ARD_PORT) $(MONITOR_BAUDRATE)
+
+.PHONY: all clean depends upload raw_upload reset reset_stty size show_boards monitor
+
+include $(DEP_FILE)