extzstd 0.3.2 → 0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -3
  3. data/contrib/zstd/CHANGELOG +225 -1
  4. data/contrib/zstd/CONTRIBUTING.md +158 -75
  5. data/contrib/zstd/LICENSE +4 -4
  6. data/contrib/zstd/Makefile +106 -69
  7. data/contrib/zstd/Package.swift +36 -0
  8. data/contrib/zstd/README.md +64 -36
  9. data/contrib/zstd/SECURITY.md +15 -0
  10. data/contrib/zstd/TESTING.md +2 -3
  11. data/contrib/zstd/lib/BUCK +5 -7
  12. data/contrib/zstd/lib/Makefile +117 -199
  13. data/contrib/zstd/lib/README.md +37 -7
  14. data/contrib/zstd/lib/common/allocations.h +55 -0
  15. data/contrib/zstd/lib/common/bits.h +200 -0
  16. data/contrib/zstd/lib/common/bitstream.h +80 -86
  17. data/contrib/zstd/lib/common/compiler.h +225 -63
  18. data/contrib/zstd/lib/common/cpu.h +37 -1
  19. data/contrib/zstd/lib/common/debug.c +7 -1
  20. data/contrib/zstd/lib/common/debug.h +21 -12
  21. data/contrib/zstd/lib/common/entropy_common.c +15 -37
  22. data/contrib/zstd/lib/common/error_private.c +9 -2
  23. data/contrib/zstd/lib/common/error_private.h +93 -5
  24. data/contrib/zstd/lib/common/fse.h +12 -87
  25. data/contrib/zstd/lib/common/fse_decompress.c +37 -117
  26. data/contrib/zstd/lib/common/huf.h +97 -172
  27. data/contrib/zstd/lib/common/mem.h +58 -58
  28. data/contrib/zstd/lib/common/pool.c +38 -17
  29. data/contrib/zstd/lib/common/pool.h +10 -4
  30. data/contrib/zstd/lib/common/portability_macros.h +158 -0
  31. data/contrib/zstd/lib/common/threading.c +74 -14
  32. data/contrib/zstd/lib/common/threading.h +5 -10
  33. data/contrib/zstd/lib/common/xxhash.c +6 -814
  34. data/contrib/zstd/lib/common/xxhash.h +6930 -195
  35. data/contrib/zstd/lib/common/zstd_common.c +1 -36
  36. data/contrib/zstd/lib/common/zstd_deps.h +1 -1
  37. data/contrib/zstd/lib/common/zstd_internal.h +68 -154
  38. data/contrib/zstd/lib/common/zstd_trace.h +163 -0
  39. data/contrib/zstd/lib/compress/clevels.h +134 -0
  40. data/contrib/zstd/lib/compress/fse_compress.c +75 -155
  41. data/contrib/zstd/lib/compress/hist.c +1 -1
  42. data/contrib/zstd/lib/compress/hist.h +1 -1
  43. data/contrib/zstd/lib/compress/huf_compress.c +810 -259
  44. data/contrib/zstd/lib/compress/zstd_compress.c +2864 -919
  45. data/contrib/zstd/lib/compress/zstd_compress_internal.h +523 -192
  46. data/contrib/zstd/lib/compress/zstd_compress_literals.c +117 -40
  47. data/contrib/zstd/lib/compress/zstd_compress_literals.h +16 -6
  48. data/contrib/zstd/lib/compress/zstd_compress_sequences.c +28 -19
  49. data/contrib/zstd/lib/compress/zstd_compress_sequences.h +1 -1
  50. data/contrib/zstd/lib/compress/zstd_compress_superblock.c +251 -412
  51. data/contrib/zstd/lib/compress/zstd_compress_superblock.h +1 -1
  52. data/contrib/zstd/lib/compress/zstd_cwksp.h +284 -97
  53. data/contrib/zstd/lib/compress/zstd_double_fast.c +382 -133
  54. data/contrib/zstd/lib/compress/zstd_double_fast.h +14 -2
  55. data/contrib/zstd/lib/compress/zstd_fast.c +732 -260
  56. data/contrib/zstd/lib/compress/zstd_fast.h +3 -2
  57. data/contrib/zstd/lib/compress/zstd_lazy.c +1177 -390
  58. data/contrib/zstd/lib/compress/zstd_lazy.h +129 -14
  59. data/contrib/zstd/lib/compress/zstd_ldm.c +280 -210
  60. data/contrib/zstd/lib/compress/zstd_ldm.h +3 -2
  61. data/contrib/zstd/lib/compress/zstd_ldm_geartab.h +106 -0
  62. data/contrib/zstd/lib/compress/zstd_opt.c +516 -285
  63. data/contrib/zstd/lib/compress/zstd_opt.h +32 -8
  64. data/contrib/zstd/lib/compress/zstdmt_compress.c +202 -131
  65. data/contrib/zstd/lib/compress/zstdmt_compress.h +9 -6
  66. data/contrib/zstd/lib/decompress/huf_decompress.c +1149 -555
  67. data/contrib/zstd/lib/decompress/huf_decompress_amd64.S +595 -0
  68. data/contrib/zstd/lib/decompress/zstd_ddict.c +4 -4
  69. data/contrib/zstd/lib/decompress/zstd_ddict.h +1 -1
  70. data/contrib/zstd/lib/decompress/zstd_decompress.c +583 -106
  71. data/contrib/zstd/lib/decompress/zstd_decompress_block.c +1054 -379
  72. data/contrib/zstd/lib/decompress/zstd_decompress_block.h +14 -3
  73. data/contrib/zstd/lib/decompress/zstd_decompress_internal.h +56 -6
  74. data/contrib/zstd/lib/deprecated/zbuff.h +1 -1
  75. data/contrib/zstd/lib/deprecated/zbuff_common.c +1 -1
  76. data/contrib/zstd/lib/deprecated/zbuff_compress.c +24 -4
  77. data/contrib/zstd/lib/deprecated/zbuff_decompress.c +3 -1
  78. data/contrib/zstd/lib/dictBuilder/cover.c +60 -44
  79. data/contrib/zstd/lib/dictBuilder/cover.h +6 -11
  80. data/contrib/zstd/lib/dictBuilder/divsufsort.c +1 -1
  81. data/contrib/zstd/lib/dictBuilder/fastcover.c +26 -18
  82. data/contrib/zstd/lib/dictBuilder/zdict.c +100 -101
  83. data/contrib/zstd/lib/legacy/zstd_legacy.h +38 -1
  84. data/contrib/zstd/lib/legacy/zstd_v01.c +18 -53
  85. data/contrib/zstd/lib/legacy/zstd_v01.h +1 -1
  86. data/contrib/zstd/lib/legacy/zstd_v02.c +28 -85
  87. data/contrib/zstd/lib/legacy/zstd_v02.h +1 -1
  88. data/contrib/zstd/lib/legacy/zstd_v03.c +29 -88
  89. data/contrib/zstd/lib/legacy/zstd_v03.h +1 -1
  90. data/contrib/zstd/lib/legacy/zstd_v04.c +27 -80
  91. data/contrib/zstd/lib/legacy/zstd_v04.h +1 -1
  92. data/contrib/zstd/lib/legacy/zstd_v05.c +36 -85
  93. data/contrib/zstd/lib/legacy/zstd_v05.h +1 -1
  94. data/contrib/zstd/lib/legacy/zstd_v06.c +44 -96
  95. data/contrib/zstd/lib/legacy/zstd_v06.h +1 -1
  96. data/contrib/zstd/lib/legacy/zstd_v07.c +37 -92
  97. data/contrib/zstd/lib/legacy/zstd_v07.h +1 -1
  98. data/contrib/zstd/lib/libzstd.mk +237 -0
  99. data/contrib/zstd/lib/libzstd.pc.in +4 -3
  100. data/contrib/zstd/lib/module.modulemap +35 -0
  101. data/contrib/zstd/lib/{dictBuilder/zdict.h → zdict.h} +202 -33
  102. data/contrib/zstd/lib/zstd.h +1030 -332
  103. data/contrib/zstd/lib/{common/zstd_errors.h → zstd_errors.h} +27 -8
  104. data/ext/extconf.rb +26 -7
  105. data/ext/extzstd.c +51 -24
  106. data/ext/extzstd.h +33 -6
  107. data/ext/extzstd_stream.c +74 -31
  108. data/ext/libzstd_conf.h +0 -1
  109. data/ext/zstd_decompress_asm.S +1 -0
  110. metadata +17 -7
  111. data/contrib/zstd/appveyor.yml +0 -292
  112. data/ext/depend +0 -2
