Permalink
Browse files

Original Makefile.master with following changes:

- Use screen as console monitor on OS X
- Support Arduino 1.0
- Remove -Wextra as is fails in Arduino's libs
- Use .ino files rather than .pde
  • Loading branch information...
neverpanic committed Feb 4, 2012
1 parent 41de2b6 commit 7bdec7e7cd9a33928d3f82ef082ceaedc720e731
Showing with 288 additions and 0 deletions.
  1. +288 −0 Makefile.master
View
@@ -0,0 +1,288 @@
+# vim:ft=make
+#
+# Changes 2012 Clemens Lang, neverpanic@gmail.com. All rights reserved.
+# Copyright 2011 Alan Burlison, alan@bleaklow.com. All rights reserved.
+# Use is subject to license terms.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice,
+# this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions and the following disclaimer in the documentation
+# and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY ALAN BURLISON "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL ALAN BURLISON OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+# OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# Makefile for building Arduino projects outside of the Arduino environment
+#
+# This makefile should be included into a per-project Makefile of the following
+# form:
+#
+# ----------
+# BOARD = mega
+# PORT = /dev/term/0
+# INC_DIRS = ../common
+# LIB_DIRS = ../libraries/Task ../../libraries/VirtualWire
+# include ../../Makefile.master
+# ----------
+#
+# Where:
+# BOARD : Arduino board type, from $(ARD_HOME)/hardware/boards.txt
+# PORT : USB port
+# INC_DIRS : List pf directories containing header files
+# LIB_DIRS : List of directories containing library source
+#
+# Before using this Makefile you can adjust the following macros to suit
+# your environment, either by editing this file directly or by defining them in
+# the Makefile that includes this one, in which case they will override the
+# definitions below:
+# ARD_REV : arduino software revision, e.g. 0017, 0018
+# ARD_HOME : installation directory of the Arduino software.
+# ARD_BIN : location of compiler binaries
+# AVRDUDE : location of avrdude executable
+# AVRDUDE_CONF : location of avrdude configuration file
+# PROGRAMMER : avrdude programmer type
+# MON_SPEED : serial monitor speed
+# EXTRA_FLAGS : any extra flags that should be passed to the compilers
+#
+
+# Global configuration.
+ARD_REV ?= 1.0
+ARD_HOME ?= /Applications/Arduino.app/Contents/Resources/Java
+ARD_BIN ?= $(ARD_HOME)/hardware/tools/avr/bin
+AVRDUDE ?= $(ARD_BIN)/avrdude
+AVRDUDE_CONF ?= $(ARD_HOME)/hardware/tools/avr/etc/avrdude.conf
+PROGRAMMER ?= arduino
+MON_SPEED ?= 9600
+
+### Nothing below here should require editing. ###
+
+# Check for the required definitions.
+ifndef BOARD
+ $(error $$(BOARD) not defined)
+endif
+ifndef PORT
+ $(error $$(PORT) not defined)
+endif
+
+# Paths
+ARD_BOARDS = $(ARD_HOME)/hardware/arduino/boards.txt
+ARD_SRC_DIR = $(ARD_HOME)/hardware/arduino/cores/arduino
+ARD_VAR_DIR = $(ARD_HOME)/hardware/arduino/variants
+ARD_MAIN = $(ARD_SRC_DIR)/main.cpp
+
+# Platform-specific settings.
+PLATFORM = $(shell uname -s)
+ifeq "$(PLATFORM)" "SunOS"
+ define run-monitor
+ gnome-terminal -t '$(BOARD) $(PORT)' \
+ -e 'env -i tip -$(MON_SPEED) $(PORT)' &
+ endef
+ define kill-monitor
+ - pkill -f 'tip.*$(PORT)'
+ endef
+else ifeq "$(PLATFORM)" "Linux"
+ define run-monitor
+ screen $(PORT) $(MON_SPEED)
+ endef
+ define kill-monitor
+ - pkill -f 'screen.*$(PORT)'
+ endef
+else ifeq "$(PLATFORM)" "Darwin"
+ define run-monitor
+ screen $(PORT) $(MON_SPEED)
+ endef
+ define kill-monitor
+ - pkill -f 'screen.*$(PORT)'
+ endef
+else
+ $(error Unknown platform $(PLATFORM))
+endif
+
+# Standard macros.
+SKETCH = $(notdir $(CURDIR))
+BUILD_DIR = build
+VPATH = $(LIB_DIRS)
+
+# Macros derived from boards.txt
+MCU := $(shell sed -n 's/$(BOARD)\.build\.mcu=\(.*\)/\1/p' < $(ARD_BOARDS))
+F_CPU := $(shell sed -n 's/$(BOARD)\.build\.f_cpu=\(.*\)/\1/p' < $(ARD_BOARDS))
+UPLOAD_SPEED := $(shell sed -n 's/$(BOARD)\.upload\.speed=\(.*\)/\1/p' < $(ARD_BOARDS))
+VARIANT := $(shell sed -n 's/$(BOARD)\.build\.variant=\(.*\)/\1/p' < $(ARD_BOARDS))
+
+# Build tools.
+CC = $(ARD_BIN)/avr-gcc
+CXX = $(ARD_BIN)/avr-g++
+CXXFILT = $(ARD_BIN)/avr-c++filt
+OBJCOPY = $(ARD_BIN)/avr-objcopy
+OBJDUMP = $(ARD_BIN)/avr-objdump
+AR = $(ARD_BIN)/avr-ar
+SIZE = $(ARD_BIN)/avr-size
+NM = $(ARD_BIN)/avr-nm
+MKDIR = mkdir -p
+RM = rm -rf
+MV = mv -f
+
+# Compiler flags.
+INC_FLAGS = \
+ $(addprefix -I,$(INC_DIRS)) $(addprefix -I,$(LIB_DIRS)) -I$(ARD_SRC_DIR) -I$(ARD_VAR_DIR)/$(VARIANT)
+ARD_FLAGS = -mmcu=$(MCU) -DF_CPU=$(F_CPU) -DARDUINO=$(ARD_REV)
+C_CXX_FLAGS = \
+ -Wall -Wundef -Werror -Wno-unused-parameter \
+ -fdiagnostics-show-option -g -Wa,-adhlns=$(BUILD_DIR)/$*.lst \
+ $(EXTRA_FLAGS)
+C_FLAGS = \
+ -std=gnu99 -Wstrict-prototypes -Wno-old-style-declaration $(C_CXX_FLAGS)
+CXX_FLAGS = \
+ $(C_CXX_FLAGS)
+
+# Optimiser flags.
+# optimise for size, unsigned by default, pack data.
+# separate sections, drop unused ones, shorten branches, jumps.
+# don't inline, vectorise loops. no exceptions.
+# no os preamble, use function calls in prologues.
+# http://gcc.gnu.org/onlinedocs/gcc-4.3.5/gcc/
+# http://www.tty1.net/blog/2008-04-29-avr-gcc-optimisations_en.html
+OPT_FLAGS = \
+ -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \
+ -ffunction-sections -fdata-sections -Wl,--gc-sections,--relax \
+ -fno-inline-small-functions -fno-tree-scev-cprop -fno-exceptions \
+ -ffreestanding -mcall-prologues
+
+# Build parameters.
+IMAGE = $(BUILD_DIR)/$(SKETCH)
+ARD_C_SRC = $(wildcard $(ARD_SRC_DIR)/*.c)
+ARD_CXX_SRC = $(wildcard $(ARD_SRC_DIR)/*.cpp)
+ARD_C_OBJ = $(patsubst %.c,%.o,$(notdir $(ARD_C_SRC)))
+ARD_CXX_OBJ = $(patsubst %.cpp,%.o,$(notdir $(ARD_CXX_SRC)))
+ARD_LIB = arduino
+ARD_AR = $(BUILD_DIR)/lib$(ARD_LIB).a
+ARD_AR_OBJ = $(ARD_AR)($(ARD_C_OBJ) $(ARD_CXX_OBJ))
+ARD_LD_FLAG = -l$(ARD_LIB)
+
+# Workaround for http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34734
+$(ARD_AR)(Tone.o) : CXX_FLAGS += -w
+
+# Sketch libraries.
+LIB_C_SRC = $(foreach ld,$(LIB_DIRS),$(wildcard $(ld)/*.c))
+LIB_CXX_SRC = $(foreach ld,$(LIB_DIRS),$(wildcard $(ld)/*.cpp))
+LIB_SRC = $(LIB_C_SRC) $(LIB_CXX_SRC)
+ifneq "$(strip $(LIB_C_SRC) $(LIB_CXX_SRC))" ""
+ LIB_C_OBJ = $(patsubst %.c,%.o,$(notdir $(LIB_C_SRC)))
+ LIB_CXX_OBJ = $(patsubst %.cpp,%.o,$(notdir $(LIB_CXX_SRC)))
+ LIB_LIB = library
+ LIB_AR = $(BUILD_DIR)/lib$(LIB_LIB).a
+ LIB_AR_OBJ = $(LIB_AR)($(LIB_C_OBJ) $(LIB_CXX_OBJ))
+ LIB_LD_FLAG = -l$(LIB_LIB)
+endif
+
+# Sketch PDE source.
+SKT_PDE_SRC = $(wildcard *.ino)
+ifneq "$(strip $(SKT_PDE_SRC))" ""
+ SKT_PDE_OBJ = $(BUILD_DIR)/$(SKETCH)_ino.o
+endif
+
+# C and C++ source.
+SKT_C_SRC = $(wildcard *.c)
+SKT_CXX_SRC = $(wildcard *.cpp)
+ifneq "$(strip $(SKT_C_SRC) $(SKT_CXX_SRC))" ""
+ SKT_C_OBJ = $(patsubst %.c,%.o,$(SKT_C_SRC))
+ SKT_CXX_OBJ = $(patsubst %.cpp,%.o,$(SKT_CXX_SRC))
+ SKT_LIB = sketch
+ SKT_AR = $(BUILD_DIR)/lib$(SKT_LIB).a
+ SKT_AR_OBJ = $(SKT_AR)/($(SKT_C_OBJ) $(SKT_CXX_OBJ))
+ SKT_LD_FLAG = -l$(SKT_LIB)
+endif
+
+# Common rule bodies.
+define run-cc
+ $(CC) -c $(C_FLAGS) $(OPT_FLAGS) $(ARD_FLAGS) $(INC_FLAGS) \
+ -MD -MT '$@($%)' -MF $(@D)/.$(@F)_$*.dep $< -o $(BUILD_DIR)/$%
+ @ $(AR) rc $@ $(BUILD_DIR)/$%
+ @ $(RM) $(BUILD_DIR)/$%
+ @ $(CXXFILT) < $(BUILD_DIR)/$*.lst > $(BUILD_DIR)/$*.lst.tmp
+ @ $(MV) $(BUILD_DIR)/$*.lst.tmp $(BUILD_DIR)/$*.lst
+endef
+
+define run-cxx
+ $(CXX) -c $(CXX_FLAGS) $(OPT_FLAGS) $(ARD_FLAGS) $(INC_FLAGS) \
+ -MD -MT '$@($%)' -MF $(@D)/.$(@F)_$*.dep $< -o $(BUILD_DIR)/$%
+ @ $(AR) rc $@ $(BUILD_DIR)/$%
+ @ $(RM) $(BUILD_DIR)/$%
+ @ $(CXXFILT) < $(BUILD_DIR)/$*.lst > $(BUILD_DIR)/$*.lst.tmp
+ @ $(MV) $(BUILD_DIR)/$*.lst.tmp $(BUILD_DIR)/$*.lst
+endef
+
+# Rules.
+.PHONY : all clean upload monitor upload_monitor
+
+all : $(BUILD_DIR) $(IMAGE).hex
+
+clean :
+ $(RM) $(BUILD_DIR)
+
+$(BUILD_DIR) :
+ $(MKDIR) $@
+
+$(SKT_PDE_OBJ) : $(SKT_PDE_SRC)
+ echo '#include <Arduino.h>' > $(BUILD_DIR)/$(SKETCH)_ino.cpp
+ cat $(SKT_PDE_SRC) >> $(BUILD_DIR)/$(SKETCH)_ino.cpp
+ cd $(BUILD_DIR) && $(CXX) -c $(subst build/,,$(CXX_FLAGS)) \
+ $(OPT_FLAGS) $(ARD_FLAGS) -I.. \
+ $(patsubst -I..%,-I../..%,$(INC_FLAGS)) \
+ $(SKETCH)_ino.cpp -o $(@F)
+
+(%.o) : $(ARD_SRC_DIR)/%.c
+ $(run-cc)
+
+(%.o) : $(ARD_SRC_DIR)/%.cpp
+ $(run-cxx)
+
+(%.o) : %.c
+ $(run-cc)
+
+(%.o) : %.cpp
+ $(run-cxx)
+
+$(BUILD_DIR)/%.d : %.c
+ $(run-cc-d)
+
+$(BUILD_DIR)/%.d : %.cpp
+ $(run-cxx-d)
+
+# The multiple "-lm" flags are to work around a linker bug.
+$(IMAGE).hex : $(ARD_AR_OBJ) $(LIB_AR_OBJ) $(SKT_AR_OBJ) $(SKT_PDE_OBJ)
+ $(CC) -lm $(CXX_FLAGS) $(OPT_FLAGS) $(ARD_FLAGS) -L$(BUILD_DIR) \
+ $(SKT_PDE_OBJ) $(SKT_LD_FLAG) $(LIB_LD_FLAG) $(ARD_LD_FLAG) \
+ -lm -o $(IMAGE).elf
+ $(OBJCOPY) -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load \
+ --no-change-warnings --change-section-lma .eeprom=0 $(IMAGE).elf \
+ $(IMAGE).eep
+ $(OBJCOPY) -O ihex -R .eeprom $(IMAGE).elf $(IMAGE).hex
+ $(OBJDUMP) -h -S $(IMAGE).elf | $(CXXFILT) -t > $(IMAGE).lst
+ $(SIZE) $(IMAGE).elf
+
+upload : all
+ $(kill-monitor)
+ - $(AVRDUDE) -V -C$(AVRDUDE_CONF) -p$(MCU) -c$(PROGRAMMER) -P$(PORT) \
+ -b$(UPLOAD_SPEED) -D -Uflash:w:$(IMAGE).hex:i
+
+monitor :
+ $(kill-monitor)
+ $(run-monitor)
+
+upload_monitor : upload monitor
+
+-include $(wildcard $(BUILD_DIR)/.*.dep))

0 comments on commit 7bdec7e

Please sign in to comment.