-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
127 lines (87 loc) · 3 KB
/
Makefile
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
# ---- Project configuration --------------------------------------------------
# Name & configuration
PROGNAME = MyProgram
CONFIG_FILE = src/myconfig.h # optional
LDSCRIPT = # optional
# Target configuration
TARGET = atmega328p
CPU_FREQ = 16000000L
# Fuses
LFUSE = #0xE2
HFUSE = #0xDF
EFUSE = #0xFF
# Upload configuration
ISP_IF = usb # For ISP programming
PROG_PORT = /dev/ttyUSB0
PROG_RATE = 57600
# Libraries
LIB_DIRS = #/path/to/libs/ /another/path/to/libs/
LIB_NAMES = #lib1 lib2 lib3
# ---- Paths & file setup -----------------------------------------------------
SRCDIR = src
OBJDIR = obj
DISTDIR = dist
# ---- Toolchain --------------------------------------------------------------
CC = avr-gcc
CPP = avr-g++
OBJCPY = avr-objcopy
SIZE = avr-size
COMP_OPT = -Os -mcall-prologues -fno-inline-small-functions -ffunction-sections -fdata-sections
LINK_OPT = -Os -Wl,--relax,--gc-sections,-Map=$(DISTDIR)/$(PROGNAME).map
FLAGS = -Wall -fno-exceptions -funsigned-char -pedantic -funsigned-bitfields -fpack-struct -fshort-enums
# Object files and include paths
SOURCE_DIRS := $(shell find src/ -type d)
SRCS := $(foreach DIR, $(SOURCE_DIRS), $(shell find $(DIR) -iname "*.c" -o -iname "*.cpp"))
OBJS := $(patsubst %.cpp, $(OBJDIR)/%.o, $(patsubst %.c, $(OBJDIR)/%.o, $(notdir $(SRCS))))
INCS := $(foreach DIR, $(SOURCE_DIRS), -I$(DIR))
# Source search paths
VPATH := $(SOURCE_DIRS)
# Library paths
LDPATHS := $(foreach L, $(LIB_DIRS), -L$(L)) $(foreach n, $(LIB_NAMES), -l$(n))
# ---- Compiler & linker flags ------------------------------------------------
CXXFLAGS := $(COMP_OPT) $(FLAGS) -mmcu=$(TARGET) -DF_CPU=$(CPU_FREQ) $(INCS)
ifdef CONFIG_FILE
CXXFLAGS += -imacros $(CONFIG_FILE)
endif
CFLAGS := $(CXXFLAGS)
CPPFLAGS := $(CXXFLAGS) -fpermissive
LDFLAGS := $(LINK_OPT) -mmcu=$(TARGET)
ifdef LDSCRIPT
LDFLAGS += -T $(LDSCRIPT)
endif
# ---- Targets & rules --------------------------------------------------------
.PHONY: all
all: makedirs $(DISTDIR)/$(PROGNAME).hex
.PHONY: clean
clean:
@rm -rf $(DISTDIR)/*
@rm -rf $(OBJDIR)/*
# Upload program using the serial STK500 (used by Arduino bootloaders)
.PHONY: stk500_upload
stk500_upload: $(DISTDIR)/$(PROGNAME).hex
avrdude -carduino -p$(TARGET) -P$(PROG_PORT) -b$(PROG_RATE) -Uflash:w:$<
# Upload program using ISP (AVR Dragon)
.PHONY: isp_upload
isp_upload: $(DISTDIR)/$(PROGNAME).hex
avrdude -cdragon_isp -p$(TARGET) -P$(ISP_IF) -Uflash:w:$<
# Set fuses iusing ISP (AVR Dragon)
.PHONY: isp_fuses
isp_fuses:
avrdude -cdragon_isp -p$(TARGET) -P$(ISP_IF) -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m
# Transform to hex
$(DISTDIR)/$(PROGNAME).hex: $(DISTDIR)/$(PROGNAME).elf
@echo "Generating hex..."
@$(OBJCPY) -O ihex $< $@
# Link
$(DISTDIR)/$(PROGNAME).elf: $(OBJS)
@echo "Linking..."
@$(CC) $(LDFLAGS) -o $@ $^ $(LDPATHS)
@$(SIZE) $@
# Compile
$(OBJDIR)/%.o: %.cpp
@$(CPP) -c $< $(CPPFLAGS) -o $@
$(OBJDIR)/%.o: %.c
@$(CC) -c $< $(CFLAGS) -o $@
makedirs:
@mkdir -p $(OBJDIR)
@mkdir -p $(DISTDIR)