-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
133 lines (105 loc) · 3.32 KB
/
Copy pathMakefile
File metadata and controls
133 lines (105 loc) · 3.32 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
# Compile variables
NAME := webserv
CXX := g++
CXXFLAGS := -Wall -Wextra -Werror -g -std=c++98
DFLAGS := -MMD -MP
PROJECT_DIR := $(CURDIR)
SRCDIR := srcs
SRCS := $(shell find $(SRCDIR) -type f -name "*.cpp")
OBJDIR := objs
OBJS = $(patsubst $(SRCDIR)%, $(OBJDIR)%, $(SRCS:%.cpp=%.o))
INCLUDES := $(shell find $(SRCDIR) -type d -exec echo -I{} \;)
DEPENDS := $(patsubst $(SRCDIR)%, $(OBJDIR)%, $(SRCS:%.cpp=%.d))
# Print variables
PRINTF := printf
DEFAULT := \033[0;39m
BLUE := \033[0;94m
GREEN := \033[0;92m
RED := \033[0;91m
DEL := \033[2K
MOVE := \033[1F
CR := \033[1G
# Progress variables
SRC_TOT := $(shell expr $(words $(SRCS)) - $(shell find $(OBJDIR) -name '*.o' | wc -l))
ifndef SRC_TOT
SRC_TOT := $(words $(SRCS))
endif
SRC_CNT := 0
SRC_PCT = $(shell expr 100 \* $(SRC_CNT) / $(SRC_TOT))
PROGRESS = $(eval SRC_CNT = $(shell expr $(SRC_CNT) + 1)) \
$(PRINTF) "${DEL}${GREEN}[ %d/%d (%d%%) ] $(CXX) $(CXXFLAGS) $< ...$(DEFAULT)$(CR)" $(SRC_CNT) $(SRC_TOT) $(SRC_PCT)
# Main commands
$(NAME): $(OBJS)
@$(CXX) $(CXXFLAGS) $(OBJS) -o $@
@echo "\n${BLUE}--- ${NAME} is up to date! ---${DEFAULT}"
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
@-mkdir -p $(@D)
@${PROGRESS}
@$(CXX) $(CXXFLAGS) $(INCLUDES) $(DFLAGS) -c $< -o $@
debug:
@echo $(shell expr $(words $(SRCS)))
@echo $(shell ls -lR $(OBJDIR) | grep .o$ | wc -l)
@echo $(shell ls -lR $(OBJDIR) | grep \\.o$)
#: Make executable file.
all: $(NAME)
%.o: %.cpp
-mkdir -p $(@D)
$(CXX) $(CXXFLAGS) $(INCLUDES) $(DFLAGS) -c $< -o $@
#: Remove all object files.
clean:
@$(RM) -rf $(OBJDIR)
@${PRINTF} "${RED}Cleaned up object files in ${basename ${NAME}} ${DEFAULT}\n"
#: Remove all object and executable files.
fclean: clean
@$(RM) $(NAME)
@${PRINTF} "${RED}Removed executable file of ${NAME} ${DEFAULT}\n"
#: Remove and recompile all.
re: fclean
@$(MAKE) -s all
#: Make executable file and exexute.
run: $(NAME)
./$(NAME) ./conf/default.conf
#: Check source files.
echo:
@echo $(SRCS)
# Unit tests
TEST_NAME := test_webserv
TEST_SRCS := $(shell find tests/srcs -type f -name "*.cpp")
TEST_OBJDIR := ./tests/objs
TEST_OBJS := $(patsubst tests/srcs/%, $(TEST_OBJDIR)/%, $(TEST_SRCS:%.cpp=%.o)) $(filter-out objs/main.o, $(OBJS))
TEST_CXXFLAGS := -Wall -Wextra -Werror -std=c++14 -g
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Linux)
TEST_LDFLAGS := -L/usr/lib -lgtest -lgtest_main -lpthread
endif
ifeq ($(UNAME_S),Darwin) # This is for macOS
TEST_LDFLAGS := -L$(PROJECT_DIR)/tests/lib -lgtest -lgtest_main -lpthread
endif
SRC_DIRS := $(shell find $(PROJECT_DIR)/srcs -type d)
INC_FLAGS := $(addprefix -I, $(SRC_DIRS)) -I./tests/include
TEST_INCS := -I$(PROJECT_DIR)/tests/include $(INC_FLAGS)
$(TEST_NAME): $(TEST_OBJS)
@-mkdir -p $(@D)
$(CXX) $(TEST_CXXFLAGS) $(TEST_INCS) $(TEST_OBJS) $(TEST_LDFLAGS) -o $(TEST_NAME)
$(TEST_OBJDIR)/%.o: tests/srcs/%.cpp
@-mkdir -p $(@D)
@$(CXX) $(CXXFLAGS) $(TEST_INCS) $(TEST_CXXFLAGS) -c $< -o $@
#: Run unit tests.
ut: $(TEST_NAME)
@./$(TEST_NAME)
u: $(TEST_NAME)
ut_run: $(MAKE)
-@./$(NAME) ./conf/default.conf& echo $$! > ./tests/pid.log
ut_clean:
@rm -rf $(TEST_OBJDIR)
@rm -f $(TEST_NAME)
#: Display all commands.
help:
@grep -A1 -E "^#:" Makefile \
| grep -v -- -- \
| sed 'N;s/\n/###/' \
| sed -n 's/^#: \(.*\)###\(.*\):.*/\2###\1/p' \
| sed -e 's/^/make /' \
| column -t -s '###'
.PHONY: all clean fclean echo run re ut help
-include $(DEPENDS)