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