2012-02-28 09:06:56 +00:00
########################################################################
#
2013-05-31 09:42:44 +05:30
# Makefile for compiling Arduino sketches from command line
2012-02-28 09:06:56 +00:00
# System part (i.e. project independent)
#
2012-07-06 12:12:43 +05:30
# Copyright (C) 2012 Sudar <http://sudarmuthu.com>, based on
2014-02-04 17:54:46 +05:30
# M J Oldfield work: https://github.com/mjoldfield/Arduino-Makefile
2012-07-06 12:12:43 +05:30
#
2012-02-28 09:06:56 +00:00
# Copyright (C) 2010,2011,2012 Martin Oldfield <m@mjo.tc>, based on
# work that is copyright Nicholas Zambetti, David A. Mellis & Hernando
# Barragan.
2012-07-05 12:45:52 -05:00
#
2012-02-28 09:06:56 +00:00
# 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
#
2014-07-12 21:00:51 +05:30
# Current version: 1.3.4
2013-05-31 09:29:36 +05:30
#
# Refer to HISTORY.md file for complete history of changes
2012-11-17 22:18:56 +01:00
#
2012-07-14 12:21:54 +05:30
########################################################################
#
# PATHS YOU NEED TO SET UP
#
# We need to worry about three different sorts of file:
#
2014-01-13 12:14:31 +00:00
# 1. The directory where the *.mk files are stored
# => ARDMK_DIR
2012-07-14 12:21:54 +05:30
#
# 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
2014-02-04 17:54:46 +05:30
# ARDMK_DIR = /usr/share/arduino
2012-07-14 12:21:54 +05:30
# AVR_TOOLS_DIR = /usr
#
2014-04-11 15:13:42 +02:00
# On Windows declare this environmental variables using the windows
# configuration options. Control Panel > System > Advanced system settings
# Also take into account that when you set them you have to add '\' on
# all spaces and special characters.
# ARDUINO_DIR and AVR_TOOLS_DIR have to be relative and not absolute.
# This are just examples, you have to adapt this variables accordingly to
# your system.
#
# ARDUINO_DIR =../../../../../Arduino
# AVR_TOOLS_DIR =../../../../../Arduino/hardware/tools/avr
# ARDMK_DIR = /cygdrive/c/Users/"YourUser"/Arduino-Makefile
#
# On Windows it is highly recommended that you create a symbolic link directory
# for avoiding using the normal directories name of windows such as
# c:\Program Files (x86)\Arduino
# For this use the command mklink on the console.
#
#
2012-07-14 12:21:54 +05:30
# You can either set these up in the Makefile, or put them in your
# environment e.g. in your .bashrc
#
# If you don't specify these, we can try to guess, but that might not work
# or work the way you want it to.
#
2012-11-01 10:33:46 -05:00
# If you'd rather not see the configuration output, define ARDUINO_QUIET.
#
2012-04-29 18:55:17 +01:00
########################################################################
#
# DEPENDENCIES
#
# The Perl programs need a couple of libraries:
# Device::SerialPort
2012-04-26 23:11:25 +01:00
#
2012-02-28 09:06:56 +00:00
########################################################################
#
# 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:
#
2013-06-22 11:48:26 +05:30
# ARDUINO_LIBS = Ethernet SPI
2012-02-28 09:06:56 +00:00
# BOARD_TAG = uno
2013-07-09 19:34:08 -04:00
# MONITOR_PORT = /dev/cu.usb*
2012-02-28 09:06:56 +00:00
#
2013-07-11 21:10:40 +05:30
# include /usr/share/arduino/Arduino.mk
2012-02-28 09:06:56 +00:00
#
# Hopefully these will be self-explanatory but in case they're not:
#
# ARDUINO_LIBS - A list of any libraries used by the sketch (we
2012-07-05 12:58:05 -05:00
# assume these are in $(ARDUINO_DIR)/hardware/libraries
# or your sketchbook's libraries directory)
2012-02-28 09:06:56 +00:00
#
2013-07-09 19:34:08 -04:00
# MONITOR_PORT - The port where the Arduino can be found (only needed
2012-07-05 12:57:32 -05:00
# when uploading)
2012-02-28 09:06:56 +00:00
#
2013-07-02 17:57:57 -04:00
# BOARD_TAG - The tag for the board e.g. uno or mega
2012-02-28 09:06:56 +00:00
# 'make show_boards' shows a list
#
2012-07-05 12:58:32 -05:00
# If you have your additional libraries relative to your source, rather
# than in your "sketchbook", also set USER_LIB_PATH, like this example:
#
# USER_LIB_PATH := $(realpath ../../libraries)
#
# If you've added the Arduino-Makefile repository to your git repo as a
# submodule (or other similar arrangement), you might have lines like this
# in your Makefile:
#
# ARDMK_DIR := $(realpath ../../tools/Arduino-Makefile)
2014-01-13 12:14:31 +00:00
# include $(ARDMK_DIR)/Arduino.mk
2012-07-05 12:58:32 -05:00
#
# In any case, once this file has been created the typical workflow is just
2012-02-28 09:06:56 +00:00
#
# $ make upload
#
2013-06-12 12:47:34 +05:30
# All of the object files are created in the build-{BOARD_TAG} subdirectory
2012-02-28 09:06:56 +00:00
# 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
#
2013-06-12 12:47:34 +05:30
# Included libraries are built in the build-{BOARD_TAG}/libs subdirectory.
2012-02-28 09:06:56 +00:00
#
2013-09-18 16:38:58 +05:30
# Besides make upload, there are a couple of other targets that are available.
# Do make help to get the complete list of targets and their description
2012-04-29 12:06:41 +01:00
#
########################################################################
#
# SERIAL MONITOR
#
# The serial monitor just invokes the GNU screen program with suitable
2012-07-05 12:45:52 -05:00
# options. For more information see screen (1) and search for
2012-04-29 12:06:41 +01:00
# '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
2012-08-18 23:36:40 -07:00
# don't set it, it tries to read from the sketch. If it couldn't read
2012-07-15 13:25:45 +05:30
# from the sketch, then it defaults to 9600 baud.
2012-02-28 09:06:56 +00:00
#
########################################################################
#
# ARDUINO WITH ISP
#
# You need to specify some details of your ISP programmer and might
# also need to specify the fuse values:
#
2013-06-12 12:47:34 +05:30
# ISP_PROG = stk500v2
2012-02-28 09:06:56 +00:00
# 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:
2012-07-05 12:45:52 -05:00
#
2012-02-28 09:06:56 +00:00
# ISP_LOCK_FUSE_PRE = 0x3f
# ISP_LOCK_FUSE_POST = 0xcf
# ISP_HIGH_FUSE = 0xdf
# ISP_LOW_FUSE = 0xff
# ISP_EXT_FUSE = 0x01
#
2012-12-16 17:06:23 +01:00
# You can specify to also upload the EEPROM file:
# ISP_EEPROM = 1
#
2012-02-28 09:06:56 +00:00
# I think the fuses here are fine for uploading to the ATmega168
# without bootloader.
2012-07-05 12:45:52 -05:00
#
2012-02-28 09:06:56 +00:00
# To actually do this upload use the ispload target:
#
# make ispload
#
#
########################################################################
2013-08-18 19:55:37 +02:00
#
# ALTERNATIVE CORES
#
# To use alternative cores for platforms such as ATtiny, you need to
# specify a few more variables, depending on the core in use.
#
# The HLT (attiny-master) core can be used just by specifying
# ALTERNATE_CORE, assuming your core is in your ~/sketchbook/hardware
# directory. For example:
#
2014-02-04 17:54:46 +05:30
# ISP_PORT = /dev/ttyACM0
# BOARD_TAG = attiny85
# ALTERNATE_CORE = attiny-master
2013-08-18 19:55:37 +02:00
#
# To use the more complex arduino-tiny and TinyCore2 cores, you must
# also set ARDUINO_CORE_PATH and ARDUINO_VAR_PATH to the core
# directory, as these cores essentially replace the main Arduino core.
# For example:
#
# ISP_PORT = /dev/ttyACM0
# BOARD_TAG = attiny85at8
# ALTERNATE_CORE = arduino-tiny
# ARDUINO_VAR_PATH = ~/sketchbook/hardware/arduino-tiny/cores/tiny
# ARDUINO_CORE_PATH = ~/sketchbook/hardware/arduino-tiny/cores/tiny
#
# or....
#
# ISP_PORT = /dev/ttyACM0
# BOARD_TAG = attiny861at8
# ALTERNATE_CORE = tiny2
# ARDUINO_VAR_PATH = ~/sketchbook/hardware/tiny2/cores/tiny
# ARDUINO_CORE_PATH = ~/sketchbook/hardware/tiny2/cores/tiny
#
########################################################################
2012-07-05 13:58:54 -05:00
2013-05-30 16:09:05 +02:00
arduino_output =
# When output is not suppressed and we're in the top-level makefile,
# running for the first time (i.e., not after a restart after
# regenerating the dependency file), then output the configuration.
2012-11-01 10:33:46 -05:00
i f n d e f A R D U I N O _ Q U I E T
2013-05-30 16:09:05 +02:00
ifeq ( $( MAKE_RESTARTS) ,)
ifeq ( $( MAKELEVEL) ,0)
arduino_output = $( info $( 1) )
endif
endif
2012-11-01 10:33:46 -05:00
e n d i f
2013-07-02 17:28:54 -04:00
########################################################################
# Makefile distribution path
2012-07-05 15:01:11 -05:00
2013-07-02 17:28:54 -04:00
i f n d e f A R D M K _ D I R
2014-01-13 12:14:31 +00:00
# presume it's the same path to our own file
ARDMK_DIR := $( realpath $( dir $( realpath $( lastword $( MAKEFILE_LIST) ) ) ) )
2013-06-29 16:49:38 +05:30
e l s e
2014-01-13 12:14:31 +00:00
# show_config_variable macro is defined in Common.mk file and is not available yet.
2013-07-26 18:47:46 +05:30
# Let's define a variable to know that user specified ARDMK_DIR
ARDMK_DIR_MSG = USER
2013-06-29 16:49:38 +05:30
e n d i f
2013-07-02 17:28:54 -04:00
2014-01-13 12:14:31 +00:00
# include Common.mk now we know where it is
i n c l u d e $( ARDMK_DIR ) / C o m m o n . m k
2013-06-29 16:49:38 +05:30
2013-07-26 18:47:46 +05:30
# show_config_variable macro is available now. So let's print config details for ARDMK_DIR
i f n d e f A R D M K _ D I R _ M S G
$( call show_config_variable,ARDMK_DIR,[ COMPUTED] ,( relative to $( notdir $( lastword $( MAKEFILE_LIST) ) ) ) )
e l s e
$( call show_config_variable,ARDMK_DIR,[ USER] )
e n d i f
2013-06-29 16:49:38 +05:30
########################################################################
# Arduino Directory
2013-09-18 16:30:16 +05:30
2012-06-28 18:28:22 -05:00
i f n d e f A R D U I N O _ D I R
2012-07-05 14:39:32 -05:00
AUTO_ARDUINO_DIR := $( firstword \
$( call dir_if_exists,/usr/share/arduino) \
$( call dir_if_exists,/Applications/Arduino.app/Contents/Resources/Java) )
ifdef AUTO_ARDUINO_DIR
ARDUINO_DIR = $( AUTO_ARDUINO_DIR)
2012-07-05 15:01:11 -05:00
$( call show_config_variable,ARDUINO_DIR,[ AUTODETECTED] )
2013-06-23 13:16:37 +05:30
else
echo $( error "ARDUINO_DIR is not defined" )
2012-07-05 14:04:35 -05:00
endif
2012-07-05 13:58:54 -05:00
e l s e
2013-06-09 17:13:04 +05:30
$( call show_config_variable,ARDUINO_DIR,[ USER] )
2012-06-28 18:28:22 -05:00
e n d i f
2012-07-14 12:21:54 +05:30
2014-05-19 22:09:00 +01:00
i f e q ( $( CURRENT_OS ) , W I N D O W S )
ifneq ( $( shell echo $( ARDUINO_DIR) | egrep '^(/|[a-zA-Z]:\\)' ) ,)
echo $( error On Windows, ARDUINO_DIR must be a relative path)
endif
e n d i f
2012-02-28 09:06:56 +00:00
########################################################################
2013-06-06 07:56:08 +05:30
# Default TARGET to pwd (ex Daniele Vergini)
2013-09-18 16:30:16 +05:30
2012-02-28 09:06:56 +00:00
i f n d e f T A R G E T
2012-07-05 14:04:35 -05:00
TARGET = $( notdir $( CURDIR) )
2012-02-28 09:06:56 +00:00
e n d i f
########################################################################
# Arduino version number
2013-09-18 16:30:16 +05:30
2012-02-28 09:06:56 +00:00
i f n d e f A R D U I N O _ V E R S I O N
2012-07-05 14:04:35 -05:00
# Remove all the decimals, and right-pad with zeros, and finally grab the first 3 bytes.
# Works for 1.0 and 1.0.1
2013-05-30 16:23:32 +02:00
VERSION_FILE := $( ARDUINO_DIR) /lib/version.txt
2014-06-29 00:14:18 +02:00
AUTO_ARDUINO_VERSION := $( shell [ -e " $( VERSION_FILE) " ] && cat " $( VERSION_FILE) " | sed -e 's/^[0-9]://g' -e 's/[.]//g' -e 's/$$/0000/' | head -c3)
2012-07-05 14:04:35 -05:00
ifdef AUTO_ARDUINO_VERSION
ARDUINO_VERSION = $( AUTO_ARDUINO_VERSION)
2012-07-05 15:01:11 -05:00
$( call show_config_variable,ARDUINO_VERSION,[ AUTODETECTED] )
2012-07-05 14:04:35 -05:00
else
ARDUINO_VERSION = 100
2012-07-05 15:01:11 -05:00
$( call show_config_variable,ARDUINO_VERSION,[ DEFAULT] )
2012-07-05 14:04:35 -05:00
endif
2012-07-05 12:29:33 -05:00
e l s e
2013-06-09 17:13:04 +05:30
$( call show_config_variable,ARDUINO_VERSION,[ USER] )
2012-02-28 09:06:56 +00:00
e n d i f
2014-06-01 17:14:38 +01:00
########################################################################
# 1.5.x architecture - avr or sam for arduino vendor
i f n d e f A R C H I T E C T U R E
ifeq ( $( shell expr $( ARDUINO_VERSION) '>' 150) , 1)
# default to avr for 1.5
ARCHITECTURE = avr
else
# unset for 1.0
ARCHITECTURE =
endif
$( call show_config_variable,ARCHITECTURE,[ DEFAULT] )
e l s e
$( call show_config_variable,ARCHITECTURE,[ USER] )
e n d i f
########################################################################
# 1.5.x vendor - defaults to arduino
i f n d e f V E N D O R
VENDOR = arduino
$( call show_config_variable,VENDOR,[ DEFAULT] )
e l s e
$( call show_config_variable,VENDOR,[ USER] )
e n d i f
2013-06-23 13:08:06 +05:30
########################################################################
# Arduino Sketchbook folder
2013-07-02 17:28:54 -04:00
2013-07-09 16:50:19 -04:00
i f n d e f A R D U I N O _ S K E T C H B O O K
ifndef ARDUINO_PREFERENCES_PATH
2013-06-23 13:08:06 +05:30
2013-07-09 16:50:19 -04:00
AUTO_ARDUINO_PREFERENCES := $( firstword \
$( call dir_if_exists,$( HOME) /.arduino/preferences.txt) \
$( call dir_if_exists,$( HOME) /Library/Arduino/preferences.txt) )
ifdef AUTO_ARDUINO_PREFERENCES
ARDUINO_PREFERENCES_PATH = $( AUTO_ARDUINO_PREFERENCES)
$( call show_config_variable,ARDUINO_PREFERENCES_PATH,[ AUTODETECTED] )
endif
2013-07-02 17:28:54 -04:00
2013-07-09 16:50:19 -04:00
else
$( call show_config_variable,ARDUINO_PREFERENCES_PATH,[ USER] )
2013-06-23 13:08:06 +05:30
endif
2013-07-09 16:50:19 -04:00
ifneq ( $( ARDUINO_PREFERENCES_PATH) ,)
ARDUINO_SKETCHBOOK = $( shell grep --max-count= 1 --regexp= "sketchbook.path=" \
2014-06-29 00:14:18 +02:00
" $( ARDUINO_PREFERENCES_PATH) " | \
2013-07-09 16:50:19 -04:00
sed -e 's/sketchbook.path=//' )
endif
2013-07-02 17:28:54 -04:00
2013-06-23 13:08:06 +05:30
ifneq ( $( ARDUINO_SKETCHBOOK) ,)
$( call show_config_variable,ARDUINO_SKETCHBOOK,[ AUTODETECTED] ,( from arduino preferences file) )
else
ARDUINO_SKETCHBOOK = $( HOME) /sketchbook
$( call show_config_variable,ARDUINO_SKETCHBOOK,[ DEFAULT] )
endif
e l s e
2013-12-17 09:15:33 +00:00
$( call show_config_variable,ARDUINO_SKETCHBOOK,[ USER] )
2013-06-23 13:08:06 +05:30
e n d i f
2012-04-29 18:55:17 +01:00
########################################################################
# Arduino and system paths
2013-07-02 17:28:54 -04:00
i f n d e f C C _ N A M E
CC_NAME = avr-gcc
e n d i f
i f n d e f C X X _ N A M E
CXX_NAME = avr-g++
e n d i f
i f n d e f O B J C O P Y _ N A M E
OBJCOPY_NAME = avr-objcopy
e n d i f
i f n d e f O B J D U M P _ N A M E
OBJDUMP_NAME = avr-objdump
e n d i f
i f n d e f A R _ N A M E
AR_NAME = avr-ar
e n d i f
i f n d e f S I Z E _ N A M E
SIZE_NAME = avr-size
e n d i f
i f n d e f N M _ N A M E
NM_NAME = avr-nm
e n d i f
2013-06-23 13:16:37 +05:30
i f n d e f A V R _ T O O L S _ D I R
2012-02-28 09:06:56 +00:00
2014-02-01 00:41:00 +00:00
BUNDLED_AVR_TOOLS_DIR := $( call dir_if_exists,$( ARDUINO_DIR) /hardware/tools/avr)
2014-01-22 11:50:24 -05:00
2013-06-23 13:16:37 +05:30
ifdef BUNDLED_AVR_TOOLS_DIR
AVR_TOOLS_DIR = $( BUNDLED_AVR_TOOLS_DIR)
2013-06-29 16:43:52 +05:30
$( call show_config_variable,AVR_TOOLS_DIR,[ BUNDLED] ,( in Arduino distribution) )
2013-06-29 21:40:36 +05:30
# In Linux distribution of Arduino, the path to avrdude and avrdude.conf are different
2013-07-02 17:28:54 -04:00
# More details at https://github.com/sudar/Arduino-Makefile/issues/48 and
2013-06-29 21:40:36 +05:30
# https://groups.google.com/a/arduino.cc/d/msg/developers/D_m97jGr8Xs/uQTt28KO_8oJ
ifeq ( $( CURRENT_OS) ,LINUX)
ifndef AVRDUDE
AVRDUDE = $( AVR_TOOLS_DIR) /../avrdude
endif
ifndef AVRDUDE_CONF
AVRDUDE_CONF = $( AVR_TOOLS_DIR) /../avrdude.conf
endif
2013-07-02 17:28:54 -04:00
2013-06-29 21:40:36 +05:30
else
ifndef AVRDUDE_CONF
AVRDUDE_CONF = $( AVR_TOOLS_DIR) /etc/avrdude.conf
endif
endif
2013-06-23 13:16:37 +05:30
else
2012-06-28 18:32:23 -05:00
2013-07-02 17:28:54 -04:00
SYSTEMPATH_AVR_TOOLS_DIR := $( call dir_if_exists,$( abspath $( dir $( shell which $( CC_NAME) ) ) /..) )
2013-06-23 13:16:37 +05:30
ifdef SYSTEMPATH_AVR_TOOLS_DIR
2013-07-02 17:28:54 -04:00
AVR_TOOLS_DIR = $( SYSTEMPATH_AVR_TOOLS_DIR)
2013-06-23 13:16:37 +05:30
$( call show_config_variable,AVR_TOOLS_DIR,[ AUTODETECTED] ,( found in $$ PATH) )
2013-07-02 17:28:54 -04:00
else
echo $( error No AVR tools directory found)
2013-06-23 13:16:37 +05:30
endif # SYSTEMPATH_AVR_TOOLS_DIR
2012-02-28 09:06:56 +00:00
2013-06-23 13:16:37 +05:30
endif # BUNDLED_AVR_TOOLS_DIR
2012-06-28 18:32:23 -05:00
2013-06-23 13:16:37 +05:30
e l s e
$( call show_config_variable,AVR_TOOLS_DIR,[ USER] )
2014-04-11 15:13:42 +02:00
# Check in Windows as Cygwin is being used, that the configuration file for the AVRDUDE is set
# Check if it works on MAC
ifeq ( $( CURRENT_OS) ,WINDOWS)
ifndef AVRDUDE_CONF
AVRDUDE_CONF = $( AVR_TOOLS_DIR) /etc/avrdude.conf
endif
endif
2013-06-23 13:16:37 +05:30
e n d i f #ndef AVR_TOOLS_DIR
2012-02-28 09:06:56 +00:00
2013-06-29 21:40:36 +05:30
i f n d e f A V R _ T O O L S _ P A T H
AVR_TOOLS_PATH = $( AVR_TOOLS_DIR) /bin
e n d i f
2013-06-23 13:16:37 +05:30
ARDUINO_LIB_PATH = $( ARDUINO_DIR) /libraries
$( call show_config_variable ,ARDUINO_LIB_PATH ,[COMPUTED ],( from ARDUINO_DIR ) )
2013-07-02 17:28:54 -04:00
i f n d e f A R D U I N O _ C O R E _ P A T H
2014-06-01 17:14:38 +01:00
ARDUINO_CORE_PATH = $( ARDUINO_DIR) /hardware/$( VENDOR) /$( ARCHITECTURE) /cores/arduino
2013-07-02 17:28:54 -04:00
$( call show_config_variable,ARDUINO_CORE_PATH,[ DEFAULT] )
e l s e
$( call show_config_variable,ARDUINO_CORE_PATH,[ USER] )
e n d i f
2012-04-29 18:55:17 +01:00
2013-06-23 13:16:37 +05:30
# Third party hardware and core like ATtiny or ATmega 16
i f d e f A L T E R N A T E _ C O R E
$( call show_config_variable,ALTERNATE_CORE,[ USER] )
2013-06-23 13:08:06 +05:30
2013-06-23 13:16:37 +05:30
ifndef ALTERNATE_CORE_PATH
ALTERNATE_CORE_PATH = $( ARDUINO_SKETCHBOOK) /hardware/$( ALTERNATE_CORE)
2013-06-23 13:08:06 +05:30
endif
2013-06-23 13:16:37 +05:30
e n d i f
2013-06-23 13:08:06 +05:30
2013-06-23 13:16:37 +05:30
i f d e f A L T E R N A T E _ C O R E _ P A T H
2013-06-23 13:08:06 +05:30
2013-06-23 13:16:37 +05:30
ifdef ALTERNATE_CORE
$( call show_config_variable,ALTERNATE_CORE_PATH,[ COMPUTED] , ( from ARDUINO_SKETCHBOOK and ALTERNATE_CORE) )
else
$( call show_config_variable,ALTERNATE_CORE_PATH,[ USER] )
endif
2013-06-23 13:08:06 +05:30
2013-06-23 13:16:37 +05:30
ifndef ARDUINO_VAR_PATH
ARDUINO_VAR_PATH = $( ALTERNATE_CORE_PATH) /variants
$( call show_config_variable,ARDUINO_VAR_PATH,[ COMPUTED] ,( from ALTERNATE_CORE_PATH) )
endif
2013-06-23 13:08:06 +05:30
2013-06-23 13:16:37 +05:30
ifndef BOARDS_TXT
BOARDS_TXT = $( ALTERNATE_CORE_PATH) /boards.txt
$( call show_config_variable,BOARDS_TXT,[ COMPUTED] ,( from ALTERNATE_CORE_PATH) )
endif
2013-06-23 13:08:06 +05:30
2013-06-23 13:16:37 +05:30
e l s e
2013-06-23 13:08:06 +05:30
2013-06-23 13:16:37 +05:30
ifndef ARDUINO_VAR_PATH
2014-06-01 17:14:38 +01:00
ARDUINO_VAR_PATH = $( ARDUINO_DIR) /hardware/$( VENDOR) /$( ARCHITECTURE) /variants
2013-06-23 13:16:37 +05:30
$( call show_config_variable,ARDUINO_VAR_PATH,[ COMPUTED] ,( from ARDUINO_DIR) )
else
$( call show_config_variable,ARDUINO_VAR_PATH,[ USER] )
endif
2013-06-23 13:08:06 +05:30
2013-06-23 13:16:37 +05:30
ifndef BOARDS_TXT
2014-06-01 17:14:38 +01:00
BOARDS_TXT = $( ARDUINO_DIR) /hardware/$( VENDOR) /$( ARCHITECTURE) /boards.txt
2013-06-23 13:16:37 +05:30
$( call show_config_variable,BOARDS_TXT,[ COMPUTED] ,( from ARDUINO_DIR) )
else
$( call show_config_variable,BOARDS_TXT,[ USER] )
2013-06-02 21:33:42 +05:30
endif
2012-04-29 18:55:17 +01:00
2012-02-28 09:06:56 +00:00
e n d i f
2012-04-29 18:55:17 +01:00
########################################################################
2013-05-31 17:43:00 +05:30
# Miscellaneous
2013-09-18 16:30:16 +05:30
2012-03-25 23:54:21 -04:00
i f n d e f U S E R _ L I B _ P A T H
2012-07-05 14:04:35 -05:00
USER_LIB_PATH = $( ARDUINO_SKETCHBOOK) /libraries
2012-07-05 15:01:11 -05:00
$( call show_config_variable,USER_LIB_PATH,[ DEFAULT] ,( in user sketchbook) )
2012-07-05 13:58:54 -05:00
e l s e
2013-06-09 17:13:04 +05:30
$( call show_config_variable,USER_LIB_PATH,[ USER] )
2012-03-25 23:54:21 -04:00
e n d i f
2014-03-14 10:42:35 +11:00
i f n d e f P R E _ B U I L D _ H O O K
PRE_BUILD_HOOK = pre-build-hook.sh
$( call show_config_variable,PRE_BUILD_HOOK,[ DEFAULT] )
e l s e
$( call show_config_variable,PRE_BUILD_HOOK,[ USER] )
e n d i f
2012-02-28 09:06:56 +00:00
########################################################################
# boards.txt parsing
2013-09-18 16:30:16 +05:30
2014-06-01 17:14:38 +01:00
i f d e f B O A R D _ S U B
BOARD_SUB := $( strip $( BOARD_SUB) )
$( call show_config_variable,BOARD_SUB,[ USER] )
e n d i f
2012-02-28 09:06:56 +00:00
i f n d e f B O A R D _ T A G
2012-07-05 14:04:35 -05:00
BOARD_TAG = uno
2012-07-05 15:01:11 -05:00
$( call show_config_variable,BOARD_TAG,[ DEFAULT] )
2012-07-05 13:58:54 -05:00
e l s e
2013-06-15 15:32:27 +05:30
# Strip the board tag of any extra whitespace, since it was causing the makefile to fail
# https://github.com/sudar/Arduino-Makefile/issues/57
BOARD_TAG := $( strip $( BOARD_TAG) )
2013-06-09 17:13:04 +05:30
$( call show_config_variable,BOARD_TAG,[ USER] )
2012-02-28 09:06:56 +00:00
e n d i f
i f n d e f P A R S E _ B O A R D
2013-07-02 17:57:57 -04:00
# result = $(call READ_BOARD_TXT, 'boardname', 'parameter')
2014-06-29 00:14:18 +02:00
PARSE_BOARD = $( shell grep -v "^\#" " $( BOARDS_TXT) " | grep $( 1) .$( 2) | cut -d = -f 2 )
2012-04-26 23:11:25 +01:00
e n d i f
2013-06-15 19:30:39 +05:30
# If NO_CORE is set, then we don't have to parse boards.txt file
# But the user might have to define MCU, F_CPU etc
i f e q ( $( strip $ ( NO_CORE ) ) , )
2012-02-28 09:06:56 +00:00
2013-06-15 19:30:39 +05:30
# Which variant ? This affects the include path
ifndef VARIANT
2013-07-02 17:57:57 -04:00
VARIANT = $( call PARSE_BOARD,$( BOARD_TAG) ,build.variant)
2013-06-15 19:30:39 +05:30
endif
2012-02-28 09:06:56 +00:00
2013-07-03 00:18:29 +02:00
# see if we are a caterina device like leonardo or micro
2014-06-01 17:14:38 +01:00
CATERINA := $( findstring caterina,$( call PARSE_BOARD,$( BOARD_TAG) ,bootloader.path) )
ifndef CATERINA
# bootloader.path is deprecated in 1.5, its now part of bootloader.file
CATERINA := $( findstring caterina,$( call PARSE_BOARD,$( BOARD_TAG) ,bootloader.file) )
endif
ifndef CATERINA
# might be a submenu
CATERINA := $( findstring caterina,$( call PARSE_BOARD,$( BOARD_TAG) ,menu.cpu.$( BOARD_SUB) .bootloader.file) )
endif
2013-07-03 00:18:29 +02:00
2013-06-15 19:30:39 +05:30
# processor stuff
ifndef MCU
2014-06-01 17:14:38 +01:00
MCU := $( call PARSE_BOARD,$( BOARD_TAG) ,build.mcu)
ifndef MCU
# might be a submenu
MCU := $( call PARSE_BOARD,$( BOARD_TAG) ,menu.cpu.$( BOARD_SUB) .build.mcu)
endif
2013-06-15 19:30:39 +05:30
endif
2012-02-28 09:06:56 +00:00
2013-06-15 19:30:39 +05:30
ifndef F_CPU
2014-06-01 17:14:38 +01:00
F_CPU := $( call PARSE_BOARD,$( BOARD_TAG) ,build.f_cpu)
ifndef F_CPU
# might be a submenu
F_CPU := $( call PARSE_BOARD,$( BOARD_TAG) ,menu.cpu.$( BOARD_SUB) .build.f_cpu)
endif
2013-06-02 21:33:42 +05:30
endif
2012-09-17 17:06:48 +01:00
2013-07-03 00:18:29 +02:00
ifneq ( $( CATERINA) ,)
2013-07-09 22:10:46 +05:30
# USB IDs for the caterina devices like leonardo or micro
2013-06-15 19:30:39 +05:30
ifndef USB_VID
2013-07-02 17:57:57 -04:00
USB_VID = $( call PARSE_BOARD,$( BOARD_TAG) ,build.vid)
2013-06-15 19:30:39 +05:30
endif
ifndef USB_PID
2013-07-02 17:57:57 -04:00
USB_PID = $( call PARSE_BOARD,$( BOARD_TAG) ,build.pid)
2013-06-15 19:30:39 +05:30
endif
2013-06-02 21:33:42 +05:30
endif
2012-09-17 17:06:48 +01:00
2013-06-15 19:30:39 +05:30
# normal programming info
ifndef AVRDUDE_ARD_PROGRAMMER
2014-06-01 17:14:38 +01:00
AVRDUDE_ARD_PROGRAMMER := $( call PARSE_BOARD,$( BOARD_TAG) ,upload.protocol)
ifndef AVRDUDE_ARD_PROGRAMMER
# might be a submenu
AVRDUDE_ARD_PROGRAMMER := $( call PARSE_BOARD,$( BOARD_TAG) ,menu.cpu.$( BOARD_SUB) .upload.protocol)
endif
2013-06-15 19:30:39 +05:30
endif
2012-02-28 09:06:56 +00:00
2013-06-15 19:30:39 +05:30
ifndef AVRDUDE_ARD_BAUDRATE
2014-06-01 17:14:38 +01:00
AVRDUDE_ARD_BAUDRATE := $( call PARSE_BOARD,$( BOARD_TAG) ,upload.speed)
ifndef AVRDUDE_ARD_BAUDRATE
# might be a submenu
AVRDUDE_ARD_BAUDRATE := $( call PARSE_BOARD,$( BOARD_TAG) ,menu.cpu.$( BOARD_SUB) .upload.speed)
endif
2013-06-15 19:30:39 +05:30
endif
2012-02-28 09:06:56 +00:00
2013-06-15 19:30:39 +05:30
# fuses if you're using e.g. ISP
ifndef ISP_LOCK_FUSE_PRE
2013-07-02 17:57:57 -04:00
ISP_LOCK_FUSE_PRE = $( call PARSE_BOARD,$( BOARD_TAG) ,bootloader.unlock_bits)
2013-06-15 19:30:39 +05:30
endif
2012-02-28 09:06:56 +00:00
2013-06-15 19:30:39 +05:30
ifndef ISP_HIGH_FUSE
2014-06-01 17:14:38 +01:00
ISP_HIGH_FUSE := $( call PARSE_BOARD,$( BOARD_TAG) ,bootloader.high_fuses)
ifndef ISP_HIGH_FUSE
# might be a submenu
ISP_HIGH_FUSE := $( call PARSE_BOARD,$( BOARD_TAG) ,menu.cpu.$( BOARD_SUB) .bootloader.high_fuses)
endif
2013-06-15 19:30:39 +05:30
endif
2012-02-28 09:06:56 +00:00
2013-06-15 19:30:39 +05:30
ifndef ISP_LOW_FUSE
2014-06-01 17:14:38 +01:00
ISP_LOW_FUSE := $( call PARSE_BOARD,$( BOARD_TAG) ,bootloader.low_fuses)
ifndef ISP_LOW_FUSE
# might be a submenu
ISP_LOW_FUSE := $( call PARSE_BOARD,$( BOARD_TAG) ,menu.cpu.$( BOARD_SUB) .bootloader.low_fuses)
endif
2013-06-15 19:30:39 +05:30
endif
2012-02-28 09:06:56 +00:00
2013-06-15 19:30:39 +05:30
ifndef ISP_EXT_FUSE
2014-06-01 17:14:38 +01:00
ISP_EXT_FUSE := $( call PARSE_BOARD,$( BOARD_TAG) ,bootloader.extended_fuses)
ifndef ISP_EXT_FUSE
# might be a submenu
ISP_EXT_FUSE := $( call PARSE_BOARD,$( BOARD_TAG) ,menu.cpu.$( BOARD_SUB) .bootloader.extended_fuses)
endif
2013-06-15 19:30:39 +05:30
endif
2013-10-06 19:10:29 +05:30
ifndef BOOTLOADER_PATH
BOOTLOADER_PATH = $( call PARSE_BOARD,$( BOARD_TAG) ,bootloader.path)
endif
ifndef BOOTLOADER_FILE
2014-06-01 17:14:38 +01:00
BOOTLOADER_FILE := $( call PARSE_BOARD,$( BOARD_TAG) ,bootloader.file)
ifndef BOOTLOADER_FILE
# might be a submenu
BOOTLOADER_FILE := $( call PARSE_BOARD,$( BOARD_TAG) ,menu.cpu.$( BOARD_SUB) .bootloader.file)
endif
2013-10-06 19:10:29 +05:30
endif
2013-06-15 19:30:39 +05:30
ifndef ISP_LOCK_FUSE_POST
2013-07-02 17:57:57 -04:00
ISP_LOCK_FUSE_POST = $( call PARSE_BOARD,$( BOARD_TAG) ,bootloader.lock_bits)
2013-06-15 19:30:39 +05:30
endif
ifndef HEX_MAXIMUM_SIZE
2014-06-01 17:14:38 +01:00
HEX_MAXIMUM_SIZE := $( call PARSE_BOARD,$( BOARD_TAG) ,upload.maximum_size)
ifndef HEX_MAXIMUM_SIZE
# might be a submenu
HEX_MAXIMUM_SIZE := $( call PARSE_BOARD,$( BOARD_TAG) ,menu.cpu.$( BOARD_SUB) .upload.maximum_size)
endif
2013-06-15 19:30:39 +05:30
endif
2012-02-28 09:06:56 +00:00
e n d i f
2012-09-17 16:29:31 +01:00
# Everything gets built in here (include BOARD_TAG now)
2012-09-17 16:25:21 +01:00
i f n d e f O B J D I R
2013-06-15 19:30:39 +05:30
OBJDIR = build-$( BOARD_TAG)
2013-06-20 21:32:35 +05:30
$( call show_config_variable,OBJDIR,[ COMPUTED] ,( from BOARD_TAG) )
e l s e
$( call show_config_variable,OBJDIR,[ USER] )
2012-11-12 21:34:51 -02:00
e n d i f
2012-02-28 09:06:56 +00:00
2013-07-03 09:29:34 +02:00
########################################################################
# Reset
2013-09-18 16:30:16 +05:30
2013-07-03 09:29:34 +02:00
i f n d e f R E S E T _ C M D
2014-01-28 09:27:49 -05:00
ARD_RESET_ARDUINO := $( shell which ard-reset-arduino 2> /dev/null)
2014-01-13 12:14:31 +00:00
ifndef ARD_RESET_ARDUINO
# same level as *.mk in bin directory when checked out from git
# or in $PATH when packaged
ARD_RESET_ARDUINO = $( ARDMK_DIR) /bin/ard-reset-arduino
endif
2013-07-03 09:29:34 +02:00
ifneq ( $( CATERINA) ,)
2014-01-13 12:14:31 +00:00
RESET_CMD = $( ARD_RESET_ARDUINO) --caterina $( ARD_RESET_OPTS) $( call get_monitor_port)
2013-07-03 09:29:34 +02:00
else
2014-01-13 12:14:31 +00:00
RESET_CMD = $( ARD_RESET_ARDUINO) $( ARD_RESET_OPTS) $( call get_monitor_port)
2013-07-03 09:29:34 +02:00
endif
e n d i f
i f n e q ( $( CATERINA ) , )
2013-07-09 22:10:46 +05:30
ERROR_ON_CATERINA = $( error On $( BOARD_TAG) , raw_xxx operation is not supported)
2013-07-03 09:29:34 +02:00
e l s e
2013-07-09 22:10:46 +05:30
ERROR_ON_CATERINA =
2013-07-03 09:29:34 +02:00
e n d i f
2012-02-28 09:06:56 +00:00
########################################################################
# Local sources
2013-09-18 16:30:16 +05:30
2012-07-01 12:52:36 +02:00
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)
2012-08-18 18:16:44 -07:00
LOCAL_SRCS = $( LOCAL_C_SRCS) $( LOCAL_CPP_SRCS) \
$( LOCAL_CC_SRCS) $( LOCAL_PDE_SRCS) \
$( LOCAL_INO_SRCS) $( LOCAL_AS_SRCS)
2014-09-16 09:20:44 -04:00
LOCAL_OBJ_FILES = $( LOCAL_C_SRCS:.c= .c.o) $( LOCAL_CPP_SRCS:.cpp= .cpp.o) \
$( LOCAL_CC_SRCS:.cc= .cc.o) $( LOCAL_PDE_SRCS:.pde= .pde.o) \
$( LOCAL_INO_SRCS:.ino= .ino.o) $( LOCAL_AS_SRCS:.S= .S.o)
2012-02-28 09:06:56 +00:00
LOCAL_OBJS = $( patsubst %,$( OBJDIR) /%,$( LOCAL_OBJ_FILES) )
2013-08-09 21:57:52 +05:30
i f e q ( $( words $ ( LOCAL_SRCS ) ) , 0 )
2014-05-21 00:14:46 +01:00
$( error At least one source file ( *.ino, *.pde, *.cpp, *c, *cc, *.S) is needed)
2013-08-09 21:57:52 +05:30
e n d i f
2013-06-15 19:30:39 +05:30
2014-06-05 22:56:17 +02:00
# CHK_SOURCES is used by flymake
# flymake creates a tmp file in the same directory as the file under edition
# we must skip the verification in this particular case
i f e q ( $( strip $ ( CHK_SOURCES ) ) , )
ifeq ( $( strip $( NO_CORE) ) ,)
# Ideally, this should just check if there are more than one file
ifneq ( $( words $( LOCAL_PDE_SRCS) $( LOCAL_INO_SRCS) ) , 1)
ifeq ( $( words $( LOCAL_PDE_SRCS) $( LOCAL_INO_SRCS) ) , 0)
$( call show_config_info,No .pde or .ino files found. If you are compiling .c or .cpp files then you need to explicitly include Arduino header files)
else
#TODO: Support more than one file. https://github.com/sudar/Arduino-Makefile/issues/49
$( error Need exactly one .pde or .ino file. This makefile doesn' t support multiple .ino/.pde files yet)
endif
2013-08-09 21:57:52 +05:30
endif
2013-06-15 19:30:39 +05:30
2014-06-05 22:56:17 +02:00
endif
2013-05-30 13:14:20 +02:00
e n d i f
2012-02-28 09:06:56 +00:00
# core sources
i f e q ( $( strip $ ( NO_CORE ) ) , )
2012-07-05 14:04:35 -05:00
ifdef ARDUINO_CORE_PATH
CORE_C_SRCS = $( wildcard $( ARDUINO_CORE_PATH) /*.c)
2014-02-05 23:31:12 +00:00
CORE_C_SRCS += $( wildcard $( ARDUINO_CORE_PATH) /avr-libc/*.c)
2012-07-05 14:04:35 -05:00
CORE_CPP_SRCS = $( wildcard $( ARDUINO_CORE_PATH) /*.cpp)
ifneq ( $( strip $( NO_CORE_MAIN_CPP) ) ,)
CORE_CPP_SRCS := $( filter-out %main.cpp, $( CORE_CPP_SRCS) )
2012-07-05 15:01:11 -05:00
$( call show_config_info,NO_CORE_MAIN_CPP set so core library will not include main.cpp,[ MANUAL] )
2012-07-05 14:04:35 -05:00
endif
2014-09-16 09:20:44 -04:00
CORE_OBJ_FILES = $( CORE_C_SRCS:.c= .c.o) $( CORE_CPP_SRCS:.cpp= .cpp.o) $( CORE_AS_SRCS:.S= .S.o)
2012-07-05 14:04:35 -05:00
CORE_OBJS = $( patsubst $( ARDUINO_CORE_PATH) /%, \
2014-06-30 09:03:15 +02:00
$( OBJDIR) /core/%,$( CORE_OBJ_FILES) )
2012-07-05 14:04:35 -05:00
endif
2012-07-05 13:58:54 -05:00
e l s e
2012-07-05 15:01:11 -05:00
$( call show_config_info,NO_CORE set so core library will not be built,[ MANUAL] )
2012-02-28 09:06:56 +00:00
e n d i f
2012-08-18 18:16:44 -07:00
########################################################################
# Determine ARDUINO_LIBS automatically
2013-09-18 16:30:16 +05:30
2012-08-18 18:16:44 -07:00
i f n d e f A R D U I N O _ L I B S
# automatically determine included libraries
ARDUINO_LIBS += $( filter $( notdir $( wildcard $( ARDUINO_DIR) /libraries/*) ) , \
$( shell sed -ne "s/^ *\# *include *[<\"]\(.*\)\.h[>\"]/\1/p" $( LOCAL_SRCS) ) )
ARDUINO_LIBS += $( filter $( notdir $( wildcard $( ARDUINO_SKETCHBOOK) /libraries/*) ) , \
$( shell sed -ne "s/^ *\# *include *[<\"]\(.*\)\.h[>\"]/\1/p" $( LOCAL_SRCS) ) )
2013-12-02 14:45:54 +01:00
ARDUINO_LIBS += $( filter $( notdir $( wildcard $( USER_LIB_PATH) /*) ) , \
$( shell sed -ne "s/^ *\# *include *[<\"]\(.*\)\.h[>\"]/\1/p" $( LOCAL_SRCS) ) )
2012-08-18 18:16:44 -07:00
e n d i f
2012-02-28 09:06:56 +00:00
2013-05-30 12:55:10 +02:00
########################################################################
# Serial monitor (just a screen wrapper)
2013-09-18 16:30:16 +05:30
2013-05-30 12:55:10 +02:00
# 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').
2013-09-18 16:30:16 +05:30
2013-06-15 19:30:39 +05:30
i f e q ( $( strip $ ( NO_CORE ) ) , )
ifndef MONITOR_BAUDRATE
2013-08-09 21:36:22 +05:30
ifeq ( $( words $( LOCAL_PDE_SRCS) $( LOCAL_INO_SRCS) ) , 1)
2014-04-14 08:39:46 +02:00
SPEED = $( shell egrep -h 'Serial.begin *\([0-9]+\)' $( LOCAL_PDE_SRCS) $( LOCAL_INO_SRCS) | sed -e 's/[^0-9]//g' | head -n1)
2013-08-09 21:36:22 +05:30
MONITOR_BAUDRATE = $( findstring $( SPEED) ,300 1200 2400 4800 9600 14400 19200 28800 38400 57600 115200)
endif
2013-06-02 21:33:42 +05:30
2013-06-15 19:30:39 +05:30
ifeq ( $( MONITOR_BAUDRATE) ,)
MONITOR_BAUDRATE = 9600
$( call show_config_variable,MONITOR_BAUDRATE,[ ASSUMED] )
else
$( call show_config_variable,MONITOR_BAUDRATE,[ DETECTED] , ( in sketch) )
endif
2013-06-02 21:33:42 +05:30
else
2013-06-15 19:30:39 +05:30
$( call show_config_variable,MONITOR_BAUDRATE, [ USER] )
2013-06-02 21:33:42 +05:30
endif
2013-05-30 12:55:10 +02:00
2013-06-15 19:30:39 +05:30
ifndef MONITOR_CMD
MONITOR_CMD = screen
endif
2013-05-30 12:55:10 +02:00
e n d i f
2013-05-30 13:29:25 +02:00
########################################################################
2013-12-26 16:00:08 +05:30
# Include Arduino Header file
2013-09-18 16:30:16 +05:30
2013-05-31 17:43:00 +05:30
i f n d e f A R D U I N O _ H E A D E R
2013-12-26 16:00:08 +05:30
# We should check for Arduino version, not just the file extension
# because, a .pde file can be used in Arduino 1.0 as well
2013-06-02 21:33:42 +05:30
ifeq ( $( shell expr $( ARDUINO_VERSION) '<' 100) , 1)
ARDUINO_HEADER = WProgram.h
else
ARDUINO_HEADER = Arduino.h
endif
2013-05-30 13:29:25 +02:00
e n d i f
2012-02-28 09:06:56 +00:00
########################################################################
# Rules for making stuff
# The name of the main targets
TARGET_HEX = $( OBJDIR) /$( TARGET) .hex
TARGET_ELF = $( OBJDIR) /$( TARGET) .elf
2012-11-17 22:18:56 +01:00
TARGET_EEP = $( OBJDIR) /$( TARGET) .eep
2012-02-28 09:06:56 +00:00
CORE_LIB = $( OBJDIR) /libcore.a
2014-01-22 11:50:24 -05:00
# Names of executables - chipKIT needs to override all to set paths to PIC32
# tools, and we can't use "?=" assignment because these are already implicitly
# defined by Make (e.g. $(CC) == cc).
i f n d e f O V E R R I D E _ E X E C U T A B L E S
CC = $( AVR_TOOLS_PATH) /$( CC_NAME)
CXX = $( AVR_TOOLS_PATH) /$( CXX_NAME)
AS = $( AVR_TOOLS_PATH) /$( AS_NAME)
OBJCOPY = $( AVR_TOOLS_PATH) /$( OBJCOPY_NAME)
OBJDUMP = $( AVR_TOOLS_PATH) /$( OBJDUMP_NAME)
AR = $( AVR_TOOLS_PATH) /$( AR_NAME)
SIZE = $( AVR_TOOLS_PATH) /$( SIZE_NAME)
NM = $( AVR_TOOLS_PATH) /$( NM_NAME)
e n d i f
2013-09-19 16:20:30 +05:30
REMOVE = rm -rf
MV = mv -f
CAT = cat
2013-11-21 10:46:09 +01:00
ECHO = printf
2013-09-19 16:20:30 +05:30
MKDIR = mkdir -p
2012-02-28 09:06:56 +00:00
# General arguments
2013-09-18 16:30:16 +05:30
USER_LIBS = $( wildcard $( patsubst %,$( USER_LIB_PATH) /%,$( ARDUINO_LIBS) ) )
USER_LIB_NAMES = $( patsubst $( USER_LIB_PATH) /%,%,$( USER_LIBS) )
2012-07-05 15:02:24 -05:00
# Let user libraries override system ones.
2013-09-18 16:30:16 +05:30
SYS_LIBS = $( wildcard $( patsubst %,$( ARDUINO_LIB_PATH) /%,$( filter-out $( USER_LIB_NAMES) ,$( ARDUINO_LIBS) ) ) )
SYS_LIB_NAMES = $( patsubst $( ARDUINO_LIB_PATH) /%,%,$( SYS_LIBS) )
2012-07-05 15:02:24 -05:00
# Error here if any are missing.
LIBS_NOT_FOUND = $( filter-out $( USER_LIB_NAMES) $( SYS_LIB_NAMES) ,$( ARDUINO_LIBS) )
i f n e q ( , $( strip $ ( LIBS_NOT_FOUND ) ) )
$( error The following libraries specified in ARDUINO_LIBS could not be found ( searched USER_LIB_PATH and ARDUINO_LIB_PATH) : $( LIBS_NOT_FOUND) )
e n d i f
2013-09-18 16:30:16 +05:30
SYS_LIBS := $( wildcard $( SYS_LIBS) $( addsuffix /utility,$( SYS_LIBS) ) )
USER_LIBS := $( wildcard $( USER_LIBS) $( addsuffix /utility,$( USER_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) ) )
2014-04-25 08:53:50 +02:00
LIB_AS_SRCS = $( wildcard $( patsubst %,%/*.S,$( SYS_LIBS) ) )
2012-03-31 18:48:20 -04:00
USER_LIB_CPP_SRCS = $( wildcard $( patsubst %,%/*.cpp,$( USER_LIBS) ) )
USER_LIB_C_SRCS = $( wildcard $( patsubst %,%/*.c,$( USER_LIBS) ) )
2014-04-25 08:53:50 +02:00
USER_LIB_AS_SRCS = $( wildcard $( patsubst %,%/*.S,$( USER_LIBS) ) )
2014-09-16 09:20:44 -04:00
LIB_OBJS = $( patsubst $( ARDUINO_LIB_PATH) /%.c,$( OBJDIR) /libs/%.c.o,$( LIB_C_SRCS) ) \
$( patsubst $( ARDUINO_LIB_PATH) /%.cpp,$( OBJDIR) /libs/%.cpp.o,$( LIB_CPP_SRCS) ) \
$( patsubst $( ARDUINO_LIB_PATH) /%.S,$( OBJDIR) /libs/%.S.o,$( LIB_AS_SRCS) )
USER_LIB_OBJS = $( patsubst $( USER_LIB_PATH) /%.cpp,$( OBJDIR) /userlibs/%.cpp.o,$( USER_LIB_CPP_SRCS) ) \
$( patsubst $( USER_LIB_PATH) /%.c,$( OBJDIR) /userlibs/%.c.o,$( USER_LIB_C_SRCS) ) \
$( patsubst $( USER_LIB_PATH) /%.S,$( OBJDIR) /userlibs/%.s.o,$( USER_LIB_AS_SRCS) )
2012-02-28 09:06:56 +00:00
2013-02-20 17:30:44 +01:00
# Dependency files
2013-09-18 16:30:16 +05:30
DEPS = $( LOCAL_OBJS:.o= .d) $( LIB_OBJS:.o= .d) $( USER_LIB_OBJS:.o= .d) $( CORE_OBJS:.o= .d)
2013-02-20 17:30:44 +01:00
2013-06-20 21:56:54 +05:30
# Optimization level for the compiler.
# You can get the list of options at http://www.nongnu.org/avr-libc/user-manual/using_tools.html#gcc_optO
# Also read http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_optflags
i f n d e f O P T I M I Z A T I O N _ L E V E L
OPTIMIZATION_LEVEL = s
$( call show_config_variable,OPTIMIZATION_LEVEL,[ DEFAULT] )
e l s e
$( call show_config_variable,OPTIMIZATION_LEVEL,[ USER] )
e n d i f
2013-12-20 01:11:13 +01:00
i f n d e f D E B U G _ F L A G S
DEBUG_FLAGS = -O0 -g
e n d i f
# SoftwareSerial requires -Os (some delays are tuned for this optimization level)
2014-09-16 09:20:44 -04:00
%SoftwareSerial.cpp.o : OPTIMIZATION_FLAGS = -Os
2013-12-20 01:11:13 +01:00
2013-07-02 17:28:54 -04:00
i f n d e f M C U _ F L A G _ N A M E
MCU_FLAG_NAME = mmcu
$( call show_config_variable,MCU_FLAG_NAME,[ DEFAULT] )
e l s e
$( call show_config_variable,MCU_FLAG_NAME,[ USER] )
e n d i f
2012-06-09 10:59:02 +05:30
# Using += instead of =, so that CPPFLAGS can be set per sketch level
2014-02-14 15:25:29 +00:00
CPPFLAGS += -$( MCU_FLAG_NAME) = $( MCU) -DF_CPU= $( F_CPU) -DARDUINO= $( ARDUINO_VERSION) -D__PROG_TYPES_COMPAT__ \
2013-06-02 21:33:42 +05:30
-I. -I$( ARDUINO_CORE_PATH) -I$( ARDUINO_VAR_PATH) /$( VARIANT) \
2013-07-02 18:07:23 -04:00
$( SYS_INCLUDES) $( USER_INCLUDES) -Wall -ffunction-sections \
-fdata-sections
i f d e f D E B U G
2013-12-20 01:11:13 +01:00
OPTIMIZATION_FLAGS = $( DEBUG_FLAGS)
2013-07-02 18:07:23 -04:00
e l s e
2013-12-20 01:11:13 +01:00
OPTIMIZATION_FLAGS = -O$( OPTIMIZATION_LEVEL)
2013-07-02 18:07:23 -04:00
e n d i f
2013-05-31 17:05:47 +05:30
2013-12-20 01:11:13 +01:00
CPPFLAGS += $( OPTIMIZATION_FLAGS)
2013-07-09 22:10:46 +05:30
# USB IDs for the Caterina devices like leonardo or micro
2013-07-03 00:18:29 +02:00
i f n e q ( $( CATERINA ) , )
2013-06-02 21:33:42 +05:30
CPPFLAGS += -DUSB_VID= $( USB_VID) -DUSB_PID= $( USB_PID)
2013-05-31 17:05:47 +05:30
e n d i f
2013-07-02 17:28:54 -04:00
i f n d e f C F L A G S _ S T D
2014-08-13 11:16:16 +02:00
CFLAGS_STD =
2013-07-02 17:28:54 -04:00
$( call show_config_variable,CFLAGS_STD,[ DEFAULT] )
e l s e
$( call show_config_variable,CFLAGS_STD,[ USER] )
e n d i f
2014-08-13 11:16:16 +02:00
i f n d e f C X X F L A G S _ S T D
CXXFLAGS_STD =
$( call show_config_variable,CXXFLAGS_STD,[ DEFAULT] )
e l s e
$( call show_config_variable,CXXFLAGS_STD,[ USER] )
e n d i f
CFLAGS += $( CFLAGS_STD)
CXXFLAGS += -fno-exceptions $( CXXFLAGS_STD)
2013-12-03 11:24:19 -05:00
ASFLAGS += -x assembler-with-cpp
2014-08-13 11:16:16 +02:00
LDFLAGS += -$( MCU_FLAG_NAME) = $( MCU) -Wl,--gc-sections -O$( OPTIMIZATION_LEVEL)
2012-07-01 13:04:39 +02:00
SIZEFLAGS ?= --mcu= $( MCU) -C
2012-02-28 09:06:56 +00:00
2013-07-09 19:34:08 -04:00
# for backwards compatibility, grab ARDUINO_PORT if the user has it set
2014-06-21 12:32:34 +02:00
# instead of MONITOR_PORT
2013-07-09 19:34:08 -04:00
MONITOR_PORT ?= $( ARDUINO_PORT)
2014-01-22 11:54:32 -05:00
i f e q ( $( CURRENT_OS ) , W I N D O W S )
# Expect MONITOR_PORT to be '1' or 'com1' for COM1 in Windows. Split it up
# into the two styles required: /dev/ttyS* for ard-reset-arduino and com*
# for avrdude. This also could work with /dev/com* device names and be more
# consistent, but the /dev/com* is not recommended by Cygwin and doesn't
# always show up.
COM_PORT_ID = $( subst com,,$( MONITOR_PORT) )
COM_STYLE_MONITOR_PORT = com$( COM_PORT_ID)
DEVICE_PATH = /dev/ttyS$( shell awk 'BEGIN{ print $(COM_PORT_ID) - 1 }' )
2014-05-03 01:36:42 +01:00
e n d i f
2014-06-21 12:32:34 +02:00
i f n e q ( $( strip $ ( MONITOR_PORT ) ) , )
# set DEVICE_PATH based on user-defined MONITOR_PORT or ARDUINO_PORT
2014-01-22 11:54:32 -05:00
DEVICE_PATH = $( MONITOR_PORT)
2014-06-21 12:32:34 +02:00
$( call show_config_variable,DEVICE_PATH,[ COMPUTED] ,( from MONITOR_PORT) )
2014-05-03 01:36:42 +01:00
e l s e
# If no port is specified, try to guess it from wildcards.
2014-06-21 12:32:34 +02:00
# Will only work if the Arduino is the only/first device matched.
2014-05-03 01:36:42 +01:00
DEVICE_PATH = $( firstword $( wildcard \
/dev/ttyACM? /dev/ttyUSB? /dev/tty.usbserial* /dev/tty.usbmodem*) )
2014-06-21 12:32:34 +02:00
$( call show_config_variable,DEVICE_PATH,[ AUTODETECTED] )
2014-01-22 11:54:32 -05:00
e n d i f
2012-11-01 10:57:11 -05:00
# Returns the Arduino port (first wildcard expansion) if it exists, otherwise it errors.
2014-01-22 11:54:32 -05:00
get_monitor_port = $( if $( wildcard $( DEVICE_PATH) ) ,$( firstword $( wildcard $( DEVICE_PATH) ) ) ,$( error Arduino port $( DEVICE_PATH) not found!) )
2012-02-28 09:06:56 +00:00
2013-06-09 17:18:12 +05:30
# Returns the ISP port (first wildcard expansion) if it exists, otherwise it errors.
2014-03-14 16:10:18 -02:30
get_isp_port = $( if $( wildcard $( ISP_PORT) ) ,$( firstword $( wildcard $( ISP_PORT) ) ) ,$( if $( findstring Xusb,X$( ISP_PORT) ) ,$( ISP_PORT) ,$( error ISP port $( ISP_PORT) not found!) ) )
2013-06-09 17:18:12 +05:30
2012-07-05 15:01:11 -05:00
# Command for avr_size: do $(call avr_size,elffile,hexfile)
i f n e q ( , $( findstring AVR ,$ ( shell $ ( SIZE ) --help ) ) )
# We have a patched version of binutils that mentions AVR - pass the MCU
# and the elf to get nice output.
2012-07-13 22:36:54 +05:30
avr_size = $( SIZE) $( SIZEFLAGS) --format= avr $( 1)
2012-07-05 15:01:11 -05:00
$( call show_config_info,Size utility: AVR-aware for enhanced output,[ AUTODETECTED] )
2012-07-05 12:45:05 -05:00
e l s e
2012-07-05 14:04:35 -05:00
# We have a plain-old binutils version - just give it the hex.
avr_size = $( SIZE) $( 2)
2012-07-05 15:01:11 -05:00
$( call show_config_info,Size utility: Basic ( not AVR-aware) ,[ AUTODETECTED] )
2012-07-05 12:45:05 -05:00
e n d i f
2012-07-05 15:01:11 -05:00
i f n e q ( , $( strip $ ( ARDUINO_LIBS ) ) )
2012-11-01 10:33:46 -05:00
$( call arduino_output,-)
2012-07-05 15:01:11 -05:00
$( call show_config_info,ARDUINO_LIBS = )
e n d i f
2013-05-31 17:43:00 +05:30
2012-07-05 15:01:11 -05:00
i f n e q ( , $( strip $ ( USER_LIB_NAMES ) ) )
$( foreach lib,$( USER_LIB_NAMES) ,$( call show_config_info, $( lib) ,[ USER] ) )
2012-07-05 13:58:54 -05:00
e n d i f
2012-07-05 15:01:11 -05:00
i f n e q ( , $( strip $ ( SYS_LIB_NAMES ) ) )
$( foreach lib,$( SYS_LIB_NAMES) ,$( call show_config_info, $( lib) ,[ SYSTEM] ) )
2012-07-05 13:58:54 -05:00
e n d i f
2013-12-17 09:15:33 +00:00
# either calculate parent dir from arduino dir, or user-defined path
i f n d e f B O O T L O A D E R _ P A R E N T
2014-06-01 17:14:38 +01:00
BOOTLOADER_PARENT = $( ARDUINO_DIR) /hardware/$( VENDOR) /$( ARCHITECTURE) /bootloaders
2013-12-17 09:15:33 +00:00
$( call show_config_variable,BOOTLOADER_PARENT,[ COMPUTED] ,( from ARDUINO_DIR) )
e l s e
$( call show_config_variable,BOOTLOADER_PARENT,[ USER] )
e n d i f
2012-07-05 13:58:54 -05:00
# end of config output
$( call show_separator )
2012-02-28 09:06:56 +00:00
# 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
2014-09-16 09:20:44 -04:00
$(OBJDIR)/libs/%.c.o : $( ARDUINO_LIB_PATH ) /%.c
2013-07-12 08:37:31 -04:00
@$( MKDIR) $( dir $@ )
2013-02-20 17:30:44 +01:00
$( CC) -MMD -c $( CPPFLAGS) $( CFLAGS) $< -o $@
2012-02-28 09:06:56 +00:00
2014-09-16 09:20:44 -04:00
$(OBJDIR)/libs/%.cpp.o : $( ARDUINO_LIB_PATH ) /%.cpp
2013-07-12 08:37:31 -04:00
@$( MKDIR) $( dir $@ )
2013-02-20 17:30:44 +01:00
$( CC) -MMD -c $( CPPFLAGS) $( CXXFLAGS) $< -o $@
2012-02-28 09:06:56 +00:00
2014-09-16 09:20:44 -04:00
$(OBJDIR)/libs/%.S.o : $( ARDUINO_LIB_PATH ) /%.S
2014-04-25 08:53:50 +02:00
@$( MKDIR) $( dir $@ )
$( CC) -MMD -c $( CPPFLAGS) $( ASFLAGS) $< -o $@
2014-09-16 09:20:44 -04:00
$(OBJDIR)/userlibs/%.cpp.o : $( USER_LIB_PATH ) /%.cpp
2013-07-12 08:37:31 -04:00
@$( MKDIR) $( dir $@ )
2014-08-01 12:17:06 +02:00
$( CC) -MMD -c $( CPPFLAGS) $( CXXFLAGS) $< -o $@
2012-03-25 23:54:21 -04:00
2014-09-16 09:20:44 -04:00
$(OBJDIR)/userlibs/%.c.o : $( USER_LIB_PATH ) /%.c
2013-07-12 08:37:31 -04:00
@$( MKDIR) $( dir $@ )
2013-02-20 17:30:44 +01:00
$( CC) -MMD -c $( CPPFLAGS) $( CFLAGS) $< -o $@
2012-03-25 23:54:21 -04:00
2014-09-16 09:20:44 -04:00
$(OBJDIR)/userlibs/%.S.o : $( USER_LIB_PATH ) /%.S
2014-04-25 08:53:50 +02:00
@$( MKDIR) $( dir $@ )
$( CC) -MMD -c $( CPPFLAGS) $( ASFLAGS) $< -o $@
2013-01-31 22:14:07 +01:00
i f d e f C O M M O N _ D E P S
2013-11-21 18:53:36 -07:00
COMMON_DEPS := $( COMMON_DEPS) $( MAKEFILE_LIST)
2013-01-31 22:14:07 +01:00
e l s e
2013-11-21 18:53:36 -07:00
COMMON_DEPS := $( MAKEFILE_LIST)
2013-01-31 22:14:07 +01:00
e n d i f
2012-02-28 09:06:56 +00:00
# normal local sources
2014-09-16 09:20:44 -04:00
$(OBJDIR)/%.c.o : %.c $( COMMON_DEPS ) | $( OBJDIR )
2013-07-12 08:37:31 -04:00
@$( MKDIR) $( dir $@ )
2012-07-05 04:30:47 +01:00
$( CC) -MMD -c $( CPPFLAGS) $( CFLAGS) $< -o $@
2012-02-28 09:06:56 +00:00
2014-09-16 09:20:44 -04:00
$(OBJDIR)/%.cc.o : %.cc $( COMMON_DEPS ) | $( OBJDIR )
2013-07-12 08:37:31 -04:00
@$( MKDIR) $( dir $@ )
2012-07-05 04:30:47 +01:00
$( CXX) -MMD -c $( CPPFLAGS) $( CXXFLAGS) $< -o $@
2012-02-28 09:06:56 +00:00
2014-09-16 09:20:44 -04:00
$(OBJDIR)/%.cpp.o : %.cpp $( COMMON_DEPS ) | $( OBJDIR )
2013-07-12 08:37:31 -04:00
@$( MKDIR) $( dir $@ )
2012-07-05 04:30:47 +01:00
$( CXX) -MMD -c $( CPPFLAGS) $( CXXFLAGS) $< -o $@
2012-02-28 09:06:56 +00:00
2014-09-16 09:20:44 -04:00
$(OBJDIR)/%.S.o : %.S $( COMMON_DEPS ) | $( OBJDIR )
2013-07-12 08:37:31 -04:00
@$( MKDIR) $( dir $@ )
2012-07-05 04:30:47 +01:00
$( CC) -MMD -c $( CPPFLAGS) $( ASFLAGS) $< -o $@
2012-02-28 09:06:56 +00:00
2014-09-16 09:20:44 -04:00
$(OBJDIR)/%.s.o : %.s $( COMMON_DEPS ) | $( OBJDIR )
2013-07-12 08:37:31 -04:00
@$( MKDIR) $( dir $@ )
2012-02-28 09:06:56 +00:00
$( CC) -c $( CPPFLAGS) $( ASFLAGS) $< -o $@
2013-05-30 13:35:37 +02:00
# the pde -> o file
2014-09-16 09:20:44 -04:00
$(OBJDIR)/%.pde.o : %.pde $( COMMON_DEPS ) | $( OBJDIR )
2013-07-12 08:37:31 -04:00
@$( MKDIR) $( dir $@ )
2013-05-31 17:43:00 +05:30
$( CXX) -x c++ -include $( ARDUINO_HEADER) -MMD -c $( CPPFLAGS) $( CXXFLAGS) $< -o $@
2012-02-28 09:06:56 +00:00
2013-05-30 13:35:37 +02:00
# the ino -> o file
2014-09-16 09:20:44 -04:00
$(OBJDIR)/%.ino.o : %.ino $( COMMON_DEPS ) | $( OBJDIR )
2013-07-12 08:37:31 -04:00
@$( MKDIR) $( dir $@ )
2013-12-26 16:00:08 +05:30
$( CXX) -x c++ -include $( ARDUINO_HEADER) -MMD -c $( CPPFLAGS) $( CXXFLAGS) $< -o $@
2012-02-28 09:06:56 +00:00
2012-09-20 11:30:46 -05:00
# generated assembly
2013-06-19 23:41:01 +02:00
$(OBJDIR)/%.s : %.pde $( COMMON_DEPS ) | $( OBJDIR )
2013-07-12 08:37:31 -04:00
@$( MKDIR) $( dir $@ )
2013-06-19 23:41:01 +02:00
$( CXX) -x c++ -include $( ARDUINO_HEADER) -MMD -S -fverbose-asm $( CPPFLAGS) $( CXXFLAGS) $< -o $@
$(OBJDIR)/%.s : %.ino $( COMMON_DEPS ) | $( OBJDIR )
2013-07-12 08:37:31 -04:00
@$( MKDIR) $( dir $@ )
2013-12-26 16:00:08 +05:30
$( CXX) -x c++ -include $( ARDUINO_HEADER) -MMD -S -fverbose-asm $( CPPFLAGS) $( CXXFLAGS) $< -o $@
2012-09-20 11:30:46 -05:00
2014-08-22 17:57:30 +02:00
$(OBJDIR)/%.s : %.cpp $( COMMON_DEPS ) | $( OBJDIR )
@$( MKDIR) $( dir $@ )
$( CXX) -x c++ -include $( ARDUINO_HEADER) -MMD -S -fverbose-asm $( CPPFLAGS) $( CXXFLAGS) $< -o $@
2012-09-20 11:30:46 -05:00
2012-02-28 09:06:56 +00:00
# core files
2014-09-16 09:20:44 -04:00
$(OBJDIR)/core/%.c.o : $( ARDUINO_CORE_PATH ) /%.c $( COMMON_DEPS ) | $( OBJDIR )
2013-07-12 08:37:31 -04:00
@$( MKDIR) $( dir $@ )
2013-02-20 17:30:44 +01:00
$( CC) -MMD -c $( CPPFLAGS) $( CFLAGS) $< -o $@
2012-02-28 09:06:56 +00:00
2014-09-16 09:20:44 -04:00
$(OBJDIR)/core/%.cpp.o : $( ARDUINO_CORE_PATH ) /%.cpp $( COMMON_DEPS ) | $( OBJDIR )
2013-07-12 08:37:31 -04:00
@$( MKDIR) $( dir $@ )
2013-02-20 17:30:44 +01:00
$( CXX) -MMD -c $( CPPFLAGS) $( CXXFLAGS) $< -o $@
2012-02-28 09:06:56 +00:00
2014-09-16 09:20:44 -04:00
$(OBJDIR)/core/%.S.o : $( ARDUINO_CORE_PATH ) /%.S $( COMMON_DEPS ) | $( OBJDIR )
2013-12-03 11:24:19 -05:00
@$( MKDIR) $( dir $@ )
$( CC) -MMD -c $( CPPFLAGS) $( ASFLAGS) $< -o $@
2012-02-28 09:06:56 +00:00
# various object conversions
2012-11-01 10:34:09 -05:00
$(OBJDIR)/%.hex : $( OBJDIR ) /%.elf $( COMMON_DEPS )
2013-07-12 08:37:31 -04:00
@$( MKDIR) $( dir $@ )
2012-02-28 09:06:56 +00:00
$( OBJCOPY) -O ihex -R .eeprom $< $@
2013-11-21 10:46:09 +01:00
@$( ECHO) '\n'
2012-07-05 12:45:19 -05:00
$( call avr_size,$<,$@ )
2013-07-01 21:54:56 +05:30
i f n e q ( $( strip $ ( HEX_MAXIMUM_SIZE ) ) , )
@if [ ` $( SIZE) $@ | awk 'FNR == 2 {print $$2}' ` -le $( HEX_MAXIMUM_SIZE) ] ; then touch $@ .sizeok; fi
e l s e
2013-11-21 10:46:09 +01:00
@$( ECHO) " Maximum flash memory of $( BOARD_TAG) is not specified. Make sure the size of $@ is less than $( BOARD_TAG) \'s flash memory "
2013-07-01 21:54:56 +05:30
@touch $@ .sizeok
e n d i f
2012-02-28 09:06:56 +00:00
2012-11-01 10:34:09 -05:00
$(OBJDIR)/%.eep : $( OBJDIR ) /%.elf $( COMMON_DEPS )
2013-07-12 08:37:31 -04:00
@$( MKDIR) $( dir $@ )
2012-02-28 09:06:56 +00:00
-$( OBJCOPY) -j .eeprom --set-section-flags= .eeprom= "alloc,load" \
--change-section-lma .eeprom= 0 -O ihex $< $@
2012-11-01 10:34:09 -05:00
$(OBJDIR)/%.lss : $( OBJDIR ) /%.elf $( COMMON_DEPS )
2013-07-12 08:37:31 -04:00
@$( MKDIR) $( dir $@ )
2012-08-23 12:39:42 -05:00
$( OBJDUMP) -h --source --demangle --wide $< > $@
2012-02-28 09:06:56 +00:00
2012-11-01 10:34:09 -05:00
$(OBJDIR)/%.sym : $( OBJDIR ) /%.elf $( COMMON_DEPS )
2013-07-12 08:37:31 -04:00
@$( MKDIR) $( dir $@ )
2012-09-20 11:29:36 -05:00
$( NM) --size-sort --demangle --reverse-sort --line-numbers $< > $@
2012-02-28 09:06:56 +00:00
########################################################################
# Avrdude
2013-09-18 16:30:16 +05:30
2013-06-29 21:40:36 +05:30
# If avrdude is installed separately, it can find its own config file
2012-02-28 09:06:56 +00:00
i f n d e f A V R D U D E
2012-07-05 14:04:35 -05:00
AVRDUDE = $( AVR_TOOLS_PATH) /avrdude
2012-02-28 09:06:56 +00:00
e n d i f
2013-09-25 15:18:14 +05:30
# Default avrdude options
# -V Do not verify
# -q - suppress progress output
2014-01-13 12:14:31 +00:00
# -D - Disable auto erase for flash memory
2013-09-25 15:18:14 +05:30
# (-D is needed for Mega boards. See https://github.com/sudar/Arduino-Makefile/issues/114#issuecomment-25011005)
2013-06-15 19:17:13 +05:30
i f n d e f A V R D U D E _ O P T S
2013-09-25 15:18:14 +05:30
AVRDUDE_OPTS = -q -V -D
2013-06-15 19:17:13 +05:30
e n d i f
AVRDUDE_COM_OPTS = $( AVRDUDE_OPTS) -p $( MCU)
2012-02-28 09:06:56 +00:00
i f d e f A V R D U D E _ C O N F
2012-07-05 14:04:35 -05:00
AVRDUDE_COM_OPTS += -C $( AVRDUDE_CONF)
2012-02-28 09:06:56 +00:00
e n d i f
2014-01-22 11:54:32 -05:00
AVRDUDE_ARD_OPTS = -c $( AVRDUDE_ARD_PROGRAMMER) -b $( AVRDUDE_ARD_BAUDRATE) -P
i f e q ( $( CURRENT_OS ) , W I N D O W S )
# get_monitor_port checks to see if the monitor port exists, assuming it is
# a file. In Windows, avrdude needs the port in the format 'com1' which is
# not a file, so we have to add the COM-style port directly.
AVRDUDE_ARD_OPTS += $( COM_STYLE_MONITOR_PORT)
e l s e
AVRDUDE_ARD_OPTS += $( call get_monitor_port)
e n d i f
2012-02-28 09:06:56 +00:00
i f n d e f I S P _ P R O G
2013-10-06 18:14:58 +05:30
ifneq ( $( strip $( AVRDUDE_ARD_PROGRAMMER) ) ,)
ISP_PROG = $( AVRDUDE_ARD_PROGRAMMER)
else
ISP_PROG = stk500v1
endif
2012-02-28 09:06:56 +00:00
e n d i f
2013-06-09 17:18:12 +05:30
i f n d e f A V R D U D E _ I S P _ B A U D R A T E
2013-10-06 18:14:58 +05:30
ifneq ( $( strip $( AVRDUDE_ARD_BAUDRATE) ) ,)
AVRDUDE_ISP_BAUDRATE = $( AVRDUDE_ARD_BAUDRATE)
else
AVRDUDE_ISP_BAUDRATE = 19200
endif
2012-11-17 22:18:56 +01:00
e n d i f
2013-10-06 19:10:29 +05:30
# Fuse settings copied from Arduino IDE.
# https://github.com/arduino/Arduino/blob/master/app/src/processing/app/debug/AvrdudeUploader.java#L254
2013-06-15 19:23:26 +05:30
# Pre fuse settings
i f n d e f A V R D U D E _ I S P _ F U S E S _ P R E
ifneq ( $( strip $( ISP_LOCK_FUSE_PRE) ) ,)
AVRDUDE_ISP_FUSES_PRE += -U lock:w:$( ISP_LOCK_FUSE_PRE) :m
endif
2013-10-06 19:10:29 +05:30
ifneq ( $( strip $( ISP_EXT_FUSE) ) ,)
AVRDUDE_ISP_FUSES_PRE += -U efuse:w:$( ISP_EXT_FUSE) :m
endif
2013-06-15 19:23:26 +05:30
ifneq ( $( strip $( ISP_HIGH_FUSE) ) ,)
AVRDUDE_ISP_FUSES_PRE += -U hfuse:w:$( ISP_HIGH_FUSE) :m
endif
ifneq ( $( strip $( ISP_LOW_FUSE) ) ,)
AVRDUDE_ISP_FUSES_PRE += -U lfuse:w:$( ISP_LOW_FUSE) :m
endif
2013-10-06 19:10:29 +05:30
e n d i f
2013-06-15 19:23:26 +05:30
2013-10-06 19:10:29 +05:30
# Bootloader file settings
i f n d e f A V R D U D E _ I S P _ B U R N _ B O O T L O A D E R
ifneq ( $( strip $( BOOTLOADER_PATH) ) ,)
ifneq ( $( strip $( BOOTLOADER_FILE) ) ,)
2013-12-17 09:15:33 +00:00
AVRDUDE_ISP_BURN_BOOTLOADER += -U flash:w:$( BOOTLOADER_PARENT) /$( BOOTLOADER_PATH) /$( BOOTLOADER_FILE) :i
2013-10-06 19:10:29 +05:30
endif
2013-06-15 19:23:26 +05:30
endif
e n d i f
# Post fuse settings
i f n d e f A V R D U D E _ I S P _ F U S E S _ P O S T
ifneq ( $( strip $( ISP_LOCK_FUSE_POST) ) ,)
AVRDUDE_ISP_FUSES_POST += -U lock:w:$( ISP_LOCK_FUSE_POST) :m
endif
e n d i f
2013-10-05 08:19:58 +05:30
AVRDUDE_ISP_OPTS = -c $( ISP_PROG) -b $( AVRDUDE_ISP_BAUDRATE)
2014-03-14 16:10:18 -02:30
i f n d e f $( ISP_PORT )
ifneq ( $( strip $( ISP_PROG) ) ,$( filter $( ISP_PROG) , usbasp usbtiny gpio) )
AVRDUDE_ISP_OPTS += -P $( call get_isp_port)
endif
e l s e
AVRDUDE_ISP_OPTS += -P $( call get_isp_port)
2013-10-05 08:19:58 +05:30
e n d i f
2012-02-28 09:06:56 +00:00
2012-11-17 22:18:56 +01:00
i f n d e f I S P _ E E P R O M
2013-06-02 21:33:42 +05:30
ISP_EEPROM = 0
2012-11-17 22:18:56 +01:00
e n d i f
2012-12-16 17:06:23 +01:00
AVRDUDE_UPLOAD_HEX = -U flash:w:$( TARGET_HEX) :i
AVRDUDE_UPLOAD_EEP = -U eeprom:w:$( TARGET_EEP) :i
AVRDUDE_ISPLOAD_OPTS = $( AVRDUDE_UPLOAD_HEX)
2013-06-02 21:33:42 +05:30
2012-11-17 22:18:56 +01:00
i f n e q ( $( ISP_EEPROM ) , 0 )
2013-06-02 21:33:42 +05:30
AVRDUDE_ISPLOAD_OPTS += $( AVRDUDE_UPLOAD_EEP)
2012-11-17 22:18:56 +01:00
e n d i f
2012-02-28 09:06:56 +00:00
########################################################################
# Explicit targets start here
2013-07-01 21:54:56 +05:30
all : $( TARGET_EEP ) $( TARGET_HEX )
2012-02-28 09:06:56 +00:00
2013-06-06 07:56:08 +05:30
# Rule to create $(OBJDIR) automatically. All rules with recipes that
2013-05-30 19:44:39 +02:00
# create a file within it, but do not already depend on a file within it
# should depend on this rule. They should use a "order-only
2013-06-06 07:56:08 +05:30
# prerequisite" (e.g., put "| $(OBJDIR)" at the end of the prerequisite
# list) to prevent remaking the target when any file in the directory
2013-05-30 19:44:39 +02:00
# changes.
2014-03-14 10:42:35 +11:00
$(OBJDIR) : pre -build
2013-06-15 15:29:49 +05:30
$( MKDIR) $( OBJDIR)
2012-02-28 09:06:56 +00:00
2014-03-14 10:42:35 +11:00
pre-build :
$( call runscript_if_exists,$( PRE_BUILD_HOOK) )
2012-02-28 09:06:56 +00:00
$(TARGET_ELF) : $( LOCAL_OBJS ) $( CORE_LIB ) $( OTHER_OBJS )
$( CC) $( LDFLAGS) -o $@ $( LOCAL_OBJS) $( CORE_LIB) $( OTHER_OBJS) -lc -lm
2012-03-31 18:48:20 -04:00
$(CORE_LIB) : $( CORE_OBJS ) $( LIB_OBJS ) $( USER_LIB_OBJS )
$( AR) rcs $@ $( CORE_OBJS) $( LIB_OBJS) $( USER_LIB_OBJS)
2012-02-28 09:06:56 +00:00
2013-07-09 22:10:46 +05:30
error_on_caterina :
$( ERROR_ON_CATERINA)
2013-06-08 17:26:24 +05:30
2014-03-14 10:42:35 +11:00
2013-06-08 16:32:43 +05:30
# Use submake so we can guarantee the reset happens
# before the upload, even with make -j
2013-05-30 15:01:07 +02:00
upload : $( TARGET_HEX ) verify_size
$( MAKE) reset
$( MAKE) do_upload
2012-02-28 09:06:56 +00:00
2013-05-30 15:01:07 +02:00
raw_upload : $( TARGET_HEX ) verify_size
2013-07-09 22:10:46 +05:30
$( MAKE) error_on_caterina
2013-05-30 15:01:07 +02:00
$( MAKE) do_upload
do_upload :
2012-02-28 09:06:56 +00:00
$( AVRDUDE) $( AVRDUDE_COM_OPTS) $( AVRDUDE_ARD_OPTS) \
2012-12-16 17:06:23 +01:00
$( AVRDUDE_UPLOAD_HEX)
2012-02-28 09:06:56 +00:00
2013-06-08 17:26:24 +05:30
do_eeprom : $( TARGET_EEP ) $( TARGET_HEX )
2012-12-16 17:06:23 +01:00
$( AVRDUDE) $( AVRDUDE_COM_OPTS) $( AVRDUDE_ARD_OPTS) \
$( AVRDUDE_UPLOAD_EEP)
2012-11-17 22:18:56 +01:00
2013-06-08 17:26:24 +05:30
eeprom : $( TARGET_HEX ) verify_size
$( MAKE) reset
$( MAKE) do_eeprom
raw_eeprom : $( TARGET_HEX ) verify_size
2013-07-09 22:10:46 +05:30
$( MAKE) error_on_caterina
2013-06-08 17:26:24 +05:30
$( MAKE) do_eeprom
2012-07-05 12:45:52 -05:00
reset :
2013-06-08 17:26:24 +05:30
$( call arduino_output,Resetting Arduino...)
$( RESET_CMD)
2012-04-29 18:55:17 +01:00
2012-02-28 09:06:56 +00:00
# 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 ?
2012-07-05 12:45:52 -05:00
reset_stty :
2012-02-28 09:06:56 +00:00
for STTYF in 'stty -F' 'stty --file' 'stty -f' 'stty <' ; \
2013-06-13 09:38:27 +02:00
do $$ STTYF /dev/tty >/dev/null 2>& 1 && break ; \
done ; \
2013-07-09 19:34:08 -04:00
$$ STTYF $( call get_monitor_port) hupcl ; \
2013-06-13 09:38:27 +02:00
( sleep 0.1 2>/dev/null || sleep 1) ; \
2013-07-09 19:34:08 -04:00
$$ STTYF $( call get_monitor_port) -hupcl
2012-02-28 09:06:56 +00:00
2012-12-16 17:06:23 +01:00
ispload : $( TARGET_EEP ) $( TARGET_HEX ) verify_size
2012-02-28 09:06:56 +00:00
$( AVRDUDE) $( AVRDUDE_COM_OPTS) $( AVRDUDE_ISP_OPTS) \
2013-06-15 19:23:26 +05:30
$( AVRDUDE_ISPLOAD_OPTS)
2013-10-06 19:10:29 +05:30
burn_bootloader :
i f n e q ( $( strip $ ( AVRDUDE_ISP_FUSES_PRE ) ) , )
$( AVRDUDE) $( AVRDUDE_COM_OPTS) $( AVRDUDE_ISP_OPTS) -e $( AVRDUDE_ISP_FUSES_PRE)
e n d i f
i f n e q ( $( strip $ ( AVRDUDE_ISP_BURN_BOOTLOADER ) ) , )
$( AVRDUDE) $( AVRDUDE_COM_OPTS) $( AVRDUDE_ISP_OPTS) $( AVRDUDE_ISP_BURN_BOOTLOADER)
e n d i f
i f n e q ( $( strip $ ( AVRDUDE_ISP_FUSES_POST ) ) , )
2013-06-15 19:23:26 +05:30
$( AVRDUDE) $( AVRDUDE_COM_OPTS) $( AVRDUDE_ISP_OPTS) $( AVRDUDE_ISP_FUSES_POST)
e n d i f
2012-02-28 09:06:56 +00:00
2013-12-15 21:10:58 +00:00
set_fuses :
i f n e q ( $( strip $ ( AVRDUDE_ISP_FUSES_PRE ) ) , )
$( AVRDUDE) $( AVRDUDE_COM_OPTS) $( AVRDUDE_ISP_OPTS) -e $( AVRDUDE_ISP_FUSES_PRE)
e n d i f
i f n e q ( $( strip $ ( AVRDUDE_ISP_FUSES_POST ) ) , )
$( AVRDUDE) $( AVRDUDE_COM_OPTS) $( AVRDUDE_ISP_OPTS) $( AVRDUDE_ISP_FUSES_POST)
e n d i f
2014-08-16 19:31:07 +02:00
clean ::
2014-07-14 12:30:31 +02:00
$( REMOVE) $( OBJDIR)
2012-02-28 09:06:56 +00:00
2013-09-18 16:30:16 +05:30
size : $( TARGET_HEX )
2012-07-05 12:45:05 -05:00
$( call avr_size,$( TARGET_ELF) ,$( TARGET_HEX) )
2012-02-28 09:06:56 +00:00
2012-07-05 12:45:52 -05:00
show_boards :
2014-08-17 19:29:43 +02:00
@$( CAT) " $( BOARDS_TXT) " | grep -E "^[a-zA-Z0-9_]+.name" | sort -uf | sed 's/.name=/:/' | column -s: -t
2012-02-28 09:06:56 +00:00
2012-04-29 12:06:41 +01:00
monitor :
2013-07-09 19:34:08 -04:00
$( MONITOR_CMD) $( call get_monitor_port) $( MONITOR_BAUDRATE)
2012-04-29 12:06:41 +01:00
2012-09-20 11:29:26 -05:00
disasm : $( OBJDIR ) /$( TARGET ) .lss
2014-05-27 11:25:23 +01:00
@$( ECHO) " The compiled ELF file has been disassembled to $( OBJDIR) / $( TARGET) .lss\n\n "
2012-07-03 12:36:00 -05:00
2012-09-20 11:30:46 -05:00
symbol_sizes : $( OBJDIR ) /$( TARGET ) .sym
2014-05-27 11:25:23 +01:00
@$( ECHO) " A symbol listing sorted by their size have been dumped to $( OBJDIR) / $( TARGET) .sym\n\n "
2012-04-29 12:06:41 +01:00
2013-07-01 21:54:56 +05:30
verify_size :
i f e q ( $( strip $ ( HEX_MAXIMUM_SIZE ) ) , )
2013-11-21 10:46:09 +01:00
@$( ECHO) " \nMaximum flash memory of $( BOARD_TAG) is not specified. Make sure the size of $( TARGET_HEX) is less than $( BOARD_TAG) \'s flash memory\n\n "
2013-06-15 15:34:10 +05:30
e n d i f
2013-07-01 21:54:56 +05:30
@if [ ! -f $( TARGET_HEX) .sizeok ] ; then echo >& 2 " \nThe size of the compiled binary file is greater than the $( BOARD_TAG) 's flash memory. \
See http : //www .arduino .cc /en /Guide /Troubleshooting #size for tips on reducing it."; false; fi
2012-04-29 12:06:41 +01:00
2013-06-20 12:51:56 +05:30
generate_assembly : $( OBJDIR ) /$( TARGET ) .s
2014-05-27 11:25:23 +01:00
@$( ECHO) " Compiler-generated assembly for the main input source has been dumped to $( OBJDIR) / $( TARGET) .s\n\n "
2012-07-03 12:36:00 -05:00
2013-06-20 12:51:56 +05:30
generated_assembly : generate_assembly
2014-05-27 11:25:23 +01:00
@$( ECHO) "\"generated_assembly\" target is deprecated. Use \"generate_assembly\" target instead\n\n"
2013-06-25 15:29:49 +02:00
2014-02-04 18:27:46 +05:30
help_vars :
2014-06-29 00:14:18 +02:00
@$( CAT) " $( ARDMK_DIR) /arduino-mk-vars.md "
2014-02-04 18:27:46 +05:30
2013-09-15 15:00:22 +08:00
help :
2013-09-18 16:30:16 +05:30
@$( ECHO) " \nAvailable targets:\n\
2014-05-27 11:25:23 +01:00
make - compile the code\n \
make upload - upload\n \
make ispload - upload using an ISP\n \
make raw_upload - upload without first resetting\n \
make eeprom - upload the eep file\n \
make raw_eeprom - upload the eep file without first resetting\n \
make clean - remove all our dependencies\n \
make depends - update dependencies\n \
make reset - reset the Arduino by tickling DTR or changing baud\n \
rate on the serial port.\n \
make show_boards - list all the boards defined in boards.txt\n \
make monitor - connect to the Arduino' s serial port\n \
make size - show the size of the compiled output ( relative to\n \
resources, if you have a patched avr-size) .\n \
make verify_size - verify that the size of the final file is less than\n \
the capacity of the micro controller.\n \
make symbol_sizes - generate a .sym file containing symbols and their\n \
sizes.\n \
make disasm - generate a .lss file that contains disassembly\n \
of the compiled file interspersed with your\n \
original source code.\n \
make generate_assembly - generate a .s file containing the compiler\n \
generated assembly of the main sketch.\n \
make burn_bootloader - burn bootloader and fuses\n \
make set_fuses - set fuses without burning bootloader\n \
make help_vars - print all variables that can be overridden\n \
make help - show this help\n \
2013-09-15 15:00:22 +08:00
"
2014-01-13 12:14:31 +00:00
@$( ECHO) " Please refer to $( ARDMK_DIR) /Arduino.mk for more details.\n "
2013-09-15 15:00:22 +08:00
.PHONY : all upload raw_upload raw_eeprom error_on_caterina reset reset_stty ispload \
clean depends size show_boards monitor disasm symbol_sizes generated_assembly \
2014-03-14 10:42:35 +11:00
generate_assembly verify_size burn_bootloader help pre-build
2012-02-28 09:06:56 +00:00
2012-05-05 16:03:40 +05:30
# added - in the beginning, so that we don't get an error if the file is not present
2012-07-05 04:30:47 +01:00
- i n c l u d e $( DEPS )