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