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 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 19 ################################################################## 20 # Input Variables 21 ################################################################## 22 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) 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 59 ZSTD_LIB_EXCLUDE_COMPRESSORS_DFAST_AND_UP ?= 0 60 ZSTD_LIB_EXCLUDE_COMPRESSORS_GREEDY_AND_UP ?= 0 61 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) 72 # Note : must be defined _after_ the default target 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 82 LIBVER_SRC := $(LIB_SRCDIR)/zstd.h 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 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)) 154 ZSTD_LEGACY_FILES := 155 156 ZSTD_DECOMPRESS_AMD64_ASM_FILES := $(sort $(wildcard $(LIB_SRCDIR)/decompress/*_amd64.S)) 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 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 202 ifneq ($(ZSTD_LEGACY_SUPPORT), 0) 203 ifeq ($(shell test $(ZSTD_LEGACY_SUPPORT) -lt 8; echo $$?), 0) 204 ZSTD_LEGACY_FILES += $(shell ls $(LIB_SRCDIR)/legacy/*.c | $(GREP) 'v0[$(ZSTD_LEGACY_SUPPORT)-7]') 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 233 ZSTD_SUBDIR := $(LIB_SRCDIR)/common $(LIB_SRCDIR)/compress $(LIB_SRCDIR)/decompress $(LIB_SRCDIR)/dictBuilder $(LIB_SRCDIR)/legacy $(LIB_SRCDIR)/deprecated 234 vpath %.c $(ZSTD_SUBDIR) 235 vpath %.S $(ZSTD_SUBDIR) 236 237 endif # LIBZSTD_MK_INCLUDED 238