@@ -1,5 +1,5 @@
1
1
  # ################################################################
2
- # Copyright (c) 2015-2020, Yann Collet, Facebook, Inc.
2
+ # Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  # All rights reserved.
4
4
  #
5
5
  # This source code is licensed under both the BSD-style license (found in the
@@ -8,103 +8,16 @@
8
8
  # You may select, at your option, one of the above-listed licenses.
9
9
  # ################################################################
10
10
 
11
- .PHONY: default
12
- default: lib-release
13
-
14
- # define silent mode as default (verbose mode with V=1 or VERBOSE=1)
15
- $(V)$(VERBOSE).SILENT:
16
-
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)
22
-
23
- # Version numbers
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))
32
- VERSION?= $(LIBVER)
33
- CCVER := $(shell $(CC) --version)
34
-
35
- # ZSTD_LIB_MINIFY is a helper variable that
36
- # configures a bunch of other variables to space-optimized defaults.
37
- ZSTD_LIB_MINIFY ?= 0
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
44
- ZSTD_NO_INLINE ?= 1
45
- ZSTD_STRIP_ERROR_STRINGS ?= 1
46
- ifneq ($(HAVE_CC_OZ), 0)
47
- # Some compilers (clang) support an even more space-optimized setting.
48
- CFLAGS += -Oz
49
- else
50
- CFLAGS += -Os
51
- endif
52
- CFLAGS += -fno-stack-protector -fomit-frame-pointer -fno-ident \
53
- -DDYNAMIC_BMI2=0 -DNDEBUG
54
- else
55
- CFLAGS += -O3
56
- endif
57
-
58
- DEBUGLEVEL ?= 0
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
62
- endif
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)
70
-
71
- HAVE_COLORNEVER = $(shell echo a | grep --color=never a > /dev/null 2> /dev/null && echo 1 || echo 0)
72
- GREP_OPTIONS ?=
73
- ifeq ($HAVE_COLORNEVER, 1)
74
- GREP_OPTIONS += --color=never
75
- endif
76
- GREP = grep $(GREP_OPTIONS)
77
- SED_ERE_OPT ?= -E
78
-
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)
85
-
86
- ifeq ($(findstring GCC,$(CCVER)),GCC)
87
- decompress/zstd_decompress_block.o : CFLAGS+=-fno-tree-vectorize
88
- endif
11
+ # default target (when running `make` with no argument)
12
+ lib-release:
89
13
 
