Skip to content

Commit eded4eb

Browse files
committed
Improve Makefile
1 parent 4084280 commit eded4eb

File tree

1 file changed

+66
-64
lines changed

1 file changed

+66
-64
lines changed

Makefile

Lines changed: 66 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,108 +1,110 @@
1-
SRC_DIR := src
2-
OUT_DIR := build
3-
EXTERNAL_DIR := external
4-
INSTALL_DIR ?= /usr/local/bin
1+
prefix := /usr/local
2+
exec_prefix := $(prefix)
3+
bindir := $(exec_prefix)/bin
4+
5+
SRC_DIR := src
6+
OUT_DIR := build
7+
EXTERNAL_DIR := external
8+
59
TEST_COMMON_DIR := tests/common
610
TEST_MOCK_DIR := tests/mock
711
BIND_CASES_DIR := tests/cases/bind
812
MOCK_CASES_DIR := tests/cases/mock
913

1014
BIN_NAME := resolve
1115
BIN_PATH := $(OUT_DIR)/$(BIN_NAME)
12-
13-
CC := g++
14-
CFLAGS := -O2 -std=c++23 -Wall -Wextra -pedantic -I $(SRC_DIR) -MMD -MP
15-
DEBUG_CFLAGS := -g3 -fsanitize=address,leak,undefined
16-
LDFLAGS := $(shell pkg-config --libs "openssl >= 3.0")
17-
18-
BIN_CFLAGS := $(CFLAGS)
19-
BIND_TEST_CFLAGS := $(CFLAGS) $(DEBUG_CFLAGS)
20-
# Mock tests must not include debug flags because libasan(enable by `fsanitize`) intercepts the
21-
# required functions(recvfrom and sendto) thus preventing the mocked functions from being used.
22-
MOCK_TEST_CFLAGS := $(CFLAGS)
16+
BIN_INSTALL_PATH := $(DESTDIR)$(bindir)/$(BIN_NAME)
17+
18+
CPPFLAGS := -I $(SRC_DIR)
19+
CXXFLAGS := -std=c++23 -Wall -Wextra -pedantic -MMD -MP -O2
20+
DEBUG_CXXFLAGS := -g3 -fsanitize=address,leak,undefined
21+
22+
LIBRARIES := "openssl >= 3.0"
23+
CPPFLAGS += $(shell pkg-config --cflags-only-I $(LIBRARIES))
24+
CXXFLAGS += $(shell pkg-config --cflags-only-other $(LIBRARIES))
25+
LDFLAGS += $(shell pkg-config --libs-only-L $(LIBRARIES))
26+
LDLIBS += $(shell pkg-config --libs-only-l $(LIBRARIES))
27+
28+
BIN_CXXFLAGS := $(CXXFLAGS)
29+
BIN_CPPFLAGS := $(CPPFLAGS) -I $(EXTERNAL_DIR)/cxxopts
30+
BIND_CXXFLAGS := $(CXXFLAGS) $(DEBUG_CXXFLAGS)
31+
BIND_CPPFLAGS := $(CPPFLAGS) -I $(TEST_COMMON_DIR)
32+
# Mock tests must not include debug flags because they contain `-fsanitize` which prevents the mock functions from being used.
33+
MOCK_CXXFLAGS := $(CXXFLAGS)
34+
MOCK_CPPFLAGS := $(CPPFLAGS) -I $(TEST_COMMON_DIR) -I $(TEST_MOCK_DIR)
2335

2436
ifeq ($(DEBUG), 1)
25-
BIN_CFLAGS += $(DEBUG_CFLAGS)
37+
BIN_CXXFLAGS += $(DEBUG_CXXFLAGS)
2638
endif
2739

