1*01826a49SYabin Cui# ################################################################ 2*01826a49SYabin Cui# Copyright (c) Meta Platforms, Inc. and affiliates. 3*01826a49SYabin Cui# All rights reserved. 4*01826a49SYabin Cui# 5*01826a49SYabin Cui# This source code is licensed under both the BSD-style license (found in the 6*01826a49SYabin Cui# LICENSE file in the root directory of this source tree) and the GPLv2 (found 7*01826a49SYabin Cui# in the COPYING file in the root directory of this source tree). 8*01826a49SYabin Cui# You may select, at your option, one of the above-listed licenses. 9*01826a49SYabin Cui# ################################################################ 10*01826a49SYabin Cui 11*01826a49SYabin Cui# This included Makefile provides the following variables : 12*01826a49SYabin Cui# LIB_SRCDIR, LIB_BINDIR 13*01826a49SYabin Cui 14*01826a49SYabin Cui# Ensure the file is not included twice 15*01826a49SYabin Cui# Note : must be included after setting the default target 16*01826a49SYabin Cuiifndef LIBZSTD_MK_INCLUDED 17*01826a49SYabin CuiLIBZSTD_MK_INCLUDED := 1 18*01826a49SYabin Cui 19*01826a49SYabin Cui################################################################## 20*01826a49SYabin Cui# Input Variables 21*01826a49SYabin Cui################################################################## 22*01826a49SYabin Cui 23*01826a49SYabin Cui# By default, library's directory is same as this included makefile 24*01826a49SYabin CuiLIB_SRCDIR ?= $(dir $(realpath $(lastword $(MAKEFILE_LIST)))) 25*01826a49SYabin CuiLIB_BINDIR ?= $(LIBSRC_DIR) 26*01826a49SYabin Cui 27*01826a49SYabin Cui# ZSTD_LIB_MINIFY is a helper variable that 28*01826a49SYabin Cui# configures a bunch of other variables to space-optimized defaults. 29*01826a49SYabin CuiZSTD_LIB_MINIFY ?= 0 30*01826a49SYabin Cui 31*01826a49SYabin Cui# Legacy support 32*01826a49SYabin Cuiifneq ($(ZSTD_LIB_MINIFY), 0) 33*01826a49SYabin Cui ZSTD_LEGACY_SUPPORT ?= 0 34*01826a49SYabin Cuielse 35*01826a49SYabin Cui ZSTD_LEGACY_SUPPORT ?= 5 36*01826a49SYabin Cuiendif 37*01826a49SYabin CuiZSTD_LEGACY_MULTITHREADED_API ?= 0 38*01826a49SYabin Cui 39*01826a49SYabin Cui# Build size optimizations 40*01826a49SYabin Cuiifneq ($(ZSTD_LIB_MINIFY), 0) 41*01826a49SYabin Cui HUF_FORCE_DECOMPRESS_X1 ?= 1 42*01826a49SYabin Cui HUF_FORCE_DECOMPRESS_X2 ?= 0 43*01826a49SYabin Cui ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT ?= 1 44*01826a49SYabin Cui ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG ?= 0 45*01826a49SYabin Cui ZSTD_NO_INLINE ?= 1 46*01826a49SYabin Cui ZSTD_STRIP_ERROR_STRINGS ?= 1 47*01826a49SYabin Cuielse 48*01826a49SYabin Cui HUF_FORCE_DECOMPRESS_X1 ?= 0 49*01826a49SYabin Cui HUF_FORCE_DECOMPRESS_X2 ?= 0 50*01826a49SYabin Cui ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT ?= 0 51*01826a49SYabin Cui ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG ?= 0 52*01826a49SYabin Cui ZSTD_NO_INLINE ?= 0 53*01826a49SYabin Cui ZSTD_STRIP_ERROR_STRINGS ?= 0 54*01826a49SYabin Cuiendif 55*01826a49SYabin Cui 56*01826a49SYabin Cui# Assembly support 57*01826a49SYabin CuiZSTD_NO_ASM ?= 0 58*01826a49SYabin Cui 59*01826a49SYabin CuiZSTD_LIB_EXCLUDE_COMPRESSORS_DFAST_AND_UP ?= 0 60*01826a49SYabin CuiZSTD_LIB_EXCLUDE_COMPRESSORS_GREEDY_AND_UP ?= 0 61*01826a49SYabin Cui 62*01826a49SYabin Cui################################################################## 63*01826a49SYabin Cui# libzstd helpers 64*01826a49SYabin Cui################################################################## 65*01826a49SYabin Cui 66*01826a49SYabin CuiVOID ?= /dev/null 67*01826a49SYabin Cui 68*01826a49SYabin Cui# Make 4.3 doesn't support '\#' anymore (https://lwn.net/Articles/810071/) 69*01826a49SYabin CuiNUM_SYMBOL := \# 70*01826a49SYabin Cui 71*01826a49SYabin Cui# define silent mode as default (verbose mode with V=1 or VERBOSE=1) 72*01826a49SYabin Cui# Note : must be defined _after_ the default target 73*01826a49SYabin Cui$(V)$(VERBOSE).SILENT: 74*01826a49SYabin Cui 75*01826a49SYabin Cui# When cross-compiling from linux to windows, 76*01826a49SYabin Cui# one might need to specify TARGET_SYSTEM as "Windows." 77*01826a49SYabin Cui# Building from Fedora fails without it. 78*01826a49SYabin Cui# (but Ubuntu and Debian don't need to set anything) 79*01826a49SYabin CuiTARGET_SYSTEM ?= $(OS) 80*01826a49SYabin Cui 81*01826a49SYabin Cui# Version numbers 82*01826a49SYabin CuiLIBVER_SRC := $(LIB_SRCDIR)/zstd.h 83*01826a49SYabin CuiLIBVER_MAJOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MAJOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < $(LIBVER_SRC)` 84*01826a49SYabin CuiLIBVER_MINOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MINOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < $(LIBVER_SRC)` 85*01826a49SYabin CuiLIBVER_PATCH_SCRIPT:=`sed -n '/define ZSTD_VERSION_RELEASE/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < $(LIBVER_SRC)` 86*01826a49SYabin CuiLIBVER_SCRIPT:= $(LIBVER_MAJOR_SCRIPT).$(LIBVER_MINOR_SCRIPT).$(LIBVER_PATCH_SCRIPT) 87*01826a49SYabin CuiLIBVER_MAJOR := $(shell echo $(LIBVER_MAJOR_SCRIPT)) 88*01826a49SYabin CuiLIBVER_MINOR := $(shell echo $(LIBVER_MINOR_SCRIPT)) 89*01826a49SYabin CuiLIBVER_PATCH := $(shell echo $(LIBVER_PATCH_SCRIPT)) 90*01826a49SYabin CuiLIBVER := $(shell echo $(LIBVER_SCRIPT)) 91*01826a49SYabin CuiCCVER := $(shell $(CC) --version) 92*01826a49SYabin CuiZSTD_VERSION?= $(LIBVER) 93*01826a49SYabin Cui 94*01826a49SYabin Cuiifneq ($(ZSTD_LIB_MINIFY), 0) 95*01826a49SYabin Cui HAVE_CC_OZ ?= $(shell echo "" | $(CC) -Oz -x c -c - -o /dev/null 2> /dev/null && echo 1 || echo 0) 96*01826a49SYabin Cuiifneq ($(HAVE_CC_OZ), 0) 97*01826a49SYabin Cui # Some compilers (clang) support an even more space-optimized setting. 98*01826a49SYabin Cui CFLAGS += -Oz 99*01826a49SYabin Cuielse 100*01826a49SYabin Cui CFLAGS += -Os 101*01826a49SYabin Cuiendif 102*01826a49SYabin Cui CFLAGS += -fno-stack-protector -fomit-frame-pointer -fno-ident \ 103*01826a49SYabin Cui -DDYNAMIC_BMI2=0 -DNDEBUG 104*01826a49SYabin Cuielse 105*01826a49SYabin Cui CFLAGS ?= -O3 106*01826a49SYabin Cuiendif 107*01826a49SYabin Cui 108*01826a49SYabin CuiDEBUGLEVEL ?= 0 109*01826a49SYabin CuiCPPFLAGS += -DXXH_NAMESPACE=ZSTD_ -DDEBUGLEVEL=$(DEBUGLEVEL) 110*01826a49SYabin Cuiifeq ($(TARGET_SYSTEM),Windows_NT) # MinGW assumed 111*01826a49SYabin Cui CPPFLAGS += -D__USE_MINGW_ANSI_STDIO # compatibility with %zu formatting 112*01826a49SYabin Cuiendif 113*01826a49SYabin CuiDEBUGFLAGS= -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow \ 114*01826a49SYabin Cui -Wstrict-aliasing=1 -Wswitch-enum -Wdeclaration-after-statement \ 115*01826a49SYabin Cui -Wstrict-prototypes -Wundef -Wpointer-arith \ 116*01826a49SYabin Cui -Wvla -Wformat=2 -Winit-self -Wfloat-equal -Wwrite-strings \ 117*01826a49SYabin Cui -Wredundant-decls -Wmissing-prototypes -Wc++-compat 118*01826a49SYabin CuiCFLAGS += $(DEBUGFLAGS) $(MOREFLAGS) 119*01826a49SYabin CuiASFLAGS += $(DEBUGFLAGS) $(MOREFLAGS) $(CFLAGS) 120*01826a49SYabin CuiLDFLAGS += $(MOREFLAGS) 121*01826a49SYabin CuiFLAGS = $(CPPFLAGS) $(CFLAGS) $(ASFLAGS) $(LDFLAGS) 122*01826a49SYabin Cui 123*01826a49SYabin Cuiifndef ALREADY_APPENDED_NOEXECSTACK 124*01826a49SYabin Cuiexport ALREADY_APPENDED_NOEXECSTACK := 1 125*01826a49SYabin Cuiifeq ($(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) 126*01826a49SYabin CuiLDFLAGS += -z noexecstack 127*01826a49SYabin Cuiendif 128*01826a49SYabin Cuiifeq ($(shell echo | $(CC) $(FLAGS) -Wa,--noexecstack -x assembler -Werror -c - -o $(VOID) 2>$(VOID) && echo 1 || echo 0),1) 129*01826a49SYabin CuiCFLAGS += -Wa,--noexecstack 130*01826a49SYabin Cui# CFLAGS are also added to ASFLAGS 131*01826a49SYabin Cuielse ifeq ($(shell echo | $(CC) $(FLAGS) -Qunused-arguments -Wa,--noexecstack -x assembler -Werror -c - -o $(VOID) 2>$(VOID) && echo 1 || echo 0),1) 132*01826a49SYabin Cui# See e.g.: https://github.com/android/ndk/issues/171 133*01826a49SYabin CuiCFLAGS += -Qunused-arguments -Wa,--noexecstack 134*01826a49SYabin Cui# CFLAGS are also added to ASFLAGS 135*01826a49SYabin Cuiendif 136*01826a49SYabin Cuiendif 137*01826a49SYabin Cui 138*01826a49SYabin Cuiifeq ($(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) 139*01826a49SYabin CuiLDFLAGS += -z cet-report=error 140*01826a49SYabin Cuiendif 141*01826a49SYabin Cui 142*01826a49SYabin CuiHAVE_COLORNEVER = $(shell echo a | grep --color=never a > /dev/null 2> /dev/null && echo 1 || echo 0) 143*01826a49SYabin CuiGREP_OPTIONS ?= 144*01826a49SYabin Cuiifeq ($(HAVE_COLORNEVER), 1) 145*01826a49SYabin Cui GREP_OPTIONS += --color=never 146*01826a49SYabin Cuiendif 147*01826a49SYabin CuiGREP = grep $(GREP_OPTIONS) 148*01826a49SYabin Cui 149*01826a49SYabin CuiZSTD_COMMON_FILES := $(sort $(wildcard $(LIB_SRCDIR)/common/*.c)) 150*01826a49SYabin CuiZSTD_COMPRESS_FILES := $(sort $(wildcard $(LIB_SRCDIR)/compress/*.c)) 151*01826a49SYabin CuiZSTD_DECOMPRESS_FILES := $(sort $(wildcard $(LIB_SRCDIR)/decompress/*.c)) 152*01826a49SYabin CuiZSTD_DICTBUILDER_FILES := $(sort $(wildcard $(LIB_SRCDIR)/dictBuilder/*.c)) 153*01826a49SYabin CuiZSTD_DEPRECATED_FILES := $(sort $(wildcard $(LIB_SRCDIR)/deprecated/*.c)) 154*01826a49SYabin CuiZSTD_LEGACY_FILES := 155*01826a49SYabin Cui 156*01826a49SYabin CuiZSTD_DECOMPRESS_AMD64_ASM_FILES := $(sort $(wildcard $(LIB_SRCDIR)/decompress/*_amd64.S)) 157*01826a49SYabin Cui 158*01826a49SYabin Cuiifneq ($(ZSTD_NO_ASM), 0) 159*01826a49SYabin Cui CPPFLAGS += -DZSTD_DISABLE_ASM 160*01826a49SYabin Cuielse 161*01826a49SYabin Cui # Unconditionally add the ASM files they are disabled by 162*01826a49SYabin Cui # macros in the .S file. 163*01826a49SYabin Cui ZSTD_DECOMPRESS_FILES += $(ZSTD_DECOMPRESS_AMD64_ASM_FILES) 164*01826a49SYabin Cuiendif 165*01826a49SYabin Cui 166*01826a49SYabin Cuiifneq ($(HUF_FORCE_DECOMPRESS_X1), 0) 167*01826a49SYabin Cui CFLAGS += -DHUF_FORCE_DECOMPRESS_X1 168*01826a49SYabin Cuiendif 169*01826a49SYabin Cui 170*01826a49SYabin Cuiifneq ($(HUF_FORCE_DECOMPRESS_X2), 0) 171*01826a49SYabin Cui CFLAGS += -DHUF_FORCE_DECOMPRESS_X2 172*01826a49SYabin Cuiendif 173*01826a49SYabin Cui 174*01826a49SYabin Cuiifneq ($(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT), 0) 175*01826a49SYabin Cui CFLAGS += -DZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT 176*01826a49SYabin Cuiendif 177*01826a49SYabin Cui 178*01826a49SYabin Cuiifneq ($(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG), 0) 179*01826a49SYabin Cui CFLAGS += -DZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG 180*01826a49SYabin Cuiendif 181*01826a49SYabin Cui 182*01826a49SYabin Cuiifneq ($(ZSTD_NO_INLINE), 0) 183*01826a49SYabin Cui CFLAGS += -DZSTD_NO_INLINE 184*01826a49SYabin Cuiendif 185*01826a49SYabin Cui 186*01826a49SYabin Cuiifneq ($(ZSTD_STRIP_ERROR_STRINGS), 0) 187*01826a49SYabin Cui CFLAGS += -DZSTD_STRIP_ERROR_STRINGS 188*01826a49SYabin Cuiendif 189*01826a49SYabin Cui 190*01826a49SYabin Cuiifneq ($(ZSTD_LEGACY_MULTITHREADED_API), 0) 191*01826a49SYabin Cui CFLAGS += -DZSTD_LEGACY_MULTITHREADED_API 192*01826a49SYabin Cuiendif 193*01826a49SYabin Cui 194*01826a49SYabin Cuiifneq ($(ZSTD_LIB_EXCLUDE_COMPRESSORS_DFAST_AND_UP), 0) 195*01826a49SYabin Cui CFLAGS += -DZSTD_EXCLUDE_DFAST_BLOCK_COMPRESSOR -DZSTD_EXCLUDE_GREEDY_BLOCK_COMPRESSOR -DZSTD_EXCLUDE_LAZY2_BLOCK_COMPRESSOR -DZSTD_EXCLUDE_BTLAZY2_BLOCK_COMPRESSOR -DZSTD_EXCLUDE_BTOPT_BLOCK_COMPRESSOR -DZSTD_EXCLUDE_BTULTRA_BLOCK_COMPRESSOR 196*01826a49SYabin Cuielse 197*01826a49SYabin Cuiifneq ($(ZSTD_LIB_EXCLUDE_COMPRESSORS_GREEDY_AND_UP), 0) 198*01826a49SYabin Cui CFLAGS += -DZSTD_EXCLUDE_GREEDY_BLOCK_COMPRESSOR -DZSTD_EXCLUDE_LAZY2_BLOCK_COMPRESSOR -DZSTD_EXCLUDE_BTLAZY2_BLOCK_COMPRESSOR -DZSTD_EXCLUDE_BTOPT_BLOCK_COMPRESSOR -DZSTD_EXCLUDE_BTULTRA_BLOCK_COMPRESSOR 199*01826a49SYabin Cuiendif 200*01826a49SYabin Cuiendif 201*01826a49SYabin Cui 202*01826a49SYabin Cuiifneq ($(ZSTD_LEGACY_SUPPORT), 0) 203*01826a49SYabin Cuiifeq ($(shell test $(ZSTD_LEGACY_SUPPORT) -lt 8; echo $$?), 0) 204*01826a49SYabin Cui ZSTD_LEGACY_FILES += $(shell ls $(LIB_SRCDIR)/legacy/*.c | $(GREP) 'v0[$(ZSTD_LEGACY_SUPPORT)-7]') 205*01826a49SYabin Cuiendif 206*01826a49SYabin Cuiendif 207*01826a49SYabin CuiCPPFLAGS += -DZSTD_LEGACY_SUPPORT=$(ZSTD_LEGACY_SUPPORT) 208*01826a49SYabin Cui 209*01826a49SYabin CuiUNAME := $(shell uname) 210*01826a49SYabin Cui 211*01826a49SYabin Cuiifndef BUILD_DIR 212*01826a49SYabin Cuiifeq ($(UNAME), Darwin) 213*01826a49SYabin Cui ifeq ($(shell md5 < /dev/null > /dev/null; echo $$?), 0) 214*01826a49SYabin Cui HASH ?= md5 215*01826a49SYabin Cui endif 216*01826a49SYabin Cuielse ifeq ($(UNAME), FreeBSD) 217*01826a49SYabin Cui HASH ?= gmd5sum 218*01826a49SYabin Cuielse ifeq ($(UNAME), NetBSD) 219*01826a49SYabin Cui HASH ?= md5 -n 220*01826a49SYabin Cuielse ifeq ($(UNAME), OpenBSD) 221*01826a49SYabin Cui HASH ?= md5 222*01826a49SYabin Cuiendif 223*01826a49SYabin CuiHASH ?= md5sum 224*01826a49SYabin Cui 225*01826a49SYabin CuiHASH_DIR = conf_$(shell echo $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(ZSTD_FILES) | $(HASH) | cut -f 1 -d " " ) 226*01826a49SYabin CuiHAVE_HASH :=$(shell echo 1 | $(HASH) > /dev/null && echo 1 || echo 0) 227*01826a49SYabin Cuiifeq ($(HAVE_HASH),0) 228*01826a49SYabin Cui $(info warning : could not find HASH ($(HASH)), needed to differentiate builds using different flags) 229*01826a49SYabin Cui BUILD_DIR := obj/generic_noconf 230*01826a49SYabin Cuiendif 231*01826a49SYabin Cuiendif # BUILD_DIR 232*01826a49SYabin Cui 233*01826a49SYabin CuiZSTD_SUBDIR := $(LIB_SRCDIR)/common $(LIB_SRCDIR)/compress $(LIB_SRCDIR)/decompress $(LIB_SRCDIR)/dictBuilder $(LIB_SRCDIR)/legacy $(LIB_SRCDIR)/deprecated 234*01826a49SYabin Cuivpath %.c $(ZSTD_SUBDIR) 235*01826a49SYabin Cuivpath %.S $(ZSTD_SUBDIR) 236*01826a49SYabin Cui 237*01826a49SYabin Cuiendif # LIBZSTD_MK_INCLUDED 238