1 1.1 christos # ################################################################ 2 1.1 christos # Copyright (c) Meta Platforms, Inc. and affiliates. 3 1.1 christos # All rights reserved. 4 1.1 christos # 5 1.1 christos # This source code is licensed under both the BSD-style license (found in the 6 1.1 christos # LICENSE file in the root directory of this source tree) and the GPLv2 (found 7 1.1 christos # in the COPYING file in the root directory of this source tree). 8 1.1 christos # ################################################################ 9 1.1 christos 10 1.1 christos # Standard variables for installation 11 1.1 christos DESTDIR ?= 12 1.1 christos PREFIX ?= /usr/local 13 1.1 christos BINDIR := $(PREFIX)/bin 14 1.1 christos 15 1.1 christos ZSTDDIR = ../../lib 16 1.1 christos PROGDIR = ../../programs 17 1.1 christos 18 1.1 christos # External program to use to run tests, e.g. qemu or valgrind 19 1.1 christos TESTPROG ?= 20 1.1 christos # Flags to pass to the tests 21 1.1 christos TESTFLAGS ?= 22 1.1 christos 23 1.1 christos # We use gcc/clang to generate the header dependencies of files 24 1.1 christos DEPFLAGS = -MMD -MP -MF $*.Td 25 1.1 christos POSTCOMPILE = mv -f $*.Td $*.d 26 1.1 christos 27 1.1 christos # CFLAGS, CXXFLAGS, CPPFLAGS, and LDFLAGS are for the users to override 28 1.1 christos CFLAGS ?= -O3 -Wall -Wextra 29 1.1 christos CXXFLAGS ?= -O3 -Wall -Wextra -pedantic 30 1.1 christos CPPFLAGS ?= 31 1.1 christos LDFLAGS ?= 32 1.1 christos 33 1.1 christos # PZstd uses legacy APIs 34 1.1 christos CFLAGS += -Wno-deprecated-declarations 35 1.1 christos 36 1.1 christos # Include flags 37 1.1 christos PZSTD_INC = -I$(ZSTDDIR) -I$(ZSTDDIR)/common -I$(PROGDIR) -I. 38 1.1 christos GTEST_INC = -isystem googletest/googletest/include 39 1.1 christos 40 1.1 christos # Set the minimum required by gtest 41 1.1 christos PZSTD_CXX_STD := -std=c++14 42 1.1 christos 43 1.1 christos PZSTD_CPPFLAGS = $(PZSTD_INC) 44 1.1 christos PZSTD_CCXXFLAGS = 45 1.1 christos PZSTD_CFLAGS = $(PZSTD_CCXXFLAGS) 46 1.1 christos PZSTD_CXXFLAGS = $(PZSTD_CCXXFLAGS) $(PZSTD_CXX_STD) 47 1.1 christos PZSTD_LDFLAGS = 48 1.1 christos EXTRA_FLAGS = 49 1.1 christos ALL_CFLAGS = $(EXTRA_FLAGS) $(CPPFLAGS) $(PZSTD_CPPFLAGS) $(CFLAGS) $(PZSTD_CFLAGS) 50 1.1 christos ALL_CXXFLAGS = $(EXTRA_FLAGS) $(CPPFLAGS) $(PZSTD_CPPFLAGS) $(CXXFLAGS) $(PZSTD_CXXFLAGS) 51 1.1 christos ALL_LDFLAGS = $(EXTRA_FLAGS) $(CXXFLAGS) $(LDFLAGS) $(PZSTD_LDFLAGS) 52 1.1 christos 53 1.1 christos 54 1.1 christos # gtest libraries need to go before "-lpthread" because they depend on it. 55 1.1 christos GTEST_LIB = -L googletest/build/googlemock/gtest 56 1.1 christos LIBS = 57 1.1 christos 58 1.1 christos # Compilation commands 59 1.1 christos LD_COMMAND = $(CXX) $^ $(ALL_LDFLAGS) $(LIBS) -pthread -o $@ 60 1.1 christos CC_COMMAND = $(CC) $(DEPFLAGS) $(ALL_CFLAGS) -c $< -o $@ 61 1.1 christos CXX_COMMAND = $(CXX) $(DEPFLAGS) $(ALL_CXXFLAGS) -c $< -o $@ 62 1.1 christos 63 1.1 christos # List all the pzstd source files so we can determine their dependencies 64 1.1 christos PZSTD_SRCS := $(wildcard *.cpp) 65 1.1 christos PZSTD_TESTS := $(wildcard test/*.cpp) 66 1.1 christos UTILS_TESTS := $(wildcard utils/test/*.cpp) 67 1.1 christos ALL_SRCS := $(PZSTD_SRCS) $(PZSTD_TESTS) $(UTILS_TESTS) 68 1.1 christos 69 1.1 christos 70 1.1 christos # Define *.exe as extension for Windows systems 71 1.1 christos ifneq (,$(filter Windows%,$(OS))) 72 1.1 christos EXT =.exe 73 1.1 christos else 74 1.1 christos EXT = 75 1.1 christos endif 76 1.1 christos 77 1.1 christos # Standard targets 78 1.1 christos .PHONY: default 79 1.1 christos default: all 80 1.1 christos 81 1.1 christos .PHONY: test-pzstd 82 1.1 christos test-pzstd: TESTFLAGS=--gtest_filter=-*ExtremelyLarge* 83 1.1 christos test-pzstd: clean googletest pzstd tests check 84 1.1 christos 85 1.1 christos .PHONY: test-pzstd32 86 1.1 christos test-pzstd32: clean googletest32 all32 check 87 1.1 christos 88 1.1 christos .PHONY: test-pzstd-tsan 89 1.1 christos test-pzstd-tsan: LDFLAGS=-fuse-ld=gold 90 1.1 christos test-pzstd-tsan: TESTFLAGS=--gtest_filter=-*ExtremelyLarge* 91 1.1 christos test-pzstd-tsan: clean googletest tsan check 92 1.1 christos 93 1.1 christos .PHONY: test-pzstd-asan 94 1.1 christos test-pzstd-asan: LDFLAGS=-fuse-ld=gold 95 1.1 christos test-pzstd-asan: TESTFLAGS=--gtest_filter=-*ExtremelyLarge* 96 1.1 christos test-pzstd-asan: clean asan check 97 1.1 christos 98 1.1 christos .PHONY: check 99 1.1 christos check: 100 1.1 christos $(TESTPROG) ./utils/test/BufferTest$(EXT) $(TESTFLAGS) 101 1.1 christos $(TESTPROG) ./utils/test/RangeTest$(EXT) $(TESTFLAGS) 102 1.1 christos $(TESTPROG) ./utils/test/ResourcePoolTest$(EXT) $(TESTFLAGS) 103 1.1 christos $(TESTPROG) ./utils/test/ScopeGuardTest$(EXT) $(TESTFLAGS) 104 1.1 christos $(TESTPROG) ./utils/test/ThreadPoolTest$(EXT) $(TESTFLAGS) 105 1.1 christos $(TESTPROG) ./utils/test/WorkQueueTest$(EXT) $(TESTFLAGS) 106 1.1 christos $(TESTPROG) ./test/OptionsTest$(EXT) $(TESTFLAGS) 107 1.1 christos $(TESTPROG) ./test/PzstdTest$(EXT) $(TESTFLAGS) 108 1.1 christos 109 1.1 christos .PHONY: install 110 1.1 christos install: PZSTD_CPPFLAGS += -DNDEBUG 111 1.1 christos install: pzstd$(EXT) 112 1.1 christos install -d -m 755 $(DESTDIR)$(BINDIR)/ 113 1.1 christos install -m 755 pzstd$(EXT) $(DESTDIR)$(BINDIR)/pzstd$(EXT) 114 1.1 christos 115 1.1 christos .PHONY: uninstall 116 1.1 christos uninstall: 117 1.1 christos $(RM) $(DESTDIR)$(BINDIR)/pzstd$(EXT) 118 1.1 christos 119 1.1 christos # Targets for many different builds 120 1.1 christos .PHONY: all 121 1.1 christos all: PZSTD_CPPFLAGS += -DNDEBUG 122 1.1 christos all: pzstd$(EXT) 123 1.1 christos 124 1.1 christos .PHONY: debug 125 1.1 christos debug: EXTRA_FLAGS += -g 126 1.1 christos debug: pzstd$(EXT) tests roundtrip 127 1.1 christos 128 1.1 christos .PHONY: tsan 129 1.1 christos tsan: PZSTD_CCXXFLAGS += -fsanitize=thread -fPIC 130 1.1 christos tsan: PZSTD_LDFLAGS += -fsanitize=thread 131 1.1 christos tsan: debug 132 1.1 christos 133 1.1 christos .PHONY: asan 134 1.1 christos asan: EXTRA_FLAGS += -fsanitize=address 135 1.1 christos asan: debug 136 1.1 christos 137 1.1 christos .PHONY: ubsan 138 1.1 christos ubsan: EXTRA_FLAGS += -fsanitize=undefined 139 1.1 christos ubsan: debug 140 1.1 christos 141 1.1 christos .PHONY: all32 142 1.1 christos all32: EXTRA_FLAGS += -m32 143 1.1 christos all32: all tests roundtrip 144 1.1 christos 145 1.1 christos .PHONY: debug32 146 1.1 christos debug32: EXTRA_FLAGS += -m32 147 1.1 christos debug32: debug 148 1.1 christos 149 1.1 christos .PHONY: asan32 150 1.1 christos asan32: EXTRA_FLAGS += -m32 151 1.1 christos asan32: asan 152 1.1 christos 153 1.1 christos .PHONY: tsan32 154 1.1 christos tsan32: EXTRA_FLAGS += -m32 155 1.1 christos tsan32: tsan 156 1.1 christos 157 1.1 christos .PHONY: ubsan32 158 1.1 christos ubsan32: EXTRA_FLAGS += -m32 159 1.1 christos ubsan32: ubsan 160 1.1 christos 161 1.1 christos # Run long round trip tests 162 1.1 christos .PHONY: roundtripcheck 163 1.1 christos roundtripcheck: roundtrip check 164 1.1 christos $(TESTPROG) ./test/RoundTripTest$(EXT) $(TESTFLAGS) 165 1.1 christos 166 1.1 christos # Build the main binary 167 1.1 christos pzstd$(EXT): main.o $(PROGDIR)/util.o Options.o Pzstd.o SkippableFrame.o $(ZSTDDIR)/libzstd.a 168 1.1 christos $(LD_COMMAND) 169 1.1 christos 170 1.1 christos # Target that depends on all the tests 171 1.1 christos .PHONY: tests 172 1.1 christos tests: EXTRA_FLAGS += -Wno-deprecated-declarations 173 1.1 christos tests: $(patsubst %,%$(EXT),$(basename $(PZSTD_TESTS) $(UTILS_TESTS))) 174 1.1 christos 175 1.1 christos # Build the round trip tests 176 1.1 christos .PHONY: roundtrip 177 1.1 christos roundtrip: EXTRA_FLAGS += -Wno-deprecated-declarations 178 1.1 christos roundtrip: test/RoundTripTest$(EXT) 179 1.1 christos 180 1.1 christos # Use the static library that zstd builds for simplicity and 181 1.1 christos # so we get the compiler options correct 182 1.1 christos .PHONY: $(ZSTDDIR)/libzstd.a 183 1.1 christos $(ZSTDDIR)/libzstd.a: 184 1.1 christos CFLAGS="$(ALL_CFLAGS)" LDFLAGS="$(ALL_LDFLAGS)" $(MAKE) -C $(ZSTDDIR) libzstd.a 185 1.1 christos 186 1.1 christos # Rules to build the tests 187 1.1 christos test/RoundTripTest$(EXT): test/RoundTripTest.o $(PROGDIR)/datagen.o \ 188 1.1 christos $(PROGDIR)/util.o Options.o \ 189 1.1 christos Pzstd.o SkippableFrame.o $(ZSTDDIR)/libzstd.a 190 1.1 christos $(LD_COMMAND) 191 1.1 christos 192 1.1 christos test/%Test$(EXT): PZSTD_LDFLAGS += $(GTEST_LIB) 193 1.1 christos test/%Test$(EXT): LIBS += -lgtest -lgtest_main 194 1.1 christos test/%Test$(EXT): test/%Test.o $(PROGDIR)/datagen.o \ 195 1.1 christos $(PROGDIR)/util.o Options.o Pzstd.o \ 196 1.1 christos SkippableFrame.o $(ZSTDDIR)/libzstd.a 197 1.1 christos $(LD_COMMAND) 198 1.1 christos 199 1.1 christos utils/test/%Test$(EXT): PZSTD_LDFLAGS += $(GTEST_LIB) 200 1.1 christos utils/test/%Test$(EXT): LIBS += -lgtest -lgtest_main 201 1.1 christos utils/test/%Test$(EXT): utils/test/%Test.o 202 1.1 christos $(LD_COMMAND) 203 1.1 christos 204 1.1 christos 205 1.1 christos GTEST_CMAKEFLAGS = 206 1.1 christos 207 1.1 christos # Install googletest 208 1.1 christos .PHONY: googletest 209 1.1 christos googletest: PZSTD_CCXXFLAGS += -fPIC 210 1.1 christos googletest: 211 1.1 christos @$(RM) -rf googletest 212 1.1 christos @git clone https://github.com/google/googletest 213 1.1 christos @mkdir -p googletest/build 214 1.1 christos @cd googletest/build && cmake $(GTEST_CMAKEFLAGS) -DCMAKE_CXX_FLAGS="$(ALL_CXXFLAGS)" .. && $(MAKE) 215 1.1 christos 216 1.1 christos .PHONY: googletest32 217 1.1 christos googletest32: PZSTD_CCXXFLAGS += -m32 218 1.1 christos googletest32: googletest 219 1.1 christos 220 1.1 christos .PHONY: googletest-mingw64 221 1.1 christos googletest-mingw64: GTEST_CMAKEFLAGS += -G "MSYS Makefiles" 222 1.1 christos googletest-mingw64: googletest 223 1.1 christos 224 1.1 christos .PHONY: clean 225 1.1 christos clean: 226 1.1 christos $(RM) -f *.o pzstd$(EXT) *.Td *.d 227 1.1 christos $(RM) -f test/*.o test/*Test$(EXT) test/*.Td test/*.d 228 1.1 christos $(RM) -f utils/test/*.o utils/test/*Test$(EXT) utils/test/*.Td utils/test/*.d 229 1.1 christos $(RM) -f $(PROGDIR)/*.o $(PROGDIR)/*.Td $(PROGDIR)/*.d 230 1.1 christos $(MAKE) -C $(ZSTDDIR) clean 231 1.1 christos @echo Cleaning completed 232 1.1 christos 233 1.1 christos 234 1.1 christos # Cancel implicit rules 235 1.1 christos %.o: %.c 236 1.1 christos %.o: %.cpp 237 1.1 christos 238 1.1 christos # Object file rules 239 1.1 christos %.o: %.c 240 1.1 christos $(CC_COMMAND) 241 1.1 christos $(POSTCOMPILE) 242 1.1 christos 243 1.1 christos $(PROGDIR)/%.o: $(PROGDIR)/%.c 244 1.1 christos $(CC_COMMAND) 245 1.1 christos $(POSTCOMPILE) 246 1.1 christos 247 1.1 christos %.o: %.cpp 248 1.1 christos $(CXX_COMMAND) 249 1.1 christos $(POSTCOMPILE) 250 1.1 christos 251 1.1 christos test/%.o: PZSTD_CPPFLAGS += $(GTEST_INC) 252 1.1 christos test/%.o: test/%.cpp 253 1.1 christos $(CXX_COMMAND) 254 1.1 christos $(POSTCOMPILE) 255 1.1 christos 256 1.1 christos utils/test/%.o: PZSTD_CPPFLAGS += $(GTEST_INC) 257 1.1 christos utils/test/%.o: utils/test/%.cpp 258 1.1 christos $(CXX_COMMAND) 259 1.1 christos $(POSTCOMPILE) 260 1.1 christos 261 1.1 christos # Dependency file stuff 262 1.1 christos .PRECIOUS: %.d test/%.d utils/test/%.d 263 1.1 christos 264 1.1 christos # Include rules that specify header file dependencies 265 1.1 christos -include $(patsubst %,%.d,$(basename $(ALL_SRCS))) 266