|
| 1 | +DEFAULT_GOAL := help |
| 2 | + |
| 3 | +# Collects inspiration from https://github.com/itzmeanjan/RandomShake/blob/a9cd4085a4d38d7b99ee42caadc56fc2d64ec1dc/Makefile#L1-L9 |
| 4 | +.PHONY: help |
| 5 | +help: |
| 6 | + @for file in $(MAKEFILE_LIST); do \ |
| 7 | + grep -E '^[a-zA-Z_-]+:.*?## .*$$' $${file} | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}';\ |
| 8 | + done |
| 9 | + |
1 | 10 | CXX ?= clang++
|
2 | 11 | CXX_FLAGS := -std=c++20
|
3 | 12 | WARN_FLAGS := -Wall -Wextra -Wpedantic
|
4 | 13 | DEBUG_FLAGS := -O1 -g
|
5 | 14 | RELEASE_FLAGS := -O3 -march=native
|
6 | 15 | LINK_OPT_FLAGS := -flto
|
7 |
| -ASAN_FLAGS := -fno-omit-frame-pointer -fno-optimize-sibling-calls -fsanitize=address # From https://clang.llvm.org/docs/AddressSanitizer.html |
8 |
| -DEBUG_ASAN_FLAGS := $(DEBUG_FLAGS) $(ASAN_FLAGS) |
9 |
| -RELEASE_ASAN_FLAGS := -g $(RELEASE_FLAGS) $(ASAN_FLAGS) |
10 |
| -UBSAN_FLAGS := -fno-omit-frame-pointer -fno-optimize-sibling-calls -fsanitize=undefined # From https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html |
11 |
| -DEBUG_UBSAN_FLAGS := $(DEBUG_FLAGS) $(UBSAN_FLAGS) |
12 |
| -RELEASE_UBSAN_FLAGS := -g $(RELEASE_FLAGS) $(UBSAN_FLAGS) |
13 | 16 |
|
14 | 17 | I_FLAGS := -I ./include
|
15 |
| -SHA3_INC_DIR = ./sha3/include |
16 |
| -SUBTLE_INC_DIR = ./subtle/include |
17 |
| -DEP_IFLAGS = -I $(SHA3_INC_DIR) -I $(SUBTLE_INC_DIR) |
| 18 | +SHA3_INC_DIR := ./sha3/include |
| 19 | +SUBTLE_INC_DIR := ./subtle/include |
| 20 | +RANDOMSHAKE_INC_DIR := ./RandomShake/include |
| 21 | +DEP_IFLAGS := -I $(SHA3_INC_DIR) -I $(SUBTLE_INC_DIR) -I $(RANDOMSHAKE_INC_DIR) |
18 | 22 |
|
19 | 23 | SRC_DIR := include
|
20 | 24 | ML_KEM_SOURCES := $(shell find $(SRC_DIR) -name '*.hpp')
|
21 | 25 | BUILD_DIR := build
|
22 |
| -TEST_BUILD_DIR := $(BUILD_DIR)/test |
23 |
| -BENCHMARK_BUILD_DIR := $(BUILD_DIR)/benchmark |
24 |
| -ASAN_BUILD_DIR := $(BUILD_DIR)/asan |
25 |
| -DEBUG_ASAN_BUILD_DIR := $(ASAN_BUILD_DIR)/debug |
26 |
| -RELEASE_ASAN_BUILD_DIR := $(ASAN_BUILD_DIR)/release |
27 |
| -UBSAN_BUILD_DIR := $(BUILD_DIR)/ubsan |
28 |
| -DEBUG_UBSAN_BUILD_DIR := $(UBSAN_BUILD_DIR)/debug |
29 |
| -RELEASE_UBSAN_BUILD_DIR := $(UBSAN_BUILD_DIR)/release |
30 |
| - |
31 |
| -TEST_DIR := tests |
32 |
| -TEST_SOURCES := $(wildcard $(TEST_DIR)/*.cpp) |
33 |
| -TEST_HEADERS := $(wildcard $(TEST_DIR)/*.hpp) |
34 |
| -TEST_OBJECTS := $(addprefix $(TEST_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(TEST_SOURCES)))) |
35 |
| -TEST_BINARY := $(TEST_BUILD_DIR)/test.out |
36 |
| -TEST_LINK_FLAGS := -lgtest -lgtest_main |
37 |
| -GTEST_PARALLEL := ./gtest-parallel/gtest-parallel |
38 |
| -DEBUG_ASAN_TEST_OBJECTS := $(addprefix $(DEBUG_ASAN_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(TEST_SOURCES)))) |
39 |
| -RELEASE_ASAN_TEST_OBJECTS := $(addprefix $(RELEASE_ASAN_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(TEST_SOURCES)))) |
40 |
| -DEBUG_ASAN_TEST_BINARY := $(DEBUG_ASAN_BUILD_DIR)/test.out |
41 |
| -RELEASE_ASAN_TEST_BINARY := $(RELEASE_ASAN_BUILD_DIR)/test.out |
42 |
| -DEBUG_UBSAN_TEST_OBJECTS := $(addprefix $(DEBUG_UBSAN_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(TEST_SOURCES)))) |
43 |
| -RELEASE_UBSAN_TEST_OBJECTS := $(addprefix $(RELEASE_UBSAN_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(TEST_SOURCES)))) |
44 |
| -DEBUG_UBSAN_TEST_BINARY := $(DEBUG_UBSAN_BUILD_DIR)/test.out |
45 |
| -RELEASE_UBSAN_TEST_BINARY := $(RELEASE_UBSAN_BUILD_DIR)/test.out |
46 |
| - |
47 |
| -BENCHMARK_DIR := benchmarks |
48 |
| -BENCHMARK_SOURCES := $(wildcard $(BENCHMARK_DIR)/*.cpp) |
49 |
| -BENCHMARK_HEADERS := $(wildcard $(BENCHMARK_DIR)/*.hpp) |
50 |
| -BENCHMARK_OBJECTS := $(addprefix $(BENCHMARK_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(BENCHMARK_SOURCES)))) |
51 |
| -BENCHMARK_LINK_FLAGS := -lbenchmark -lbenchmark_main -lpthread |
52 |
| -BENCHMARK_BINARY := $(BENCHMARK_BUILD_DIR)/bench.out |
53 |
| -PERF_LINK_FLAGS := -lbenchmark -lbenchmark_main -lpfm -lpthread |
54 |
| -PERF_BINARY := $(BENCHMARK_BUILD_DIR)/perf.out |
55 |
| -BENCHMARK_OUT_FILE := bench_result_on_$(shell uname -s)_$(shell uname -r)_$(shell uname -m)_with_$(CXX)_$(shell $(CXX) -dumpversion).json |
56 |
| - |
57 |
| -all: test |
58 |
| - |
59 |
| -$(DEBUG_ASAN_BUILD_DIR): |
60 |
| - mkdir -p $@ |
61 |
| - |
62 |
| -$(RELEASE_ASAN_BUILD_DIR): |
63 |
| - mkdir -p $@ |
64 |
| - |
65 |
| -$(DEBUG_UBSAN_BUILD_DIR): |
66 |
| - mkdir -p $@ |
67 | 26 |
|
68 |
| -$(RELEASE_UBSAN_BUILD_DIR): |
69 |
| - mkdir -p $@ |
70 |
| - |
71 |
| -$(TEST_BUILD_DIR): |
72 |
| - mkdir -p $@ |
73 |
| - |
74 |
| -$(BENCHMARK_BUILD_DIR): |
75 |
| - mkdir -p $@ |
| 27 | +include tests/test.mk |
| 28 | +include benchmarks/bench.mk |
| 29 | +include examples/example.mk |
76 | 30 |
|
77 | 31 | $(SUBTLE_INC_DIR):
|
78 | 32 | git submodule update --init subtle
|
79 | 33 |
|
80 |
| -$(SHA3_INC_DIR): $(SUBTLE_INC_DIR) |
| 34 | +$(RANDOMSHAKE_INC_DIR): $(SUBTLE_INC_DIR) |
| 35 | + git submodule update --init --recursive RandomShake |
| 36 | + |
| 37 | +$(SHA3_INC_DIR): $(RANDOMSHAKE_INC_DIR) |
81 | 38 | git submodule update --init sha3
|
82 | 39 |
|
83 | 40 | $(GTEST_PARALLEL): $(SHA3_INC_DIR)
|
84 | 41 | git submodule update --init gtest-parallel
|
85 | 42 |
|
86 |
| -$(TEST_BUILD_DIR)/%.o: $(TEST_DIR)/%.cpp $(TEST_BUILD_DIR) $(SHA3_INC_DIR) $(ASCON_INC_DIR) $(SUBTLE_INC_DIR) |
87 |
| - $(CXX) $(CXX_FLAGS) $(WARN_FLAGS) $(RELEASE_FLAGS) $(I_FLAGS) $(DEP_IFLAGS) -c $< -o $@ |
88 |
| - |
89 |
| -$(DEBUG_ASAN_BUILD_DIR)/%.o: $(TEST_DIR)/%.cpp $(DEBUG_ASAN_BUILD_DIR) $(SHA3_INC_DIR) $(ASCON_INC_DIR) $(SUBTLE_INC_DIR) |
90 |
| - $(CXX) $(CXX_FLAGS) $(WARN_FLAGS) $(DEBUG_ASAN_FLAGS) $(I_FLAGS) $(DEP_IFLAGS) -c $< -o $@ |
91 |
| - |
92 |
| -$(RELEASE_ASAN_BUILD_DIR)/%.o: $(TEST_DIR)/%.cpp $(RELEASE_ASAN_BUILD_DIR) $(SHA3_INC_DIR) $(ASCON_INC_DIR) $(SUBTLE_INC_DIR) |
93 |
| - $(CXX) $(CXX_FLAGS) $(WARN_FLAGS) $(RELEASE_ASAN_FLAGS) $(I_FLAGS) $(DEP_IFLAGS) -c $< -o $@ |
94 |
| - |
95 |
| -$(DEBUG_UBSAN_BUILD_DIR)/%.o: $(TEST_DIR)/%.cpp $(DEBUG_UBSAN_BUILD_DIR) $(SHA3_INC_DIR) $(ASCON_INC_DIR) $(SUBTLE_INC_DIR) |
96 |
| - $(CXX) $(CXX_FLAGS) $(WARN_FLAGS) $(DEBUG_UBSAN_FLAGS) $(I_FLAGS) $(DEP_IFLAGS) -c $< -o $@ |
97 |
| - |
98 |
| -$(RELEASE_UBSAN_BUILD_DIR)/%.o: $(TEST_DIR)/%.cpp $(RELEASE_UBSAN_BUILD_DIR) $(SHA3_INC_DIR) $(ASCON_INC_DIR) $(SUBTLE_INC_DIR) |
99 |
| - $(CXX) $(CXX_FLAGS) $(WARN_FLAGS) $(RELEASE_UBSAN_FLAGS) $(I_FLAGS) $(DEP_IFLAGS) -c $< -o $@ |
100 |
| - |
101 |
| -$(TEST_BINARY): $(TEST_OBJECTS) |
102 |
| - $(CXX) $(RELEASE_FLAGS) $(LINK_OPT_FLAGS) $^ $(TEST_LINK_FLAGS) -o $@ |
103 |
| - |
104 |
| -$(DEBUG_ASAN_TEST_BINARY): $(DEBUG_ASAN_TEST_OBJECTS) |
105 |
| - $(CXX) $(DEBUG_ASAN_FLAGS) $^ $(TEST_LINK_FLAGS) -o $@ |
106 |
| - |
107 |
| -$(RELEASE_ASAN_TEST_BINARY): $(RELEASE_ASAN_TEST_OBJECTS) |
108 |
| - $(CXX) $(RELEASE_ASAN_FLAGS) $^ $(TEST_LINK_FLAGS) -o $@ |
109 |
| - |
110 |
| -$(DEBUG_UBSAN_TEST_BINARY): $(DEBUG_UBSAN_TEST_OBJECTS) |
111 |
| - $(CXX) $(DEBUG_UBSAN_FLAGS) $^ $(TEST_LINK_FLAGS) -o $@ |
112 |
| - |
113 |
| -$(RELEASE_UBSAN_TEST_BINARY): $(RELEASE_UBSAN_TEST_OBJECTS) |
114 |
| - $(CXX) $(RELEASE_UBSAN_FLAGS) $^ $(TEST_LINK_FLAGS) -o $@ |
115 |
| - |
116 |
| -test: $(TEST_BINARY) $(GTEST_PARALLEL) |
117 |
| - $(GTEST_PARALLEL) $< --print_test_times |
118 |
| - |
119 |
| -debug_asan_test: $(DEBUG_ASAN_TEST_BINARY) $(GTEST_PARALLEL) |
120 |
| - $(GTEST_PARALLEL) $< --print_test_times |
121 |
| - |
122 |
| -release_asan_test: $(RELEASE_ASAN_TEST_BINARY) $(GTEST_PARALLEL) |
123 |
| - $(GTEST_PARALLEL) $< --print_test_times |
124 |
| - |
125 |
| -debug_ubsan_test: $(DEBUG_UBSAN_TEST_BINARY) $(GTEST_PARALLEL) |
126 |
| - $(GTEST_PARALLEL) $< --print_test_times |
127 |
| - |
128 |
| -release_ubsan_test: $(RELEASE_UBSAN_TEST_BINARY) $(GTEST_PARALLEL) |
129 |
| - $(GTEST_PARALLEL) $< --print_test_times |
130 |
| - |
131 |
| -$(BENCHMARK_BUILD_DIR)/%.o: $(BENCHMARK_DIR)/%.cpp $(BENCHMARK_BUILD_DIR) $(SHA3_INC_DIR) $(ASCON_INC_DIR) $(SUBTLE_INC_DIR) |
132 |
| - $(CXX) $(CXX_FLAGS) $(WARN_FLAGS) $(RELEASE_FLAGS) $(I_FLAGS) $(DEP_IFLAGS) -c $< -o $@ |
133 |
| - |
134 |
| -$(BENCHMARK_BINARY): $(BENCHMARK_OBJECTS) |
135 |
| - $(CXX) $(RELEASE_FLAGS) $(LINK_OPT_FLAGS) $^ $(BENCHMARK_LINK_FLAGS) -o $@ |
136 |
| - |
137 |
| -benchmark: $(BENCHMARK_BINARY) |
138 |
| - # Must *not* build google-benchmark with libPFM |
139 |
| - ./$< --benchmark_time_unit=us --benchmark_min_warmup_time=.5 --benchmark_enable_random_interleaving=true --benchmark_repetitions=10 --benchmark_min_time=0.1s --benchmark_display_aggregates_only=true --benchmark_counters_tabular=true |
140 |
| - |
141 |
| -$(PERF_BINARY): $(BENCHMARK_OBJECTS) |
142 |
| - $(CXX) $(RELEASE_FLAGS) $(LINK_OPT_FLAGS) $^ $(PERF_LINK_FLAGS) -o $@ |
143 |
| - |
144 |
| -perf: $(PERF_BINARY) |
145 |
| - # Must build google-benchmark with libPFM, follow https://gist.github.com/itzmeanjan/05dc3e946f635d00c5e0b21aae6203a7 |
146 |
| - ./$< --benchmark_time_unit=us --benchmark_min_warmup_time=.5 --benchmark_enable_random_interleaving=true --benchmark_repetitions=10 --benchmark_min_time=0.1s --benchmark_display_aggregates_only=true --benchmark_counters_tabular=true --benchmark_perf_counters=CYCLES |
147 |
| - |
148 |
| -.PHONY: format clean |
149 |
| - |
150 |
| -clean: |
| 43 | +.PHONY: clean |
| 44 | +clean: ## Remove build directory |
151 | 45 | rm -rf $(BUILD_DIR)
|
152 | 46 |
|
153 |
| -format: $(ML_KEM_SOURCES) $(TEST_SOURCES) $(TEST_HEADERS) $(BENCHMARK_SOURCES) $(BENCHMARK_HEADERS) |
| 47 | +.PHONY: format |
| 48 | +format: $(ML_KEM_SOURCES) $(TEST_SOURCES) $(TEST_HEADERS) $(BENCHMARK_SOURCES) $(BENCHMARK_HEADERS) ## Format source code |
154 | 49 | clang-format -i $^
|
0 commit comments