90
14
  # Modules
91
15
  ZSTD_LIB_COMPRESSION ?= 1
92
16
  ZSTD_LIB_DECOMPRESSION ?= 1
93
17
  ZSTD_LIB_DICTBUILDER ?= 1
94
- ZSTD_LIB_DEPRECATED ?= 1
95
-
96
- # Legacy support
97
- ZSTD_LEGACY_SUPPORT ?= 5
98
- ZSTD_LEGACY_MULTITHREADED_API ?= 0
99
-
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
105
- ZSTD_NO_INLINE ?= 0
106
- ZSTD_STRIP_ERROR_STRINGS ?= 0
18
+ ZSTD_LIB_DEPRECATED ?= 0
107
19
 
20
+ # Input variables for libzstd.mk
108
21
  ifeq ($(ZSTD_LIB_COMPRESSION), 0)
109
22
  ZSTD_LIB_DICTBUILDER = 0
110
23
  ZSTD_LIB_DEPRECATED = 0
@@ -115,82 +28,45 @@ ifeq ($(ZSTD_LIB_DECOMPRESSION), 0)
115
28
  ZSTD_LIB_DEPRECATED = 0
116
29
  endif
117
30
 
31
+ include libzstd.mk
32
+
33
+ ZSTD_FILES := $(ZSTD_COMMON_FILES) $(ZSTD_LEGACY_FILES)
34
+
118
35
  ifneq ($(ZSTD_LIB_COMPRESSION), 0)
119
- ZSTD_FILES += $(ZSTDCOMP_FILES)
36
+ ZSTD_FILES += $(ZSTD_COMPRESS_FILES)
120
37
  endif
121
38
 
122
39
  ifneq ($(ZSTD_LIB_DECOMPRESSION), 0)
123
- ZSTD_FILES += $(ZSTDDECOMP_FILES)
40
+ ZSTD_FILES += $(ZSTD_DECOMPRESS_FILES)
124
41
  endif
125
42
 
126
43
  ifneq ($(ZSTD_LIB_DEPRECATED), 0)
127
- ZSTD_FILES += $(ZDEPR_FILES)
44
+ ZSTD_FILES += $(ZSTD_DEPRECATED_FILES)
128
45
  endif
129
46
 
130
47
  ifneq ($(ZSTD_LIB_DICTBUILDER), 0)
131
- ZSTD_FILES += $(ZDICT_FILES)
132
- endif
133
-
134
- ifneq ($(HUF_FORCE_DECOMPRESS_X1), 0)
135
- CFLAGS += -DHUF_FORCE_DECOMPRESS_X1
136
- endif
137
-
138
- ifneq ($(HUF_FORCE_DECOMPRESS_X2), 0)
139
- CFLAGS += -DHUF_FORCE_DECOMPRESS_X2
140
- endif
141
-
142
- ifneq ($(ZSTD_FORCE_DECOMPRESS_SHORT), 0)
143
- CFLAGS += -DZSTD_FORCE_DECOMPRESS_SHORT
144
- endif
145
-
146
- ifneq ($(ZSTD_FORCE_DECOMPRESS_LONG), 0)
147
- CFLAGS += -DZSTD_FORCE_DECOMPRESS_LONG
148
- endif
149
-
150
- ifneq ($(ZSTD_NO_INLINE), 0)
151
- CFLAGS += -DZSTD_NO_INLINE
152
- endif
153
-
154
- ifneq ($(ZSTD_STRIP_ERROR_STRINGS), 0)
155
- CFLAGS += -DZSTD_STRIP_ERROR_STRINGS
48
+ ZSTD_FILES += $(ZSTD_DICTBUILDER_FILES)
156
49
  endif
