|
1 |
| -# When unset, discover g++. Prioritise the latest version on the path. |
2 |
| -ifeq (, $(and $(strip $(CXX)), $(filter-out default undefined, $(origin CXX)))) |
3 |
| - override CXX := $(shell which g++-13 g++-12 g++-11 g++-10 g++-9 g++-8 g++ 2>/dev/null | head -n 1) |
4 |
| - ifeq (, $(strip $(CXX))) |
5 |
| - $(error Could not locate the g++ compiler. Please manually specify its path using the CXX variable) |
6 |
| - endif |
7 |
| -endif |
8 |
| - |
9 |
| -export CXX |
10 |
| -CXXFLAGS += $(OPTIMFLAG) $(MARCHFLAG) |
11 |
| -override CXXFLAGS += -I$(SRCDIR) -I$(UTILSDIR) |
12 |
| -GTESTCFLAGS := `pkg-config --cflags gtest_main` |
13 |
| -GTESTLDFLAGS := `pkg-config --static --libs gtest_main` |
14 |
| -GBENCHCFLAGS := `pkg-config --cflags benchmark` |
15 |
| -GBENCHLDFLAGS := `pkg-config --static --libs benchmark` |
16 |
| -OPTIMFLAG := -O3 |
17 |
| -MARCHFLAG := -march=sapphirerapids |
18 |
| - |
19 |
| -SRCDIR := ./src |
20 |
| -TESTDIR := ./tests |
21 |
| -BENCHDIR := ./benchmarks |
22 |
| -UTILSDIR := ./utils |
23 |
| - |
24 |
| -SRCS := $(wildcard $(addprefix $(SRCDIR)/, *.hpp *.h)) |
25 |
| -UTILSRCS := $(wildcard $(addprefix $(UTILSDIR)/, *.hpp *.h)) |
26 |
| -TESTSRCS := $(wildcard $(addprefix $(TESTDIR)/, *.hpp *.h)) |
27 |
| -BENCHSRCS := $(wildcard $(addprefix $(BENCHDIR)/, *.hpp *.h)) |
28 |
| -UTILS := $(wildcard $(UTILSDIR)/*.cpp) |
29 |
| -TESTS := $(wildcard $(TESTDIR)/*.cpp) |
30 |
| -BENCHS := $(wildcard $(BENCHDIR)/*.cpp) |
31 |
| - |
32 |
| -test_cxx_flag = $(shell 2>/dev/null $(CXX) -o /dev/null $(1) -c -x c++ /dev/null; echo $$?) |
33 |
| - |
34 |
| -# Compiling AVX512-FP16 instructions wasn't possible until GCC 12 |
35 |
| -ifeq ($(call test_cxx_flag,-mavx512fp16), 1) |
36 |
| - BENCHS_SKIP += bench-qsortfp16.cpp |
37 |
| - TESTS_SKIP += test-qsortfp16.cpp |
38 |
| -endif |
39 |
| - |
40 |
| -# Sapphire Rapids was otherwise supported from GCC 11. Downgrade if required. |
41 |
| -ifeq ($(call test_cxx_flag,$(MARCHFLAG)), 1) |
42 |
| - MARCHFLAG := -march=icelake-client |
43 |
| -endif |
44 |
| - |
45 |
| -BENCHOBJS := $(patsubst %.cpp, %.o, $(filter-out $(addprefix $(BENCHDIR)/, $(BENCHS_SKIP)), $(BENCHS))) |
46 |
| -TESTOBJS := $(patsubst %.cpp, %.o, $(filter-out $(addprefix $(TESTDIR)/, $(TESTS_SKIP)), $(TESTS))) |
47 |
| -UTILOBJS := $(UTILS:.cpp=.o) |
48 |
| - |
49 |
| -# Stops make from wondering if it needs to generate the .hpp files (.cpp and .h have equivalent rules by default) |
50 |
| -%.hpp: |
51 |
| - |
52 |
| -.PHONY: all |
53 |
| -.DEFAULT_GOAL := all |
54 |
| -all: test bench |
55 |
| - |
56 |
| -.PHONY: test |
57 |
| -test: testexe |
58 |
| - |
59 |
| -.PHONY: bench |
60 |
| -bench: benchexe |
61 |
| - |
62 |
| -$(UTILOBJS): $(UTILSRCS) |
63 |
| - |
64 |
| -$(TESTOBJS): $(TESTSRCS) $(UTILSRCS) $(SRCS) |
65 |
| -$(TESTDIR)/%.o: override CXXFLAGS += $(GTESTCFLAGS) |
66 |
| - |
67 |
| -testexe: $(TESTOBJS) $(UTILOBJS) |
68 |
| - $(CXX) $(CXXFLAGS) $^ $(LDLIBS) $(LDFLAGS) -lgtest_main $(GTESTLDFLAGS) -o $@ |
69 |
| - |
70 |
| -$(BENCHOBJS): $(BENCHSRCS) $(UTILSRCS) $(SRCS) |
71 |
| -$(BENCHDIR)/%.o: override CXXFLAGS += $(GBENCHCFLAGS) |
72 |
| - |
73 |
| -benchexe: $(BENCHOBJS) $(UTILOBJS) |
74 |
| - $(CXX) $(CXXFLAGS) $^ $(LDLIBS) $(LDFLAGS) -lbenchmark_main $(GBENCHLDFLAGS) -o $@ |
75 |
| - |
76 |
| -.PHONY: meson |
77 | 1 | meson:
|
78 | 2 | meson setup --warnlevel 2 --werror --buildtype release builddir
|
79 | 3 | cd builddir && ninja
|
80 | 4 |
|
81 |
| -.PHONY: mesondebug |
82 | 5 | mesondebug:
|
83 | 6 | meson setup --warnlevel 2 --werror --buildtype debug debug
|
84 | 7 | cd debug && ninja
|
85 | 8 |
|
86 |
| -.PHONY: clean |
87 | 9 | clean:
|
88 | 10 | $(RM) -rf $(TESTOBJS) $(BENCHOBJS) $(UTILOBJS) testexe benchexe builddir
|
0 commit comments