aboutsummaryrefslogtreecommitdiffstats
path: root/sw/Makefile
blob: 259583df615f5f9591bf99a73aeec1d23dc4d419 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# Location of build tools
CC=avr-gcc
CXX=avr-g++
OBJCOPY=avr-objcopy
SIZE=avr-size
AVRDUDE=avrdude

# Modify this to the device name of the UART used for AVRDUDE
AVRDUDE_DEV=usb
PROG = dragon_isp

# Modify this to the CPU you are using
PART=atmega328p
AVRDUDE_PART=m328p

# Cpu frequency is 16MHz, divider = 8
F_CPU="(16000000UL/8)"

# Directory for built objects
BUILD_DIR=build

# Port/application object files
APP_NAME = sw

HEADERS = \
		  pins.hpp \
		  common.hpp \
		  relays.hpp \
		  lib/Arduino.h \
		  lib/DallasTemperature.h \
		  lib/delay.h \
		  lib/OneWire.h \
		  lib/pins_arduino.h \
		  lib/uart.h \
		  lib/util/OneWire_direct_gpio.h \
		  lib/util/OneWire_direct_regtype.h

# Application object files
APP_CXX_OBJECTS = main.o relays.o ltc2400.o
APP_OBJECTS =

# Library object files to build and use
LIB_OBJECTS = uart.o
LIB_CXX_OBJECTS = OneWire.o DallasTemperature.o
LIB_ASM_OBJECTS =
LIB_DIR = lib

# Collection of built objects
ALL_OBJECTS = $(LIB_OBJECTS) $(LIB_ASM_OBJECTS) $(LIB_CXX_OBJECTS) $(APP_OBJECTS) $(APP_CXX_OBJECTS)
BUILT_OBJECTS = $(patsubst %,$(BUILD_DIR)/%,$(ALL_OBJECTS))

# Target application filenames (.elf and .hex) for each application object
APP_ELF = $(APP_NAME).elf
APP_HEX = $(APP_NAME).hex

# Search build/output directory for dependencies
vpath %.o ./$(BUILD_DIR)
vpath %.elf ./$(BUILD_DIR)
vpath %.hex ./$(BUILD_DIR)

# GCC flags
DEFINES=-DUART_RX0_BUFFER_SIZE=64 -DUART_TX0_BUFFER_SIZE=64 -DARDUINO=180
FLAGS=-g -mmcu=$(PART) -Os -Wall -Wextra -DF_CPU=$(F_CPU) $(DEFINES) -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects
CFLAGS=$(FLAGS) -std=c99
CXXFLAGS=$(FLAGS) -std=c++11 -fno-exceptions -fno-threadsafe-statics
INCLUDES=-I. -I$(LIB_DIR)


#################
# Build targets #
#################

# All applications
all: $(BUILD_DIR) $(APP_HEX) Makefile

# Make build/output directory
$(BUILD_DIR):
	mkdir $(BUILD_DIR)

# Application HEX files
$(APP_HEX): %.hex: %.elf
	@echo Building $@
	$(OBJCOPY) -j .text -j .data -O ihex $(BUILD_DIR)/$< $(BUILD_DIR)/$@

# Application ELF files
$(APP_ELF): %.elf: $(LIB_OBJECTS) $(LIB_CXX_OBJECTS) $(LIB_ASM_OBJECTS) $(APP_OBJECTS) $(APP_CXX_OBJECTS)
	$(CXX) $(CXXFLAGS) $(BUILT_OBJECTS) --output $(BUILD_DIR)/$@ -flto -fuse-linker-plugin -Wl,--gc-sections -Wl,-Map,$(BUILD_DIR)/$(basename $@).map

# Application objects builder
$(APP_OBJECTS): %.o: %.c $(HEADERS)
	$(CC) -c $(CFLAGS) $(INCLUDES) $< -o $(BUILD_DIR)/$(notdir $@)

$(APP_CXX_OBJECTS): %.o: %.cpp $(HEADERS)
	$(CXX) -c $(CXXFLAGS) $(INCLUDES) $< -o $(BUILD_DIR)/$(notdir $@)

# Application objects builder
$(LIB_OBJECTS): %.o: $(LIB_DIR)/%.c $(HEADERS)
	$(CC) -c $(CFLAGS) $(INCLUDES) $< -o $(BUILD_DIR)/$(notdir $@)

$(LIB_CXX_OBJECTS): %.o: $(LIB_DIR)/%.cpp $(HEADERS)
	$(CXX) -c $(CXXFLAGS) $(INCLUDES) $< -o $(BUILD_DIR)/$(notdir $@)

$(LIB_ASM_OBJECTS): %.o: $(LIB_DIR)/%.s
	$(CC) -c $(CFLAGS) -x assembler-with-cpp -flto -MMD $(INCLUDES) $< -o $(BUILD_DIR)/$(notdir $@)

# .lst file builder
%.lst: %.c $(HEADERS)
	$(CC) $(CFLAGS) $(INCLUDES) -Wa,-al $< > $@

%.lst: %.cpp $(HEADERS)
	$(CXX) $(CXXFLAGS) $(INCLUDES) -Wa,-al $< > $@

# Clean
clean:
	rm -f *.o *.elf *.map *.hex *.bin *.lst
	rm -rf doxygen-avr
	rm -rf build

# Send to device
program: $(APP_HEX)
	$(SIZE) -C $(BUILD_DIR)/$(APP_ELF)
	$(AVRDUDE) $(AVRDUDE_FLAGS) -c $(PROG) -P $(AVRDUDE_DEV) -p $(AVRDUDE_PART) -U flash:w:$(BUILD_DIR)/$(APP_HEX) -v

fuse:
	$(AVRDUDE) $(AVRDUDE_FLAGS) -c $(PROG) -P $(AVRDUDE_DEV) -p $(AVRDUDE_PART) -U lfuse:w:0x7e:m -U hfuse:w:0xd9:m -U efuse:w:0xfc:m -v

interactive:
	$(AVRDUDE) $(AVRDUDE_FLAGS) -c $(PROG) -P $(AVRDUDE_DEV) -p $(AVRDUDE_PART) -t -v

help:
	@echo "targets: all, program, fuse, interactive"

doxygen:
	doxygen ./Doxyfile