157
50
 
158
- ifneq ($(ZSTD_LEGACY_MULTITHREADED_API), 0)
159
- CFLAGS += -DZSTD_LEGACY_MULTITHREADED_API
160
- endif
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)
161
54
 
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]')
165
- endif
166
- endif
167
- CPPFLAGS += -DZSTD_LEGACY_SUPPORT=$(ZSTD_LEGACY_SUPPORT)
55
+ VERSION := $(ZSTD_VERSION)
168
56
 
169
- ZSTD_LOCAL_SRC := $(notdir $(ZSTD_FILES))
170
- ZSTD_LOCAL_OBJ := $(ZSTD_LOCAL_SRC:.c=.o)
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).
171
60
 
172
- ZSTD_SUBDIR := common compress decompress dictBuilder legacy deprecated
173
- vpath %.c $(ZSTD_SUBDIR)
174
61
 
175
- UNAME := $(shell uname)
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
176
65
 
177
- ifndef BUILD_DIR
178
- ifeq ($(UNAME), Darwin)
179
- HASH ?= md5
180
- else ifeq ($(UNAME), FreeBSD)
181
- HASH ?= gmd5sum
182
- else ifeq ($(UNAME), OpenBSD)
183
- HASH ?= md5
184
- endif
185
- HASH ?= md5sum
186
66
 
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
67
+ ifeq ($(findstring GCC,$(CCVER)),GCC)
68
+ decompress/zstd_decompress_block.o : CFLAGS+=-fno-tree-vectorize
192
69
  endif
193
- endif # BUILD_DIR
194
70
 
195
71
 
196
72
  # macOS linker doesn't support -soname, and use different extension
@@ -201,29 +77,31 @@ ifeq ($(UNAME), Darwin)
201
77
  SHARED_EXT_VER = $(LIBVER).$(SHARED_EXT)
202
78
  SONAME_FLAGS = -install_name $(LIBDIR)/libzstd.$(SHARED_EXT_MAJOR) -compatibility_version $(LIBVER_MAJOR) -current_version $(LIBVER)
203
79
  else
204
- SONAME_FLAGS = -Wl,-soname=libzstd.$(SHARED_EXT).$(LIBVER_MAJOR)
80
+ ifeq ($(UNAME), AIX)
81
+ SONAME_FLAGS =
82
+ else
83
+ SONAME_FLAGS = -Wl,-soname=libzstd.$(SHARED_EXT).$(LIBVER_MAJOR)
84
+ endif
205
85
  SHARED_EXT = so
206
86
  SHARED_EXT_MAJOR = $(SHARED_EXT).$(LIBVER_MAJOR)
207
87
  SHARED_EXT_VER = $(SHARED_EXT).$(LIBVER)
208
88
  endif
209
89
 
90
+
91
+ .PHONY: all
92
+ all: lib
93
+
94
+
95
+ .PHONY: libzstd.a # must be run every time
96
+ libzstd.a: CPPFLAGS += $(CPPFLAGS_STATICLIB)
97
+
210
98
  SET_CACHE_DIRECTORY = \
211
- $(MAKE) --no-print-directory $@ \
99
+ +$(MAKE) --no-print-directory $@ \
212
100
  BUILD_DIR=obj/$(HASH_DIR) \
213
101
  CPPFLAGS="$(CPPFLAGS)" \
214
102
  CFLAGS="$(CFLAGS)" \
215
103
  LDFLAGS="$(LDFLAGS)"
216
104
 
217
-
218
- .PHONY: lib-all all clean install uninstall
219
-
220
- # alias
221
- lib-all: all
222
-
223
- all: lib
224
-
225
- .PHONY: libzstd.a # must be run every time
226
-
227
105
  ifndef BUILD_DIR
228
106
  # determine BUILD_DIR from compilation flags
229
107
 
@@ -233,16 +111,19 @@ libzstd.a:
233
111
  else
234
112
  # BUILD_DIR is defined
235
113
 
236
- ZSTD_STATLIB_DIR := $(BUILD_DIR)/static
237
- ZSTD_STATLIB := $(ZSTD_STATLIB_DIR)/libzstd.a
238
- ZSTD_STATLIB_OBJ := $(addprefix $(ZSTD_STATLIB_DIR)/,$(ZSTD_LOCAL_OBJ))
239
- $(ZSTD_STATLIB): ARFLAGS = rcs
240
- $(ZSTD_STATLIB): | $(ZSTD_STATLIB_DIR)
241
- $(ZSTD_STATLIB): $(ZSTD_STATLIB_OBJ)
242
- @echo compiling static library
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))
243
124
  $(AR) $(ARFLAGS) $@ $^
244
125
 
245
- libzstd.a: $(ZSTD_STATLIB)
126
+ libzstd.a: $(ZSTD_STATICLIB)
246
127
  cp -f $< $@
