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