-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
143 lines (117 loc) · 3.86 KB
/
Makefile
File metadata and controls
143 lines (117 loc) · 3.86 KB
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
135
136
137
138
139
140
141
142
143
.DELETE_ON_ERROR:
.SUFFIXES:
# Makefile
# Written by Leon Krieg <info@madcow.dev>
# ==============================================================================
# GENERAL SETTINGS
# ==============================================================================
VERBOSE := false
ARCH := m1284
MCU := atmega1284p
FREQ := 8000000UL
ISP := usbasp
CC := avr-gcc
LD := $(CC)
OBJCOPY := avr-objcopy
AVD := avrdude
SIM := simavr
MKDIR := mkdir -p
RMR := rm -rf
GIT := git
LFUSE := 0xC2
HFUSE := 0xD7
EFUSE := 0xFF
LOCK := 0xFF
SRCDIR := src
BINDIR := bin
TMPDIR := $(BINDIR)/build
TARGET := $(BINDIR)/core.hex
ELFFILE := $(BINDIR)/core.elf
LOGFILE := $(BINDIR)/core.log
CPPFLAGS := -DF_CPU=$(FREQ) -I$(SRCDIR)
CFLAGS := -mmcu=$(MCU) -Os -std=c99 -Wall -Wextra -Werror
OCFLAGS := -j .text -j .data -O ihex
LDFLAGS := -mmcu=$(MCU) -Wl,-u,vfprintf -lprintf_flt
LDLIBS := -lm
# ==============================================================================
# TARGET FILE LISTS (DERIVED FROM SOURCE TREE)
# ==============================================================================
PATHS := $(shell find "$(SRCDIR)" -type d -printf '%P ' 2>/dev/null)
FILES := $(shell find "$(SRCDIR)" -type f -name "*.c" -printf '%P ' 2>/dev/null)
TMPDIRS := $(BINDIR) $(TMPDIR) $(PATHS:%=$(TMPDIR)/%)
OBJECTS := $(FILES:%.c=$(TMPDIR)/%.o)
DEPENDS := $(FILES:%.c=$(TMPDIR)/%.d)
# ==============================================================================
# AUXILIARY TARGETS
# ==============================================================================
.PHONY: all
all: flash
.PHONY: flash
flash: $(TARGET)
$(E) "[AVD] Flashing..."
$(Q) $(AVD) \
-l$(LOGFILE) -B375kHz \
-c $(ISP) -p $(ARCH) \
-U lfuse:w:$(LFUSE):m \
-U hfuse:w:$(HFUSE):m \
-U efuse:w:$(EFUSE):m \
-U lock:w:$(LOCK):m \
-U flash:w:$<
.PHONY: simulate
simulate: $(TARGET)
$(E) "[SIM] $<"
$(Q) $(SIM) -m $(MCU) -f $(FREQ) $<
.PHONY: clean
clean:
$(E) "[REM] $(TARGET)"
$(Q) $(RMR) $(TARGET)
$(E) "[REM] $(ELFFILE)"
$(Q) $(RMR) $(ELFFILE)
$(E) "[REM] $(LOGFILE)"
$(Q) $(RMR) $(LOGFILE)
$(E) "[REM] $(TMPDIR)"
$(Q) $(RMR) $(TMPDIR)
.PHONY: distclean
distclean: clean
$(E) "[REM] $(BINDIR)"
$(Q) $(RMR) $(BINDIR)
$(TMPDIRS):
$(E) "[DIR] $@"
$(Q) $(MKDIR) $@
# ==============================================================================
# PRIMARY BUILD TARGET AND PATTERN RULES
# ==============================================================================
# We must expand the prerequisite lists a second time to resolve path variable
# $(@D). This means folders can be set as explicit dependencies and created in
# the $TMPDIRS rule. This is better than relying on Make to honor the order of
# prerequisites for the primary target and we will not have to call mkdir for
# each build step preemptively.
.SECONDEXPANSION:
$(TARGET): $(ELFFILE) | $$(@D)
$(E) "[HEX] $@"
$(Q) $(OBJCOPY) $(OCFLAGS) $< $@
$(ELFFILE): $(OBJECTS) $(DEPENDS) | $$(@D)
$(E) "[ELF] $@"
$(Q) $(LD) -o $@ $(LDFLAGS) $(OBJECTS) $(LDLIBS)
$(TMPDIR)/%.o: $(SRCDIR)/%.c | $$(@D)
$(E) "[OBJ] $@"
$(Q) $(CC) -c -o $@ $(CFLAGS) $(CPPFLAGS) $<
$(TMPDIR)/%.d: $(SRCDIR)/%.c | $$(@D)
$(E) "[DEP] $@"
$(Q) $(CC) -c -o $@ $(CFLAGS) $(CPPFLAGS) -MM -MT $(@:.d=.o) $<
# ==============================================================================
# MAKE PREPROCESSOR INCLUDES AND CONDITIONALS
# ==============================================================================
# Load header dependency rules
include $(wildcard $(DEPENDS))
# Sanity check
ifeq ($(strip $(OBJECTS)),)
$(error No sources found in '$(SRCDIR)/')
endif
# Handle verbosity setting
ifneq ($(VERBOSE), false)
E = @true
else
E = @echo
Q = @
endif