1 # ################################################################
2 # Copyright (c) 2015-2020, 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 # ################################################################
11 Q = $(if $(filter 1,$(V) $(VERBOSE)),,@)
13 # When cross-compiling from linux to windows, you might
14 # need to specify this as "Windows." Fedora build fails
17 # Note: mingw-w64 build from linux to windows does not
18 # fail on other tested distros (ubuntu, debian) even
19 # without manually specifying the TARGET_SYSTEM.
20 TARGET_SYSTEM ?= $(OS)
23 LIBVER_MAJOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MAJOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < ./zstd.h`
24 LIBVER_MINOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MINOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < ./zstd.h`
25 LIBVER_PATCH_SCRIPT:=`sed -n '/define ZSTD_VERSION_RELEASE/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < ./zstd.h`
26 LIBVER_SCRIPT:= $(LIBVER_MAJOR_SCRIPT).$(LIBVER_MINOR_SCRIPT).$(LIBVER_PATCH_SCRIPT)
27 LIBVER_MAJOR := $(shell echo $(LIBVER_MAJOR_SCRIPT))
28 LIBVER_MINOR := $(shell echo $(LIBVER_MINOR_SCRIPT))
29 LIBVER_PATCH := $(shell echo $(LIBVER_PATCH_SCRIPT))
30 LIBVER := $(shell echo $(LIBVER_SCRIPT))
32 CCVER := $(shell $(CC) --version)
34 CPPFLAGS+= -DXXH_NAMESPACE=ZSTD_
35 ifeq ($(TARGET_SYSTEM),Windows_NT) # MinGW assumed
36 CPPFLAGS += -D__USE_MINGW_ANSI_STDIO # compatibility with %zu formatting
38 DEBUGFLAGS= -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow \
39 -Wstrict-aliasing=1 -Wswitch-enum -Wdeclaration-after-statement \
40 -Wstrict-prototypes -Wundef -Wpointer-arith \
41 -Wvla -Wformat=2 -Winit-self -Wfloat-equal -Wwrite-strings \
42 -Wredundant-decls -Wmissing-prototypes -Wc++-compat
43 CFLAGS += $(DEBUGFLAGS) $(MOREFLAGS)
44 FLAGS = $(CPPFLAGS) $(CFLAGS)
46 HAVE_COLORNEVER = $(shell echo a | grep --color=never a > /dev/null 2> /dev/null && echo 1 || echo 0)
48 ifeq ($HAVE_COLORNEVER, 1)
49 GREP_OPTIONS += --color=never
51 GREP = grep $(GREP_OPTIONS)
53 ZSTDCOMMON_FILES := $(sort $(wildcard common/*.c))
54 ZSTDCOMP_FILES := $(sort $(wildcard compress/*.c))
55 ZSTDDECOMP_FILES := $(sort $(wildcard decompress/*.c))
56 ZDICT_FILES := $(sort $(wildcard dictBuilder/*.c))
57 ZDEPR_FILES := $(sort $(wildcard deprecated/*.c))
58 ZSTD_FILES := $(ZSTDCOMMON_FILES)
60 ifeq ($(findstring GCC,$(CCVER)),GCC)
61 decompress/zstd_decompress_block.o : CFLAGS+=-fno-tree-vectorize
64 # This is a helper variable that configures a bunch of other variables to new,
65 # space-optimized defaults.
67 ifneq ($(ZSTD_LIB_MINIFY), 0)
68 HAVE_CC_OZ ?= $(shell echo "" | $(CC) -Oz -x c -c - -o /dev/null 2> /dev/null && echo 1 || echo 0)
69 ZSTD_LEGACY_SUPPORT ?= 0
70 ZSTD_LIB_DEPRECATED ?= 0
71 HUF_FORCE_DECOMPRESS_X1 ?= 1
72 ZSTD_FORCE_DECOMPRESS_SHORT ?= 1
74 ZSTD_STRIP_ERROR_STRINGS ?= 1
75 ifneq ($(HAVE_CC_OZ), 0)
76 # Some compilers (clang) support an even more space-optimized setting.
81 CFLAGS += -fno-stack-protector -fomit-frame-pointer -fno-ident \
82 -DDYNAMIC_BMI2=0 -DNDEBUG
88 ZSTD_LIB_COMPRESSION ?= 1
89 ZSTD_LIB_DECOMPRESSION ?= 1
90 ZSTD_LIB_DICTBUILDER ?= 1
91 ZSTD_LIB_DEPRECATED ?= 1
94 ZSTD_LEGACY_SUPPORT ?= 5
95 ZSTD_LEGACY_MULTITHREADED_API ?= 0
97 # Build size optimizations
98 HUF_FORCE_DECOMPRESS_X1 ?= 0
99 HUF_FORCE_DECOMPRESS_X2 ?= 0
100 ZSTD_FORCE_DECOMPRESS_SHORT ?= 0
101 ZSTD_FORCE_DECOMPRESS_LONG ?= 0
103 ZSTD_STRIP_ERROR_STRINGS ?= 0
105 ifeq ($(ZSTD_LIB_COMPRESSION), 0)
106 ZSTD_LIB_DICTBUILDER = 0
107 ZSTD_LIB_DEPRECATED = 0
110 ifeq ($(ZSTD_LIB_DECOMPRESSION), 0)
111 ZSTD_LEGACY_SUPPORT = 0
112 ZSTD_LIB_DEPRECATED = 0
115 ifneq ($(ZSTD_LIB_COMPRESSION), 0)
116 ZSTD_FILES += $(ZSTDCOMP_FILES)
119 ifneq ($(ZSTD_LIB_DECOMPRESSION), 0)
120 ZSTD_FILES += $(ZSTDDECOMP_FILES)
123 ifneq ($(ZSTD_LIB_DEPRECATED), 0)
124 ZSTD_FILES += $(ZDEPR_FILES)
127 ifneq ($(ZSTD_LIB_DICTBUILDER), 0)
128 ZSTD_FILES += $(ZDICT_FILES)
131 ifneq ($(HUF_FORCE_DECOMPRESS_X1), 0)
132 CFLAGS += -DHUF_FORCE_DECOMPRESS_X1
135 ifneq ($(HUF_FORCE_DECOMPRESS_X2), 0)
136 CFLAGS += -DHUF_FORCE_DECOMPRESS_X2
139 ifneq ($(ZSTD_FORCE_DECOMPRESS_SHORT), 0)
140 CFLAGS += -DZSTD_FORCE_DECOMPRESS_SHORT
143 ifneq ($(ZSTD_FORCE_DECOMPRESS_LONG), 0)
144 CFLAGS += -DZSTD_FORCE_DECOMPRESS_LONG
147 ifneq ($(ZSTD_NO_INLINE), 0)
148 CFLAGS += -DZSTD_NO_INLINE
151 ifneq ($(ZSTD_STRIP_ERROR_STRINGS), 0)
152 CFLAGS += -DZSTD_STRIP_ERROR_STRINGS
155 ifneq ($(ZSTD_LEGACY_MULTITHREADED_API), 0)
156 CFLAGS += -DZSTD_LEGACY_MULTITHREADED_API
159 ifneq ($(ZSTD_LEGACY_SUPPORT), 0)
160 ifeq ($(shell test $(ZSTD_LEGACY_SUPPORT) -lt 8; echo $$?), 0)
161 ZSTD_FILES += $(shell ls legacy/*.c | $(GREP) 'v0[$(ZSTD_LEGACY_SUPPORT)-7]')
164 CPPFLAGS += -DZSTD_LEGACY_SUPPORT=$(ZSTD_LEGACY_SUPPORT)
166 ZSTD_OBJ := $(patsubst %.c,%.o,$(ZSTD_FILES))
168 # macOS linker doesn't support -soname, and use different extension
169 # see : https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/DynamicLibraries/100-Articles/DynamicLibraryDesignGuidelines.html
170 ifeq ($(shell uname), Darwin)
172 SHARED_EXT_MAJOR = $(LIBVER_MAJOR).$(SHARED_EXT)
173 SHARED_EXT_VER = $(LIBVER).$(SHARED_EXT)
174 SONAME_FLAGS = -install_name $(LIBDIR)/libzstd.$(SHARED_EXT_MAJOR) -compatibility_version $(LIBVER_MAJOR) -current_version $(LIBVER)
176 SONAME_FLAGS = -Wl,-soname=libzstd.$(SHARED_EXT).$(LIBVER_MAJOR)
178 SHARED_EXT_MAJOR = $(SHARED_EXT).$(LIBVER_MAJOR)
179 SHARED_EXT_VER = $(SHARED_EXT).$(LIBVER)
183 .PHONY: default lib-all all clean install uninstall
192 libzstd.a: ARFLAGS = rcs
193 libzstd.a: $(ZSTD_OBJ)
194 @echo compiling static library
195 $(Q)$(AR) $(ARFLAGS) $@ $^
197 ifneq (,$(filter Windows%,$(TARGET_SYSTEM)))
199 LIBZSTD = dll\libzstd.dll
200 $(LIBZSTD): $(ZSTD_FILES)
201 @echo compiling dynamic library $(LIBVER)
202 $(CC) $(FLAGS) -DZSTD_DLL_EXPORT=1 -Wl,--out-implib,dll\libzstd.dll.a -shared $^ -o $@
206 LIBZSTD = libzstd.$(SHARED_EXT_VER)
207 $(LIBZSTD): LDFLAGS += -shared -fPIC -fvisibility=hidden
208 $(LIBZSTD): $(ZSTD_FILES)
209 @echo compiling dynamic library $(LIBVER)
210 $(Q)$(CC) $(FLAGS) $^ $(LDFLAGS) $(SONAME_FLAGS) -o $@
211 @echo creating versioned links
212 $(Q)ln -sf $@ libzstd.$(SHARED_EXT_MAJOR)
213 $(Q)ln -sf $@ libzstd.$(SHARED_EXT)
221 lib : libzstd.a libzstd
224 %-mt : CPPFLAGS += -DZSTD_MULTITHREAD
225 %-mt : LDFLAGS += -pthread
227 @echo multi-threading build completed
230 %-release : DEBUGFLAGS :=
232 @echo release build completed
235 # Special case : building library in single-thread mode _and_ without zstdmt_compress.c
236 ZSTDMT_FILES = compress/zstdmt_compress.c
237 ZSTD_NOMT_FILES = $(filter-out $(ZSTDMT_FILES),$(ZSTD_FILES))
238 libzstd-nomt: LDFLAGS += -shared -fPIC -fvisibility=hidden
239 libzstd-nomt: $(ZSTD_NOMT_FILES)
240 @echo compiling single-thread dynamic library $(LIBVER)
241 @echo files : $(ZSTD_NOMT_FILES)
242 $(Q)$(CC) $(FLAGS) $^ $(LDFLAGS) $(SONAME_FLAGS) -o $@
245 $(Q)$(RM) -r *.dSYM # macOS-specific
246 $(Q)$(RM) core *.o *.a *.gcda *.$(SHARED_EXT) *.$(SHARED_EXT).* libzstd.pc
247 $(Q)$(RM) dll/libzstd.dll dll/libzstd.lib libzstd-nomt*
248 $(Q)$(RM) common/*.o compress/*.o decompress/*.o dictBuilder/*.o legacy/*.o deprecated/*.o
249 @echo Cleaning library completed
251 #-----------------------------------------------------------------------------
252 # make install is validated only for below listed environments
253 #-----------------------------------------------------------------------------
254 ifneq (,$(filter $(shell uname),Linux Darwin GNU/kFreeBSD GNU OpenBSD FreeBSD NetBSD DragonFly SunOS Haiku))
259 # directory variables : GNU conventions prefer lowercase
260 # see https://www.gnu.org/prep/standards/html_node/Makefile-Conventions.html
261 # support both lower and uppercase (BSD), use uppercase in script
264 exec_prefix ?= $(PREFIX)
265 EXEC_PREFIX ?= $(exec_prefix)
266 libdir ?= $(EXEC_PREFIX)/lib
268 includedir ?= $(PREFIX)/include
269 INCLUDEDIR ?= $(includedir)
271 PCLIBDIR ?= $(shell echo "$(LIBDIR)" | sed -n -E -e "s@^$(EXEC_PREFIX)(/|$$)@@p")
272 PCINCDIR ?= $(shell echo "$(INCLUDEDIR)" | sed -n -E -e "s@^$(PREFIX)(/|$$)@@p")
275 # Additional prefix check is required, since the empty string is technically a
277 ifeq (,$(shell echo "$(LIBDIR)" | sed -n -E -e "\\@^$(EXEC_PREFIX)(/|$$)@ p"))
278 $(error configured libdir ($(LIBDIR)) is outside of prefix ($(PREFIX)), can't generate pkg-config file)
283 # Additional prefix check is required, since the empty string is technically a
285 ifeq (,$(shell echo "$(INCLUDEDIR)" | sed -n -E -e "\\@^$(PREFIX)(/|$$)@ p"))
286 $(error configured includedir ($(INCLUDEDIR)) is outside of exec_prefix ($(EXEC_PREFIX)), can't generate pkg-config file)
290 ifneq (,$(filter $(shell uname),FreeBSD NetBSD DragonFly))
291 PKGCONFIGDIR ?= $(PREFIX)/libdata/pkgconfig
293 PKGCONFIGDIR ?= $(LIBDIR)/pkgconfig
296 ifneq (,$(filter $(shell uname),SunOS))
302 INSTALL_PROGRAM ?= $(INSTALL)
303 INSTALL_DATA ?= $(INSTALL) -m 644
307 libzstd.pc: libzstd.pc.in
308 @echo creating pkgconfig
309 $(Q)@sed -E -e 's|@PREFIX@|$(PREFIX)|' \
310 -e 's|@LIBDIR@|$(PCLIBDIR)|' \
311 -e 's|@INCLUDEDIR@|$(PCINCDIR)|' \
312 -e 's|@VERSION@|$(VERSION)|' \
315 install: install-pc install-static install-shared install-includes
316 @echo zstd static and shared library installed
318 install-pc: libzstd.pc
319 $(Q)$(INSTALL) -d -m 755 $(DESTDIR)$(PKGCONFIGDIR)/
320 $(Q)$(INSTALL_DATA) libzstd.pc $(DESTDIR)$(PKGCONFIGDIR)/
322 install-static: libzstd.a
323 @echo Installing static library
324 $(Q)$(INSTALL) -d -m 755 $(DESTDIR)$(LIBDIR)/
325 $(Q)$(INSTALL_DATA) libzstd.a $(DESTDIR)$(LIBDIR)
327 install-shared: libzstd
328 @echo Installing shared library
329 $(Q)$(INSTALL) -d -m 755 $(DESTDIR)$(LIBDIR)/
330 $(Q)$(INSTALL_PROGRAM) $(LIBZSTD) $(DESTDIR)$(LIBDIR)
331 $(Q)ln -sf $(LIBZSTD) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT_MAJOR)
332 $(Q)ln -sf $(LIBZSTD) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT)
335 @echo Installing includes
336 $(Q)$(INSTALL) -d -m 755 $(DESTDIR)$(INCLUDEDIR)/
337 $(Q)$(INSTALL_DATA) zstd.h $(DESTDIR)$(INCLUDEDIR)
338 $(Q)$(INSTALL_DATA) common/zstd_errors.h $(DESTDIR)$(INCLUDEDIR)
339 $(Q)$(INSTALL_DATA) deprecated/zbuff.h $(DESTDIR)$(INCLUDEDIR) # prototypes generate deprecation warnings
340 $(Q)$(INSTALL_DATA) dictBuilder/zdict.h $(DESTDIR)$(INCLUDEDIR)
343 $(Q)$(RM) $(DESTDIR)$(LIBDIR)/libzstd.a
344 $(Q)$(RM) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT)
345 $(Q)$(RM) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT_MAJOR)
346 $(Q)$(RM) $(DESTDIR)$(LIBDIR)/$(LIBZSTD)
347 $(Q)$(RM) $(DESTDIR)$(PKGCONFIGDIR)/libzstd.pc
348 $(Q)$(RM) $(DESTDIR)$(INCLUDEDIR)/zstd.h
349 $(Q)$(RM) $(DESTDIR)$(INCLUDEDIR)/zstd_errors.h
350 $(Q)$(RM) $(DESTDIR)$(INCLUDEDIR)/zbuff.h # Deprecated streaming functions
351 $(Q)$(RM) $(DESTDIR)$(INCLUDEDIR)/zdict.h
352 @echo zstd libraries successfully uninstalled