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