# (1) Project Information PROJECT_LIBS = SPI RF24 ; # (2) Board Information UPLOAD_PROTOCOL ?= stk500v1 ; UPLOAD_SPEED ?= 57600 ; MCU ?= atmega328p ; F_CPU ?= 16000000 ; CORE ?= arduino ; VARIANT ?= standard ; ARDUINO_VERSION ?= 100 ; # (3) USB Ports PORTS = p4 p6 p9 u0 u1 u2 ; PORT_p6 = /dev/tty.usbserial-A600eHIs ; PORT_p4 = /dev/tty.usbserial-A40081RP ; PORT_p9 = /dev/tty.usbserial-A9007LmI ; PORT_u0 = /dev/ttyUSB0 ; PORT_u1 = /dev/ttyUSB1 ; PORT_u2 = /dev/ttyUSB2 ; # (4) Location of AVR tools # # This configuration assumes using avr-tools that were obtained separate from the Arduino # distribution. if $(OS) = MACOSX { AVR_BIN = /usr/local/avrtools/bin ; AVR_ETC = /usr/local/avrtools/etc ; AVR_INCLUDE = /usr/local/avrtools/include ; } else { AVR_BIN = /usr/bin ; AVR_INCLUDE = /usr/lib/avr/include ; AVR_ETC = /etc ; } # (5) Directories where Arduino core and libraries are located ARDUINO_DIR ?= /opt/Arduino ; ARDUINO_CORE = $(ARDUINO_DIR)/hardware/arduino/cores/$(CORE) $(ARDUINO_DIR)/hardware/arduino/variants/$(VARIANT) ; ARDUINO_LIB = $(ARDUINO_DIR)/libraries ; SKETCH_LIB = $(HOME)/Source/Arduino/libraries ; # # -------------------------------------------------- # Below this line usually never needs to be modified # # Tool locations CC = $(AVR_BIN)/avr-gcc ; C++ = $(AVR_BIN)/avr-g++ ; LINK = $(AVR_BIN)/avr-gcc ; OBJCOPY = $(AVR_BIN)/avr-objcopy ; AVRDUDE = $(AVR_BIN)/avrdude ; # Flags DEFINES += F_CPU=$(F_CPU)L ARDUINO=$(ARDUINO_VERSION) VERSION_H ; OPTIM = -Os ; CCFLAGS = -Wall -Wextra -mmcu=$(MCU) -ffunction-sections -fdata-sections ; C++FLAGS = $(CCFLAGS) -fno-exceptions -fno-strict-aliasing ; LINKFLAGS = $(OPTIM) -lm -Wl,--gc-sections -mmcu=$(MCU) ; AVRDUDEFLAGS = -V -F -D -C $(AVR_ETC)/avrdude.conf -p $(MCU) -c $(UPLOAD_PROTOCOL) -b $(UPLOAD_SPEED) ; # Search everywhere for headers HDRS = $(PWD) $(AVR_INCLUDE) $(ARDUINO_CORE) $(ARDUINO_LIB)/$(PROJECT_LIBS) $(ARDUINO_LIB)/$(PROJECT_LIBS)/utility $(SKETCH_LIB)/$(PROJECT_LIBS) ; # Output locations LOCATE_TARGET = $(F_CPU) ; LOCATE_SOURCE = $(F_CPU) ; # # Custom rules # rule GitVersion { Always $(<) ; Depends all : $(<) ; } actions GitVersion { echo "const char program_version[] = \"\\" > $(<) git log -1 --pretty=format:%h >> $(<) echo "\";" >> $(<) } GitVersion version.h ; rule Pde { Depends $(<) : $(>) ; MakeLocate $(<) : $(LOCATE_SOURCE) ; Clean clean : $(<) ; } if ( $(ARDUINO_VERSION) < 100 ) { ARDUINO_H = WProgram.h ; } else { ARDUINO_H = Arduino.h ; } actions Pde { echo "#include <$(ARDUINO_H)>" > $(<) echo "#line 1 \"$(>)\"" >> $(<) cat $(>) >> $(<) } rule C++Pde { local _CPP = $(>:B).cpp ; Pde $(_CPP) : $(>) ; C++ $(<) : $(_CPP) ; } rule UserObject { switch $(>:S) { case .ino : C++Pde $(<) : $(>) ; case .pde : C++Pde $(<) : $(>) ; } } rule Objects { local _i ; for _i in [ FGristFiles $(<) ] { local _b = $(_i:B)$(SUFOBJ) ; local _o = $(_b:G=$(SOURCE_GRIST:E)) ; Object $(_o) : $(_i) ; Depends obj : $(_o) ; } } rule Main { MainFromObjects $(<) : $(>:B)$(SUFOBJ) ; Objects $(>) ; } rule Hex { Depends $(<) : $(>) ; MakeLocate $(<) : $(LOCATE_TARGET) ; Depends hex : $(<) ; Clean clean : $(<) ; } actions Hex { $(OBJCOPY) -O ihex -R .eeprom $(>) $(<) } rule Upload { Depends $(1) : $(2) ; Depends $(2) : $(3) ; NotFile $(1) ; Always $(1) ; Always $(2) ; UploadAction $(2) : $(3) ; } actions UploadAction { $(AVRDUDE) $(AVRDUDEFLAGS) -P $(<) $(AVRDUDE_WRITE_FLASH) -U flash:w:$(>):i } # # Targets # # Grab everything from the core directory CORE_MODULES = [ GLOB $(ARDUINO_CORE) : *.c *.cpp ] ; # Grab everything from libraries. To avoid this "grab everything" behaviour, you # can specify specific modules to pick up in PROJECT_MODULES LIB_MODULES = [ GLOB $(ARDUINO_LIB)/$(PROJECT_LIBS) $(ARDUINO_LIB)/$(PROJECT_LIBS)/utility $(SKETCH_LIB)/$(PROJECT_LIBS) : *.cpp *.c ] ; # Grab everything from the current dir PROJECT_MODULES += [ GLOB $(PWD) : *.c *.cpp *.pde *.ino ] ; # Main output executable MAIN = $(PWD:B).elf ; Main $(MAIN) : $(CORE_MODULES) $(LIB_MODULES) $(PROJECT_MODULES) ; Hex $(MAIN:B).hex : $(MAIN) ; # Upload targets for _p in $(PORTS) { Upload $(_p) : $(PORT_$(_p)) : $(MAIN:B).hex ; }