This repository has been archived by the owner on Nov 2, 2023. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
77 lines (62 loc) · 2.61 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
TARGET_EXEC := abalone
BUILD_DIR := ./build
SRC_DIRS := ./src
TESTS_DIR := ./tests
# Find all the C files we want to compile
# Note the single quotes around the * expressions. Make will incorrectly expand these otherwise.
SRCS := $(shell find $(SRC_DIRS) -name '*.c')
TESTS_SRCS := $(shell find $(TESTS_DIR) -name '*.c')
# String substitution for every C file.
# As an example, hello.c turns into ./build/hello.c.o
OBJS := $(SRCS:%=$(BUILD_DIR)/%.o)
OBJS_NO_GUI := $(addsuffix _nogui, $(filter-out %/gui.c.o, $(OBJS)))
OBJS_FOR_TESTS := $(addsuffix _tests, $(filter-out %/gui.c.o, $(filter-out %/main.c.o, $(OBJS))))
TESTS_OBJS := $(TESTS_SRCS:%=$(BUILD_DIR)/%.o)
# String substitution (suffix version without %).
# As an example, ./build/hello.c.o turns into ./build/hello.c.d
DEPS := $(OBJS:.o=.d)
TESTS_DEPS := $(TESTS_OBJS:.o=.d)
# Every folder in ./src will need to be passed to GCC so that it can find header files
INC_DIRS := $(shell find $(SRC_DIRS) -type d)
# Add a prefix to INC_DIRS. So moduleA would become -ImoduleA. GCC understands this -I flag
INC_FLAGS := $(addprefix -I,$(INC_DIRS))
# The -MMD and -MP flags together generate Makefiles for us!
# These files will have .d instead of .o as the output.
CPPFLAGS := $(INC_FLAGS) -MMD -MP
# Default task (Test and compile)
all: clean tests coverage $(TARGET_EXEC) docs
nogui: clean tests coverage $(TARGET_EXEC)_nogui docs
# The final build step
$(TARGET_EXEC): $(OBJS)
gcc -pthread $(OBJS) -o $(TARGET_EXEC) $(LDFLAGS) $$(pkg-config --libs --cflags gtk+-3.0)
# The final build step (no gui variant)
$(TARGET_EXEC)_nogui: $(OBJS_NO_GUI)
gcc -pthread $(OBJS_NO_GUI) -o $(TARGET_EXEC) $(LDFLAGS)
# The build step for tests
tests: $(OBJS) $(TESTS_OBJS)
gcc -Wall -fprofile-arcs -ftest-coverage -pthread $(OBJS_FOR_TESTS) $(TESTS_OBJS) -o $(TARGET_EXEC)_tests $(LDFLAGS)
./$(TARGET_EXEC)_tests
# Build step for C source
$(BUILD_DIR)/%.c.o: %.c
mkdir -p $(dir $@)
gcc $(CPPFLAGS) $(CFLAGS) $$(pkg-config --libs --cflags gtk+-3.0) -c $< -o $@
gcc $(CPPFLAGS) $(CFLAGS) -D NOGUI $$(pkg-config --libs --cflags gtk+-3.0) -c $< -o $@_nogui
gcc -fprofile-arcs -ftest-coverage -O0 $(CPPFLAGS) $(CFLAGS) -D NOGUI -D TEST $$(pkg-config --libs --cflags gtk+-3.0) -c $< -o $@_tests
# Generate coverage report
coverage: tests
gcov -pb $(OBJS)
# Generate documentation
docs:
-doxygen Doxyfile
# Clean up
.PHONY: clean
clean:
-rm abalone
-rm abalone_tests
-rm -rf $(BUILD_DIR)
-rm -rf html
-rm *.gcov
# Include the .d makefiles. The - at the front suppresses the errors of missing
# Makefiles. Initially, all the .d files will be missing, and we don't want those
# errors to show up.
-include $(DEPS)