1 # ################################################################
2 # Copyright (c) 2015-2021, Yann Collet, Facebook, Inc.
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 # ################################################################
14 # define silent mode as default (verbose mode with V=1 or VERBOSE=1)
15 $(V
)$(VERBOSE
).SILENT
:
17 # When cross-compiling from linux to windows,
18 # one might need to specify TARGET_SYSTEM as "Windows."
19 # Building from Fedora fails without it.
20 # (but Ubuntu and Debian don't need to set anything)
21 TARGET_SYSTEM ?
= $(OS
)
24 LIBVER_MAJOR_SCRIPT
:=`sed -n '/define ZSTD_VERSION_MAJOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < ./zstd.h`
25 LIBVER_MINOR_SCRIPT
:=`sed -n '/define ZSTD_VERSION_MINOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < ./zstd.h`
26 LIBVER_PATCH_SCRIPT
:=`sed -n '/define ZSTD_VERSION_RELEASE/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < ./zstd.h`
27 LIBVER_SCRIPT
:= $(LIBVER_MAJOR_SCRIPT
).
$(LIBVER_MINOR_SCRIPT
).
$(LIBVER_PATCH_SCRIPT
)
28 LIBVER_MAJOR
:= $(shell echo
$(LIBVER_MAJOR_SCRIPT
))
29 LIBVER_MINOR
:= $(shell echo
$(LIBVER_MINOR_SCRIPT
))
30 LIBVER_PATCH
:= $(shell echo
$(LIBVER_PATCH_SCRIPT
))
31 LIBVER
:= $(shell echo
$(LIBVER_SCRIPT
))
33 CCVER
:= $(shell $(CC
) --version
)
35 # ZSTD_LIB_MINIFY is a helper variable that
36 # configures a bunch of other variables to space-optimized defaults.
38 ifneq ($(ZSTD_LIB_MINIFY
), 0)
39 HAVE_CC_OZ ?
= $(shell echo
"" |
$(CC
) -Oz
-x c
-c
- -o
/dev
/null
2> /dev
/null
&& echo
1 || echo
0)
40 ZSTD_LEGACY_SUPPORT ?
= 0
41 ZSTD_LIB_DEPRECATED ?
= 0
42 HUF_FORCE_DECOMPRESS_X1 ?
= 1
43 ZSTD_FORCE_DECOMPRESS_SHORT ?
= 1
45 ZSTD_STRIP_ERROR_STRINGS ?
= 1
46 ifneq ($(HAVE_CC_OZ
), 0)
47 # Some compilers (clang) support an even more space-optimized setting.
52 CFLAGS
+= -fno-stack-protector
-fomit-frame-pointer
-fno-ident \
53 -DDYNAMIC_BMI2
=0 -DNDEBUG
59 CPPFLAGS
+= -DXXH_NAMESPACE
=ZSTD_
-DDEBUGLEVEL
=$(DEBUGLEVEL
)
60 ifeq ($(TARGET_SYSTEM
),Windows_NT
) # MinGW assumed
61 CPPFLAGS
+= -D__USE_MINGW_ANSI_STDIO
# compatibility with %zu formatting
63 DEBUGFLAGS
= -Wall
-Wextra
-Wcast-qual
-Wcast-align
-Wshadow \
64 -Wstrict-aliasing
=1 -Wswitch-enum
-Wdeclaration-after-statement \
65 -Wstrict-prototypes
-Wundef
-Wpointer-arith \
66 -Wvla
-Wformat
=2 -Winit-self
-Wfloat-equal
-Wwrite-strings \
67 -Wredundant-decls
-Wmissing-prototypes
-Wc
++-compat
68 CFLAGS
+= $(DEBUGFLAGS
) $(MOREFLAGS
)
69 FLAGS
= $(CPPFLAGS
) $(CFLAGS
)
71 HAVE_COLORNEVER
= $(shell echo a | grep
--color
=never a
> /dev
/null
2> /dev
/null
&& echo
1 || echo
0)
73 ifeq ($HAVE_COLORNEVER, 1)
74 GREP_OPTIONS
+= --color
=never
76 GREP
= grep
$(GREP_OPTIONS
)
79 ZSTDCOMMON_FILES
:= $(sort $(wildcard common
/*.c
))
80 ZSTDCOMP_FILES
:= $(sort $(wildcard compress
/*.c
))
81 ZSTDDECOMP_FILES
:= $(sort $(wildcard decompress
/*.c
))
82 ZDICT_FILES
:= $(sort $(wildcard dictBuilder
/*.c
))
83 ZDEPR_FILES
:= $(sort $(wildcard deprecated
/*.c
))
84 ZSTD_FILES
:= $(ZSTDCOMMON_FILES
)
86 ifeq ($(findstring GCC
,$(CCVER
)),GCC
)
87 decompress
/zstd_decompress_block.o
: CFLAGS
+=-fno-tree-vectorize
91 ZSTD_LIB_COMPRESSION ?
= 1
92 ZSTD_LIB_DECOMPRESSION ?
= 1
93 ZSTD_LIB_DICTBUILDER ?
= 1
94 ZSTD_LIB_DEPRECATED ?
= 1
97 ZSTD_LEGACY_SUPPORT ?
= 5
98 ZSTD_LEGACY_MULTITHREADED_API ?
= 0
100 # Build size optimizations
101 HUF_FORCE_DECOMPRESS_X1 ?
= 0
102 HUF_FORCE_DECOMPRESS_X2 ?
= 0
103 ZSTD_FORCE_DECOMPRESS_SHORT ?
= 0
104 ZSTD_FORCE_DECOMPRESS_LONG ?
= 0
106 ZSTD_STRIP_ERROR_STRINGS ?
= 0
108 ifeq ($(ZSTD_LIB_COMPRESSION
), 0)
109 ZSTD_LIB_DICTBUILDER
= 0
110 ZSTD_LIB_DEPRECATED
= 0
113 ifeq ($(ZSTD_LIB_DECOMPRESSION
), 0)
114 ZSTD_LEGACY_SUPPORT
= 0
115 ZSTD_LIB_DEPRECATED
= 0
118 ifneq ($(ZSTD_LIB_COMPRESSION
), 0)
119 ZSTD_FILES
+= $(ZSTDCOMP_FILES
)
122 ifneq ($(ZSTD_LIB_DECOMPRESSION
), 0)
123 ZSTD_FILES
+= $(ZSTDDECOMP_FILES
)
126 ifneq ($(ZSTD_LIB_DEPRECATED
), 0)
127 ZSTD_FILES
+= $(ZDEPR_FILES
)
130 ifneq ($(ZSTD_LIB_DICTBUILDER
), 0)
131 ZSTD_FILES
+= $(ZDICT_FILES
)
134 ifneq ($(HUF_FORCE_DECOMPRESS_X1
), 0)
135 CFLAGS
+= -DHUF_FORCE_DECOMPRESS_X1
138 ifneq ($(HUF_FORCE_DECOMPRESS_X2
), 0)
139 CFLAGS
+= -DHUF_FORCE_DECOMPRESS_X2
142 ifneq ($(ZSTD_FORCE_DECOMPRESS_SHORT
), 0)
143 CFLAGS
+= -DZSTD_FORCE_DECOMPRESS_SHORT
146 ifneq ($(ZSTD_FORCE_DECOMPRESS_LONG
), 0)
147 CFLAGS
+= -DZSTD_FORCE_DECOMPRESS_LONG
150 ifneq ($(ZSTD_NO_INLINE
), 0)
151 CFLAGS
+= -DZSTD_NO_INLINE
154 ifneq ($(ZSTD_STRIP_ERROR_STRINGS
), 0)
155 CFLAGS
+= -DZSTD_STRIP_ERROR_STRINGS
158 ifneq ($(ZSTD_LEGACY_MULTITHREADED_API
), 0)
159 CFLAGS
+= -DZSTD_LEGACY_MULTITHREADED_API
162 ifneq ($(ZSTD_LEGACY_SUPPORT
), 0)
163 ifeq ($(shell test $(ZSTD_LEGACY_SUPPORT
) -lt
8; echo
$$?
), 0)
164 ZSTD_FILES
+= $(shell ls legacy
/*.c |
$(GREP
) 'v0[$(ZSTD_LEGACY_SUPPORT)-7]')
167 CPPFLAGS
+= -DZSTD_LEGACY_SUPPORT
=$(ZSTD_LEGACY_SUPPORT
)
169 ZSTD_LOCAL_SRC
:= $(notdir $(ZSTD_FILES
))
170 ZSTD_LOCAL_OBJ
:= $(ZSTD_LOCAL_SRC
:.c
=.o
)
172 ZSTD_SUBDIR
:= common compress decompress dictBuilder legacy deprecated
173 vpath
%.c
$(ZSTD_SUBDIR
)
175 UNAME
:= $(shell uname
)
178 ifeq ($(UNAME
), Darwin
)
180 else ifeq ($(UNAME
), FreeBSD
)
182 else ifeq ($(UNAME
), OpenBSD
)
187 HASH_DIR
= conf_
$(shell echo
$(CC
) $(CPPFLAGS
) $(CFLAGS
) $(LDFLAGS
) $(ZSTD_FILES
) |
$(HASH
) | cut
-f
1 -d
" " )
188 HAVE_HASH
:=$(shell echo
1 |
$(HASH
) > /dev
/null
&& echo
1 || echo
0)
189 ifeq ($(HAVE_HASH
),0)
190 $(info warning
: could not find HASH
($(HASH
)), needed to differentiate builds using different flags
)
191 BUILD_DIR
:= obj
/generic_noconf
196 # macOS linker doesn't support -soname, and use different extension
197 # see : https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/DynamicLibraries/100-Articles/DynamicLibraryDesignGuidelines.html
198 ifeq ($(UNAME
), Darwin
)
200 SHARED_EXT_MAJOR
= $(LIBVER_MAJOR
).
$(SHARED_EXT
)
201 SHARED_EXT_VER
= $(LIBVER
).
$(SHARED_EXT
)
202 SONAME_FLAGS
= -install_name
$(LIBDIR
)/libzstd.
$(SHARED_EXT_MAJOR
) -compatibility_version
$(LIBVER_MAJOR
) -current_version
$(LIBVER
)
204 SONAME_FLAGS
= -Wl
,-soname
=libzstd.
$(SHARED_EXT
).
$(LIBVER_MAJOR
)
206 SHARED_EXT_MAJOR
= $(SHARED_EXT
).
$(LIBVER_MAJOR
)
207 SHARED_EXT_VER
= $(SHARED_EXT
).
$(LIBVER
)
210 SET_CACHE_DIRECTORY
= \
211 +$(MAKE
) --no-print-directory
$@ \
212 BUILD_DIR
=obj
/$(HASH_DIR
) \
213 CPPFLAGS
="$(CPPFLAGS)" \
222 .PHONY
: libzstd.a
# must be run every time
225 # determine BUILD_DIR from compilation flags
228 $(SET_CACHE_DIRECTORY
)
231 # BUILD_DIR is defined
233 ZSTD_STATLIB_DIR
:= $(BUILD_DIR
)/static
234 ZSTD_STATLIB
:= $(ZSTD_STATLIB_DIR
)/libzstd.a
235 ZSTD_STATLIB_OBJ
:= $(addprefix $(ZSTD_STATLIB_DIR
)/,$(ZSTD_LOCAL_OBJ
))
236 $(ZSTD_STATLIB
): ARFLAGS
= rcs
237 $(ZSTD_STATLIB
): |
$(ZSTD_STATLIB_DIR
)
238 $(ZSTD_STATLIB
): $(ZSTD_STATLIB_OBJ
)
239 @echo compiling static library
240 $(AR
) $(ARFLAGS
) $@
$^
242 libzstd.a
: $(ZSTD_STATLIB
)
247 ifneq (,$(filter Windows
%,$(TARGET_SYSTEM
)))
249 LIBZSTD
= dll
/libzstd.dll
250 $(LIBZSTD
): $(ZSTD_FILES
)
251 @echo compiling dynamic library
$(LIBVER
)
252 $(CC
) $(FLAGS
) -DZSTD_DLL_EXPORT
=1 -Wl
,--out-implib
,dll
/libzstd.dll.a
-shared
$^
-o
$@
256 LIBZSTD
= libzstd.
$(SHARED_EXT_VER
)
257 .PHONY
: $(LIBZSTD
) # must be run every time
258 $(LIBZSTD
): CFLAGS
+= -fPIC
-fvisibility
=hidden
259 $(LIBZSTD
): LDFLAGS
+= -shared
262 # determine BUILD_DIR from compilation flags
265 $(SET_CACHE_DIRECTORY
)
268 # BUILD_DIR is defined
270 ZSTD_DYNLIB_DIR
:= $(BUILD_DIR
)/dynamic
271 ZSTD_DYNLIB
:= $(ZSTD_DYNLIB_DIR
)/$(LIBZSTD
)
272 ZSTD_DYNLIB_OBJ
:= $(addprefix $(ZSTD_DYNLIB_DIR
)/,$(ZSTD_LOCAL_OBJ
))
274 $(ZSTD_DYNLIB
): |
$(ZSTD_DYNLIB_DIR
)
275 $(ZSTD_DYNLIB
): $(ZSTD_DYNLIB_OBJ
)
276 @echo compiling dynamic library
$(LIBVER
)
277 $(CC
) $(FLAGS
) $^
$(LDFLAGS
) $(SONAME_FLAGS
) -o
$@
278 @echo creating versioned links
279 ln
-sf
$@ libzstd.
$(SHARED_EXT_MAJOR
)
280 ln
-sf
$@ libzstd.
$(SHARED_EXT
)
282 $(LIBZSTD
): $(ZSTD_DYNLIB
)
285 endif # ifndef BUILD_DIR
292 lib
: libzstd.a libzstd
295 # note : do not define lib-mt or lib-release as .PHONY
296 # make does not consider implicit pattern rule for .PHONY target
298 %-mt
: CPPFLAGS
+= -DZSTD_MULTITHREAD
299 %-mt
: LDFLAGS
+= -pthread
301 @echo multi-threading build completed
303 %-release
: DEBUGFLAGS
:=
305 @echo release build completed
308 # Generate .h dependencies automatically
310 DEPFLAGS
= -MT
$@
-MMD
-MP
-MF
312 $(ZSTD_DYNLIB_DIR
)/%.o
: %.c
$(ZSTD_DYNLIB_DIR
)/%.d |
$(ZSTD_DYNLIB_DIR
)
314 $(COMPILE.c
) $(DEPFLAGS
) $(ZSTD_DYNLIB_DIR
)/$*.d
$(OUTPUT_OPTION
) $<
316 $(ZSTD_STATLIB_DIR
)/%.o
: %.c
$(ZSTD_STATLIB_DIR
)/%.d |
$(ZSTD_STATLIB_DIR
)
318 $(COMPILE.c
) $(DEPFLAGS
) $(ZSTD_STATLIB_DIR
)/$*.d
$(OUTPUT_OPTION
) $<
321 $(BUILD_DIR
) $(ZSTD_DYNLIB_DIR
) $(ZSTD_STATLIB_DIR
):
324 DEPFILES
:= $(ZSTD_DYNLIB_OBJ
:.o
=.d
) $(ZSTD_STATLIB_OBJ
:.o
=.d
)
327 include $(wildcard $(DEPFILES
))
330 # Special case : building library in single-thread mode _and_ without zstdmt_compress.c
331 ZSTDMT_FILES
= compress
/zstdmt_compress.c
332 ZSTD_NOMT_FILES
= $(filter-out $(ZSTDMT_FILES
),$(ZSTD_FILES
))
333 libzstd-nomt
: LDFLAGS
+= -shared
-fPIC
-fvisibility
=hidden
334 libzstd-nomt
: $(ZSTD_NOMT_FILES
)
335 @echo compiling single-thread dynamic library
$(LIBVER
)
336 @echo files
: $(ZSTD_NOMT_FILES
)
337 $(CC
) $(FLAGS
) $^
$(LDFLAGS
) $(SONAME_FLAGS
) -o
$@
341 $(RM
) -r
*.dSYM
# macOS-specific
342 $(RM
) core
*.o
*.a
*.gcda
*.
$(SHARED_EXT
) *.
$(SHARED_EXT
).
* libzstd.
pc
343 $(RM
) dll
/libzstd.dll dll
/libzstd.lib libzstd-nomt
*
345 @echo Cleaning library completed
347 #-----------------------------------------------------------------------------
348 # make install is validated only for below listed environments
349 #-----------------------------------------------------------------------------
350 ifneq (,$(filter $(UNAME
),Linux Darwin GNU
/kFreeBSD GNU OpenBSD FreeBSD NetBSD DragonFly SunOS Haiku
))
354 HAS_EXPLICIT_EXEC_PREFIX
:= $(if
$(or
$(EXEC_PREFIX
),$(exec_prefix)),1,)
357 # directory variables : GNU conventions prefer lowercase
358 # see https://www.gnu.org/prep/standards/html_node/Makefile-Conventions.html
359 # support both lower and uppercase (BSD), use uppercase in script
362 exec_prefix ?
= $(PREFIX
)
363 EXEC_PREFIX ?
= $(exec_prefix)
364 libdir ?
= $(EXEC_PREFIX
)/lib
366 includedir ?
= $(PREFIX
)/include
367 INCLUDEDIR ?
= $(includedir)
369 PCINCDIR
:= $(patsubst $(PREFIX
)%,%,$(INCLUDEDIR
))
370 PCLIBDIR
:= $(patsubst $(EXEC_PREFIX
)%,%,$(LIBDIR
))
372 # If we successfully stripped off a prefix, we'll add a reference to the
373 # relevant pc variable.
374 PCINCPREFIX
:= $(if
$(findstring $(INCLUDEDIR
),$(PCINCDIR
)),,$${prefix})
375 PCLIBPREFIX
:= $(if
$(findstring $(LIBDIR
),$(PCLIBDIR
)),,$${exec_prefix})
377 # If no explicit EXEC_PREFIX was set by the caller, write it out as a reference
378 # to PREFIX, rather than as a resolved value.
379 PCEXEC_PREFIX
:= $(if
$(HAS_EXPLICIT_EXEC_PREFIX
),$(EXEC_PREFIX
),$${prefix})
381 ifneq (,$(filter $(UNAME
),FreeBSD NetBSD DragonFly
))
382 PKGCONFIGDIR ?
= $(PREFIX
)/libdata
/pkgconfig
384 PKGCONFIGDIR ?
= $(LIBDIR
)/pkgconfig
387 ifneq (,$(filter $(UNAME
),SunOS
))
393 INSTALL_PROGRAM ?
= $(INSTALL
)
394 INSTALL_DATA ?
= $(INSTALL
) -m
644
398 libzstd.
pc: libzstd.
pc.in
399 @echo creating pkgconfig
400 @sed
$(SED_ERE_OPT
) \
401 -e
's|@PREFIX@|$(PREFIX)|' \
402 -e
's|@EXEC_PREFIX@|$(PCEXEC_PREFIX)|' \
403 -e
's|@INCLUDEDIR@|$(PCINCPREFIX)$(PCINCDIR)|' \
404 -e
's|@LIBDIR@|$(PCLIBPREFIX)$(PCLIBDIR)|' \
405 -e
's|@VERSION@|$(VERSION)|' \
409 install: install-pc install-static install-shared install-includes
410 @echo zstd static and shared library installed
412 install-pc
: libzstd.
pc
413 [ -e
$(DESTDIR
)$(PKGCONFIGDIR
) ] ||
$(INSTALL
) -d
-m
755 $(DESTDIR
)$(PKGCONFIGDIR
)/
414 $(INSTALL_DATA
) libzstd.
pc $(DESTDIR
)$(PKGCONFIGDIR
)/
417 # only generate libzstd.a if it's not already present
418 [ -e libzstd.a
] ||
$(MAKE
) libzstd.a-release
419 [ -e
$(DESTDIR
)$(LIBDIR
) ] ||
$(INSTALL
) -d
-m
755 $(DESTDIR
)$(LIBDIR
)/
420 @echo Installing static library
421 $(INSTALL_DATA
) libzstd.a
$(DESTDIR
)$(LIBDIR
)
424 # only generate libzstd.so if it's not already present
425 [ -e
$(LIBZSTD
) ] ||
$(MAKE
) libzstd-release
426 [ -e
$(DESTDIR
)$(LIBDIR
) ] ||
$(INSTALL
) -d
-m
755 $(DESTDIR
)$(LIBDIR
)/
427 @echo Installing shared library
428 $(INSTALL_PROGRAM
) $(LIBZSTD
) $(DESTDIR
)$(LIBDIR
)
429 ln
-sf
$(LIBZSTD
) $(DESTDIR
)$(LIBDIR
)/libzstd.
$(SHARED_EXT_MAJOR
)
430 ln
-sf
$(LIBZSTD
) $(DESTDIR
)$(LIBDIR
)/libzstd.
$(SHARED_EXT
)
433 [ -e
$(DESTDIR
)$(INCLUDEDIR
) ] ||
$(INSTALL
) -d
-m
755 $(DESTDIR
)$(INCLUDEDIR
)/
434 @echo Installing includes
435 $(INSTALL_DATA
) zstd.h
$(DESTDIR
)$(INCLUDEDIR
)
436 $(INSTALL_DATA
) common
/zstd_errors.h
$(DESTDIR
)$(INCLUDEDIR
)
437 $(INSTALL_DATA
) dictBuilder
/zdict.h
$(DESTDIR
)$(INCLUDEDIR
)
441 $(RM
) $(DESTDIR
)$(LIBDIR
)/libzstd.a
442 $(RM
) $(DESTDIR
)$(LIBDIR
)/libzstd.
$(SHARED_EXT
)
443 $(RM
) $(DESTDIR
)$(LIBDIR
)/libzstd.
$(SHARED_EXT_MAJOR
)
444 $(RM
) $(DESTDIR
)$(LIBDIR
)/$(LIBZSTD
)
445 $(RM
) $(DESTDIR
)$(PKGCONFIGDIR
)/libzstd.
pc
446 $(RM
) $(DESTDIR
)$(INCLUDEDIR
)/zstd.h
447 $(RM
) $(DESTDIR
)$(INCLUDEDIR
)/zstd_errors.h
448 $(RM
) $(DESTDIR
)$(INCLUDEDIR
)/zdict.h
449 @echo zstd libraries successfully uninstalled