28-
BIN_SRCS := $(shell find $(SRC_DIR) -type f -name '*.cc')
40+
BIN_SRCS := $(wildcard $(SRC_DIR)/*.cc)
2941
BIN_OBJS := $(patsubst %.cc, $(OUT_DIR)/%.o, $(BIN_SRCS))
30-
BIN_DEPS := $(patsubst %.o, %.d, $(BIN_OBJS))
42+
BIN_DEPS := $(BIN_OBJS:.o=.d)
3143

3244
TEST_COMMON_SRCS := $(filter-out $(SRC_DIR)/main.cc, $(BIN_SRCS))
33-
BIND_COMMON_OBJ_DIR := $(OUT_DIR)/$(TEST_COMMON_DIR)/bind
34-
BIND_COMMON_OBJS := $(patsubst %.cc, $(BIND_COMMON_OBJ_DIR)/%.o, $(TEST_COMMON_SRCS))
35-
BIND_COMMON_DEPS := $(patsubst %.o, %.d, $(BIND_COMMON_OBJS))
36-
MOCK_COMMON_OBJ_DIR := $(OUT_DIR)/$(TEST_COMMON_DIR)/mock
37-
MOCK_COMMON_OBJS := $(patsubst %.cc, $(MOCK_COMMON_OBJ_DIR)/%.o, $(TEST_COMMON_SRCS))
38-
MOCK_COMMON_DEPS := $(patsubst %.o, %.d, $(MOCK_COMMON_OBJS))
39-
40-
TEST_MOCK_OBJ_DIR := $(OUT_DIR)/$(TEST_MOCK_DIR)
41-
TEST_MOCK_SRCS := $(shell find $(TEST_MOCK_DIR) -type f -name '*.cc')
42-
TEST_MOCK_OBJS := $(patsubst %.cc, $(TEST_MOCK_OBJ_DIR)/%.o, $(TEST_MOCK_SRCS))
43-
TEST_MOCK_DEPS := $(patsubst %.o, %.d, $(TEST_MOCK_OBJS))
44-
45-
BIND_CASES_OUT_DIR := $(OUT_DIR)/$(BIND_CASES_DIR)
46-
BIND_CASES_SRCS := $(shell find $(BIND_CASES_DIR) -type f -name '*.cc')
45+
BIND_COMMON_OBJ_DIR := $(OUT_DIR)/tests/common/bind
46+
BIND_COMMON_OBJS := $(patsubst $(SRC_DIR)/%.cc, $(BIND_COMMON_OBJ_DIR)/%.o, $(TEST_COMMON_SRCS))
47+
BIND_COMMON_DEPS := $(BIND_COMMON_OBJS:.o=.d)
48+
MOCK_COMMON_OBJ_DIR := $(OUT_DIR)/tests/common/mock
49+
MOCK_COMMON_OBJS := $(patsubst $(SRC_DIR)/%.cc, $(MOCK_COMMON_OBJ_DIR)/%.o, $(TEST_COMMON_SRCS))
50+
MOCK_COMMON_DEPS := $(MOCK_COMMON_OBJS:.o=.d)
51+
52+
TEST_MOCK_OBJ_DIR := $(OUT_DIR)/tests/mock
53+
TEST_MOCK_SRCS := $(wildcard $(TEST_MOCK_DIR)/*.cc)
54+
TEST_MOCK_OBJS := $(patsubst $(TEST_MOCK_DIR)/%.cc, $(TEST_MOCK_OBJ_DIR)/%.o, $(TEST_MOCK_SRCS))
55+
TEST_MOCK_DEPS := $(TEST_MOCK_OBJS:.o=.d)
56+
57+
BIND_CASES_OUT_DIR := $(OUT_DIR)/tests/cases/bind
58+
BIND_CASES_SRCS := $(wildcard $(BIND_CASES_DIR)/*.cc)
4759
BIND_CASES := $(patsubst $(BIND_CASES_DIR)/%.cc, $(BIND_CASES_OUT_DIR)/%, $(BIND_CASES_SRCS))
4860
BIND_CASES_DEPS := $(addsuffix .d, $(BIND_CASES))
4961

50-
MOCK_CASES_OUT_DIR := $(OUT_DIR)/$(MOCK_CASES_DIR)
51-
MOCK_CASES_SRCS := $(shell find $(MOCK_CASES_DIR) -type f -name '*.cc')
62+
MOCK_CASES_OUT_DIR := $(OUT_DIR)/tests/cases/mock
63+
MOCK_CASES_SRCS := $(wildcard $(MOCK_CASES_DIR)/*.cc)
5264
MOCK_CASES := $(patsubst $(MOCK_CASES_DIR)/%.cc, $(MOCK_CASES_OUT_DIR)/%, $(MOCK_CASES_SRCS))
5365
MOCK_CASES_DEPS := $(addsuffix .d, $(MOCK_CASES))
5466

55-
.PHONY: all clean build test
56-
all: build
67+
.PHONY: all test clean install uninstall
68+
all: $(BIN_PATH)
69+
70+
test: $(BIND_CASES) $(MOCK_CASES)
71+
@./tests/test.sh
5772

5873
clean:
5974
rm -rf $(OUT_DIR)
6075

61-
build: $(BIN_PATH)
62-
63-
install: build
64-
install -D -m755 $(BIN_PATH) $(INSTALL_DIR)/$(BIN_NAME)
76+
install:
77+
install -D -m755 $(BIN_PATH) $(BIN_INSTALL_PATH)
6578

6679
uninstall:
67-
rm $(INSTALL_DIR)/$(BIN_NAME)
80+
rm $(BIN_INSTALL_PATH)
6881

6982
$(BIN_PATH): $(BIN_OBJS)
7083
@mkdir -p $(@D)
71-
$(CC) $(BIN_CFLAGS) -o $@ $^ $(LDFLAGS)
84+
$(CXX) $(BIN_CXXFLAGS) $(LDFLAGS) $^ -o $@ $(LDLIBS)
7285

7386
$(OUT_DIR)/%.o: %.cc
7487
@mkdir -p $(@D)
75-
$(CC) $(BIN_CFLAGS) -I $(EXTERNAL_DIR)/cxxopts -o $@ -c $<
76-
77-
test: $(BIND_CASES) $(MOCK_CASES)
78-
@./tests/test.sh
79-
80-
$(BIND_CASES_OUT_DIR)/%: $(BIND_CASES_OUT_DIR)/%.o $(BIND_COMMON_OBJS)
81-
@mkdir -p $(@D)
82-
$(CC) $(BIND_TEST_CFLAGS) -o $@ $^ $(LDFLAGS)
83-
84-
$(BIND_CASES_OUT_DIR)/%.o: $(BIND_CASES_DIR)/%.cc
85-
@mkdir -p $(@D)
86-
$(CC) $(BIND_TEST_CFLAGS) -I $(TEST_COMMON_DIR) -o $@ -c $<
88+
$(CXX) $(BIN_CPPFLAGS) $(BIN_CXXFLAGS) -c $< -o $@
8789

88-
$(BIND_COMMON_OBJ_DIR)/%.o: %.cc
90+
$(BIND_COMMON_OBJ_DIR)/%.o: $(SRC_DIR)/%.cc
8991
@mkdir -p $(@D)
90-
$(CC) $(BIND_TEST_CFLAGS) -o $@ -c $<
92+
$(CXX) $(BIND_CPPFLAGS) $(BIND_CXXFLAGS) -c $< -o $@
9193

92-
$(MOCK_CASES_OUT_DIR)/%: $(MOCK_CASES_OUT_DIR)/%.o $(TEST_MOCK_OBJS) $(MOCK_COMMON_OBJS)
94+
$(BIND_CASES_OUT_DIR)/%: $(BIND_CASES_DIR)/%.cc $(BIND_COMMON_OBJS)
9395
@mkdir -p $(@D)
94-
$(CC) $(MOCK_TEST_CFLAGS) -o $@ $^ $(LDFLAGS)
96+
$(CXX) $(BIND_CPPFLAGS) $(BIND_CXXFLAGS) $(LDFLAGS) $^ -o $@ $(LDLIBS)
9597

96-
$(MOCK_CASES_OUT_DIR)/%.o: $(MOCK_CASES_DIR)/%.cc
98+
$(MOCK_COMMON_OBJ_DIR)/%.o: $(SRC_DIR)/%.cc
9799
@mkdir -p $(@D)
98-
$(CC) $(MOCK_TEST_CFLAGS) -I $(TEST_COMMON_DIR) -I $(TEST_MOCK_DIR) -o $@ -c $<
100+
$(CXX) $(MOCK_CPPFLAGS) $(MOCK_CXXFLAGS) -c $< -o $@
99101

100-
$(MOCK_COMMON_OBJ_DIR)/%.o: %.cc
102+
$(TEST_MOCK_OBJ_DIR)/%.o: $(TEST_MOCK_DIR)/%.cc
101103
@mkdir -p $(@D)
102-
$(CC) $(MOCK_TEST_CFLAGS) -o $@ -c $<
104+
$(CXX) $(MOCK_CPPFLAGS) $(MOCK_CXXFLAGS) -c $< -o $@
103105

104-
$(TEST_MOCK_OBJ_DIR)/%.o: %.cc
106+
$(MOCK_CASES_OUT_DIR)/%: $(MOCK_CASES_DIR)/%.cc $(TEST_MOCK_OBJS) $(MOCK_COMMON_OBJS)
105107
@mkdir -p $(@D)
106-
$(CC) $(MOCK_TEST_CFLAGS) -I $(TEST_COMMON_DIR) -o $@ -c $<
108+
$(CXX) $(MOCK_CPPFLAGS) $(MOCK_CXXFLAGS) $(LDFLAGS) $^ -o $@ $(LDLIBS)
107109

108110
-include $(BIN_DEPS) $(BIND_COMMON_DEPS) $(MOCK_COMMON_DEPS) $(TEST_MOCK_DEPS) $(BIND_CASES_DEPS) $(MOCK_CASES_DEPS)

0 commit comments

Comments
 (0)