1193323Sed# ################################################################
2193323Sed# Copyright (c) Yann Collet, Facebook, Inc.
3193323Sed# All rights reserved.
4193323Sed#
5193323Sed# This source code is licensed under both the BSD-style license (found in the
6193323Sed# LICENSE file in the root directory of this source tree) and the GPLv2 (found
7193323Sed# in the COPYING file in the root directory of this source tree).
8193323Sed# You may select, at your option, one of the above-listed licenses.
9193323Sed# ################################################################
10193323Sed
11193323Sed##################################################################
12193323Sed# Input Variables
13193323Sed##################################################################
14193323Sed
15193323Sed# Zstd lib directory
16234353SdimLIBZSTD ?= ./
17193323Sed
18193323Sed# Legacy support
19193323SedZSTD_LEGACY_SUPPORT ?= 5
20193323SedZSTD_LEGACY_MULTITHREADED_API ?= 0
21193323Sed
22193323Sed# Build size optimizations
23193323SedHUF_FORCE_DECOMPRESS_X1 ?= 0
24239462SdimHUF_FORCE_DECOMPRESS_X2 ?= 0
25239462SdimZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT ?= 0
26239462SdimZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG ?= 0
27193323SedZSTD_NO_INLINE ?= 0
28218893SdimZSTD_STRIP_ERROR_STRINGS ?= 0
29218893Sdim
30249423Sdim# Assembly support
31249423SdimZSTD_NO_ASM ?= 0
32249423Sdim
33249423Sdim##################################################################
34249423Sdim# libzstd helpers
35249423Sdim##################################################################
36249423Sdim
37249423SdimVOID ?= /dev/null
38249423Sdim
39249423Sdim# Make 4.3 doesn't support '\#' anymore (https://lwn.net/Articles/810071/)
40249423SdimNUM_SYMBOL := \#
41249423Sdim
42249423Sdim# define silent mode as default (verbose mode with V=1 or VERBOSE=1)
43249423Sdim$(V)$(VERBOSE).SILENT:
44218893Sdim
45193323Sed# When cross-compiling from linux to windows,
46198090Srdivacky# one might need to specify TARGET_SYSTEM as "Windows."
47193323Sed# Building from Fedora fails without it.
48193323Sed# (but Ubuntu and Debian don't need to set anything)
49198090SrdivackyTARGET_SYSTEM ?= $(OS)
50239462Sdim
51239462Sdim# Version numbers
52239462SdimLIBVER_SRC := $(LIBZSTD)/zstd.h
53193323SedLIBVER_MAJOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MAJOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < $(LIBVER_SRC)`
54193323SedLIBVER_MINOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MINOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < $(LIBVER_SRC)`
55193323SedLIBVER_PATCH_SCRIPT:=`sed -n '/define ZSTD_VERSION_RELEASE/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < $(LIBVER_SRC)`
56193323SedLIBVER_SCRIPT:= $(LIBVER_MAJOR_SCRIPT).$(LIBVER_MINOR_SCRIPT).$(LIBVER_PATCH_SCRIPT)
57218893SdimLIBVER_MAJOR := $(shell echo $(LIBVER_MAJOR_SCRIPT))
58193323SedLIBVER_MINOR := $(shell echo $(LIBVER_MINOR_SCRIPT))
59193323SedLIBVER_PATCH := $(shell echo $(LIBVER_PATCH_SCRIPT))
60193323SedLIBVER := $(shell echo $(LIBVER_SCRIPT))
61198090SrdivackyCCVER := $(shell $(CC) --version)
62239462SdimZSTD_VERSION?= $(LIBVER)
63218893Sdim
64193323Sed# ZSTD_LIB_MINIFY is a helper variable that
65193323Sed# configures a bunch of other variables to space-optimized defaults.
66193323SedZSTD_LIB_MINIFY ?= 0
67193323Sedifneq ($(ZSTD_LIB_MINIFY), 0)
68239462Sdim  HAVE_CC_OZ ?= $(shell echo "" | $(CC) -Oz -x c -c - -o /dev/null 2> /dev/null && echo 1 || echo 0)
69239462Sdim  ZSTD_LEGACY_SUPPORT ?= 0
70239462Sdim  ZSTD_LIB_DEPRECATED ?= 0
71239462Sdim  HUF_FORCE_DECOMPRESS_X1 ?= 1
72239462Sdim  ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT ?= 1
73239462Sdim  ZSTD_NO_INLINE ?= 1
74239462Sdim  ZSTD_STRIP_ERROR_STRINGS ?= 1
75239462Sdimifneq ($(HAVE_CC_OZ), 0)
76239462Sdim    # Some compilers (clang) support an even more space-optimized setting.
77239462Sdim    CFLAGS += -Oz
78239462Sdimelse
79239462Sdim    CFLAGS += -Os
80239462Sdimendif
81193323Sed  CFLAGS += -fno-stack-protector -fomit-frame-pointer -fno-ident \
82193323Sed            -DDYNAMIC_BMI2=0 -DNDEBUG
83193323Sedelse
84193323Sed  CFLAGS ?= -O3
85193323Sedendif
86193323Sed
87193323SedDEBUGLEVEL ?= 0
88193323SedCPPFLAGS += -DXXH_NAMESPACE=ZSTD_ -DDEBUGLEVEL=$(DEBUGLEVEL)
89218893Sdimifeq ($(TARGET_SYSTEM),Windows_NT)   # MinGW assumed
90243830Sdim  CPPFLAGS += -D__USE_MINGW_ANSI_STDIO   # compatibility with %zu formatting
91218893Sdimendif
92201360SrdivackyDEBUGFLAGS= -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow \
93201360Srdivacky            -Wstrict-aliasing=1 -Wswitch-enum -Wdeclaration-after-statement \
94201360Srdivacky            -Wstrict-prototypes -Wundef -Wpointer-arith \
95201360Srdivacky            -Wvla -Wformat=2 -Winit-self -Wfloat-equal -Wwrite-strings \
96193323Sed            -Wredundant-decls -Wmissing-prototypes -Wc++-compat
97193323SedCFLAGS   += $(DEBUGFLAGS) $(MOREFLAGS)
98193323SedASFLAGS  += $(DEBUGFLAGS) $(MOREFLAGS) $(CFLAGS)
99193323SedLDFLAGS  += $(MOREFLAGS)
100218893SdimFLAGS     = $(CPPFLAGS) $(CFLAGS) $(ASFLAGS) $(LDFLAGS)
101218893Sdim
102239462Sdimifndef ALREADY_APPENDED_NOEXECSTACK
103218893Sdimexport ALREADY_APPENDED_NOEXECSTACK := 1
104218893Sdimifeq ($(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)
105218893SdimLDFLAGS += -z noexecstack
106239462Sdimendif
107193323Sedifeq ($(shell echo | $(CC) $(FLAGS) -Wa,--noexecstack -x assembler -Werror -c - -o $(VOID) 2>$(VOID) && echo 1 || echo 0),1)
108193323SedCFLAGS  += -Wa,--noexecstack
109218893Sdim# CFLAGS are also added to ASFLAGS
110193323Sedelse ifeq ($(shell echo | $(CC) $(FLAGS) -Qunused-arguments -Wa,--noexecstack -x assembler -Werror -c - -o $(VOID) 2>$(VOID) && echo 1 || echo 0),1)
111193323Sed# See e.g.: https://github.com/android/ndk/issues/171
112193323SedCFLAGS  += -Qunused-arguments -Wa,--noexecstack
113193323Sed# CFLAGS are also added to ASFLAGS
114193323Sedendif
115193323Sedendif
116218893Sdim
117218893SdimHAVE_COLORNEVER = $(shell echo a | grep --color=never a > /dev/null 2> /dev/null && echo 1 || echo 0)
118218893SdimGREP_OPTIONS ?=
119218893Sdimifeq ($HAVE_COLORNEVER, 1)
120239462Sdim  GREP_OPTIONS += --color=never
121218893Sdimendif
122218893SdimGREP = grep $(GREP_OPTIONS)
123218893SdimSED_ERE_OPT ?= -E
124218893Sdim
125239462SdimZSTD_COMMON_FILES := $(sort $(wildcard $(LIBZSTD)/common/*.c))
126218893SdimZSTD_COMPRESS_FILES := $(sort $(wildcard $(LIBZSTD)/compress/*.c))
127218893SdimZSTD_DECOMPRESS_FILES := $(sort $(wildcard $(LIBZSTD)/decompress/*.c))
128218893SdimZSTD_DICTBUILDER_FILES := $(sort $(wildcard $(LIBZSTD)/dictBuilder/*.c))
129193323SedZSTD_DEPRECATED_FILES := $(sort $(wildcard $(LIBZSTD)/deprecated/*.c))
130218893SdimZSTD_LEGACY_FILES :=
131239462Sdim
132193323SedZSTD_DECOMPRESS_AMD64_ASM_FILES := $(sort $(wildcard $(LIBZSTD)/decompress/*_amd64.S))
133193323Sed
134239462Sdimifneq ($(ZSTD_NO_ASM), 0)
135239462Sdim  CPPFLAGS += -DZSTD_DISABLE_ASM
136239462Sdimelse
137239462Sdim  # Unconditionally add the ASM files they are disabled by
138239462Sdim  # macros in the .S file.
139239462Sdim  ZSTD_DECOMPRESS_FILES += $(ZSTD_DECOMPRESS_AMD64_ASM_FILES)
140239462Sdimendif
141239462Sdim
142239462Sdimifneq ($(HUF_FORCE_DECOMPRESS_X1), 0)
143239462Sdim  CFLAGS += -DHUF_FORCE_DECOMPRESS_X1
144239462Sdimendif
145239462Sdim
146218893Sdimifneq ($(HUF_FORCE_DECOMPRESS_X2), 0)
147218893Sdim  CFLAGS += -DHUF_FORCE_DECOMPRESS_X2
148218893Sdimendif
149218893Sdim
150193323Sedifneq ($(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT), 0)
151202878Srdivacky  CFLAGS += -DZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT
152193323Sedendif
153218893Sdim
154218893Sdimifneq ($(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG), 0)
155218893Sdim  CFLAGS += -DZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG
156218893Sdimendif
157218893Sdim
158226633Sdimifneq ($(ZSTD_NO_INLINE), 0)
159218893Sdim  CFLAGS += -DZSTD_NO_INLINE
160226633Sdimendif
161226633Sdim
162226633Sdimifneq ($(ZSTD_STRIP_ERROR_STRINGS), 0)
163218893Sdim  CFLAGS += -DZSTD_STRIP_ERROR_STRINGS
164218893Sdimendif
165198892Srdivacky
166201360Srdivackyifneq ($(ZSTD_LEGACY_MULTITHREADED_API), 0)
167218893Sdim  CFLAGS += -DZSTD_LEGACY_MULTITHREADED_API
168201360Srdivackyendif
169263508Sdim
170201360Srdivackyifneq ($(ZSTD_LEGACY_SUPPORT), 0)
171263508Sdimifeq ($(shell test $(ZSTD_LEGACY_SUPPORT) -lt 8; echo $$?), 0)
172201360Srdivacky  ZSTD_LEGACY_FILES += $(shell ls $(LIBZSTD)/legacy/*.c | $(GREP) 'v0[$(ZSTD_LEGACY_SUPPORT)-7]')
173263508Sdimendif
174226633Sdimendif
175226633SdimCPPFLAGS  += -DZSTD_LEGACY_SUPPORT=$(ZSTD_LEGACY_SUPPORT)
176263508Sdim
177201360SrdivackyUNAME := $(shell uname)
178198892Srdivacky
179263508Sdimifndef BUILD_DIR
180198892Srdivackyifeq ($(UNAME), Darwin)
181263508Sdim  ifeq ($(shell md5 < /dev/null > /dev/null; echo $$?), 0)
182198892Srdivacky    HASH ?= md5
183263508Sdim  endif
184239462Sdimelse ifeq ($(UNAME), FreeBSD)
185193323Sed  HASH ?= gmd5sum
186239462Sdimelse ifeq ($(UNAME), NetBSD)
187218893Sdim  HASH ?= md5 -n
188218893Sdimelse ifeq ($(UNAME), OpenBSD)
189218893Sdim  HASH ?= md5
190218893Sdimendif
191239462SdimHASH ?= md5sum
192239462Sdim
193218893SdimHASH_DIR = conf_$(shell echo $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(ZSTD_FILES) | $(HASH) | cut -f 1 -d " " )
194218893SdimHAVE_HASH :=$(shell echo 1 | $(HASH) > /dev/null && echo 1 || echo 0)
195239462Sdimifeq ($(HAVE_HASH),0)
196218893Sdim  $(info warning : could not find HASH ($(HASH)), needed to differentiate builds using different flags)
197218893Sdim  BUILD_DIR := obj/generic_noconf
198218893Sdimendif
199218893Sdimendif # BUILD_DIR
200218893Sdim
201218893SdimZSTD_SUBDIR := $(LIBZSTD)/common $(LIBZSTD)/compress $(LIBZSTD)/decompress $(LIBZSTD)/dictBuilder $(LIBZSTD)/legacy $(LIBZSTD)/deprecated
202218893Sdimvpath %.c $(ZSTD_SUBDIR)
203239462Sdimvpath %.S $(ZSTD_SUBDIR)
204218893Sdim