xref: /aosp_15_r20/external/zstd/contrib/pzstd/Makefile (revision 01826a4963a0d8a59bc3812d29bdf0fb76416722)
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