-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
155 lines (111 loc) · 4.78 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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
################################################################################
# COMMON RULES #
##############################################################################R##
COMMON_SRC_DIR=src
COMMON_INC_DIR=include
CFLAGS=-Wall -Wextra -I${COMMON_INC_DIR} -DDISABLE_FAILSAFE
FIRMWARE_SRC_DIR=firmware/src
FIRMWARE_INC_DIR=firmware/include
DRIVER_DIR=driver
COMMON_SRC = $(wildcard $(COMMON_SRC_DIR)/*.c)
FIRMWARE_SRC = $(wildcard $(FIRMWARE_SRC_DIR)/*.c)
DRIVER_SRC = $(wildcard $(DRIVER_DIR)/*.c)
.PHONY: all depend clean local_build cross_build
BINS=test_bit_utils \
test_driver \
test_protocol \
fake_device \
test_communication
all: ${BINS} all_cross
################################################################################
# LOCAL BUILD RULES #
################################################################################
LOC_COMPILER=gcc
LOC_CFLAGS= ${CFLAGS} -g
LOC_COMMON_OBJ = $(addprefix local_build/, $(COMMON_SRC:.c=.o))
LOC_FIRMWARE_OBJ = $(addprefix local_build/, $(FIRMWARE_SRC:.c=.o))
LOC_DRIVER_OBJ = $(addprefix local_build/, $(DRIVER_SRC:.c=.o))
local_build/src/%.o: src/%.c local_build
${LOC_COMPILER} ${LOC_CFLAGS} -o $@ -c $<
local_build/firmware/%.o: firmware/%.c local_build
${LOC_COMPILER} ${LOC_CFLAGS} -I${FIRMWARE_INC_DIR} -o $@ -c $<
local_build/driver/%.o: driver/%.c local_build
${LOC_COMPILER} ${LOC_CFLAGS} -I${DRIVER_DIR} -o $@ -c $<
local_build:
@mkdir -p local_build
@mkdir -p local_build/driver
@mkdir -p local_build/driver/tests
@mkdir -p local_build/firmware
@mkdir -p local_build/firmware/src
@mkdir -p local_build/firmware/tests
@mkdir -p local_build/src
@mkdir -p local_build/src/tests
test_communication: local_build/driver/tests/test_communication.o \
${LOC_COMMON_OBJ} ${LOC_DRIVER_OBJ}
${LOC_COMPILER} -o $@ $^ ${LDFLAGS}
fake_device: local_build/firmware/firmware.o \
${LOC_FIRMWARE_OBJ} ${LOC_COMMON_OBJ}
${LOC_COMPILER} -o $@ $^ ${LDFLAGS}
test_bit_utils: local_build/src/tests/test_bit_utils.o ${LOC_COMMON_OBJ}
${LOC_COMPILER} -o $@ $^ ${LDFLAGS}
test_driver: local_build/driver/tests/test_driver.o \
${LOC_COMMON_OBJ} ${LOC_DRIVER_OBJ}
${LOC_COMPILER} -o $@ $^ ${LDFLAGS}
test_protocol: local_build/src/tests/test_protocol.o \
${LOC_COMMON_OBJ} ${LOC_DRIVER_OBJ}
${LOC_COMPILER} -o $@ $^ ${LDFLAGS}
################################################################################
# CROSS COMPILING BUILD RULES #
################################################################################
CROSS_COMPILER = avr-gcc
DEVICE = atmega8
FCPU = 16000000
TARGET = firmware
CROSS_CFLAGS = $(LOC_CFLAGS) -DEMBEDDED -Os -I${FIRMWARE_INC_DIR}
PROGRAMMER = arduino
PORT = /dev/ttyUSB0
BAUDRATE = 19200
CROSS_COMPILE = $(CROSS_COMPILER) -mmcu=$(DEVICE) $(CROSS_CFLAGS) -DF_CPU=$(FCPU)
CROSS_COMMON_OBJ = $(addprefix cross_build/, $(COMMON_SRC:.c=.o))
CROSS_FIRMWARE_OBJ = $(addprefix cross_build/, $(FIRMWARE_SRC:.c=.o))
CROSS_COMMON_ASS = $(addprefix cross_build/, $(COMMON_SRC:.c=.s))
CROSS_FIRMWARE_ASS = $(addprefix cross_build/, $(FIRMWARE_SRC:.c=.s))
all_cross: cross_build/$(TARGET).hex
flash: cross_build/$(TARGET).hex
avrdude -p ${DEVICE} -c $(PROGRAMMER) -P $(PORT) -b $(BAUDRATE) -U flash:w:$<
geteeprom: cross_build
avrdude -p ${DEVICE} -c $(PROGRAMMER) -P $(PORT) -U eeprom:r:cross_build/eeprom:r
cross_build/%.o : %.c cross_build
$(CROSS_COMPILE) -c $< -o $@ -g
cross_build/%.o : %.S cross_build
$(CROSS_COMPILE) -x assembler-with-cpp -c $< -o $@ -g
cross_build/%.s : %.c cross_build
$(CROSS_COMPILE) -S $< -o $@ -g
disasm: cross_build/$(TARGET).elf
avr-objdump -h -S $< > cross_build/${TARGET}.lss
asm: $(ASSEMBLE)
cross_build/$(TARGET).hex : cross_build/$(TARGET).elf
avr-objcopy -S -j .text -j .data -O ihex $< $@ -g
avr-size --mcu=$(DEVICE) -C $@
bin: cross_build/$(TARGET).elf
avr-objcopy -S -j .text -j .data -O binary $< cross_build/${TARGET}.bin
cross_build/$(TARGET).elf : cross_build/firmware/firmware.o \
$(CROSS_COMMON_OBJ) \
$(CROSS_FIRMWARE_OBJ)
$(CROSS_COMPILE) -o $@ $^ -gc-sections
avr-size --mcu=$(DEVICE) -C $@
cross_build:
@mkdir -p cross_build
@mkdir -p cross_build/src
@mkdir -p cross_build/firmware
@mkdir -p cross_build/firmware/src
#depend needs to be updated with the new Makefile
depend: .depend
.depend: $(COMMON_SRC) $(DRIVER_SRC) $(FIRMWARE_SRC)
rm -f ./.depend
$(CC) -I$(COMMON_INC_DIR) -I$(FIRMWARE_INC_DIR) -MM $^ > ./.depend;
include .depend
clean:
@rm -rf local_build cross_build
mrproper: clean
@rm -f ${BINS} ./.depend