247
128
 
248
129
  endif
@@ -258,8 +139,9 @@ else # not Windows
258
139
 
259
140
  LIBZSTD = libzstd.$(SHARED_EXT_VER)
260
141
  .PHONY: $(LIBZSTD) # must be run every time
261
- $(LIBZSTD): CFLAGS += -fPIC
262
- $(LIBZSTD): LDFLAGS += -shared -fvisibility=hidden
142
+ $(LIBZSTD): CPPFLAGS += $(CPPFLAGS_DYNLIB)
143
+ $(LIBZSTD): CFLAGS += -fPIC -fvisibility=hidden
144
+ $(LIBZSTD): LDFLAGS += -shared $(LDFLAGS_DYNLIB)
263
145
 
264
146
  ifndef BUILD_DIR
265
147
  # determine BUILD_DIR from compilation flags
@@ -276,7 +158,10 @@ ZSTD_DYNLIB_OBJ := $(addprefix $(ZSTD_DYNLIB_DIR)/,$(ZSTD_LOCAL_OBJ))
276
158
 
277
159
  $(ZSTD_DYNLIB): | $(ZSTD_DYNLIB_DIR)
278
160
  $(ZSTD_DYNLIB): $(ZSTD_DYNLIB_OBJ)
279
- @echo compiling dynamic library $(LIBVER)
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))
280
165
  $(CC) $(FLAGS) $^ $(LDFLAGS) $(SONAME_FLAGS) -o $@
281
166
  @echo creating versioned links
282
167
  ln -sf $@ libzstd.$(SHARED_EXT_MAJOR)
@@ -298,10 +183,17 @@ lib : libzstd.a libzstd
298
183
  # note : do not define lib-mt or lib-release as .PHONY
299
184
  # make does not consider implicit pattern rule for .PHONY target
300
185
 
301
- %-mt : CPPFLAGS += -DZSTD_MULTITHREAD
302
- %-mt : LDFLAGS += -pthread
186
+ %-mt : CPPFLAGS_DYNLIB := -DZSTD_MULTITHREAD
187
+ %-mt : CPPFLAGS_STATICLIB := -DZSTD_MULTITHREAD
188
+ %-mt : LDFLAGS_DYNLIB := -pthread
303
189
  %-mt : %
304
- @echo multi-threading build completed
190
+ @echo multi-threaded build completed
191
+
192
+ %-nomt : CPPFLAGS_DYNLIB :=
193
+ %-nomt : LDFLAGS_DYNLIB :=
194
+ %-nomt : CPPFLAGS_STATICLIB :=
195
+ %-nomt : %
196
+ @echo single-threaded build completed
305
197
 
306
198
  %-release : DEBUGFLAGS :=
307
199
  %-release : %
@@ -310,35 +202,55 @@ lib : libzstd.a libzstd
310
202
 
311
203
  # Generate .h dependencies automatically
312
204
 
313
- DEPFLAGS = -MT $@ -MMD -MP -MF
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
314
208
 
315
- $(ZSTD_DYNLIB_DIR)/%.o : %.c $(ZSTD_DYNLIB_DIR)/%.d | $(ZSTD_DYNLIB_DIR)
209
+ # ensure that ZSTD_DYNLIB_DIR exists prior to generating %.o
210
+ $(ZSTD_DYNLIB_DIR)/%.o : %.c | $(ZSTD_DYNLIB_DIR)
316
211
  @echo CC $@
317
- $(COMPILE.c) $(DEPFLAGS) $(ZSTD_DYNLIB_DIR)/$*.d $(OUTPUT_OPTION) $<
212
+ $(COMPILE.c) $(DEPFLAGS) $(OUTPUT_OPTION) $<
318
213
 
319
- $(ZSTD_STATLIB_DIR)/%.o : %.c $(ZSTD_STATLIB_DIR)/%.d | $(ZSTD_STATLIB_DIR)
214
+ $(ZSTD_STATICLIB_DIR)/%.o : %.c | $(ZSTD_STATICLIB_DIR)
320
215
  @echo CC $@
321
- $(COMPILE.c) $(DEPFLAGS) $(ZSTD_STATLIB_DIR)/$*.d $(OUTPUT_OPTION) $<
216
+ $(COMPILE.c) $(DEPFLAGS) $(OUTPUT_OPTION) $<
217
+
218
+ $(ZSTD_DYNLIB_DIR)/%.o : %.S | $(ZSTD_DYNLIB_DIR)
219
+ @echo AS $@
220
+ $(COMPILE.S) $(OUTPUT_OPTION) $<
221
+
222
+ $(ZSTD_STATICLIB_DIR)/%.o : %.S | $(ZSTD_STATICLIB_DIR)
223
+ @echo AS $@
224
+ $(COMPILE.S) $(OUTPUT_OPTION) $<
322
225
 
