648db22b |
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 | # You may select, at your option, one of the above-listed licenses. |
9 | # ################################################################ |
10 | |
f535537f |
11 | # default target (when running `make` with no argument) |
12 | lib-release: |
13 | |
648db22b |
14 | # Modules |
15 | ZSTD_LIB_COMPRESSION ?= 1 |
16 | ZSTD_LIB_DECOMPRESSION ?= 1 |
17 | ZSTD_LIB_DICTBUILDER ?= 1 |
18 | ZSTD_LIB_DEPRECATED ?= 0 |
19 | |
20 | # Input variables for libzstd.mk |
21 | ifeq ($(ZSTD_LIB_COMPRESSION), 0) |
22 | ZSTD_LIB_DICTBUILDER = 0 |
23 | ZSTD_LIB_DEPRECATED = 0 |
24 | endif |
25 | |
26 | ifeq ($(ZSTD_LIB_DECOMPRESSION), 0) |
27 | ZSTD_LEGACY_SUPPORT = 0 |
28 | ZSTD_LIB_DEPRECATED = 0 |
29 | endif |
30 | |
31 | include libzstd.mk |
32 | |
33 | ZSTD_FILES := $(ZSTD_COMMON_FILES) $(ZSTD_LEGACY_FILES) |
34 | |
35 | ifneq ($(ZSTD_LIB_COMPRESSION), 0) |
36 | ZSTD_FILES += $(ZSTD_COMPRESS_FILES) |
37 | endif |
38 | |
39 | ifneq ($(ZSTD_LIB_DECOMPRESSION), 0) |
40 | ZSTD_FILES += $(ZSTD_DECOMPRESS_FILES) |
41 | endif |
42 | |
43 | ifneq ($(ZSTD_LIB_DEPRECATED), 0) |
44 | ZSTD_FILES += $(ZSTD_DEPRECATED_FILES) |
45 | endif |
46 | |
47 | ifneq ($(ZSTD_LIB_DICTBUILDER), 0) |
48 | ZSTD_FILES += $(ZSTD_DICTBUILDER_FILES) |
49 | endif |
50 | |
51 | ZSTD_LOCAL_SRC := $(notdir $(ZSTD_FILES)) |
52 | ZSTD_LOCAL_OBJ0 := $(ZSTD_LOCAL_SRC:.c=.o) |
53 | ZSTD_LOCAL_OBJ := $(ZSTD_LOCAL_OBJ0:.S=.o) |
54 | |
55 | VERSION := $(ZSTD_VERSION) |
56 | |
57 | # Note: by default, the static library is built single-threaded and dynamic library is built |
58 | # multi-threaded. It is possible to force multi or single threaded builds by appending |
59 | # -mt or -nomt to the build target (like lib-mt for multi-threaded, lib-nomt for single-threaded). |
f535537f |
60 | |
648db22b |
61 | |
62 | CPPFLAGS_DYNLIB += -DZSTD_MULTITHREAD # dynamic library build defaults to multi-threaded |
63 | LDFLAGS_DYNLIB += -pthread |
f535537f |
64 | CPPFLAGS_STATICLIB += # static library build defaults to single-threaded |
648db22b |
65 | |
66 | |
67 | ifeq ($(findstring GCC,$(CCVER)),GCC) |
68 | decompress/zstd_decompress_block.o : CFLAGS+=-fno-tree-vectorize |
69 | endif |
70 | |
71 | |
72 | # macOS linker doesn't support -soname, and use different extension |
73 | # see : https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/DynamicLibraries/100-Articles/DynamicLibraryDesignGuidelines.html |
74 | ifeq ($(UNAME), Darwin) |
75 | SHARED_EXT = dylib |
76 | SHARED_EXT_MAJOR = $(LIBVER_MAJOR).$(SHARED_EXT) |
77 | SHARED_EXT_VER = $(LIBVER).$(SHARED_EXT) |
78 | SONAME_FLAGS = -install_name $(LIBDIR)/libzstd.$(SHARED_EXT_MAJOR) -compatibility_version $(LIBVER_MAJOR) -current_version $(LIBVER) |
79 | else |
80 | ifeq ($(UNAME), AIX) |
81 | SONAME_FLAGS = |
82 | else |
83 | SONAME_FLAGS = -Wl,-soname=libzstd.$(SHARED_EXT).$(LIBVER_MAJOR) |
84 | endif |
85 | SHARED_EXT = so |
86 | SHARED_EXT_MAJOR = $(SHARED_EXT).$(LIBVER_MAJOR) |
87 | SHARED_EXT_VER = $(SHARED_EXT).$(LIBVER) |
88 | endif |
89 | |
90 | |
91 | .PHONY: all |
92 | all: lib |
93 | |
94 | |
95 | .PHONY: libzstd.a # must be run every time |
f535537f |
96 | libzstd.a: CPPFLAGS += $(CPPFLAGS_STATICLIB) |
648db22b |
97 | |
98 | SET_CACHE_DIRECTORY = \ |
99 | +$(MAKE) --no-print-directory $@ \ |
100 | BUILD_DIR=obj/$(HASH_DIR) \ |
101 | CPPFLAGS="$(CPPFLAGS)" \ |
102 | CFLAGS="$(CFLAGS)" \ |
103 | LDFLAGS="$(LDFLAGS)" |
104 | |
105 | ifndef BUILD_DIR |
106 | # determine BUILD_DIR from compilation flags |
107 | |
108 | libzstd.a: |
109 | $(SET_CACHE_DIRECTORY) |
110 | |
111 | else |
112 | # BUILD_DIR is defined |
113 | |
f535537f |
114 | ZSTD_STATICLIB_DIR := $(BUILD_DIR)/static |
115 | ZSTD_STATICLIB := $(ZSTD_STATICLIB_DIR)/libzstd.a |
116 | ZSTD_STATICLIB_OBJ := $(addprefix $(ZSTD_STATICLIB_DIR)/,$(ZSTD_LOCAL_OBJ)) |
117 | $(ZSTD_STATICLIB): ARFLAGS = rcs |
118 | $(ZSTD_STATICLIB): | $(ZSTD_STATICLIB_DIR) |
119 | $(ZSTD_STATICLIB): $(ZSTD_STATICLIB_OBJ) |
648db22b |
120 | # Check for multithread flag at target execution time |
121 | $(if $(filter -DZSTD_MULTITHREAD,$(CPPFLAGS)),\ |
122 | @echo compiling multi-threaded static library $(LIBVER),\ |
123 | @echo compiling single-threaded static library $(LIBVER)) |
124 | $(AR) $(ARFLAGS) $@ $^ |
125 | |
f535537f |
126 | libzstd.a: $(ZSTD_STATICLIB) |
648db22b |
127 | cp -f $< $@ |
128 | |
129 | endif |
130 | |
131 | ifneq (,$(filter Windows%,$(TARGET_SYSTEM))) |
132 | |
133 | LIBZSTD = dll/libzstd.dll |
134 | $(LIBZSTD): $(ZSTD_FILES) |
135 | @echo compiling dynamic library $(LIBVER) |
136 | $(CC) $(FLAGS) -DZSTD_DLL_EXPORT=1 -Wl,--out-implib,dll/libzstd.dll.a -shared $^ -o $@ |
137 | |
138 | else # not Windows |
139 | |
140 | LIBZSTD = libzstd.$(SHARED_EXT_VER) |
141 | .PHONY: $(LIBZSTD) # must be run every time |
142 | $(LIBZSTD): CPPFLAGS += $(CPPFLAGS_DYNLIB) |
143 | $(LIBZSTD): CFLAGS += -fPIC -fvisibility=hidden |
144 | $(LIBZSTD): LDFLAGS += -shared $(LDFLAGS_DYNLIB) |
145 | |
146 | ifndef BUILD_DIR |
147 | # determine BUILD_DIR from compilation flags |
148 | |
149 | $(LIBZSTD): |
150 | $(SET_CACHE_DIRECTORY) |
151 | |
152 | else |
153 | # BUILD_DIR is defined |
154 | |
155 | ZSTD_DYNLIB_DIR := $(BUILD_DIR)/dynamic |
156 | ZSTD_DYNLIB := $(ZSTD_DYNLIB_DIR)/$(LIBZSTD) |
157 | ZSTD_DYNLIB_OBJ := $(addprefix $(ZSTD_DYNLIB_DIR)/,$(ZSTD_LOCAL_OBJ)) |
158 | |
159 | $(ZSTD_DYNLIB): | $(ZSTD_DYNLIB_DIR) |
160 | $(ZSTD_DYNLIB): $(ZSTD_DYNLIB_OBJ) |
161 | # Check for multithread flag at target execution time |
162 | $(if $(filter -DZSTD_MULTITHREAD,$(CPPFLAGS)),\ |
163 | @echo compiling multi-threaded dynamic library $(LIBVER),\ |
164 | @echo compiling single-threaded dynamic library $(LIBVER)) |
165 | $(CC) $(FLAGS) $^ $(LDFLAGS) $(SONAME_FLAGS) -o $@ |
166 | @echo creating versioned links |
167 | ln -sf $@ libzstd.$(SHARED_EXT_MAJOR) |
168 | ln -sf $@ libzstd.$(SHARED_EXT) |
169 | |
170 | $(LIBZSTD): $(ZSTD_DYNLIB) |
171 | cp -f $< $@ |
172 | |
173 | endif # ifndef BUILD_DIR |
174 | endif # if windows |
175 | |
176 | .PHONY: libzstd |
177 | libzstd : $(LIBZSTD) |
178 | |
179 | .PHONY: lib |
180 | lib : libzstd.a libzstd |
181 | |
182 | |
183 | # note : do not define lib-mt or lib-release as .PHONY |
184 | # make does not consider implicit pattern rule for .PHONY target |
185 | |
186 | %-mt : CPPFLAGS_DYNLIB := -DZSTD_MULTITHREAD |
f535537f |
187 | %-mt : CPPFLAGS_STATICLIB := -DZSTD_MULTITHREAD |
648db22b |
188 | %-mt : LDFLAGS_DYNLIB := -pthread |
189 | %-mt : % |
190 | @echo multi-threaded build completed |
191 | |
192 | %-nomt : CPPFLAGS_DYNLIB := |
193 | %-nomt : LDFLAGS_DYNLIB := |
f535537f |
194 | %-nomt : CPPFLAGS_STATICLIB := |
648db22b |
195 | %-nomt : % |
196 | @echo single-threaded build completed |
197 | |
198 | %-release : DEBUGFLAGS := |
199 | %-release : % |
200 | @echo release build completed |
201 | |
202 | |
203 | # Generate .h dependencies automatically |
204 | |
f535537f |
205 | # -MMD: compiler generates dependency information as a side-effect of compilation, without system headers |
206 | # -MP: adds phony target for each dependency other than main file. |
207 | DEPFLAGS = -MMD -MP |
648db22b |
208 | |
f535537f |
209 | # ensure that ZSTD_DYNLIB_DIR exists prior to generating %.o |
210 | $(ZSTD_DYNLIB_DIR)/%.o : %.c | $(ZSTD_DYNLIB_DIR) |
648db22b |
211 | @echo CC $@ |
f535537f |
212 | $(COMPILE.c) $(DEPFLAGS) $(OUTPUT_OPTION) $< |
648db22b |
213 | |
f535537f |
214 | $(ZSTD_STATICLIB_DIR)/%.o : %.c | $(ZSTD_STATICLIB_DIR) |
648db22b |
215 | @echo CC $@ |
f535537f |
216 | $(COMPILE.c) $(DEPFLAGS) $(OUTPUT_OPTION) $< |
648db22b |
217 | |
218 | $(ZSTD_DYNLIB_DIR)/%.o : %.S | $(ZSTD_DYNLIB_DIR) |
219 | @echo AS $@ |
220 | $(COMPILE.S) $(OUTPUT_OPTION) $< |
221 | |
f535537f |
222 | $(ZSTD_STATICLIB_DIR)/%.o : %.S | $(ZSTD_STATICLIB_DIR) |
648db22b |
223 | @echo AS $@ |
224 | $(COMPILE.S) $(OUTPUT_OPTION) $< |
225 | |
f535537f |
226 | MKDIR ?= mkdir -p |
227 | $(BUILD_DIR) $(ZSTD_DYNLIB_DIR) $(ZSTD_STATICLIB_DIR): |
228 | $(MKDIR) $@ |
648db22b |
229 | |
f535537f |
230 | DEPFILES := $(ZSTD_DYNLIB_OBJ:.o=.d) $(ZSTD_STATICLIB_OBJ:.o=.d) |
648db22b |
231 | $(DEPFILES): |
232 | |
f535537f |
233 | # The leading '-' means: do not fail is include fails (ex: directory does not exist yet) |
234 | -include $(wildcard $(DEPFILES)) |
648db22b |
235 | |
236 | |
f535537f |
237 | # Special case : build library in single-thread mode _and_ without zstdmt_compress.c |
238 | # Note : we still need threading.c and pool.c for the dictionary builder, |
239 | # but they will correctly behave single-threaded. |
240 | ZSTDMT_FILES = zstdmt_compress.c |
241 | ZSTD_NOMT_FILES = $(filter-out $(ZSTDMT_FILES),$(notdir $(ZSTD_FILES))) |
648db22b |
242 | libzstd-nomt: CFLAGS += -fPIC -fvisibility=hidden |
243 | libzstd-nomt: LDFLAGS += -shared |
244 | libzstd-nomt: $(ZSTD_NOMT_FILES) |
245 | @echo compiling single-thread dynamic library $(LIBVER) |
246 | @echo files : $(ZSTD_NOMT_FILES) |
f535537f |
247 | @if echo "$(ZSTD_NOMT_FILES)" | tr ' ' '\n' | $(GREP) -q zstdmt; then \ |
248 | echo "Error: Found zstdmt in list."; \ |
249 | exit 1; \ |
250 | fi |
648db22b |
251 | $(CC) $(FLAGS) $^ $(LDFLAGS) $(SONAME_FLAGS) -o $@ |
252 | |
253 | .PHONY: clean |
254 | clean: |
255 | $(RM) -r *.dSYM # macOS-specific |
256 | $(RM) core *.o *.a *.gcda *.$(SHARED_EXT) *.$(SHARED_EXT).* libzstd.pc |
257 | $(RM) dll/libzstd.dll dll/libzstd.lib libzstd-nomt* |
258 | $(RM) -r obj/* |
259 | @echo Cleaning library completed |
260 | |
261 | #----------------------------------------------------------------------------- |
262 | # make install is validated only for below listed environments |
263 | #----------------------------------------------------------------------------- |
f535537f |
264 | ifneq (,$(filter $(UNAME),Linux Darwin GNU/kFreeBSD GNU OpenBSD FreeBSD NetBSD DragonFly SunOS Haiku AIX MSYS_NT CYGWIN_NT)) |
648db22b |
265 | |
266 | lib: libzstd.pc |
267 | |
268 | HAS_EXPLICIT_EXEC_PREFIX := $(if $(or $(EXEC_PREFIX),$(exec_prefix)),1,) |
269 | |
270 | DESTDIR ?= |
271 | # directory variables : GNU conventions prefer lowercase |
272 | # see https://www.gnu.org/prep/standards/html_node/Makefile-Conventions.html |
273 | # support both lower and uppercase (BSD), use uppercase in script |
274 | prefix ?= /usr/local |
275 | PREFIX ?= $(prefix) |
276 | exec_prefix ?= $(PREFIX) |
277 | EXEC_PREFIX ?= $(exec_prefix) |
278 | libdir ?= $(EXEC_PREFIX)/lib |
279 | LIBDIR ?= $(libdir) |
280 | includedir ?= $(PREFIX)/include |
281 | INCLUDEDIR ?= $(includedir) |
282 | |
283 | PCINCDIR := $(patsubst $(PREFIX)%,%,$(INCLUDEDIR)) |
284 | PCLIBDIR := $(patsubst $(EXEC_PREFIX)%,%,$(LIBDIR)) |
285 | |
286 | # If we successfully stripped off a prefix, we'll add a reference to the |
287 | # relevant pc variable. |
288 | PCINCPREFIX := $(if $(findstring $(INCLUDEDIR),$(PCINCDIR)),,$${prefix}) |
289 | PCLIBPREFIX := $(if $(findstring $(LIBDIR),$(PCLIBDIR)),,$${exec_prefix}) |
290 | |
291 | # If no explicit EXEC_PREFIX was set by the caller, write it out as a reference |
292 | # to PREFIX, rather than as a resolved value. |
293 | PCEXEC_PREFIX := $(if $(HAS_EXPLICIT_EXEC_PREFIX),$(EXEC_PREFIX),$${prefix}) |
294 | |
295 | ifneq (,$(filter $(UNAME),FreeBSD NetBSD DragonFly)) |
296 | PKGCONFIGDIR ?= $(PREFIX)/libdata/pkgconfig |
297 | else |
298 | PKGCONFIGDIR ?= $(LIBDIR)/pkgconfig |
299 | endif |
300 | |
301 | ifneq (,$(filter $(UNAME),SunOS)) |
302 | INSTALL ?= ginstall |
303 | else |
304 | INSTALL ?= install |
305 | endif |
306 | |
307 | INSTALL_PROGRAM ?= $(INSTALL) |
308 | INSTALL_DATA ?= $(INSTALL) -m 644 |
309 | |
310 | |
311 | libzstd.pc: libzstd.pc.in |
312 | @echo creating pkgconfig |
313 | @sed \ |
314 | -e 's|@PREFIX@|$(PREFIX)|' \ |
315 | -e 's|@EXEC_PREFIX@|$(PCEXEC_PREFIX)|' \ |
316 | -e 's|@INCLUDEDIR@|$(PCINCPREFIX)$(PCINCDIR)|' \ |
317 | -e 's|@LIBDIR@|$(PCLIBPREFIX)$(PCLIBDIR)|' \ |
318 | -e 's|@VERSION@|$(VERSION)|' \ |
319 | -e 's|@LIBS_PRIVATE@|$(LDFLAGS_DYNLIB)|' \ |
320 | $< >$@ |
321 | |
322 | .PHONY: install |
323 | install: install-pc install-static install-shared install-includes |
324 | @echo zstd static and shared library installed |
325 | |
326 | .PHONY: install-pc |
327 | install-pc: libzstd.pc |
328 | [ -e $(DESTDIR)$(PKGCONFIGDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(PKGCONFIGDIR)/ |
329 | $(INSTALL_DATA) libzstd.pc $(DESTDIR)$(PKGCONFIGDIR)/ |
330 | |
331 | .PHONY: install-static |
332 | install-static: |
333 | # only generate libzstd.a if it's not already present |
334 | [ -e libzstd.a ] || $(MAKE) libzstd.a-release |
335 | [ -e $(DESTDIR)$(LIBDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(LIBDIR)/ |
336 | @echo Installing static library |
337 | $(INSTALL_DATA) libzstd.a $(DESTDIR)$(LIBDIR) |
338 | |
339 | .PHONY: install-shared |
340 | install-shared: |
341 | # only generate libzstd.so if it's not already present |
342 | [ -e $(LIBZSTD) ] || $(MAKE) libzstd-release |
343 | [ -e $(DESTDIR)$(LIBDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(LIBDIR)/ |
344 | @echo Installing shared library |
345 | $(INSTALL_PROGRAM) $(LIBZSTD) $(DESTDIR)$(LIBDIR) |
346 | ln -sf $(LIBZSTD) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT_MAJOR) |
347 | ln -sf $(LIBZSTD) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT) |
348 | |
349 | .PHONY: install-includes |
350 | install-includes: |
351 | [ -e $(DESTDIR)$(INCLUDEDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(INCLUDEDIR)/ |
352 | @echo Installing includes |
353 | $(INSTALL_DATA) zstd.h $(DESTDIR)$(INCLUDEDIR) |
354 | $(INSTALL_DATA) zstd_errors.h $(DESTDIR)$(INCLUDEDIR) |
355 | $(INSTALL_DATA) zdict.h $(DESTDIR)$(INCLUDEDIR) |
356 | |
357 | .PHONY: uninstall |
358 | uninstall: |
359 | $(RM) $(DESTDIR)$(LIBDIR)/libzstd.a |
360 | $(RM) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT) |
361 | $(RM) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT_MAJOR) |
362 | $(RM) $(DESTDIR)$(LIBDIR)/$(LIBZSTD) |
363 | $(RM) $(DESTDIR)$(PKGCONFIGDIR)/libzstd.pc |
364 | $(RM) $(DESTDIR)$(INCLUDEDIR)/zstd.h |
365 | $(RM) $(DESTDIR)$(INCLUDEDIR)/zstd_errors.h |
366 | $(RM) $(DESTDIR)$(INCLUDEDIR)/zdict.h |
367 | @echo zstd libraries successfully uninstalled |
368 | |
369 | endif |