648db22b |
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 | |
f535537f |
11 | # This included Makefile provides the following variables : |
12 | # LIB_SRCDIR, LIB_BINDIR |
13 | |
14 | # Ensure the file is not included twice |
15 | # Note : must be included after setting the default target |
16 | ifndef LIBZSTD_MK_INCLUDED |
17 | LIBZSTD_MK_INCLUDED := 1 |
18 | |
648db22b |
19 | ################################################################## |
20 | # Input Variables |
21 | ################################################################## |
22 | |
f535537f |
23 | # By default, library's directory is same as this included makefile |
24 | LIB_SRCDIR ?= $(dir $(realpath $(lastword $(MAKEFILE_LIST)))) |
25 | LIB_BINDIR ?= $(LIBSRC_DIR) |
648db22b |
26 | |
27 | # ZSTD_LIB_MINIFY is a helper variable that |
28 | # configures a bunch of other variables to space-optimized defaults. |
29 | ZSTD_LIB_MINIFY ?= 0 |
30 | |
31 | # Legacy support |
32 | ifneq ($(ZSTD_LIB_MINIFY), 0) |
33 | ZSTD_LEGACY_SUPPORT ?= 0 |
34 | else |
35 | ZSTD_LEGACY_SUPPORT ?= 5 |
36 | endif |
37 | ZSTD_LEGACY_MULTITHREADED_API ?= 0 |
38 | |
39 | # Build size optimizations |
40 | ifneq ($(ZSTD_LIB_MINIFY), 0) |
41 | HUF_FORCE_DECOMPRESS_X1 ?= 1 |
42 | HUF_FORCE_DECOMPRESS_X2 ?= 0 |
43 | ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT ?= 1 |
44 | ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG ?= 0 |
45 | ZSTD_NO_INLINE ?= 1 |
46 | ZSTD_STRIP_ERROR_STRINGS ?= 1 |
47 | else |
48 | HUF_FORCE_DECOMPRESS_X1 ?= 0 |
49 | HUF_FORCE_DECOMPRESS_X2 ?= 0 |
50 | ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT ?= 0 |
51 | ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG ?= 0 |
52 | ZSTD_NO_INLINE ?= 0 |
53 | ZSTD_STRIP_ERROR_STRINGS ?= 0 |
54 | endif |
55 | |
56 | # Assembly support |
57 | ZSTD_NO_ASM ?= 0 |
58 | |
f535537f |
59 | ZSTD_LIB_EXCLUDE_COMPRESSORS_DFAST_AND_UP ?= 0 |
60 | ZSTD_LIB_EXCLUDE_COMPRESSORS_GREEDY_AND_UP ?= 0 |
61 | |
648db22b |
62 | ################################################################## |
63 | # libzstd helpers |
64 | ################################################################## |
65 | |
66 | VOID ?= /dev/null |
67 | |
68 | # Make 4.3 doesn't support '\#' anymore (https://lwn.net/Articles/810071/) |
69 | NUM_SYMBOL := \# |
70 | |
71 | # define silent mode as default (verbose mode with V=1 or VERBOSE=1) |
f535537f |
72 | # Note : must be defined _after_ the default target |
648db22b |
73 | $(V)$(VERBOSE).SILENT: |
74 | |
75 | # When cross-compiling from linux to windows, |
76 | # one might need to specify TARGET_SYSTEM as "Windows." |
77 | # Building from Fedora fails without it. |
78 | # (but Ubuntu and Debian don't need to set anything) |
79 | TARGET_SYSTEM ?= $(OS) |
80 | |
81 | # Version numbers |
f535537f |
82 | LIBVER_SRC := $(LIB_SRCDIR)/zstd.h |
648db22b |
83 | LIBVER_MAJOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MAJOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < $(LIBVER_SRC)` |
84 | LIBVER_MINOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MINOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < $(LIBVER_SRC)` |
85 | LIBVER_PATCH_SCRIPT:=`sed -n '/define ZSTD_VERSION_RELEASE/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < $(LIBVER_SRC)` |
86 | LIBVER_SCRIPT:= $(LIBVER_MAJOR_SCRIPT).$(LIBVER_MINOR_SCRIPT).$(LIBVER_PATCH_SCRIPT) |
87 | LIBVER_MAJOR := $(shell echo $(LIBVER_MAJOR_SCRIPT)) |
88 | LIBVER_MINOR := $(shell echo $(LIBVER_MINOR_SCRIPT)) |
89 | LIBVER_PATCH := $(shell echo $(LIBVER_PATCH_SCRIPT)) |
90 | LIBVER := $(shell echo $(LIBVER_SCRIPT)) |
91 | CCVER := $(shell $(CC) --version) |
92 | ZSTD_VERSION?= $(LIBVER) |
93 | |
94 | ifneq ($(ZSTD_LIB_MINIFY), 0) |
95 | HAVE_CC_OZ ?= $(shell echo "" | $(CC) -Oz -x c -c - -o /dev/null 2> /dev/null && echo 1 || echo 0) |
96 | ifneq ($(HAVE_CC_OZ), 0) |
97 | # Some compilers (clang) support an even more space-optimized setting. |
98 | CFLAGS += -Oz |
99 | else |
100 | CFLAGS += -Os |
101 | endif |
102 | CFLAGS += -fno-stack-protector -fomit-frame-pointer -fno-ident \ |
103 | -DDYNAMIC_BMI2=0 -DNDEBUG |
104 | else |
105 | CFLAGS ?= -O3 |
106 | endif |
107 | |
108 | DEBUGLEVEL ?= 0 |
109 | CPPFLAGS += -DXXH_NAMESPACE=ZSTD_ -DDEBUGLEVEL=$(DEBUGLEVEL) |
110 | ifeq ($(TARGET_SYSTEM),Windows_NT) # MinGW assumed |
111 | CPPFLAGS += -D__USE_MINGW_ANSI_STDIO # compatibility with %zu formatting |
112 | endif |
113 | DEBUGFLAGS= -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow \ |
114 | -Wstrict-aliasing=1 -Wswitch-enum -Wdeclaration-after-statement \ |
115 | -Wstrict-prototypes -Wundef -Wpointer-arith \ |
116 | -Wvla -Wformat=2 -Winit-self -Wfloat-equal -Wwrite-strings \ |
117 | -Wredundant-decls -Wmissing-prototypes -Wc++-compat |
118 | CFLAGS += $(DEBUGFLAGS) $(MOREFLAGS) |
119 | ASFLAGS += $(DEBUGFLAGS) $(MOREFLAGS) $(CFLAGS) |
120 | LDFLAGS += $(MOREFLAGS) |
121 | FLAGS = $(CPPFLAGS) $(CFLAGS) $(ASFLAGS) $(LDFLAGS) |
122 | |
123 | ifndef ALREADY_APPENDED_NOEXECSTACK |
124 | export ALREADY_APPENDED_NOEXECSTACK := 1 |
125 | ifeq ($(shell echo "int main(int argc, char* argv[]) { (void)argc; (void)argv; return 0; }" | $(CC) $(FLAGS) -z noexecstack -x c -Werror - -o $(VOID) 2>$(VOID) && echo 1 || echo 0),1) |
126 | LDFLAGS += -z noexecstack |
127 | endif |
128 | ifeq ($(shell echo | $(CC) $(FLAGS) -Wa,--noexecstack -x assembler -Werror -c - -o $(VOID) 2>$(VOID) && echo 1 || echo 0),1) |
129 | CFLAGS += -Wa,--noexecstack |
130 | # CFLAGS are also added to ASFLAGS |
131 | else ifeq ($(shell echo | $(CC) $(FLAGS) -Qunused-arguments -Wa,--noexecstack -x assembler -Werror -c - -o $(VOID) 2>$(VOID) && echo 1 || echo 0),1) |
132 | # See e.g.: https://github.com/android/ndk/issues/171 |
133 | CFLAGS += -Qunused-arguments -Wa,--noexecstack |
134 | # CFLAGS are also added to ASFLAGS |
135 | endif |
136 | endif |
137 | |
138 | ifeq ($(shell echo "int main(int argc, char* argv[]) { (void)argc; (void)argv; return 0; }" | $(CC) $(FLAGS) -z cet-report=error -x c -Werror - -o $(VOID) 2>$(VOID) && echo 1 || echo 0),1) |
139 | LDFLAGS += -z cet-report=error |
140 | endif |
141 | |
142 | HAVE_COLORNEVER = $(shell echo a | grep --color=never a > /dev/null 2> /dev/null && echo 1 || echo 0) |
143 | GREP_OPTIONS ?= |
144 | ifeq ($(HAVE_COLORNEVER), 1) |
145 | GREP_OPTIONS += --color=never |
146 | endif |
147 | GREP = grep $(GREP_OPTIONS) |
148 | |
f535537f |
149 | ZSTD_COMMON_FILES := $(sort $(wildcard $(LIB_SRCDIR)/common/*.c)) |
150 | ZSTD_COMPRESS_FILES := $(sort $(wildcard $(LIB_SRCDIR)/compress/*.c)) |
151 | ZSTD_DECOMPRESS_FILES := $(sort $(wildcard $(LIB_SRCDIR)/decompress/*.c)) |
152 | ZSTD_DICTBUILDER_FILES := $(sort $(wildcard $(LIB_SRCDIR)/dictBuilder/*.c)) |
153 | ZSTD_DEPRECATED_FILES := $(sort $(wildcard $(LIB_SRCDIR)/deprecated/*.c)) |
648db22b |
154 | ZSTD_LEGACY_FILES := |
155 | |
f535537f |
156 | ZSTD_DECOMPRESS_AMD64_ASM_FILES := $(sort $(wildcard $(LIB_SRCDIR)/decompress/*_amd64.S)) |
648db22b |
157 | |
158 | ifneq ($(ZSTD_NO_ASM), 0) |
159 | CPPFLAGS += -DZSTD_DISABLE_ASM |
160 | else |
161 | # Unconditionally add the ASM files they are disabled by |
162 | # macros in the .S file. |
163 | ZSTD_DECOMPRESS_FILES += $(ZSTD_DECOMPRESS_AMD64_ASM_FILES) |
164 | endif |
165 | |
166 | ifneq ($(HUF_FORCE_DECOMPRESS_X1), 0) |
167 | CFLAGS += -DHUF_FORCE_DECOMPRESS_X1 |
168 | endif |
169 | |
170 | ifneq ($(HUF_FORCE_DECOMPRESS_X2), 0) |
171 | CFLAGS += -DHUF_FORCE_DECOMPRESS_X2 |
172 | endif |
173 | |
174 | ifneq ($(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT), 0) |
175 | CFLAGS += -DZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT |
176 | endif |
177 | |
178 | ifneq ($(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG), 0) |
179 | CFLAGS += -DZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG |
180 | endif |
181 | |
182 | ifneq ($(ZSTD_NO_INLINE), 0) |
183 | CFLAGS += -DZSTD_NO_INLINE |
184 | endif |
185 | |
186 | ifneq ($(ZSTD_STRIP_ERROR_STRINGS), 0) |
187 | CFLAGS += -DZSTD_STRIP_ERROR_STRINGS |
188 | endif |
189 | |
190 | ifneq ($(ZSTD_LEGACY_MULTITHREADED_API), 0) |
191 | CFLAGS += -DZSTD_LEGACY_MULTITHREADED_API |
192 | endif |
193 | |
f535537f |
194 | ifneq ($(ZSTD_LIB_EXCLUDE_COMPRESSORS_DFAST_AND_UP), 0) |
195 | CFLAGS += -DZSTD_EXCLUDE_DFAST_BLOCK_COMPRESSOR -DZSTD_EXCLUDE_GREEDY_BLOCK_COMPRESSOR -DZSTD_EXCLUDE_LAZY2_BLOCK_COMPRESSOR -DZSTD_EXCLUDE_BTLAZY2_BLOCK_COMPRESSOR -DZSTD_EXCLUDE_BTOPT_BLOCK_COMPRESSOR -DZSTD_EXCLUDE_BTULTRA_BLOCK_COMPRESSOR |
196 | else |
197 | ifneq ($(ZSTD_LIB_EXCLUDE_COMPRESSORS_GREEDY_AND_UP), 0) |
198 | CFLAGS += -DZSTD_EXCLUDE_GREEDY_BLOCK_COMPRESSOR -DZSTD_EXCLUDE_LAZY2_BLOCK_COMPRESSOR -DZSTD_EXCLUDE_BTLAZY2_BLOCK_COMPRESSOR -DZSTD_EXCLUDE_BTOPT_BLOCK_COMPRESSOR -DZSTD_EXCLUDE_BTULTRA_BLOCK_COMPRESSOR |
199 | endif |
200 | endif |
201 | |
648db22b |
202 | ifneq ($(ZSTD_LEGACY_SUPPORT), 0) |
203 | ifeq ($(shell test $(ZSTD_LEGACY_SUPPORT) -lt 8; echo $$?), 0) |
f535537f |
204 | ZSTD_LEGACY_FILES += $(shell ls $(LIB_SRCDIR)/legacy/*.c | $(GREP) 'v0[$(ZSTD_LEGACY_SUPPORT)-7]') |
648db22b |
205 | endif |
206 | endif |
207 | CPPFLAGS += -DZSTD_LEGACY_SUPPORT=$(ZSTD_LEGACY_SUPPORT) |
208 | |
209 | UNAME := $(shell uname) |
210 | |
211 | ifndef BUILD_DIR |
212 | ifeq ($(UNAME), Darwin) |
213 | ifeq ($(shell md5 < /dev/null > /dev/null; echo $$?), 0) |
214 | HASH ?= md5 |
215 | endif |
216 | else ifeq ($(UNAME), FreeBSD) |
217 | HASH ?= gmd5sum |
218 | else ifeq ($(UNAME), NetBSD) |
219 | HASH ?= md5 -n |
220 | else ifeq ($(UNAME), OpenBSD) |
221 | HASH ?= md5 |
222 | endif |
223 | HASH ?= md5sum |
224 | |
225 | HASH_DIR = conf_$(shell echo $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(ZSTD_FILES) | $(HASH) | cut -f 1 -d " " ) |
226 | HAVE_HASH :=$(shell echo 1 | $(HASH) > /dev/null && echo 1 || echo 0) |
227 | ifeq ($(HAVE_HASH),0) |
228 | $(info warning : could not find HASH ($(HASH)), needed to differentiate builds using different flags) |
229 | BUILD_DIR := obj/generic_noconf |
230 | endif |
231 | endif # BUILD_DIR |
232 | |
f535537f |
233 | ZSTD_SUBDIR := $(LIB_SRCDIR)/common $(LIB_SRCDIR)/compress $(LIB_SRCDIR)/decompress $(LIB_SRCDIR)/dictBuilder $(LIB_SRCDIR)/legacy $(LIB_SRCDIR)/deprecated |
648db22b |
234 | vpath %.c $(ZSTD_SUBDIR) |
235 | vpath %.S $(ZSTD_SUBDIR) |
f535537f |
236 | |
237 | endif # LIBZSTD_MK_INCLUDED |