/
Makefile
105 lines (74 loc) · 2.57 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
# Directories
SRCDIR = ./src
TESTDIR = ./test
OUTDIR = ./out
ODIR = $(OUTDIR)/obj
TESTODIR = $(OUTDIR)/test-obj
IDIR = ./src/include
DATADIR = ./gen
# Toolchain
CC = gcc
CFLAGS = -I$(IDIR) -Wall -Werror -pedantic -std=c99
AR = ar
ifdef MACH
MACH_ARG = -mmcu=$(MACH)
endif
# Files
LIB = libHamCode.a
_DEPS = dtmf.h morsecode.h morsecode_data.h varicode.h varicode_data.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
_OBJ = dtmf.o morsecode.o morsecode_data.o varicode.o varicode_data.o
ifdef CROSS_COMPILE
ODIR = $(OUTDIR)/$(CROSS_COMPILE)obj
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
else
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
TESTOBJ = $(patsubst %,$(TESTODIR)/%,$(_OBJ))
endif
_TESTS = DtmfTest.o VaricodeTest.o MorsecodeTest.o CuTest.o AllTests.o
TESTS = $(patsubst %,$(TESTODIR)/%,$(_TESTS))
# Make stuff
.PHONY: main test gentests profile clean
.PRECIOUS: %/.d
# To handle dependencies to output directories
%/.d:
mkdir -p $(@D)
touch $@
# Build
#
# make CROSS_COMPILE=avr- MACH=atmega328 for cross compile to AVR.
main: $(OUTDIR)/$(CROSS_COMPILE)$(LIB)
$(ODIR)/%.o: $(SRCDIR)/%.c $(DEPS) $(ODIR)/.d
$(CROSS_COMPILE)$(CC) -c -o $@ $< $(CFLAGS) $(MACH_ARG)
$(ODIR)/%.o: $(DATADIR)/%.c $(DEPS) $(ODIR)/.d
$(CROSS_COMPILE)$(CC) -c -o $@ $< $(CFLAGS) $(MACH_ARG)
$(OUTDIR)/$(CROSS_COMPILE)$(LIB): $(OBJ) $(OUTDIR)/.d
$(CROSS_COMPILE)$(AR) rs $@ $^
# Test
test: $(OUTDIR)/test-$(LIB) $(TESTS) $(OUTDIR)/gcov/.d
clang $(TESTS) -o $(OUTDIR)/run-all-tests -I./test $(CFLAGS) $(OUTDIR)/test-$(LIB) -fprofile-arcs -ftest-coverage
$(OUTDIR)/run-all-tests
gcov -l -o$(TESTODIR) $(SRCDIR)/*.c 2> /dev/null > $(OUTDIR)/gcov/summary.txt
mv *.gcov $(OUTDIR)/gcov
$(TESTDIR)/AllTests.c: $(TESTDIR)/*.c
$(TESTDIR)/make-tests.sh $(TESTDIR)/*.c > $(TESTDIR)/AllTests.c
$(TESTODIR)/%.o: $(TESTDIR)/%.c $(DEPS) $(TESTODIR)/.d $(TESTDIR)/AllTests.c
clang -c -o $@ $< $(CFLAGS)
$(TESTODIR)/%.o: $(SRCDIR)/%.c $(DEPS) $(TESTODIR)/.d
clang -c -o $@ $< $(CFLAGS) -fprofile-arcs -ftest-coverage
$(TESTODIR)/%.o: $(DATADIR)/%.c $(DEPS) $(TESTODIR)/.d
clang -c -o $@ $< $(CFLAGS) -fprofile-arcs -ftest-coverage
$(OUTDIR)/test-$(LIB): $(TESTOBJ) $(OUTDIR)/.d
$(AR) rs $@ $^
# Profile
profile: $(OUTDIR)/profile.log
$(OUTDIR)/profile.log: $(OUTDIR)/callgrind
callgrind_annotate $< > $@
cat $@
$(OUTDIR)/callgrind: $(OUTDIR)/test-$(LIB) gentests $(TESTS)
clang $(TESTS) -o $(OUTDIR)/run-all-tests -I./test $(CFLAGS) $(OUTDIR)/test-$(LIB) -fprofile-arcs -ftest-coverage
valgrind --dsymutil=yes --tool=callgrind --callgrind-out-file=$@ $(OUTDIR)/run-all-tests
# Clean
clean:
rm -rf $(OUTDIR)
rm $(TESTDIR)/AllTests.c