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