• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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