1 # ################################################################
2 # Copyright (c) Meta Platforms, Inc. and affiliates.
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 # ################################################################
11 # default target (when running `make` with no argument)
15 ZSTD_LIB_COMPRESSION ?
= 1
16 ZSTD_LIB_DECOMPRESSION ?
= 1
17 ZSTD_LIB_DICTBUILDER ?
= 1
18 ZSTD_LIB_DEPRECATED ?
= 0
20 # Input variables for libzstd.mk
21 ifeq ($(ZSTD_LIB_COMPRESSION
), 0)
22 ZSTD_LIB_DICTBUILDER
= 0
23 ZSTD_LIB_DEPRECATED
= 0
26 ifeq ($(ZSTD_LIB_DECOMPRESSION
), 0)
27 ZSTD_LEGACY_SUPPORT
= 0
28 ZSTD_LIB_DEPRECATED
= 0
33 ZSTD_FILES
:= $(ZSTD_COMMON_FILES
) $(ZSTD_LEGACY_FILES
)
35 ifneq ($(ZSTD_LIB_COMPRESSION
), 0)
36 ZSTD_FILES
+= $(ZSTD_COMPRESS_FILES
)
39 ifneq ($(ZSTD_LIB_DECOMPRESSION
), 0)
40 ZSTD_FILES
+= $(ZSTD_DECOMPRESS_FILES
)
43 ifneq ($(ZSTD_LIB_DEPRECATED
), 0)
44 ZSTD_FILES
+= $(ZSTD_DEPRECATED_FILES
)
47 ifneq ($(ZSTD_LIB_DICTBUILDER
), 0)
48 ZSTD_FILES
+= $(ZSTD_DICTBUILDER_FILES
)
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
)
55 VERSION
:= $(ZSTD_VERSION
)
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).
62 CPPFLAGS_DYNLIB
+= -DZSTD_MULTITHREAD
# dynamic library build defaults to multi-threaded
63 LDFLAGS_DYNLIB
+= -pthread
64 CPPFLAGS_STATICLIB
+= # static library build defaults to single-threaded
67 ifeq ($(findstring GCC
,$(CCVER
)),GCC
)
68 decompress
/zstd_decompress_block.o
: CFLAGS
+=-fno-tree-vectorize
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
)
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
)
83 SONAME_FLAGS
= -Wl
,-soname
=libzstd.
$(SHARED_EXT
).
$(LIBVER_MAJOR
)
86 SHARED_EXT_MAJOR
= $(SHARED_EXT
).
$(LIBVER_MAJOR
)
87 SHARED_EXT_VER
= $(SHARED_EXT
).
$(LIBVER
)
95 .PHONY
: libzstd.a
# must be run every time
96 libzstd.a
: CPPFLAGS
+= $(CPPFLAGS_STATICLIB
)
98 SET_CACHE_DIRECTORY
= \
99 +$(MAKE
) --no-print-directory
$@ \
100 BUILD_DIR
=obj
/$(HASH_DIR
) \
101 CPPFLAGS
="$(CPPFLAGS)" \
106 # determine BUILD_DIR from compilation flags
109 $(SET_CACHE_DIRECTORY
)
112 # BUILD_DIR is defined
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
)
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
) $@
$^
126 libzstd.a
: $(ZSTD_STATICLIB
)
131 ifneq (,$(filter Windows
%,$(TARGET_SYSTEM
)))
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
$@
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
)
147 # determine BUILD_DIR from compilation flags
150 $(SET_CACHE_DIRECTORY
)
153 # BUILD_DIR is defined
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
))
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
)
170 $(LIBZSTD
): $(ZSTD_DYNLIB
)
173 endif # ifndef BUILD_DIR
180 lib
: libzstd.a libzstd
183 # note : do not define lib-mt or lib-release as .PHONY
184 # make does not consider implicit pattern rule for .PHONY target
186 %-mt
: CPPFLAGS_DYNLIB
:= -DZSTD_MULTITHREAD
187 %-mt
: CPPFLAGS_STATICLIB
:= -DZSTD_MULTITHREAD
188 %-mt
: LDFLAGS_DYNLIB
:= -pthread
190 @echo multi-threaded build completed
192 %-nomt
: CPPFLAGS_DYNLIB
:=
193 %-nomt
: LDFLAGS_DYNLIB
:=
194 %-nomt
: CPPFLAGS_STATICLIB
:=
196 @echo single-threaded build completed
198 %-release
: DEBUGFLAGS
:=
200 @echo release build completed
203 # Generate .h dependencies automatically
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.
209 # ensure that ZSTD_DYNLIB_DIR exists prior to generating %.o
210 $(ZSTD_DYNLIB_DIR
)/%.o
: %.c |
$(ZSTD_DYNLIB_DIR
)
212 $(COMPILE.c
) $(DEPFLAGS
) $(OUTPUT_OPTION
) $<
214 $(ZSTD_STATICLIB_DIR
)/%.o
: %.c |
$(ZSTD_STATICLIB_DIR
)
216 $(COMPILE.c
) $(DEPFLAGS
) $(OUTPUT_OPTION
) $<
218 $(ZSTD_DYNLIB_DIR
)/%.o
: %.S |
$(ZSTD_DYNLIB_DIR
)
220 $(COMPILE.S
) $(OUTPUT_OPTION
) $<
222 $(ZSTD_STATICLIB_DIR
)/%.o
: %.S |
$(ZSTD_STATICLIB_DIR
)
224 $(COMPILE.S
) $(OUTPUT_OPTION
) $<
227 $(BUILD_DIR
) $(ZSTD_DYNLIB_DIR
) $(ZSTD_STATICLIB_DIR
):
230 DEPFILES
:= $(ZSTD_DYNLIB_OBJ
:.o
=.d
) $(ZSTD_STATICLIB_OBJ
:.o
=.d
)
233 # The leading '-' means: do not fail is include fails (ex: directory does not exist yet)
234 -include $(wildcard $(DEPFILES
))
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
)))
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
)
247 @if echo
"$(ZSTD_NOMT_FILES)" | tr
' ' '\n' |
$(GREP
) -q zstdmt
; then \
248 echo
"Error: Found zstdmt in list."; \
251 $(CC
) $(FLAGS
) $^
$(LDFLAGS
) $(SONAME_FLAGS
) -o
$@
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
*
259 @echo Cleaning library completed
261 #-----------------------------------------------------------------------------
262 # make install is validated only for below listed environments
263 #-----------------------------------------------------------------------------
264 ifneq (,$(filter $(UNAME
),Linux Darwin GNU
/kFreeBSD GNU OpenBSD FreeBSD NetBSD DragonFly SunOS Haiku AIX MSYS_NT CYGWIN_NT
))
268 HAS_EXPLICIT_EXEC_PREFIX
:= $(if
$(or
$(EXEC_PREFIX
),$(exec_prefix)),1,)
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
276 exec_prefix ?
= $(PREFIX
)
277 EXEC_PREFIX ?
= $(exec_prefix)
278 libdir ?
= $(EXEC_PREFIX
)/lib
280 includedir ?
= $(PREFIX
)/include
281 INCLUDEDIR ?
= $(includedir)
283 PCINCDIR
:= $(patsubst $(PREFIX
)%,%,$(INCLUDEDIR
))
284 PCLIBDIR
:= $(patsubst $(EXEC_PREFIX
)%,%,$(LIBDIR
))
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})
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})
295 ifneq (,$(filter $(UNAME
),FreeBSD NetBSD DragonFly
))
296 PKGCONFIGDIR ?
= $(PREFIX
)/libdata
/pkgconfig
298 PKGCONFIGDIR ?
= $(LIBDIR
)/pkgconfig
301 ifneq (,$(filter $(UNAME
),SunOS
))
307 INSTALL_PROGRAM ?
= $(INSTALL
)
308 INSTALL_DATA ?
= $(INSTALL
) -m
644
311 libzstd.
pc: libzstd.
pc.in
312 @echo creating pkgconfig
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)|' \
323 install: install-pc install-static install-shared install-includes
324 @echo zstd static and shared library installed
327 install-pc
: libzstd.
pc
328 [ -e
$(DESTDIR
)$(PKGCONFIGDIR
) ] ||
$(INSTALL
) -d
-m
755 $(DESTDIR
)$(PKGCONFIGDIR
)/
329 $(INSTALL_DATA
) libzstd.
pc $(DESTDIR
)$(PKGCONFIGDIR
)/
331 .PHONY
: 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
)
339 .PHONY
: 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
)
349 .PHONY
: 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
)
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