1# ################################################################ 2# Copyright (c) 2016-present, Facebook, Inc. 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 := $(DESTDIR)$(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 40PZSTD_CPPFLAGS = $(PZSTD_INC) 41PZSTD_CCXXFLAGS = 42PZSTD_CFLAGS = $(PZSTD_CCXXFLAGS) 43PZSTD_CXXFLAGS = $(PZSTD_CCXXFLAGS) -std=c++11 44PZSTD_LDFLAGS = 45EXTRA_FLAGS = 46ALL_CFLAGS = $(EXTRA_FLAGS) $(CPPFLAGS) $(PZSTD_CPPFLAGS) $(CFLAGS) $(PZSTD_CFLAGS) 47ALL_CXXFLAGS = $(EXTRA_FLAGS) $(CPPFLAGS) $(PZSTD_CPPFLAGS) $(CXXFLAGS) $(PZSTD_CXXFLAGS) 48ALL_LDFLAGS = $(EXTRA_FLAGS) $(CXXFLAGS) $(LDFLAGS) $(PZSTD_LDFLAGS) 49 50 51# gtest libraries need to go before "-lpthread" because they depend on it. 52GTEST_LIB = -L googletest/build/googlemock/gtest 53LIBS = 54 55# Compilation commands 56LD_COMMAND = $(CXX) $^ $(ALL_LDFLAGS) $(LIBS) -pthread -o $@ 57CC_COMMAND = $(CC) $(DEPFLAGS) $(ALL_CFLAGS) -c $< -o $@ 58CXX_COMMAND = $(CXX) $(DEPFLAGS) $(ALL_CXXFLAGS) -c $< -o $@ 59 60# List all the pzstd source files so we can determine their dependencies 61PZSTD_SRCS := $(wildcard *.cpp) 62PZSTD_TESTS := $(wildcard test/*.cpp) 63UTILS_TESTS := $(wildcard utils/test/*.cpp) 64ALL_SRCS := $(PZSTD_SRCS) $(PZSTD_TESTS) $(UTILS_TESTS) 65 66 67# Define *.exe as extension for Windows systems 68ifneq (,$(filter Windows%,$(OS))) 69EXT =.exe 70else 71EXT = 72endif 73 74# Standard targets 75.PHONY: default 76default: all 77 78.PHONY: test-pzstd 79test-pzstd: TESTFLAGS=--gtest_filter=-*ExtremelyLarge* 80test-pzstd: clean googletest pzstd tests check 81 82.PHONY: test-pzstd32 83test-pzstd32: clean googletest32 all32 check 84 85.PHONY: test-pzstd-tsan 86test-pzstd-tsan: LDFLAGS=-fuse-ld=gold 87test-pzstd-tsan: TESTFLAGS=--gtest_filter=-*ExtremelyLarge* 88test-pzstd-tsan: clean googletest tsan check 89 90.PHONY: test-pzstd-asan 91test-pzstd-asan: LDFLAGS=-fuse-ld=gold 92test-pzstd-asan: TESTFLAGS=--gtest_filter=-*ExtremelyLarge* 93test-pzstd-asan: clean asan check 94 95.PHONY: check 96check: 97 $(TESTPROG) ./utils/test/BufferTest$(EXT) $(TESTFLAGS) 98 $(TESTPROG) ./utils/test/RangeTest$(EXT) $(TESTFLAGS) 99 $(TESTPROG) ./utils/test/ResourcePoolTest$(EXT) $(TESTFLAGS) 100 $(TESTPROG) ./utils/test/ScopeGuardTest$(EXT) $(TESTFLAGS) 101 $(TESTPROG) ./utils/test/ThreadPoolTest$(EXT) $(TESTFLAGS) 102 $(TESTPROG) ./utils/test/WorkQueueTest$(EXT) $(TESTFLAGS) 103 $(TESTPROG) ./test/OptionsTest$(EXT) $(TESTFLAGS) 104 $(TESTPROG) ./test/PzstdTest$(EXT) $(TESTFLAGS) 105 106.PHONY: install 107install: PZSTD_CPPFLAGS += -DNDEBUG 108install: pzstd$(EXT) 109 install -d -m 755 $(BINDIR)/ 110 install -m 755 pzstd$(EXT) $(BINDIR)/pzstd$(EXT) 111 112.PHONY: uninstall 113uninstall: 114 $(RM) $(BINDIR)/pzstd$(EXT) 115 116# Targets for many different builds 117.PHONY: all 118all: PZSTD_CPPFLAGS += -DNDEBUG 119all: pzstd$(EXT) 120 121.PHONY: debug 122debug: EXTRA_FLAGS += -g 123debug: pzstd$(EXT) tests roundtrip 124 125.PHONY: tsan 126tsan: PZSTD_CCXXFLAGS += -fsanitize=thread -fPIC 127tsan: PZSTD_LDFLAGS += -fsanitize=thread 128tsan: debug 129 130.PHONY: asan 131asan: EXTRA_FLAGS += -fsanitize=address 132asan: debug 133 134.PHONY: ubsan 135ubsan: EXTRA_FLAGS += -fsanitize=undefined 136ubsan: debug 137 138.PHONY: all32 139all32: EXTRA_FLAGS += -m32 140all32: all tests roundtrip 141 142.PHONY: debug32 143debug32: EXTRA_FLAGS += -m32 144debug32: debug 145 146.PHONY: asan32 147asan32: EXTRA_FLAGS += -m32 148asan32: asan 149 150.PHONY: tsan32 151tsan32: EXTRA_FLAGS += -m32 152tsan32: tsan 153 154.PHONY: ubsan32 155ubsan32: EXTRA_FLAGS += -m32 156ubsan32: ubsan 157 158# Run long round trip tests 159.PHONY: roundtripcheck 160roundtripcheck: roundtrip check 161 $(TESTPROG) ./test/RoundTripTest$(EXT) $(TESTFLAGS) 162 163# Build the main binary 164pzstd$(EXT): main.o $(PROGDIR)/util.o Options.o Pzstd.o SkippableFrame.o $(ZSTDDIR)/libzstd.a 165 $(LD_COMMAND) 166 167# Target that depends on all the tests 168.PHONY: tests 169tests: EXTRA_FLAGS += -Wno-deprecated-declarations 170tests: $(patsubst %,%$(EXT),$(basename $(PZSTD_TESTS) $(UTILS_TESTS))) 171 172# Build the round trip tests 173.PHONY: roundtrip 174roundtrip: EXTRA_FLAGS += -Wno-deprecated-declarations 175roundtrip: test/RoundTripTest$(EXT) 176 177# Use the static library that zstd builds for simplicity and 178# so we get the compiler options correct 179.PHONY: $(ZSTDDIR)/libzstd.a 180$(ZSTDDIR)/libzstd.a: 181 CFLAGS="$(ALL_CFLAGS)" LDFLAGS="$(ALL_LDFLAGS)" $(MAKE) -C $(ZSTDDIR) libzstd.a 182 183# Rules to build the tests 184test/RoundTripTest$(EXT): test/RoundTripTest.o $(PROGDIR)/datagen.o \ 185 $(PROGDIR)/util.o Options.o \ 186 Pzstd.o SkippableFrame.o $(ZSTDDIR)/libzstd.a 187 $(LD_COMMAND) 188 189test/%Test$(EXT): PZSTD_LDFLAGS += $(GTEST_LIB) 190test/%Test$(EXT): LIBS += -lgtest -lgtest_main 191test/%Test$(EXT): test/%Test.o $(PROGDIR)/datagen.o \ 192 $(PROGDIR)/util.o Options.o Pzstd.o \ 193 SkippableFrame.o $(ZSTDDIR)/libzstd.a 194 $(LD_COMMAND) 195 196utils/test/%Test$(EXT): PZSTD_LDFLAGS += $(GTEST_LIB) 197utils/test/%Test$(EXT): LIBS += -lgtest -lgtest_main 198utils/test/%Test$(EXT): utils/test/%Test.o 199 $(LD_COMMAND) 200 201 202GTEST_CMAKEFLAGS = 203 204# Install googletest 205.PHONY: googletest 206googletest: PZSTD_CCXXFLAGS += -fPIC 207googletest: 208 @$(RM) -rf googletest 209 @git clone https://github.com/google/googletest 210 @mkdir -p googletest/build 211 @cd googletest/build && cmake $(GTEST_CMAKEFLAGS) -DCMAKE_CXX_FLAGS="$(ALL_CXXFLAGS)" .. && $(MAKE) 212 213.PHONY: googletest32 214googletest32: PZSTD_CCXXFLAGS += -m32 215googletest32: googletest 216 217.PHONY: googletest-mingw64 218googletest-mingw64: GTEST_CMAKEFLAGS += -G "MSYS Makefiles" 219googletest-mingw64: googletest 220 221.PHONY: clean 222clean: 223 $(RM) -f *.o pzstd$(EXT) *.Td *.d 224 $(RM) -f test/*.o test/*Test$(EXT) test/*.Td test/*.d 225 $(RM) -f utils/test/*.o utils/test/*Test$(EXT) utils/test/*.Td utils/test/*.d 226 $(RM) -f $(PROGDIR)/*.o $(PROGDIR)/*.Td $(PROGDIR)/*.d 227 $(MAKE) -C $(ZSTDDIR) clean 228 @echo Cleaning completed 229 230 231# Cancel implicit rules 232%.o: %.c 233%.o: %.cpp 234 235# Object file rules 236%.o: %.c 237 $(CC_COMMAND) 238 $(POSTCOMPILE) 239 240$(PROGDIR)/%.o: $(PROGDIR)/%.c 241 $(CC_COMMAND) 242 $(POSTCOMPILE) 243 244%.o: %.cpp 245 $(CXX_COMMAND) 246 $(POSTCOMPILE) 247 248test/%.o: PZSTD_CPPFLAGS += $(GTEST_INC) 249test/%.o: test/%.cpp 250 $(CXX_COMMAND) 251 $(POSTCOMPILE) 252 253utils/test/%.o: PZSTD_CPPFLAGS += $(GTEST_INC) 254utils/test/%.o: utils/test/%.cpp 255 $(CXX_COMMAND) 256 $(POSTCOMPILE) 257 258# Dependency file stuff 259.PRECIOUS: %.d test/%.d utils/test/%.d 260 261# Include rules that specify header file dependencies 262-include $(patsubst %,%.d,$(basename $(ALL_SRCS))) 263