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