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