323
- MKDIR ?= mkdir
324
- $(BUILD_DIR) $(ZSTD_DYNLIB_DIR) $(ZSTD_STATLIB_DIR):
325
- $(MKDIR) -p $@
226
+ MKDIR ?= mkdir -p
227
+ $(BUILD_DIR) $(ZSTD_DYNLIB_DIR) $(ZSTD_STATICLIB_DIR):
228
+ $(MKDIR) $@
326
229
 
327
- DEPFILES := $(ZSTD_DYNLIB_OBJ:.o=.d) $(ZSTD_STATLIB_OBJ:.o=.d)
230
+ DEPFILES := $(ZSTD_DYNLIB_OBJ:.o=.d) $(ZSTD_STATICLIB_OBJ:.o=.d)
328
231
  $(DEPFILES):
329
232
 
330
- include $(wildcard $(DEPFILES))
233
+ # The leading '-' means: do not fail is include fails (ex: directory does not exist yet)
234
+ -include $(wildcard $(DEPFILES))
331
235
 
332
236
 
333
- # Special case : building library in single-thread mode _and_ without zstdmt_compress.c
334
- ZSTDMT_FILES = compress/zstdmt_compress.c
335
- ZSTD_NOMT_FILES = $(filter-out $(ZSTDMT_FILES),$(ZSTD_FILES))
336
- libzstd-nomt: LDFLAGS += -shared -fPIC -fvisibility=hidden
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
337
244
  libzstd-nomt: $(ZSTD_NOMT_FILES)
338
245
  @echo compiling single-thread dynamic library $(LIBVER)
339
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."; \
249
+ exit 1; \
250
+ fi
340
251
  $(CC) $(FLAGS) $^ $(LDFLAGS) $(SONAME_FLAGS) -o $@
341
252
 
253
+ .PHONY: clean
342
254
  clean:
343
255
  $(RM) -r *.dSYM # macOS-specific
344
256
  $(RM) core *.o *.a *.gcda *.$(SHARED_EXT) *.$(SHARED_EXT).* libzstd.pc
@@ -349,9 +261,9 @@ clean:
349
261
  #-----------------------------------------------------------------------------
350
262
  # make install is validated only for below listed environments
351
263
  #-----------------------------------------------------------------------------
352
- ifneq (,$(filter $(UNAME),Linux Darwin GNU/kFreeBSD GNU OpenBSD FreeBSD NetBSD DragonFly SunOS Haiku))
264
+ ifneq (,$(filter $(UNAME),Linux Darwin GNU/kFreeBSD GNU OpenBSD FreeBSD NetBSD DragonFly SunOS Haiku AIX MSYS_NT CYGWIN_NT))
353
265
 
354
- all: libzstd.pc
266
+ lib: libzstd.pc
355
267
 
356
268
  HAS_EXPLICIT_EXEC_PREFIX := $(if $(or $(EXEC_PREFIX),$(exec_prefix)),1,)
357
269
 
@@ -396,24 +308,27 @@ INSTALL_PROGRAM ?= $(INSTALL)
396
308
  INSTALL_DATA ?= $(INSTALL) -m 644
397
309
 
398
310
 
399
- libzstd.pc:
400
311
  libzstd.pc: libzstd.pc.in
401
312
  @echo creating pkgconfig
402
- @sed $(SED_ERE_OPT) \
313
+ @sed \
403
314
  -e 's|@PREFIX@|$(PREFIX)|' \
404
315
  -e 's|@EXEC_PREFIX@|$(PCEXEC_PREFIX)|' \
405
- -e 's|@INCLUDEDIR@|$(PCINCPREFIX)$(PCINCDIR)|' \
406
- -e 's|@LIBDIR@|$(PCLIBPREFIX)$(PCLIBDIR)|' \
407
- -e 's|@VERSION@|$(VERSION)|' \
408
- $< >$@
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
+ $< >$@
409
321
 
322
+ .PHONY: install
410
323
  install: install-pc install-static install-shared install-includes
411
324
  @echo zstd static and shared library installed
412
325
 
326
+ .PHONY: install-pc
413
327
  install-pc: libzstd.pc
414
328
  [ -e $(DESTDIR)$(PKGCONFIGDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(PKGCONFIGDIR)/
415
329
  $(INSTALL_DATA) libzstd.pc $(DESTDIR)$(PKGCONFIGDIR)/
416
330
 
331
+ .PHONY: install-static
417
332
  install-static:
418
333
  # only generate libzstd.a if it's not already present
419
334
  [ -e libzstd.a ] || $(MAKE) libzstd.a-release
@@ -421,6 +336,7 @@ install-static:
421
336
  @echo Installing static library
422
337
  $(INSTALL_DATA) libzstd.a $(DESTDIR)$(LIBDIR)
423
338
 
339
+ .PHONY: install-shared
424
340
  install-shared:
425
341
  # only generate libzstd.so if it's not already present
426
342
  [ -e $(LIBZSTD) ] || $(MAKE) libzstd-release
@@ -430,13 +346,15 @@ install-shared:
430
346
  ln -sf $(LIBZSTD) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT_MAJOR)
431
347
  ln -sf $(LIBZSTD) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT)
