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