| inikep | 6416b0d | 2016-08-29 13:04:26 +0200 | [diff] [blame] | 1 | Zstandard library files |
| Yann Collet | d56a419 | 2016-02-17 17:47:29 +0100 | [diff] [blame] | 2 | ================================ |
| 3 | |
| Yann Collet | 36374cc | 2017-09-06 16:15:18 -0700 | [diff] [blame] | 4 | The __lib__ directory is split into several sub-directories, |
| Yann Collet | 2eff217 | 2017-12-31 15:50:00 +0100 | [diff] [blame] | 5 | in order to make it easier to select or exclude features. |
| Yann Collet | 36374cc | 2017-09-06 16:15:18 -0700 | [diff] [blame] | 6 | |
| 7 | |
| 8 | #### Building |
| 9 | |
| Yann Collet | 0fb4b21 | 2018-12-25 03:10:07 -0800 | [diff] [blame] | 10 | `Makefile` script is provided, supporting [Makefile conventions](https://www.gnu.org/prep/standards/html_node/Makefile-Conventions.html#Makefile-Conventions), |
| Yann Collet | 2eff217 | 2017-12-31 15:50:00 +0100 | [diff] [blame] | 11 | including commands variables, staged install, directory variables and standard targets. |
| Yann Collet | 36374cc | 2017-09-06 16:15:18 -0700 | [diff] [blame] | 12 | - `make` : generates both static and dynamic libraries |
| Yann Collet | 0fb4b21 | 2018-12-25 03:10:07 -0800 | [diff] [blame] | 13 | - `make install` : install libraries and headers in target system directories |
| inikep | a8138fd | 2016-04-25 11:36:44 +0200 | [diff] [blame] | 14 | |
| Yann Collet | 0fb4b21 | 2018-12-25 03:10:07 -0800 | [diff] [blame] | 15 | `libzstd` default scope is pretty large, including compression, decompression, dictionary builder, |
| 16 | and support for decoding legacy formats >= v0.5.0. |
| 17 | The scope can be reduced on demand (see paragraph _modular build_). |
| 18 | |
| 19 | |
| 20 | #### Multithreading support |
| 21 | |
| sen | 91465e2 | 2021-05-07 11:13:30 -0400 | [diff] [blame^] | 22 | When building with `make`, by default the dynamic library is multithreaded and static library is single-threaded (for compatibility reasons). |
| 23 | |
| Yann Collet | 0fb4b21 | 2018-12-25 03:10:07 -0800 | [diff] [blame] | 24 | Enabling multithreading requires 2 conditions : |
| 25 | - set build macro `ZSTD_MULTITHREAD` (`-DZSTD_MULTITHREAD` for `gcc`) |
| 26 | - for POSIX systems : compile with pthread (`-pthread` compilation flag for `gcc`) |
| 27 | |
| sen | 91465e2 | 2021-05-07 11:13:30 -0400 | [diff] [blame^] | 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`. |
| Yann Collet | 0fb4b21 | 2018-12-25 03:10:07 -0800 | [diff] [blame] | 32 | |
| 33 | When linking a POSIX program with a multithreaded version of `libzstd`, |
| Yann Collet | f966cd0 | 2019-10-22 17:43:09 -0700 | [diff] [blame] | 34 | note that it's necessary to invoke the `-pthread` flag during link stage. |
| Yann Collet | 0fb4b21 | 2018-12-25 03:10:07 -0800 | [diff] [blame] | 35 | |
| 36 | Multithreading capabilities are exposed |
| Yann Collet | f966cd0 | 2019-10-22 17:43:09 -0700 | [diff] [blame] | 37 | via the [advanced API defined in `lib/zstd.h`](https://github.com/facebook/zstd/blob/v1.4.3/lib/zstd.h#L351). |
| Yann Collet | 2eff217 | 2017-12-31 15:50:00 +0100 | [diff] [blame] | 38 | |
| Yann Collet | d56a419 | 2016-02-17 17:47:29 +0100 | [diff] [blame] | 39 | |
| Yann Collet | 85f3919 | 2016-07-17 20:42:21 +0200 | [diff] [blame] | 40 | #### API |
| inikep | 4979431 | 2016-04-25 11:31:28 +0200 | [diff] [blame] | 41 | |
| Yann Collet | 36374cc | 2017-09-06 16:15:18 -0700 | [diff] [blame] | 42 | Zstandard's stable API is exposed within [lib/zstd.h](zstd.h). |
| inikep | 4979431 | 2016-04-25 11:31:28 +0200 | [diff] [blame] | 43 | |
| Yann Collet | dcc000f | 2016-03-10 01:09:41 +0100 | [diff] [blame] | 44 | |
| Yann Collet | 85f3919 | 2016-07-17 20:42:21 +0200 | [diff] [blame] | 45 | #### Advanced API |
| Yann Collet | d56a419 | 2016-02-17 17:47:29 +0100 | [diff] [blame] | 46 | |
| Yann Collet | 36374cc | 2017-09-06 16:15:18 -0700 | [diff] [blame] | 47 | Optional advanced features are exposed via : |
| 48 | |
| Nick Terrell | 09149be | 2021-04-30 15:02:12 -0700 | [diff] [blame] | 49 | - `lib/zstd_errors.h` : translates `size_t` function results |
| 50 | into a `ZSTD_ErrorCode`, for accurate error handling. |
| Yann Collet | 0fb4b21 | 2018-12-25 03:10:07 -0800 | [diff] [blame] | 51 | |
| Yann Collet | 36374cc | 2017-09-06 16:15:18 -0700 | [diff] [blame] | 52 | - `ZSTD_STATIC_LINKING_ONLY` : if this macro is defined _before_ including `zstd.h`, |
| Yann Collet | 0fb4b21 | 2018-12-25 03:10:07 -0800 | [diff] [blame] | 53 | it unlocks access to the experimental API, |
| 54 | exposed in the second part of `zstd.h`. |
| 55 | All definitions in the experimental APIs are unstable, |
| 56 | they may still change in the future, or even be removed. |
| 57 | As a consequence, experimental definitions shall ___never be used with dynamic library___ ! |
| Yann Collet | 85f3919 | 2016-07-17 20:42:21 +0200 | [diff] [blame] | 58 | Only static linking is allowed. |
| Yann Collet | d56a419 | 2016-02-17 17:47:29 +0100 | [diff] [blame] | 59 | |
| Yann Collet | 26f6814 | 2016-07-08 10:42:59 +0200 | [diff] [blame] | 60 | |
| Yann Collet | 85f3919 | 2016-07-17 20:42:21 +0200 | [diff] [blame] | 61 | #### Modular build |
| Yann Collet | d56a419 | 2016-02-17 17:47:29 +0100 | [diff] [blame] | 62 | |
| Yann Collet | 0fb4b21 | 2018-12-25 03:10:07 -0800 | [diff] [blame] | 63 | It's possible to compile only a limited set of features within `libzstd`. |
| 64 | The file structure is designed to make this selection manually achievable for any build system : |
| Yann Collet | 2eff217 | 2017-12-31 15:50:00 +0100 | [diff] [blame] | 65 | |
| Yann Collet | 36374cc | 2017-09-06 16:15:18 -0700 | [diff] [blame] | 66 | - Directory `lib/common` is always required, for all variants. |
| Yann Collet | 0fb4b21 | 2018-12-25 03:10:07 -0800 | [diff] [blame] | 67 | |
| Yann Collet | 36374cc | 2017-09-06 16:15:18 -0700 | [diff] [blame] | 68 | - Compression source code lies in `lib/compress` |
| Yann Collet | 0fb4b21 | 2018-12-25 03:10:07 -0800 | [diff] [blame] | 69 | |
| Yann Collet | 36374cc | 2017-09-06 16:15:18 -0700 | [diff] [blame] | 70 | - Decompression source code lies in `lib/decompress` |
| Yann Collet | 0fb4b21 | 2018-12-25 03:10:07 -0800 | [diff] [blame] | 71 | |
| Yann Collet | 36374cc | 2017-09-06 16:15:18 -0700 | [diff] [blame] | 72 | - It's possible to include only `compress` or only `decompress`, they don't depend on each other. |
| Yann Collet | 0fb4b21 | 2018-12-25 03:10:07 -0800 | [diff] [blame] | 73 | |
| Yann Collet | 36374cc | 2017-09-06 16:15:18 -0700 | [diff] [blame] | 74 | - `lib/dictBuilder` : makes it possible to generate dictionaries from a set of samples. |
| Yann Collet | 2eff217 | 2017-12-31 15:50:00 +0100 | [diff] [blame] | 75 | The API is exposed in `lib/dictBuilder/zdict.h`. |
| 76 | This module depends on both `lib/common` and `lib/compress` . |
| Yann Collet | 0fb4b21 | 2018-12-25 03:10:07 -0800 | [diff] [blame] | 77 | |
| 78 | - `lib/legacy` : makes it possible to decompress legacy zstd formats, starting from `v0.1.0`. |
| Yann Collet | 2eff217 | 2017-12-31 15:50:00 +0100 | [diff] [blame] | 79 | This module depends on `lib/common` and `lib/decompress`. |
| Yann Collet | b293916 | 2018-09-20 14:24:23 -0700 | [diff] [blame] | 80 | To enable this feature, define `ZSTD_LEGACY_SUPPORT` during compilation. |
| 81 | Specifying a number limits versions supported to that version onward. |
| Yann Collet | 2eff217 | 2017-12-31 15:50:00 +0100 | [diff] [blame] | 82 | For example, `ZSTD_LEGACY_SUPPORT=2` means : "support legacy formats >= v0.2.0". |
| Yann Collet | 0fb4b21 | 2018-12-25 03:10:07 -0800 | [diff] [blame] | 83 | Conversely, `ZSTD_LEGACY_SUPPORT=0` means "do __not__ support legacy formats". |
| 84 | By default, this build macro is set as `ZSTD_LEGACY_SUPPORT=5`. |
| 85 | Decoding supported legacy format is a transparent capability triggered within decompression functions. |
| 86 | It's also allowed to invoke legacy API directly, exposed in `lib/legacy/zstd_legacy.h`. |
| 87 | Each version does also provide its own set of advanced API. |
| Yann Collet | 2eff217 | 2017-12-31 15:50:00 +0100 | [diff] [blame] | 88 | For example, advanced API for version `v0.4` is exposed in `lib/legacy/zstd_v04.h` . |
| Yann Collet | 0fb4b21 | 2018-12-25 03:10:07 -0800 | [diff] [blame] | 89 | |
| 90 | - While invoking `make libzstd`, it's possible to define build macros |
| 91 | `ZSTD_LIB_COMPRESSION, ZSTD_LIB_DECOMPRESSION`, `ZSTD_LIB_DICTBUILDER`, |
| W. Felix Handte | fa5e01c | 2020-01-27 17:14:08 -0500 | [diff] [blame] | 92 | and `ZSTD_LIB_DEPRECATED` as `0` to forgo compilation of the |
| 93 | corresponding features. This will also disable compilation of all |
| 94 | dependencies (eg. `ZSTD_LIB_COMPRESSION=0` will also disable |
| 95 | dictBuilder). |
| Yann Collet | 0fb4b21 | 2018-12-25 03:10:07 -0800 | [diff] [blame] | 96 | |
| W. Felix Handte | fa5e01c | 2020-01-27 17:14:08 -0500 | [diff] [blame] | 97 | - There are a number of options that can help minimize the binary size of |
| 98 | `libzstd`. |
| W. Felix Handte | ece2c18 | 2018-12-06 10:32:36 -0800 | [diff] [blame] | 99 | |
| W. Felix Handte | fa5e01c | 2020-01-27 17:14:08 -0500 | [diff] [blame] | 100 | The first step is to select the components needed (using the above-described |
| 101 | `ZSTD_LIB_COMPRESSION` etc.). |
| 102 | |
| 103 | The next step is to set `ZSTD_LIB_MINIFY` to `1` when invoking `make`. This |
| 104 | disables various optional components and changes the compilation flags to |
| 105 | prioritize space-saving. |
| 106 | |
| 107 | Detailed options: Zstandard's code and build environment is set up by default |
| 108 | to optimize above all else for performance. In pursuit of this goal, Zstandard |
| 109 | makes significant trade-offs in code size. For example, Zstandard often has |
| 110 | more than one implementation of a particular component, with each |
| 111 | implementation optimized for different scenarios. For example, the Huffman |
| 112 | decoder has complementary implementations that decode the stream one symbol at |
| 113 | a time or two symbols at a time. Zstd normally includes both (and dispatches |
| 114 | between them at runtime), but by defining `HUF_FORCE_DECOMPRESS_X1` or |
| 115 | `HUF_FORCE_DECOMPRESS_X2`, you can force the use of one or the other, avoiding |
| W. Felix Handte | ece2c18 | 2018-12-06 10:32:36 -0800 | [diff] [blame] | 116 | compilation of the other. Similarly, `ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT` |
| 117 | and `ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG` force the compilation and use of |
| 118 | only one or the other of two decompression implementations. The smallest |
| 119 | binary is achieved by using `HUF_FORCE_DECOMPRESS_X1` and |
| W. Felix Handte | fa5e01c | 2020-01-27 17:14:08 -0500 | [diff] [blame] | 120 | `ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT` (implied by `ZSTD_LIB_MINIFY`). |
| W. Felix Handte | ece2c18 | 2018-12-06 10:32:36 -0800 | [diff] [blame] | 121 | |
| 122 | For squeezing the last ounce of size out, you can also define |
| 123 | `ZSTD_NO_INLINE`, which disables inlining, and `ZSTD_STRIP_ERROR_STRINGS`, |
| 124 | which removes the error messages that are otherwise returned by |
| W. Felix Handte | fa5e01c | 2020-01-27 17:14:08 -0500 | [diff] [blame] | 125 | `ZSTD_getErrorName` (implied by `ZSTD_LIB_MINIFY`). |
| 126 | |
| 127 | Finally, when integrating into your application, make sure you're doing link- |
| 128 | time optimation and unused symbol garbage collection (via some combination of, |
| 129 | e.g., `-flto`, `-ffat-lto-objects`, `-fuse-linker-plugin`, |
| 130 | `-ffunction-sections`, `-fdata-sections`, `-fmerge-all-constants`, |
| 131 | `-Wl,--gc-sections`, `-Wl,-z,norelro`, and an archiver that understands |
| 132 | the compiler's intermediate representation, e.g., `AR=gcc-ar`). Consult your |
| 133 | compiler's documentation. |
| Yann Collet | d56a419 | 2016-02-17 17:47:29 +0100 | [diff] [blame] | 134 | |
| Nick Terrell | 641e594 | 2019-04-07 18:47:52 -0700 | [diff] [blame] | 135 | - While invoking `make libzstd`, the build macro `ZSTD_LEGACY_MULTITHREADED_API=1` |
| Nick Terrell | 947548c | 2019-04-08 16:50:18 -0700 | [diff] [blame] | 136 | will expose the deprecated `ZSTDMT` API exposed by `zstdmt_compress.h` in |
| Nick Terrell | 641e594 | 2019-04-07 18:47:52 -0700 | [diff] [blame] | 137 | the shared library, which is now hidden by default. |
| 138 | |
| Yann Collet | f966cd0 | 2019-10-22 17:43:09 -0700 | [diff] [blame] | 139 | - The build macro `DYNAMIC_BMI2` can be set to 1 or 0 in order to generate binaries |
| 140 | which can detect at runtime the presence of BMI2 instructions, and use them only if present. |
| 141 | These instructions contribute to better performance, notably on the decoder side. |
| 142 | By default, this feature is automatically enabled on detecting |
| 143 | the right instruction set (x64) and compiler (clang or gcc >= 5). |
| 144 | It's obviously disabled for different cpus, |
| 145 | or when BMI2 instruction set is _required_ by the compiler command line |
| 146 | (in this case, only the BMI2 code path is generated). |
| 147 | Setting this macro will either force to generate the BMI2 dispatcher (1) |
| 148 | or prevent it (0). It overrides automatic detection. |
| 149 | |
| Nick Terrell | b92569a | 2020-09-09 17:13:16 -0700 | [diff] [blame] | 150 | - The build macro `ZSTD_NO_UNUSED_FUNCTIONS` can be defined to hide the definitions of functions |
| 151 | that zstd does not use. Not all unused functions are hidden, but they can be if needed. |
| 152 | Currently, this macro will hide function definitions in FSE and HUF that use an excessive |
| 153 | amount of stack space. |
| 154 | |
| 155 | - The build macro `ZSTD_NO_INTRINSICS` can be defined to disable all explicit intrinsics. |
| 156 | Compiler builtins are still used. |
| 157 | |
| Yann Collet | 26f6814 | 2016-07-08 10:42:59 +0200 | [diff] [blame] | 158 | |
| Yann Collet | 36374cc | 2017-09-06 16:15:18 -0700 | [diff] [blame] | 159 | #### Windows : using MinGW+MSYS to create DLL |
| Przemyslaw Skibinski | 62d19a6 | 2016-11-21 14:22:08 +0100 | [diff] [blame] | 160 | |
| 161 | DLL can be created using MinGW+MSYS with the `make libzstd` command. |
| 162 | This command creates `dll\libzstd.dll` and the import library `dll\libzstd.lib`. |
| 163 | The import library is only required with Visual C++. |
| 164 | The header file `zstd.h` and the dynamic library `dll\libzstd.dll` are required to |
| 165 | compile a project using gcc/MinGW. |
| 166 | The dynamic library has to be added to linking options. |
| 167 | It means that if a project that uses ZSTD consists of a single `test-dll.c` |
| 168 | file it should be linked with `dll\libzstd.dll`. For example: |
| 169 | ``` |
| 170 | gcc $(CFLAGS) -Iinclude/ test-dll.c -o test-dll dll\libzstd.dll |
| 171 | ``` |
| Yann Collet | 825dffb | 2016-12-05 19:28:19 -0800 | [diff] [blame] | 172 | The compiled executable will require ZSTD DLL which is available at `dll\libzstd.dll`. |
| Przemyslaw Skibinski | 62d19a6 | 2016-11-21 14:22:08 +0100 | [diff] [blame] | 173 | |
| 174 | |
| Yann Collet | ce6cd07 | 2020-10-22 12:31:23 -0700 | [diff] [blame] | 175 | #### Advanced Build options |
| 176 | |
| 177 | The build system requires a hash function in order to |
| 178 | separate object files created with different compilation flags. |
| 179 | By default, it tries to use `md5sum` or equivalent. |
| 180 | The hash function can be manually switched by setting the `HASH` variable. |
| 181 | For example : `make HASH=xxhsum` |
| 182 | The hash function needs to generate at least 64-bit using hexadecimal format. |
| 183 | When no hash function is found, |
| 184 | the Makefile just generates all object files into the same default directory, |
| 185 | irrespective of compilation flags. |
| 186 | This functionality only matters if `libzstd` is compiled multiple times |
| 187 | with different build flags. |
| 188 | |
| 189 | The build directory, where object files are stored |
| 190 | can also be manually controlled using variable `BUILD_DIR`, |
| 191 | for example `make BUILD_DIR=objectDir/v1`. |
| 192 | In which case, the hash function doesn't matter. |
| 193 | |
| 194 | |
| Yann Collet | 36374cc | 2017-09-06 16:15:18 -0700 | [diff] [blame] | 195 | #### Deprecated API |
| Yann Collet | 26f6814 | 2016-07-08 10:42:59 +0200 | [diff] [blame] | 196 | |
| Yann Collet | 36374cc | 2017-09-06 16:15:18 -0700 | [diff] [blame] | 197 | Obsolete API on their way out are stored in directory `lib/deprecated`. |
| 198 | At this stage, it contains older streaming prototypes, in `lib/deprecated/zbuff.h`. |
| Yann Collet | 36374cc | 2017-09-06 16:15:18 -0700 | [diff] [blame] | 199 | These prototypes will be removed in some future version. |
| 200 | Consider migrating code towards supported streaming API exposed in `zstd.h`. |
| Yann Collet | 26f6814 | 2016-07-08 10:42:59 +0200 | [diff] [blame] | 201 | |
| Yann Collet | d56a419 | 2016-02-17 17:47:29 +0100 | [diff] [blame] | 202 | |
| 203 | #### Miscellaneous |
| 204 | |
| 205 | The other files are not source code. There are : |
| 206 | |
| Yann Collet | 1c7b914 | 2017-09-06 16:23:39 -0700 | [diff] [blame] | 207 | - `BUCK` : support for `buck` build system (https://buckbuild.com/) |
| Yann Collet | 0fb4b21 | 2018-12-25 03:10:07 -0800 | [diff] [blame] | 208 | - `Makefile` : `make` script to build and install zstd library (static and dynamic) |
| Yann Collet | 36374cc | 2017-09-06 16:15:18 -0700 | [diff] [blame] | 209 | - `README.md` : this file |
| Yann Collet | 0fb4b21 | 2018-12-25 03:10:07 -0800 | [diff] [blame] | 210 | - `dll/` : resources directory for Windows compilation |
| 211 | - `libzstd.pc.in` : script for `pkg-config` (used in `make install`) |