Skip to content

Commit f22807a

Browse files
author
Raghuveer Devulapalli
authored
Merge pull request #52 from mosullivan93/build-updates
Further Makefile updates
2 parents f220118 + cead969 commit f22807a

File tree

2 files changed

+71
-37
lines changed

2 files changed

+71
-37
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,5 @@
3636
# Build or IDE artifacts
3737
**/.vscode
3838
/builddir/
39+
/testexe
40+
/benchexe

Makefile

Lines changed: 69 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,83 @@
1-
CXX ?= g++-12
2-
CXXFLAGS += -I$(SRCDIR) -I$(UTILS) -O3
3-
GTESTCFLAGS = `pkg-config --cflags gtest_main`
4-
GTESTLDFLAGS = `pkg-config --static --libs gtest_main`
5-
GBENCHCFLAGS = `pkg-config --cflags benchmark`
6-
GBENCHLDFLAGS = `pkg-config --static --libs benchmark`
7-
MARCHFLAG = -march=sapphirerapids
8-
9-
SRCDIR = ./src
10-
TESTDIR = ./tests
11-
BENCHDIR = ./benchmarks
12-
UTILS = ./utils
13-
SRCS = $(wildcard $(SRCDIR)/*.hpp)
14-
TESTS = $(wildcard $(TESTDIR)/*.cpp)
15-
BENCHS = $(wildcard $(BENCHDIR)/*.cpp)
16-
TESTOBJS = $(patsubst $(TESTDIR)/%.cpp,$(TESTDIR)/%.o,$(TESTS))
17-
BENCHOBJS = $(patsubst $(BENCHDIR)/%.cpp,$(BENCHDIR)/%.o,$(BENCHS))
18-
19-
# Compiling AVX512-FP16 instructions isn't possible for g++ < 12
20-
ifeq ($(shell expr `$(CXX) -dumpversion | cut -d '.' -f 1` \< 12), 1)
21-
MARCHFLAG = -march=icelake-client
22-
BENCHOBJS_SKIP += bench-qsortfp16.o
23-
TESTOBJS_SKIP += test-qsortfp16.o
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++-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
247
endif
258

26-
BENCHOBJS := $(filter-out $(addprefix $(BENCHDIR)/, $(BENCHOBJS_SKIP)) ,$(BENCHOBJS))
27-
TESTOBJS := $(filter-out $(addprefix $(TESTDIR)/, $(TESTOBJS_SKIP)) ,$(TESTOBJS))
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
2818

29-
all : test bench
19+
SRCDIR := ./src
20+
TESTDIR := ./tests
21+
BENCHDIR := ./benchmarks
22+
UTILSDIR := ./utils
3023

31-
$(UTILS)/cpuinfo.o : $(UTILS)/cpuinfo.cpp
32-
$(CXX) $(CXXFLAGS) -c $(UTILS)/cpuinfo.cpp -o $(UTILS)/cpuinfo.o
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)
3331

34-
$(TESTDIR)/%.o : $(TESTDIR)/%.cpp $(SRCS)
35-
$(CXX) $(CXXFLAGS) $(MARCHFLAG) $(GTESTCFLAGS) -c $< -o $@
32+
test_cxx_flag = $(shell 2>/dev/null $(CXX) -o /dev/null $(1) -c -x c++ /dev/null; echo $$?)
3633

37-
test: $(TESTOBJS) $(UTILS)/cpuinfo.o $(SRCS)
38-
$(CXX) $(TESTOBJS) $(UTILS)/cpuinfo.o $(MARCHFLAG) $(CXXFLAGS) -lgtest_main $(GTESTLDFLAGS) -o testexe
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 $@
3969

40-
$(BENCHDIR)/%.o : $(BENCHDIR)/%.cpp $(SRCS)
41-
$(CXX) $(CXXFLAGS) $(MARCHFLAG) $(GBENCHCFLAGS) -c $< -o $@
70+
$(BENCHOBJS): $(BENCHSRCS) $(UTILSRCS) $(SRCS)
71+
$(BENCHDIR)/%.o: override CXXFLAGS += $(GBENCHCFLAGS)
4272

43-
bench: $(BENCHOBJS) $(UTILS)/cpuinfo.o
44-
$(CXX) $(BENCHOBJS) $(UTILS)/cpuinfo.o $(MARCHFLAG) $(CXXFLAGS) -lbenchmark_main $(GBENCHLDFLAGS) -o benchexe
73+
benchexe: $(BENCHOBJS) $(UTILOBJS)
74+
$(CXX) $(CXXFLAGS) $^ $(LDLIBS) $(LDFLAGS) -lbenchmark_main $(GBENCHLDFLAGS) -o $@
4575

76+
.PHONY: meson
4677
meson:
4778
meson setup --warnlevel 0 --buildtype plain builddir
4879
cd builddir && ninja
4980

81+
.PHONY: clean
5082
clean:
51-
$(RM) -rf $(TESTDIR)/*.o $(BENCHDIR)/*.o $(UTILS)/*.o testexe benchexe builddir
83+
$(RM) -rf $(TESTOBJS) $(BENCHOBJS) $(UTILOBJS) testexe benchexe builddir

0 commit comments

Comments
 (0)