Skip to content

Commit d0623a7

Browse files
committed
Substantially update Makefile to improve coverage
The header files are now considered when make decides what targets need updating. Configured .DEFAULT_GOAL and .PHONY for the non-file targets. Tweaked file to predominantly rely on the default implicit rules for building the `.o` objects (read: moved all the options into CXXFLAGS). In addition to tracking with each `.hpp` or `.h` file inside of tests and benchmarks (accordingly), each `.o` object will also trigger a rebuild when there are changes to the main source files in src. However, each `.cpp` is otherwise independent of each other.
1 parent 5041188 commit d0623a7

File tree

2 files changed

+55
-35
lines changed

2 files changed

+55
-35
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: 53 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,75 @@
11
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-
test_cxx_flag = $(shell 2>/dev/null $(CXX) -o /dev/null $(1) -c -x c++ /dev/null; echo $$?)
2+
CXXFLAGS += $(OPTIMFLAG) $(MARCHFLAG)
3+
override CXXFLAGS += -I$(SRCDIR) -I$(UTILSDIR)
4+
GTESTCFLAGS := `pkg-config --cflags gtest_main`
5+
GTESTLDFLAGS := `pkg-config --static --libs gtest_main`
6+
GBENCHCFLAGS := `pkg-config --cflags benchmark`
7+
GBENCHLDFLAGS := `pkg-config --static --libs benchmark`
8+
OPTIMFLAG := -O3
9+
MARCHFLAG := -march=sapphirerapids
10+
11+
SRCDIR := ./src
12+
TESTDIR := ./tests
13+
BENCHDIR := ./benchmarks
14+
UTILSDIR := ./utils
15+
16+
SRCS := $(wildcard $(addprefix $(SRCDIR)/, *.hpp *.h))
17+
UTILSRCS := $(wildcard $(addprefix $(UTILSDIR)/, *.hpp *.h))
18+
TESTSRCS := $(wildcard $(addprefix $(TESTDIR)/, *.hpp *.h))
19+
BENCHSRCS := $(wildcard $(addprefix $(BENCHDIR)/, *.hpp *.h))
20+
UTILS := $(wildcard $(UTILSDIR)/*.cpp)
21+
TESTS := $(wildcard $(TESTDIR)/*.cpp)
22+
BENCHS := $(wildcard $(BENCHDIR)/*.cpp)
23+
24+
test_cxx_flag = $(shell 2>/dev/null $(CXX) -o /dev/null $(1) -c -x c++ /dev/null; echo $$?)
2025

2126
# Compiling AVX512-FP16 instructions wasn't possible until GCC 12
2227
ifeq ($(call test_cxx_flag,-mavx512fp16), 1)
23-
BENCHOBJS_SKIP += bench-qsortfp16.o
24-
TESTOBJS_SKIP += test-qsortfp16.o
28+
BENCHS_SKIP += bench-qsortfp16.cpp
29+
TESTS_SKIP += test-qsortfp16.cpp
2530
endif
2631

2732
# Sapphire Rapids was otherwise supported from GCC 11. Downgrade if required.
2833
ifeq ($(call test_cxx_flag,$(MARCHFLAG)), 1)
29-
MARCHFLAG = -march=icelake-client
34+
MARCHFLAG := -march=icelake-client
3035
endif
3136

32-
BENCHOBJS := $(filter-out $(addprefix $(BENCHDIR)/, $(BENCHOBJS_SKIP)) ,$(BENCHOBJS))
33-
TESTOBJS := $(filter-out $(addprefix $(TESTDIR)/, $(TESTOBJS_SKIP)) ,$(TESTOBJS))
37+
BENCHOBJS := $(patsubst %.cpp, %.o, $(filter-out $(addprefix $(BENCHDIR)/, $(BENCHS_SKIP)), $(BENCHS)))
38+
TESTOBJS := $(patsubst %.cpp, %.o, $(filter-out $(addprefix $(TESTDIR)/, $(TESTS_SKIP)), $(TESTS)))
39+
UTILOBJS := $(UTILS:.cpp=.o)
40+
41+
# Stops make from wondering if it needs to generate the .hpp files (.cpp and .h have equivalent rules by default)
42+
%.hpp:
43+
44+
.PHONY: all
45+
.DEFAULT_GOAL := all
46+
all: test bench
47+
48+
.PHONY: test
49+
test: testexe
3450

35-
all : test bench
51+
.PHONY: bench
52+
bench: benchexe
3653

37-
$(UTILS)/cpuinfo.o : $(UTILS)/cpuinfo.cpp
38-
$(CXX) $(CXXFLAGS) -c $(UTILS)/cpuinfo.cpp -o $(UTILS)/cpuinfo.o
54+
$(UTILOBJS): $(UTILSRCS)
3955

40-
$(TESTDIR)/%.o : $(TESTDIR)/%.cpp $(SRCS)
41-
$(CXX) $(CXXFLAGS) $(MARCHFLAG) $(GTESTCFLAGS) -c $< -o $@
56+
$(TESTOBJS): $(TESTSRCS) $(UTILSRCS) $(SRCS)
57+
$(TESTDIR)/%.o: override CXXFLAGS += $(GTESTCFLAGS)
4258

43-
test: $(TESTOBJS) $(UTILS)/cpuinfo.o $(SRCS)
44-
$(CXX) $(TESTOBJS) $(UTILS)/cpuinfo.o $(MARCHFLAG) $(CXXFLAGS) -lgtest_main $(GTESTLDFLAGS) -o testexe
59+
testexe: $(TESTOBJS) $(UTILOBJS)
60+
$(CXX) $(CXXFLAGS) $^ $(LDLIBS) $(LDFLAGS) -lgtest_main $(GTESTLDFLAGS) -o $@
4561

46-
$(BENCHDIR)/%.o : $(BENCHDIR)/%.cpp $(SRCS)
47-
$(CXX) $(CXXFLAGS) $(MARCHFLAG) $(GBENCHCFLAGS) -c $< -o $@
62+
$(BENCHOBJS): $(BENCHSRCS) $(UTILSRCS) $(SRCS)
63+
$(BENCHDIR)/%.o: override CXXFLAGS += $(GBENCHCFLAGS)
4864

49-
bench: $(BENCHOBJS) $(UTILS)/cpuinfo.o
50-
$(CXX) $(BENCHOBJS) $(UTILS)/cpuinfo.o $(MARCHFLAG) $(CXXFLAGS) -lbenchmark_main $(GBENCHLDFLAGS) -o benchexe
65+
benchexe: $(BENCHOBJS) $(UTILOBJS)
66+
$(CXX) $(CXXFLAGS) $^ $(LDLIBS) $(LDFLAGS) -lbenchmark_main $(GBENCHLDFLAGS) -o $@
5167

68+
.PHONY: meson
5269
meson:
5370
meson setup --warnlevel 0 --buildtype plain builddir
5471
cd builddir && ninja
5572

73+
.PHONY: clean
5674
clean:
57-
$(RM) -rf $(TESTDIR)/*.o $(BENCHDIR)/*.o $(UTILS)/*.o testexe benchexe builddir
75+
$(RM) -rf $(TESTOBJS) $(BENCHOBJS) $(UTILOBJS) testexe benchexe builddir

0 commit comments

Comments
 (0)