-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
134 lines (105 loc) · 3.87 KB
/
Copy pathMakefile
File metadata and controls
134 lines (105 loc) · 3.87 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
134
NAME = parse_expression
DEPEND = parse common
TEST_DEPEND = parse common
COVERAGE ?= 0
ifeq ($(COVERAGE),0)
CXXFLAGS = -std=c++20 -g -Wall -fmessage-length=0 -O2
LDFLAGS =
else
CXXFLAGS = -std=c++20 -g -Wall -fmessage-length=0 -O0 --coverage -fprofile-arcs -ftest-coverage
LDFLAGS = --coverage -fprofile-arcs -ftest-coverage
endif
SRCDIR = $(NAME)
INCLUDE_PATHS = $(DEPEND:%=-I../%) -I.
LIBRARY_PATHS =
LIBRARIES =
SOURCES := $(shell mkdir -p $(SRCDIR); find $(SRCDIR) -name '*.cpp')
OBJECTS := $(SOURCES:%.cpp=build/%.o)
DEPS := $(shell mkdir -p build/$(SRCDIR); find build/$(SRCDIR) -name '*.d')
TARGET = lib$(NAME).a
TESTDIR = tests
ifndef GTEST
override GTEST=../../googletest
endif
TEST_INCLUDE_PATHS = -I$(GTEST)/googletest/include $(TEST_DEPEND:%=-I../%) -I.
TEST_LIBRARY_PATHS = -L$(GTEST)/build/lib $(TEST_DEPEND:%=-L../%) -L.
TEST_LIBRARIES = -l$(NAME) $(TEST_DEPEND:%=-l%) -pthread -lgtest
TESTS := $(shell mkdir -p $(TESTDIR); find $(TESTDIR) -name '*.cpp')
TEST_OBJECTS := $(TESTS:%.cpp=build/%.o) build/$(TESTDIR)/gtest_main.o
TEST_DEPS := $(shell mkdir -p build/$(TESTDIR); find build/$(TESTDIR) -name '*.d')
TEST_TARGET = test
ifeq ($(OS),Windows_NT)
CXXFLAGS += -D WIN32
ifeq ($(PROCESSOR_ARCHITEW6432),AMD64)
CXXFLAGS += -D AMD64
else
ifeq ($(PROCESSOR_ARCHITECTURE),AMD64)
CXXFLAGS += -D AMD64
endif
ifeq ($(PROCESSOR_ARCHITECTURE),x86)
CXXFLAGS += -D IA32
endif
endif
else
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Linux)
CXXFLAGS += -D LINUX
endif
ifeq ($(UNAME_S),Darwin)
CXXFLAGS += -D OSX -mmacos-version-min=26.0
endif
UNAME_P := $(shell uname -p)
ifeq ($(UNAME_P),x86_64)
CXXFLAGS += -D AMD64
endif
ifneq ($(filter %86,$(UNAME_P)),)
CXXFLAGS += -D IA32
endif
ifneq ($(filter arm%,$(UNAME_P)),)
CXXFLAGS += -D ARM
endif
endif
all: lib
lib: $(TARGET)
tests: lib $(TEST_TARGET)
coverage: clean
$(MAKE) COVERAGE=1 tests
./$(TEST_TARGET) || true # Continue even if tests fail
lcov --capture --directory build/$(SRCDIR) --output-file coverage.info
lcov --ignore-errors unused --remove coverage.info '/usr/include/*' '*/googletest/*' '*/tests/*' --output-file coverage_filtered.info
genhtml coverage_filtered.info --output-directory coverage_report
$(TARGET): $(OBJECTS)
ar rvs $(TARGET) $(OBJECTS)
build/$(SRCDIR)/%.o: $(SRCDIR)/%.cpp
@mkdir -p $(dir $@)
@$(CXX) $(CXXFLAGS) $(LDFLAGS) $(INCLUDE_PATHS) -MM -MF $(patsubst %.o,%.d,$@) -MT $@ $<
$(CXX) $(CXXFLAGS) $(LDFLAGS) $(INCLUDE_PATHS) -c -o $@ $<
$(TEST_TARGET): $(TEST_OBJECTS) $(OBJECTS) $(TARGET)
$(CXX) $(CXXFLAGS) $(LDFLAGS) $(TEST_LIBRARY_PATHS) $(TEST_OBJECTS) $(TEST_LIBRARIES) -o $(TEST_TARGET)
build/$(TESTDIR)/%.o: $(TESTDIR)/%.cpp
@mkdir -p $(dir $@)
@$(CXX) $(CXXFLAGS) $(TEST_INCLUDE_PATHS) -MM -MF $(patsubst %.o,%.d,$@) -MT $@ $<
$(CXX) $(CXXFLAGS) $(TEST_INCLUDE_PATHS) $< -c -o $@
build/$(TESTDIR)/gtest_main.o: $(GTEST)/googletest/src/gtest_main.cc
@mkdir -p $(dir $@)
$(CXX) $(CXXFLAGS) $(TEST_INCLUDE_PATHS) $< -c -o $@
include $(DEPS) $(TEST_DEPS)
clean:
rm -rf build $(TARGET) $(TEST_TARGET) $(WASM_BUILD_DIR) coverage.info coverage_filtered.info coverage_report *.gcda *.gcno
clean-test:
rm -rf build/$(TESTDIR) $(TEST_TARGET)
clean-coverage:
rm -rf coverage.info coverage_filtered.info coverage_report *.gcda *.gcno
# wasm support for bin/studio
WASM_BUILD_DIR = build-wasm
WASM_TARGET = $(WASM_BUILD_DIR)/lib$(NAME).a
WASM_CXX = em++
WASM_CXXFLAGS = -std=c++20 -Os -g0 -fvisibility=hidden
$(WASM_BUILD_DIR)/%.o: $(SRCDIR)/%.cpp
@mkdir -p $(@D)
$(WASM_CXX) $(WASM_CXXFLAGS) $(INCLUDE_PATHS) -c -o $@ $<
WASM_OBJECTS = $(patsubst $(SRCDIR)/%.cpp,$(WASM_BUILD_DIR)/%.o,$(SOURCES))
$(WASM_TARGET): $(WASM_OBJECTS)
@mkdir -p $(@D)
emar rcs $@ $^
wasm: $(WASM_TARGET)