-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
136 lines (107 loc) · 4.17 KB
/
Makefile
File metadata and controls
136 lines (107 loc) · 4.17 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
135
136
NAME = gc
DEPEND = interpret_arithmetic arithmetic parse_cog parse_expression parse_ucs parse common
TEST_DEPEND = interpret_arithmetic arithmetic parse_cog parse_expression parse_ucs 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 -lcgraph -lgvc
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=15.0 -D GRAPHVIZ_SUPPORTED
TEST_INCLUDE_PATHS += -I$(shell brew --prefix graphviz)/include
TEST_LIBRARY_PATHS += -L$(shell brew --prefix graphviz)/lib
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 $@ -c $<
$(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 $@ -c $<
$(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)