432
348
 
349
+ .PHONY: install-includes
433
350
  install-includes:
434
351
  [ -e $(DESTDIR)$(INCLUDEDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(INCLUDEDIR)/
435
352
  @echo Installing includes
436
353
  $(INSTALL_DATA) zstd.h $(DESTDIR)$(INCLUDEDIR)
437
- $(INSTALL_DATA) common/zstd_errors.h $(DESTDIR)$(INCLUDEDIR)
438
- $(INSTALL_DATA) dictBuilder/zdict.h $(DESTDIR)$(INCLUDEDIR)
354
+ $(INSTALL_DATA) zstd_errors.h $(DESTDIR)$(INCLUDEDIR)
355
+ $(INSTALL_DATA) zdict.h $(DESTDIR)$(INCLUDEDIR)
439
356
 
357
+ .PHONY: uninstall
440
358
  uninstall:
441
359
  $(RM) $(DESTDIR)$(LIBDIR)/libzstd.a
442
360
  $(RM) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT)
@@ -19,12 +19,16 @@ The scope can be reduced on demand (see paragraph _modular build_).
19
19
 
20
20
  #### Multithreading support
21
21
 
22
- Multithreading is disabled by default when building with `make`.
22
+ When building with `make`, by default the dynamic library is multithreaded and static library is single-threaded (for compatibility reasons).
23
+
23
24
  Enabling multithreading requires 2 conditions :
24
25
  - set build macro `ZSTD_MULTITHREAD` (`-DZSTD_MULTITHREAD` for `gcc`)
25
26
  - for POSIX systems : compile with pthread (`-pthread` compilation flag for `gcc`)
26
27
 
27
- Both conditions are automatically applied when invoking `make lib-mt` target.
28
+ For convenience, we provide a build target to generate multi and single threaded libraries:
29
+ - Force enable multithreading on both dynamic and static libraries by appending `-mt` to the target, e.g. `make lib-mt`.
30
+ - Force disable multithreading on both dynamic and static libraries by appending `-nomt` to the target, e.g. `make lib-nomt`.
31
+ - By default, as mentioned before, dynamic library is multithreaded, and static library is single-threaded, e.g. `make lib`.
28
32
 
29
33
  When linking a POSIX program with a multithreaded version of `libzstd`,
30
34
  note that it's necessary to invoke the `-pthread` flag during link stage.
@@ -42,8 +46,8 @@ Zstandard's stable API is exposed within [lib/zstd.h](zstd.h).
42
46
 
43
47
  Optional advanced features are exposed via :
44
48
 
45
- - `lib/common/zstd_errors.h` : translates `size_t` function results
46
- into a `ZSTD_ErrorCode`, for accurate error handling.
49
+ - `lib/zstd_errors.h` : translates `size_t` function results
50
+ into a `ZSTD_ErrorCode`, for accurate error handling.
47
51
 
48
52
  - `ZSTD_STATIC_LINKING_ONLY` : if this macro is defined _before_ including `zstd.h`,
49
53
  it unlocks access to the experimental API,
@@ -84,10 +88,10 @@ The file structure is designed to make this selection manually achievable for an
84
88
  For example, advanced API for version `v0.4` is exposed in `lib/legacy/zstd_v04.h` .
85
89
 
86
90
  - While invoking `make libzstd`, it's possible to define build macros
87
- `ZSTD_LIB_COMPRESSION, ZSTD_LIB_DECOMPRESSION`, `ZSTD_LIB_DICTBUILDER`,
91
+ `ZSTD_LIB_COMPRESSION`, `ZSTD_LIB_DECOMPRESSION`, `ZSTD_LIB_DICTBUILDER`,
88
92
  and `ZSTD_LIB_DEPRECATED` as `0` to forgo compilation of the
89
93
  corresponding features. This will also disable compilation of all
90
- dependencies (eg. `ZSTD_LIB_COMPRESSION=0` will also disable
94
+ dependencies (e.g. `ZSTD_LIB_COMPRESSION=0` will also disable
91
95
  dictBuilder).
92
96
 
93
97
  - There are a number of options that can help minimize the binary size of
@@ -115,13 +119,22 @@ The file structure is designed to make this selection manually achievable for an
115
119
  binary is achieved by using `HUF_FORCE_DECOMPRESS_X1` and
116
120
  `ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT` (implied by `ZSTD_LIB_MINIFY`).
117
121
 
122
+ On the compressor side, Zstd's compression levels map to several internal
123
+ strategies. In environments where the higher compression levels aren't used,
124
+ it is possible to exclude all but the fastest strategy with
125
+ `ZSTD_LIB_EXCLUDE_COMPRESSORS_DFAST_AND_UP=1`. (Note that this will change
126
+ the behavior of the default compression level.) Or if you want to retain the
127
+ default compressor as well, you can set
128
+ `ZSTD_LIB_EXCLUDE_COMPRESSORS_GREEDY_AND_UP=1`, at the cost of an additional
129
+ ~20KB or so.
130
+
118
131
  For squeezing the last ounce of size out, you can also define
119
132
  `ZSTD_NO_INLINE`, which disables inlining, and `ZSTD_STRIP_ERROR_STRINGS`,
120
133
  which removes the error messages that are otherwise returned by
121
134
  `ZSTD_getErrorName` (implied by `ZSTD_LIB_MINIFY`).
122
135
 
123
136
  Finally, when integrating into your application, make sure you're doing link-
124
- time optimation and unused symbol garbage collection (via some combination of,
137
+ time optimization and unused symbol garbage collection (via some combination of,
125
138
  e.g., `-flto`, `-ffat-lto-objects`, `-fuse-linker-plugin`,
126
139
  `-ffunction-sections`, `-fdata-sections`, `-fmerge-all-constants`,
127
140
  `-Wl,--gc-sections`, `-Wl,-z,norelro`, and an archiver that understands
@@ -151,6 +164,23 @@ The file structure is designed to make this selection manually achievable for an
151
164
  - The build macro `ZSTD_NO_INTRINSICS` can be defined to disable all explicit intrinsics.
152
165
  Compiler builtins are still used.
153
166
 
167
+ - The build macro `ZSTD_DECODER_INTERNAL_BUFFER` can be set to control
168
+ the amount of extra memory used during decompression to store literals.
169
+ This defaults to 64kB. Reducing this value reduces the memory footprint of
170
+ `ZSTD_DCtx` decompression contexts,
171
+ but might also result in a small decompression speed cost.
172
+
173
+ - The C compiler macros `ZSTDLIB_VISIBLE`, `ZSTDERRORLIB_VISIBLE` and `ZDICTLIB_VISIBLE`
174
+ can be overridden to control the visibility of zstd's API. Additionally,
175
+ `ZSTDLIB_STATIC_API` and `ZDICTLIB_STATIC_API` can be overridden to control the visibility
176
+ of zstd's static API. Specifically, it can be set to `ZSTDLIB_HIDDEN` to hide the symbols
177
+ from the shared library. These macros default to `ZSTDLIB_VISIBILITY`,
178
+ `ZSTDERRORLIB_VSIBILITY`, and `ZDICTLIB_VISIBILITY` if unset, for backwards compatibility
179
+ with the old macro names.
180
+
181
+ - The C compiler macro `HUF_DISABLE_FAST_DECODE` disables the newer Huffman fast C
182
+ and assembly decoding loops. You may want to use this macro if these loops are
183
+ slower on your platform.
154
184
 
155
185
  #### Windows : using MinGW+MSYS to create DLL
156
186
 
@@ -0,0 +1,55 @@
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
+
11
+ /* This file provides custom allocation primitives
12
+ */
13
+
14
+ #define ZSTD_DEPS_NEED_MALLOC
15
+ #include "zstd_deps.h" /* ZSTD_malloc, ZSTD_calloc, ZSTD_free, ZSTD_memset */
16
+
17
+ #include "compiler.h" /* MEM_STATIC */
18
+ #define ZSTD_STATIC_LINKING_ONLY
19
+ #include "../zstd.h" /* ZSTD_customMem */
20
+
21
+ #ifndef ZSTD_ALLOCATIONS_H
22
+ #define ZSTD_ALLOCATIONS_H
23
+
24
+ /* custom memory allocation functions */
25
+
26
+ MEM_STATIC void* ZSTD_customMalloc(size_t size, ZSTD_customMem customMem)
27
+ {
28
+ if (customMem.customAlloc)
29
+ return customMem.customAlloc(customMem.opaque, size);
30
+ return ZSTD_malloc(size);
31
+ }
32
+
33
+ MEM_STATIC void* ZSTD_customCalloc(size_t size, ZSTD_customMem customMem)
34
+ {
35
+ if (customMem.customAlloc) {
36
+ /* calloc implemented as malloc+memset;
37
+ * not as efficient as calloc, but next best guess for custom malloc */
38
+ void* const ptr = customMem.customAlloc(customMem.opaque, size);
39
+ ZSTD_memset(ptr, 0, size);
40
+ return ptr;
41
+ }
42
+ return ZSTD_calloc(1, size);
43
+ }
44
+
45
+ MEM_STATIC void ZSTD_customFree(void* ptr, ZSTD_customMem customMem)
46
+ {
47
+ if (ptr!=NULL) {
48
+ if (customMem.customFree)
49
+ customMem.customFree(customMem.opaque, ptr);
50
+ else
51
+ ZSTD_free(ptr);
52
+ }
53
+ }
54
+
55
+ #endif /* ZSTD_ALLOCATIONS_H */