-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
96 lines (69 loc) · 2.1 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
.PHONY: clean check run help build
.DEFAULT_GOAL := run
### FILE STRUCTURE ###
BASEDIR = .
BUILDDIR = $(BASEDIR)/build
BUILDSRC = $(BUILDDIR)/src
BUILDAPP = $(BUILDDIR)/main
BUILDTEST = $(BUILDDIR)/test
LIBDIR = $(BASEDIR)/libs
SRCDIR = $(BASEDIR)/src
TESTDIR = $(BASEDIR)/tests
LIBFILES = $(wildcard $(LIBDIR)/*.cpp)
LIBHEADERS = $(wildcard $(LIBDIR)/*.hpp)
SRCFILES = $(wildcard $(SRCDIR)/*.cpp)
TESTFILES = $(wildcard $(TESTDIR)/*.cpp)
OBJ_FILES := $(patsubst $(LIBDIR)/%.cpp,$(BUILDSRC)/%.o,$(LIBFILES))
SRC_FILES := $(patsubst $(SRCDIR)/%.cpp,$(BUILDAPP)/%.o,$(SRCFILES))
TEST_FILES := $(patsubst $(TESTDIR)/%.cpp,$(BUILDTEST)/%.o,$(TESTFILES))
### COMPILER FLAGS ###
CC=clang++
LDFLAGS=
CPPFLAGS=--std=c++20 -I./libs
CXXFLAGS:=$(CXXFLAGS) -Werror -Wall -Wextra -Wconversion -Wunreachable-code \
-Wuninitialized -pedantic-errors -Wold-style-cast -Wno-error=unused-variable -Wunused
ifdef DBG_FLAG
CXXFLAGS := $(CXXFLAGS) -g
else
CXXFLAGS := $(CXXFLAGS) -O3
endif
### PROJECT
PROJECT = tic_tac_toe
TEST = test
build: $(PROJECT)
run: $(PROJECT)
./$(PROJECT)
check: $(TEST)
./$(TEST)
clean:
rm -f $(BUILDSRC)/*.o $(BUILDAPP)/*.o $(BUILDTEST)/*.o $(TEST) $(PROJECT)
summary:
wc -l libs/* src/*
help:
@echo "** HELP **"
@echo "make run: build && run program"
@echo "make check: build && run test"
@echo "make summary: count number of lines in libs and src"
@echo "make build: combile project"
@echo "make clean: remove all object files"
### TUTORIAL ON MAKE
# This is how Makefile works
# all: library.cpp main.cpp
# $@ evaluates to all
# $< evaluates to library.cpp
# $^ evaluates to library.cpp main.cpp
# build project
$(PROJECT): $(SRC_FILES) $(OBJ_FILES)
$(CC) $(LDFLAGS) -o $@ $^
# build test
$(TEST): $(TEST_FILES) $(OBJ_FILES)
$(CC) -lgtest $(LDFLAGS) -o $@ $^
# build lib objects
$(BUILDSRC)/%.o: $(LIBDIR)/%.cpp $(LIBHEADERS)
$(CC) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $<
# build main object
$(BUILDAPP)/%.o: $(SRCDIR)/%.cpp $(LIBHEADERS)
$(CC) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $<
# build test object
$(BUILDTEST)/%.o: $(TESTDIR)/%.cpp $(LIBHEADERS)
$(CC) -lgtest $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $<