-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
64 lines (49 loc) · 1.68 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
# compiler
CXX = g++
CXXFLAGS = -O2 -Wall -std=c++11
# src directories
DIR_CLIENT = ./src
DIR_GRPC = ./grpc
DIR_TEST = ./test
# target directories
TARGET = target
TARGET_DEPS = ${TARGET}/deps
# src file
SRC := ${shell find . -depth 1 -name "*.cpp"}
SRC_CLIENT := ${shell find ${DIR_CLIENT} -depth 1 -name "*.cpp"}
SRC_GRPC := ${shell find ${DIR_GRPC} -depth 1 -name "*.cpp"}
SRC_TEST := ${shell find ${DIR_TEST} -depth 1 -name "*.cpp"}
SRCS = ${SRC} ${SRC_CLIENT} ${SRC_GRPC} ${SRC_TEST}
SRCS_LIB = ${SRC} ${SRC_GRPC}
# objects files
OBJS = ${foreach src,${SRCS},${patsubst %.cpp,${TARGET_DEPS}/%.o,${notdir ${src}}}}
OBJS_LIB = ${foreach src,${SRCS_LIB},${patsubst %.cpp,${TARGET_DEPS}/%.o,${notdir ${src}}}}
OBJS_TEST = ${foreach src,${SRC_TEST},${patsubst %.cpp,${TARGET_DEPS}/%.o,${notdir ${src}}}}
OBJS_CLIENT = ${foreach src,${SRC_CLIENT},${patsubst %.cpp,${TARGET_DEPS}/%.o,${notdir ${src}}}}
.PHONY: clean test run
run: ${TARGET}/client
./$<
build: ${TARGET}/client
# run test
test: ${TARGET}/test
./$<
${TARGET}/client: ${OBJS_LIB} ${OBJS_CLIENT}
${CXX} ${CXXFLAGS} -o $@ $^
# make ELF for test
${TARGET}/test: ${OBJS_LIB} ${OBJS_TEST}
${CXX} ${CXXFLAGS} -o $@ $^
# compile each src file to object file when file updated
define template
${TARGET_DEPS}/${patsubst %.cpp,%.o,${notdir $1}}: $1 ${TARGET_DEPS}
if [ ! -e ${TARGET_DEPS}/${patsubst %.cpp,%.o,${notdir $1}} ] \
|| [ ${TARGET_DEPS}/${patsubst %.cpp,%.o,${notdir $1}} -ot ${1} ]; then \
${CXX} -c ${CXXFLAGS} -o ${TARGET_DEPS}/${patsubst %.cpp,%.o,${notdir $1}} ${1}; \
fi
endef
${foreach src,${SRCS},${eval ${call template,${src}}}}
# remove binaries
clean:
rm -rf ${TARGET}
# make target directory
${TARGET_DEPS}:
mkdir -p $@