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