1*22ce4affSfengbojiang# ################################################################ 2*22ce4affSfengbojiang# Copyright (c) 2015-2020, Yann Collet, Facebook, Inc. 3*22ce4affSfengbojiang# All rights reserved. 4*22ce4affSfengbojiang# 5*22ce4affSfengbojiang# This source code is licensed under both the BSD-style license (found in the 6*22ce4affSfengbojiang# LICENSE file in the root directory of this source tree) and the GPLv2 (found 7*22ce4affSfengbojiang# in the COPYING file in the root directory of this source tree). 8*22ce4affSfengbojiang# You may select, at your option, one of the above-listed licenses. 9*22ce4affSfengbojiang# ########################################################################## 10*22ce4affSfengbojiang# zstd : Command Line Utility, supporting gzip-like arguments 11*22ce4affSfengbojiang# zstd32 : Same as zstd, but forced to compile in 32-bits mode 12*22ce4affSfengbojiang# zstd_nolegacy : zstd without support of decompression of legacy versions 13*22ce4affSfengbojiang# zstd-small : minimal zstd without dictionary builder and benchmark 14*22ce4affSfengbojiang# zstd-compress : compressor-only version of zstd 15*22ce4affSfengbojiang# zstd-decompress : decompressor-only version of zstd 16*22ce4affSfengbojiang# ########################################################################## 17*22ce4affSfengbojiang 18*22ce4affSfengbojiang.PHONY: default 19*22ce4affSfengbojiangdefault: zstd-release 20*22ce4affSfengbojiang 21*22ce4affSfengbojiang# silent mode by default; verbose can be triggered by V=1 or VERBOSE=1 22*22ce4affSfengbojiang$(V)$(VERBOSE).SILENT: 23*22ce4affSfengbojiang 24*22ce4affSfengbojiang 25*22ce4affSfengbojiangZSTDDIR := ../lib 26*22ce4affSfengbojiang 27*22ce4affSfengbojiang# Version numbers 28*22ce4affSfengbojiangLIBVER_SRC := $(ZSTDDIR)/zstd.h 29*22ce4affSfengbojiangLIBVER_MAJOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MAJOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < $(LIBVER_SRC)` 30*22ce4affSfengbojiangLIBVER_MINOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MINOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < $(LIBVER_SRC)` 31*22ce4affSfengbojiangLIBVER_PATCH_SCRIPT:=`sed -n '/define ZSTD_VERSION_RELEASE/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < $(LIBVER_SRC)` 32*22ce4affSfengbojiangLIBVER_SCRIPT:= $(LIBVER_MAJOR_SCRIPT).$(LIBVER_MINOR_SCRIPT).$(LIBVER_PATCH_SCRIPT) 33*22ce4affSfengbojiangLIBVER_MAJOR := $(shell echo $(LIBVER_MAJOR_SCRIPT)) 34*22ce4affSfengbojiangLIBVER_MINOR := $(shell echo $(LIBVER_MINOR_SCRIPT)) 35*22ce4affSfengbojiangLIBVER_PATCH := $(shell echo $(LIBVER_PATCH_SCRIPT)) 36*22ce4affSfengbojiangLIBVER := $(shell echo $(LIBVER_SCRIPT)) 37*22ce4affSfengbojiang 38*22ce4affSfengbojiangZSTD_VERSION = $(LIBVER) 39*22ce4affSfengbojiang 40*22ce4affSfengbojiangHAVE_COLORNEVER = $(shell echo a | grep --color=never a > /dev/null 2> /dev/null && echo 1 || echo 0) 41*22ce4affSfengbojiangGREP_OPTIONS ?= 42*22ce4affSfengbojiangifeq ($HAVE_COLORNEVER, 1) 43*22ce4affSfengbojiang GREP_OPTIONS += --color=never 44*22ce4affSfengbojiangendif 45*22ce4affSfengbojiangGREP = grep $(GREP_OPTIONS) 46*22ce4affSfengbojiang 47*22ce4affSfengbojiangifeq ($(shell $(CC) -v 2>&1 | $(GREP) -c "gcc version "), 1) 48*22ce4affSfengbojiang ALIGN_LOOP = -falign-loops=32 49*22ce4affSfengbojiangelse 50*22ce4affSfengbojiang ALIGN_LOOP = 51*22ce4affSfengbojiangendif 52*22ce4affSfengbojiang 53*22ce4affSfengbojiangDEBUGLEVEL ?= 0 54*22ce4affSfengbojiangCPPFLAGS += -DXXH_NAMESPACE=ZSTD_ -DDEBUGLEVEL=$(DEBUGLEVEL) 55*22ce4affSfengbojiangifeq ($(OS),Windows_NT) # MinGW assumed 56*22ce4affSfengbojiang CPPFLAGS += -D__USE_MINGW_ANSI_STDIO # compatibility with %zu formatting 57*22ce4affSfengbojiangendif 58*22ce4affSfengbojiangCFLAGS ?= -O3 59*22ce4affSfengbojiangDEBUGFLAGS+=-Wall -Wextra -Wcast-qual -Wcast-align -Wshadow \ 60*22ce4affSfengbojiang -Wstrict-aliasing=1 -Wswitch-enum -Wdeclaration-after-statement \ 61*22ce4affSfengbojiang -Wstrict-prototypes -Wundef -Wpointer-arith \ 62*22ce4affSfengbojiang -Wvla -Wformat=2 -Winit-self -Wfloat-equal -Wwrite-strings \ 63*22ce4affSfengbojiang -Wredundant-decls -Wmissing-prototypes -Wc++-compat 64*22ce4affSfengbojiangCFLAGS += $(DEBUGFLAGS) $(MOREFLAGS) 65*22ce4affSfengbojiangFLAGS = $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) 66*22ce4affSfengbojiang 67*22ce4affSfengbojiangZSTDLIB_COMMON := $(ZSTDDIR)/common 68*22ce4affSfengbojiangZSTDLIB_COMPRESS := $(ZSTDDIR)/compress 69*22ce4affSfengbojiangZSTDLIB_DECOMPRESS := $(ZSTDDIR)/decompress 70*22ce4affSfengbojiangZDICT_DIR := $(ZSTDDIR)/dictBuilder 71*22ce4affSfengbojiangZSTDLEGACY_DIR := $(ZSTDDIR)/legacy 72*22ce4affSfengbojiang 73*22ce4affSfengbojiangvpath %.c $(ZSTDLIB_COMMON) $(ZSTDLIB_COMPRESS) $(ZSTDLIB_DECOMPRESS) $(ZDICT_DIR) $(ZSTDLEGACY_DIR) 74*22ce4affSfengbojiang 75*22ce4affSfengbojiangZSTDLIB_COMMON_C := $(wildcard $(ZSTDLIB_COMMON)/*.c) 76*22ce4affSfengbojiangZSTDLIB_COMPRESS_C := $(wildcard $(ZSTDLIB_COMPRESS)/*.c) 77*22ce4affSfengbojiangZSTDLIB_DECOMPRESS_C := $(wildcard $(ZSTDLIB_DECOMPRESS)/*.c) 78*22ce4affSfengbojiangZSTDLIB_CORE_SRC := $(ZSTDLIB_DECOMPRESS_C) $(ZSTDLIB_COMMON_C) $(ZSTDLIB_COMPRESS_C) 79*22ce4affSfengbojiangZDICT_SRC := $(wildcard $(ZDICT_DIR)/*.c) 80*22ce4affSfengbojiang 81*22ce4affSfengbojiangZSTD_LEGACY_SUPPORT ?= 5 82*22ce4affSfengbojiangZSTDLEGACY_SRC := 83*22ce4affSfengbojiangifneq ($(ZSTD_LEGACY_SUPPORT), 0) 84*22ce4affSfengbojiangifeq ($(shell test $(ZSTD_LEGACY_SUPPORT) -lt 8; echo $$?), 0) 85*22ce4affSfengbojiang ZSTDLEGACY_SRC += $(shell ls $(ZSTDLEGACY_DIR)/*.c | $(GREP) 'v0[$(ZSTD_LEGACY_SUPPORT)-7]') 86*22ce4affSfengbojiangendif 87*22ce4affSfengbojiangendif 88*22ce4affSfengbojiang 89*22ce4affSfengbojiang# Sort files in alphabetical order for reproducible builds 90*22ce4affSfengbojiangZSTDLIB_FULL_SRC = $(sort $(ZSTDLIB_CORE_SRC) $(ZSTDLEGACY_SRC) $(ZDICT_SRC)) 91*22ce4affSfengbojiangZSTDLIB_LOCAL_SRC := $(notdir $(ZSTDLIB_FULL_SRC)) 92*22ce4affSfengbojiangZSTDLIB_LOCAL_OBJ := $(ZSTDLIB_LOCAL_SRC:.c=.o) 93*22ce4affSfengbojiang 94*22ce4affSfengbojiangZSTD_CLI_SRC := $(wildcard *.c) 95*22ce4affSfengbojiangZSTD_CLI_OBJ := $(ZSTD_CLI_SRC:.c=.o) 96*22ce4affSfengbojiang 97*22ce4affSfengbojiangZSTD_ALL_SRC := $(ZSTDLIB_LOCAL_SRC) $(ZSTD_CLI_SRC) 98*22ce4affSfengbojiangZSTD_ALL_OBJ := $(ZSTD_ALL_SRC:.c=.o) 99*22ce4affSfengbojiang 100*22ce4affSfengbojiangUNAME := $(shell uname) 101*22ce4affSfengbojiangifeq ($(UNAME), Darwin) 102*22ce4affSfengbojiang HASH ?= md5 103*22ce4affSfengbojiangelse ifeq ($(UNAME), FreeBSD) 104*22ce4affSfengbojiang HASH ?= gmd5sum 105*22ce4affSfengbojiangelse ifeq ($(UNAME), OpenBSD) 106*22ce4affSfengbojiang HASH ?= md5 107*22ce4affSfengbojiangendif 108*22ce4affSfengbojiangHASH ?= md5sum 109*22ce4affSfengbojiangHAVE_HASH :=$(shell echo 1 | $(HASH) > /dev/null && echo 1 || echo 0) 110*22ce4affSfengbojiang 111*22ce4affSfengbojiangifndef BUILD_DIR 112*22ce4affSfengbojiangHASH_DIR = conf_$(shell echo $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(ZSTD_FILES) | $(HASH) | cut -f 1 -d " ") 113*22ce4affSfengbojiangifeq ($(HAVE_HASH),0) 114*22ce4affSfengbojiang $(info warning : could not find HASH ($(HASH)), needed to differentiate builds using different flags) 115*22ce4affSfengbojiang BUILD_DIR := obj/generic_noconf 116*22ce4affSfengbojiangendif 117*22ce4affSfengbojiangendif # BUILD_DIR 118*22ce4affSfengbojiang 119*22ce4affSfengbojiang# Define *.exe as extension for Windows systems 120*22ce4affSfengbojiangifneq (,$(filter Windows%,$(OS))) 121*22ce4affSfengbojiang EXT =.exe 122*22ce4affSfengbojiang RES64_FILE = windres/zstd64.res 123*22ce4affSfengbojiang RES32_FILE = windres/zstd32.res 124*22ce4affSfengbojiangifneq (,$(filter x86_64%,$(shell $(CC) -dumpmachine))) 125*22ce4affSfengbojiang RES_FILE = $(RES64_FILE) 126*22ce4affSfengbojiangelse 127*22ce4affSfengbojiang RES_FILE = $(RES32_FILE) 128*22ce4affSfengbojiangendif 129*22ce4affSfengbojiangelse 130*22ce4affSfengbojiang EXT = 131*22ce4affSfengbojiangendif 132*22ce4affSfengbojiang 133*22ce4affSfengbojiangVOID = /dev/null 134*22ce4affSfengbojiang 135*22ce4affSfengbojiang# Make 4.3 doesn't support '\#' anymore (https://lwn.net/Articles/810071/) 136*22ce4affSfengbojiangNUM_SYMBOL := \# 137*22ce4affSfengbojiang 138*22ce4affSfengbojiang# thread detection 139*22ce4affSfengbojiangNO_THREAD_MSG := ==> no threads, building without multithreading support 140*22ce4affSfengbojiangHAVE_PTHREAD := $(shell printf '$(NUM_SYMBOL)include <pthread.h>\nint main(void) { return 0; }' > have_pthread.c && $(CC) $(FLAGS) -o have_pthread$(EXT) have_pthread.c -pthread 2> $(VOID) && rm have_pthread$(EXT) && echo 1 || echo 0; rm have_pthread.c) 141*22ce4affSfengbojiangHAVE_THREAD := $(shell [ "$(HAVE_PTHREAD)" -eq "1" -o -n "$(filter Windows%,$(OS))" ] && echo 1 || echo 0) 142*22ce4affSfengbojiangifeq ($(HAVE_THREAD), 1) 143*22ce4affSfengbojiang THREAD_MSG := ==> building with threading support 144*22ce4affSfengbojiang THREAD_CPP := -DZSTD_MULTITHREAD 145*22ce4affSfengbojiang THREAD_LD := -pthread 146*22ce4affSfengbojiangelse 147*22ce4affSfengbojiang THREAD_MSG := $(NO_THREAD_MSG) 148*22ce4affSfengbojiangendif 149*22ce4affSfengbojiang 150*22ce4affSfengbojiang# zlib detection 151*22ce4affSfengbojiangNO_ZLIB_MSG := ==> no zlib, building zstd without .gz support 152*22ce4affSfengbojiangHAVE_ZLIB := $(shell printf '$(NUM_SYMBOL)include <zlib.h>\nint main(void) { return 0; }' > have_zlib.c && $(CC) $(FLAGS) -o have_zlib$(EXT) have_zlib.c -lz 2> $(VOID) && rm have_zlib$(EXT) && echo 1 || echo 0; rm have_zlib.c) 153*22ce4affSfengbojiangifeq ($(HAVE_ZLIB), 1) 154*22ce4affSfengbojiang ZLIB_MSG := ==> building zstd with .gz compression support 155*22ce4affSfengbojiang ZLIBCPP = -DZSTD_GZCOMPRESS -DZSTD_GZDECOMPRESS 156*22ce4affSfengbojiang ZLIBLD = -lz 157*22ce4affSfengbojiangelse 158*22ce4affSfengbojiang ZLIB_MSG := $(NO_ZLIB_MSG) 159*22ce4affSfengbojiangendif 160*22ce4affSfengbojiang 161*22ce4affSfengbojiang# lzma detection 162*22ce4affSfengbojiangNO_LZMA_MSG := ==> no liblzma, building zstd without .xz/.lzma support 163*22ce4affSfengbojiangHAVE_LZMA := $(shell printf '$(NUM_SYMBOL)include <lzma.h>\nint main(void) { return 0; }' > have_lzma.c && $(CC) $(FLAGS) -o have_lzma$(EXT) have_lzma.c -llzma 2> $(VOID) && rm have_lzma$(EXT) && echo 1 || echo 0; rm have_lzma.c) 164*22ce4affSfengbojiangifeq ($(HAVE_LZMA), 1) 165*22ce4affSfengbojiang LZMA_MSG := ==> building zstd with .xz/.lzma compression support 166*22ce4affSfengbojiang LZMACPP = -DZSTD_LZMACOMPRESS -DZSTD_LZMADECOMPRESS 167*22ce4affSfengbojiang LZMALD = -llzma 168*22ce4affSfengbojiangelse 169*22ce4affSfengbojiang LZMA_MSG := $(NO_LZMA_MSG) 170*22ce4affSfengbojiangendif 171*22ce4affSfengbojiang 172*22ce4affSfengbojiang# lz4 detection 173*22ce4affSfengbojiangNO_LZ4_MSG := ==> no liblz4, building zstd without .lz4 support 174*22ce4affSfengbojiangHAVE_LZ4 := $(shell printf '$(NUM_SYMBOL)include <lz4frame.h>\n$(NUM_SYMBOL)include <lz4.h>\nint main(void) { return 0; }' > have_lz4.c && $(CC) $(FLAGS) -o have_lz4$(EXT) have_lz4.c -llz4 2> $(VOID) && rm have_lz4$(EXT) && echo 1 || echo 0; rm have_lz4.c) 175*22ce4affSfengbojiangifeq ($(HAVE_LZ4), 1) 176*22ce4affSfengbojiang LZ4_MSG := ==> building zstd with .lz4 compression support 177*22ce4affSfengbojiang LZ4CPP = -DZSTD_LZ4COMPRESS -DZSTD_LZ4DECOMPRESS 178*22ce4affSfengbojiang LZ4LD = -llz4 179*22ce4affSfengbojiangelse 180*22ce4affSfengbojiang LZ4_MSG := $(NO_LZ4_MSG) 181*22ce4affSfengbojiangendif 182*22ce4affSfengbojiang 183*22ce4affSfengbojiang# explicit backtrace enable/disable for Linux & Darwin 184*22ce4affSfengbojiangifeq ($(BACKTRACE), 0) 185*22ce4affSfengbojiang DEBUGFLAGS += -DBACKTRACE_ENABLE=0 186*22ce4affSfengbojiangendif 187*22ce4affSfengbojiangifeq (,$(filter Windows%, $(OS))) 188*22ce4affSfengbojiangifeq ($(BACKTRACE), 1) 189*22ce4affSfengbojiang DEBUGFLAGS += -DBACKTRACE_ENABLE=1 190*22ce4affSfengbojiang DEBUGFLAGS_LD += -rdynamic 191*22ce4affSfengbojiangendif 192*22ce4affSfengbojiangendif 193*22ce4affSfengbojiang 194*22ce4affSfengbojiangSET_CACHE_DIRECTORY = \ 195*22ce4affSfengbojiang $(MAKE) --no-print-directory $@ \ 196*22ce4affSfengbojiang BUILD_DIR=obj/$(HASH_DIR) \ 197*22ce4affSfengbojiang CPPFLAGS="$(CPPFLAGS)" \ 198*22ce4affSfengbojiang CFLAGS="$(CFLAGS)" \ 199*22ce4affSfengbojiang LDFLAGS="$(LDFLAGS)" 200*22ce4affSfengbojiang 201*22ce4affSfengbojiang 202*22ce4affSfengbojiang.PHONY: all 203*22ce4affSfengbojiangall: zstd 204*22ce4affSfengbojiang 205*22ce4affSfengbojiang.PHONY: allVariants 206*22ce4affSfengbojiangallVariants: zstd zstd-compress zstd-decompress zstd-small zstd-nolegacy zstd-dictBuilder 207*22ce4affSfengbojiang 208*22ce4affSfengbojiang.PHONY: zstd # must always be run 209*22ce4affSfengbojiangzstd : CPPFLAGS += $(THREAD_CPP) $(ZLIBCPP) $(LZMACPP) $(LZ4CPP) 210*22ce4affSfengbojiangzstd : LDFLAGS += $(THREAD_LD) $(ZLIBLD) $(LZMALD) $(LZ4LD) $(DEBUGFLAGS_LD) 211*22ce4affSfengbojiangzstd : CPPFLAGS += -DZSTD_LEGACY_SUPPORT=$(ZSTD_LEGACY_SUPPORT) 212*22ce4affSfengbojiangifneq (,$(filter Windows%,$(OS))) 213*22ce4affSfengbojiangzstd : $(RES_FILE) 214*22ce4affSfengbojiangendif 215*22ce4affSfengbojiang 216*22ce4affSfengbojiangifndef BUILD_DIR 217*22ce4affSfengbojiang# generate BUILD_DIR from flags 218*22ce4affSfengbojiang 219*22ce4affSfengbojiangzstd: 220*22ce4affSfengbojiang $(SET_CACHE_DIRECTORY) 221*22ce4affSfengbojiang 222*22ce4affSfengbojiangelse 223*22ce4affSfengbojiang# BUILD_DIR is defined 224*22ce4affSfengbojiang 225*22ce4affSfengbojiangZSTD_OBJ := $(addprefix $(BUILD_DIR)/, $(ZSTD_ALL_OBJ)) 226*22ce4affSfengbojiang$(BUILD_DIR)/zstd : $(ZSTD_OBJ) 227*22ce4affSfengbojiang @echo "$(THREAD_MSG)" 228*22ce4affSfengbojiang @echo "$(ZLIB_MSG)" 229*22ce4affSfengbojiang @echo "$(LZMA_MSG)" 230*22ce4affSfengbojiang @echo "$(LZ4_MSG)" 231*22ce4affSfengbojiang @echo LINK $@ 232*22ce4affSfengbojiang $(CC) $(FLAGS) $^ -o $@$(EXT) $(LDFLAGS) 233*22ce4affSfengbojiang 234*22ce4affSfengbojiangifeq ($(HAVE_HASH),1) 235*22ce4affSfengbojiangSRCBIN_HASH = $(shell cat $(BUILD_DIR)/zstd 2> $(VOID) | $(HASH) | cut -f 1 -d " ") 236*22ce4affSfengbojiangDSTBIN_HASH = $(shell cat zstd 2> $(VOID) | $(HASH) | cut -f 1 -d " ") 237*22ce4affSfengbojiangBIN_ISDIFFERENT = $(if $(filter $(SRCBIN_HASH),$(DSTBIN_HASH)),0,1) 238*22ce4affSfengbojiangelse 239*22ce4affSfengbojiangBIN_ISDIFFERENT = 1 240*22ce4affSfengbojiangendif 241*22ce4affSfengbojiang 242*22ce4affSfengbojiangzstd : $(BUILD_DIR)/zstd 243*22ce4affSfengbojiang if [ $(BIN_ISDIFFERENT) -eq 1 ]; then \ 244*22ce4affSfengbojiang cp -f $< $@; \ 245*22ce4affSfengbojiang echo zstd build completed; \ 246*22ce4affSfengbojiang else \ 247*22ce4affSfengbojiang echo zstd already built; \ 248*22ce4affSfengbojiang fi 249*22ce4affSfengbojiang 250*22ce4affSfengbojiangendif # BUILD_DIR 251*22ce4affSfengbojiang 252*22ce4affSfengbojiang 253*22ce4affSfengbojiang.PHONY: zstd-release 254*22ce4affSfengbojiangzstd-release: DEBUGFLAGS := -DBACKTRACE_ENABLE=0 255*22ce4affSfengbojiangzstd-release: DEBUGFLAGS_LD := 256*22ce4affSfengbojiangzstd-release: zstd 257*22ce4affSfengbojiang 258*22ce4affSfengbojiangzstd32 : CPPFLAGS += $(THREAD_CPP) 259*22ce4affSfengbojiangzstd32 : LDFLAGS += $(THREAD_LD) 260*22ce4affSfengbojiangzstd32 : CPPFLAGS += -DZSTD_LEGACY_SUPPORT=$(ZSTD_LEGACY_SUPPORT) 261*22ce4affSfengbojiangifneq (,$(filter Windows%,$(OS))) 262*22ce4affSfengbojiangzstd32 : $(RES32_FILE) 263*22ce4affSfengbojiangendif 264*22ce4affSfengbojiangzstd32 : $(ZSTDLIB_FULL_SRC) $(ZSTD_CLI_SRC) 265*22ce4affSfengbojiang $(CC) -m32 $(FLAGS) $^ -o $@$(EXT) 266*22ce4affSfengbojiang 267*22ce4affSfengbojiang## zstd-nolegacy: same scope as zstd, with just support of legacy formats removed 268*22ce4affSfengbojiangzstd-nolegacy : LDFLAGS += $(THREAD_LD) $(ZLIBLD) $(LZMALD) $(LZ4LD) $(DEBUGFLAGS_LD) 269*22ce4affSfengbojiangzstd-nolegacy : $(ZSTDLIB_CORE_SRC) $(ZDICT_SRC) $(ZSTD_CLI_OBJ) 270*22ce4affSfengbojiang $(CC) $(FLAGS) $^ -o $@$(EXT) $(LDFLAGS) 271*22ce4affSfengbojiang 272*22ce4affSfengbojiangzstd-nomt : THREAD_CPP := 273*22ce4affSfengbojiangzstd-nomt : THREAD_LD := 274*22ce4affSfengbojiangzstd-nomt : THREAD_MSG := - multi-threading disabled 275*22ce4affSfengbojiangzstd-nomt : zstd 276*22ce4affSfengbojiang 277*22ce4affSfengbojiangzstd-nogz : ZLIBCPP := 278*22ce4affSfengbojiangzstd-nogz : ZLIBLD := 279*22ce4affSfengbojiangzstd-nogz : ZLIB_MSG := - gzip support is disabled 280*22ce4affSfengbojiangzstd-nogz : zstd 281*22ce4affSfengbojiang 282*22ce4affSfengbojiangzstd-noxz : LZMACPP := 283*22ce4affSfengbojiangzstd-noxz : LZMALD := 284*22ce4affSfengbojiangzstd-noxz : LZMA_MSG := - xz/lzma support is disabled 285*22ce4affSfengbojiangzstd-noxz : zstd 286*22ce4affSfengbojiang 287*22ce4affSfengbojiang## zstd-dll: zstd executable linked to dynamic library libzstd (must already exist) 288*22ce4affSfengbojiang# note : the following target doesn't link 289*22ce4affSfengbojiang# because zstd uses non-public symbols from libzstd 290*22ce4affSfengbojiang# such as XXH64 (for benchmark), 291*22ce4affSfengbojiang# ZDICT_trainFromBuffer_unsafe_legacy (for dictionary builder) 292*22ce4affSfengbojiang# and ZSTD_cycleLog (likely for --patch-from). 293*22ce4affSfengbojiang# It's unclear at this stage if this is a scenario that must be supported 294*22ce4affSfengbojiang.PHONY: zstd-dll 295*22ce4affSfengbojiangzstd-dll : LDFLAGS+= -L$(ZSTDDIR) -lzstd 296*22ce4affSfengbojiangzstd-dll : ZSTDLIB_FULL_SRC = 297*22ce4affSfengbojiangzstd-dll : $(ZSTD_CLI_OBJ) 298*22ce4affSfengbojiang $(CC) $(FLAGS) $^ -o $@$(EXT) $(LDFLAGS) 299*22ce4affSfengbojiang 300*22ce4affSfengbojiang 301*22ce4affSfengbojiang## zstd-pgo: zstd executable optimized with PGO. 302*22ce4affSfengbojiangzstd-pgo : 303*22ce4affSfengbojiang $(MAKE) clean 304*22ce4affSfengbojiang $(MAKE) zstd MOREFLAGS=-fprofile-generate 305*22ce4affSfengbojiang ./zstd -b19i1 $(PROFILE_WITH) 306*22ce4affSfengbojiang ./zstd -b16i1 $(PROFILE_WITH) 307*22ce4affSfengbojiang ./zstd -b9i2 $(PROFILE_WITH) 308*22ce4affSfengbojiang ./zstd -b $(PROFILE_WITH) 309*22ce4affSfengbojiang ./zstd -b7i2 $(PROFILE_WITH) 310*22ce4affSfengbojiang ./zstd -b5 $(PROFILE_WITH) 311*22ce4affSfengbojiang $(RM) zstd *.o 312*22ce4affSfengbojiang case $(CC) in *clang*) if ! [ -e default.profdata ]; then llvm-profdata merge -output=default.profdata default*.profraw; fi ;; esac 313*22ce4affSfengbojiang $(MAKE) zstd MOREFLAGS=-fprofile-use 314*22ce4affSfengbojiang 315*22ce4affSfengbojiang## zstd-small: minimal target, supporting only zstd compression and decompression. no bench. no legacy. no other format. 316*22ce4affSfengbojiangzstd-small: CFLAGS = -Os -s 317*22ce4affSfengbojiangzstd-frugal zstd-small: $(ZSTDLIB_CORE_SRC) zstdcli.c util.c timefn.c fileio.c 318*22ce4affSfengbojiang $(CC) $(FLAGS) -DZSTD_NOBENCH -DZSTD_NODICT $^ -o $@$(EXT) 319*22ce4affSfengbojiang 320*22ce4affSfengbojiangzstd-decompress: $(ZSTDLIB_COMMON_C) $(ZSTDLIB_DECOMPRESS_C) zstdcli.c util.c timefn.c fileio.c 321*22ce4affSfengbojiang $(CC) $(FLAGS) -DZSTD_NOBENCH -DZSTD_NODICT -DZSTD_NOCOMPRESS $^ -o $@$(EXT) 322*22ce4affSfengbojiang 323*22ce4affSfengbojiangzstd-compress: $(ZSTDLIB_COMMON_C) $(ZSTDLIB_COMPRESS_C) zstdcli.c util.c timefn.c fileio.c 324*22ce4affSfengbojiang $(CC) $(FLAGS) -DZSTD_NOBENCH -DZSTD_NODICT -DZSTD_NODECOMPRESS $^ -o $@$(EXT) 325*22ce4affSfengbojiang 326*22ce4affSfengbojiang## zstd-dictBuilder: executable supporting dictionary creation and compression (only) 327*22ce4affSfengbojiangzstd-dictBuilder: CPPFLAGS += -DZSTD_NOBENCH -DZSTD_NODECOMPRESS 328*22ce4affSfengbojiangzstd-dictBuilder: $(ZSTDLIB_COMMON_C) $(ZSTDLIB_COMPRESS_C) $(ZDICT_SRC) zstdcli.c util.c timefn.c fileio.c dibio.c 329*22ce4affSfengbojiang $(CC) $(FLAGS) $^ -o $@$(EXT) 330*22ce4affSfengbojiang 331*22ce4affSfengbojiangzstdmt: zstd 332*22ce4affSfengbojiang ln -sf zstd zstdmt 333*22ce4affSfengbojiang 334*22ce4affSfengbojiang.PHONY: generate_res 335*22ce4affSfengbojianggenerate_res: $(RES64_FILE) $(RES32_FILE) 336*22ce4affSfengbojiang 337*22ce4affSfengbojiangifneq (,$(filter Windows%,$(OS))) 338*22ce4affSfengbojiangRC ?= windres 339*22ce4affSfengbojiang# http://stackoverflow.com/questions/708238/how-do-i-add-an-icon-to-a-mingw-gcc-compiled-executable 340*22ce4affSfengbojiang$(RES64_FILE): windres/zstd.rc 341*22ce4affSfengbojiang $(RC) -o $@ -I ../lib -I windres -i $< -O coff -F pe-x86-64 342*22ce4affSfengbojiang$(RES32_FILE): windres/zstd.rc 343*22ce4affSfengbojiang $(RC) -o $@ -I ../lib -I windres -i $< -O coff -F pe-i386 344*22ce4affSfengbojiangendif 345*22ce4affSfengbojiang 346*22ce4affSfengbojiang.PHONY: clean 347*22ce4affSfengbojiangclean: 348*22ce4affSfengbojiang $(RM) core *.o tmp* result* *.gcda dictionary *.zst \ 349*22ce4affSfengbojiang zstd$(EXT) zstd32$(EXT) zstd-compress$(EXT) zstd-decompress$(EXT) \ 350*22ce4affSfengbojiang zstd-small$(EXT) zstd-frugal$(EXT) zstd-nolegacy$(EXT) zstd4$(EXT) \ 351*22ce4affSfengbojiang zstd-dictBuilder$(EXT) *.gcda default*.profraw default.profdata have_zlib$(EXT) 352*22ce4affSfengbojiang $(RM) -r obj/* 353*22ce4affSfengbojiang @echo Cleaning completed 354*22ce4affSfengbojiang 355*22ce4affSfengbojiangMD2ROFF = ronn 356*22ce4affSfengbojiangMD2ROFF_FLAGS = --roff --warnings --manual="User Commands" --organization="zstd $(ZSTD_VERSION)" 357*22ce4affSfengbojiang 358*22ce4affSfengbojiangzstd.1: zstd.1.md ../lib/zstd.h 359*22ce4affSfengbojiang cat $< | $(MD2ROFF) $(MD2ROFF_FLAGS) | sed -n '/^\.\\\".*/!p' > $@ 360*22ce4affSfengbojiang 361*22ce4affSfengbojiangzstdgrep.1: zstdgrep.1.md ../lib/zstd.h 362*22ce4affSfengbojiang cat $< | $(MD2ROFF) $(MD2ROFF_FLAGS) | sed -n '/^\.\\\".*/!p' > $@ 363*22ce4affSfengbojiang 364*22ce4affSfengbojiangzstdless.1: zstdless.1.md ../lib/zstd.h 365*22ce4affSfengbojiang cat $< | $(MD2ROFF) $(MD2ROFF_FLAGS) | sed -n '/^\.\\\".*/!p' > $@ 366*22ce4affSfengbojiang 367*22ce4affSfengbojiang.PHONY: man 368*22ce4affSfengbojiangman: zstd.1 zstdgrep.1 zstdless.1 369*22ce4affSfengbojiang 370*22ce4affSfengbojiang.PHONY: clean-man 371*22ce4affSfengbojiangclean-man: 372*22ce4affSfengbojiang $(RM) zstd.1 373*22ce4affSfengbojiang $(RM) zstdgrep.1 374*22ce4affSfengbojiang $(RM) zstdless.1 375*22ce4affSfengbojiang 376*22ce4affSfengbojiang.PHONY: preview-man 377*22ce4affSfengbojiangpreview-man: clean-man man 378*22ce4affSfengbojiang man ./zstd.1 379*22ce4affSfengbojiang man ./zstdgrep.1 380*22ce4affSfengbojiang man ./zstdless.1 381*22ce4affSfengbojiang 382*22ce4affSfengbojiang 383*22ce4affSfengbojiang# Generate .h dependencies automatically 384*22ce4affSfengbojiang 385*22ce4affSfengbojiangDEPFLAGS = -MT $@ -MMD -MP -MF 386*22ce4affSfengbojiang 387*22ce4affSfengbojiang$(BUILD_DIR)/%.o : %.c $(BUILD_DIR)/%.d | $(BUILD_DIR) 388*22ce4affSfengbojiang @echo CC $@ 389*22ce4affSfengbojiang $(COMPILE.c) $(DEPFLAGS) $(BUILD_DIR)/$*.d $(OUTPUT_OPTION) $< 390*22ce4affSfengbojiang 391*22ce4affSfengbojiangMKDIR ?= mkdir 392*22ce4affSfengbojiang$(BUILD_DIR): ; $(MKDIR) -p $@ 393*22ce4affSfengbojiang 394*22ce4affSfengbojiangDEPFILES := $(ZSTD_OBJ:.o=.d) 395*22ce4affSfengbojiang$(DEPFILES): 396*22ce4affSfengbojiang 397*22ce4affSfengbojianginclude $(wildcard $(DEPFILES)) 398*22ce4affSfengbojiang 399*22ce4affSfengbojiang 400*22ce4affSfengbojiang 401*22ce4affSfengbojiang#----------------------------------------------------------------------------- 402*22ce4affSfengbojiang# make install is validated only for Linux, macOS, BSD, Hurd and Solaris targets 403*22ce4affSfengbojiang#----------------------------------------------------------------------------- 404*22ce4affSfengbojiangifneq (,$(filter $(UNAME),Linux Darwin GNU/kFreeBSD GNU OpenBSD FreeBSD NetBSD DragonFly SunOS Haiku)) 405*22ce4affSfengbojiang 406*22ce4affSfengbojiangHAVE_COLORNEVER = $(shell echo a | egrep --color=never a > /dev/null 2> /dev/null && echo 1 || echo 0) 407*22ce4affSfengbojiangEGREP_OPTIONS ?= 408*22ce4affSfengbojiangifeq ($HAVE_COLORNEVER, 1) 409*22ce4affSfengbojiang EGREP_OPTIONS += --color=never 410*22ce4affSfengbojiangendif 411*22ce4affSfengbojiangEGREP = egrep $(EGREP_OPTIONS) 412*22ce4affSfengbojiangAWK = awk 413*22ce4affSfengbojiang 414*22ce4affSfengbojiang# Print a two column output of targets and their description. To add a target description, put a 415*22ce4affSfengbojiang# comment in the Makefile with the format "## <TARGET>: <DESCRIPTION>". For example: 416*22ce4affSfengbojiang# 417*22ce4affSfengbojiang## list: Print all targets and their descriptions (if provided) 418*22ce4affSfengbojiang.PHONY: list 419*22ce4affSfengbojianglist: 420*22ce4affSfengbojiang TARGETS=$$($(MAKE) -pRrq -f $(lastword $(MAKEFILE_LIST)) : 2>/dev/null \ 421*22ce4affSfengbojiang | $(AWK) -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' \ 422*22ce4affSfengbojiang | $(EGREP) -v -e '^[^[:alnum:]]' | sort); \ 423*22ce4affSfengbojiang { \ 424*22ce4affSfengbojiang printf "Target Name\tDescription\n"; \ 425*22ce4affSfengbojiang printf "%0.s-" {1..16}; printf "\t"; printf "%0.s-" {1..40}; printf "\n"; \ 426*22ce4affSfengbojiang for target in $$TARGETS; do \ 427*22ce4affSfengbojiang line=$$($(EGREP) "^##[[:space:]]+$$target:" $(lastword $(MAKEFILE_LIST))); \ 428*22ce4affSfengbojiang description=$$(echo $$line | $(AWK) '{i=index($$0,":"); print substr($$0,i+1)}' | xargs); \ 429*22ce4affSfengbojiang printf "$$target\t$$description\n"; \ 430*22ce4affSfengbojiang done \ 431*22ce4affSfengbojiang } | column -t -s $$'\t' 432*22ce4affSfengbojiang 433*22ce4affSfengbojiang 434*22ce4affSfengbojiangDESTDIR ?= 435*22ce4affSfengbojiang# directory variables : GNU conventions prefer lowercase 436*22ce4affSfengbojiang# see https://www.gnu.org/prep/standards/html_node/Makefile-Conventions.html 437*22ce4affSfengbojiang# support both lower and uppercase (BSD), use uppercase in script 438*22ce4affSfengbojiangprefix ?= /usr/local 439*22ce4affSfengbojiangPREFIX ?= $(prefix) 440*22ce4affSfengbojiangexec_prefix ?= $(PREFIX) 441*22ce4affSfengbojiangbindir ?= $(exec_prefix)/bin 442*22ce4affSfengbojiangBINDIR ?= $(bindir) 443*22ce4affSfengbojiangdatarootdir ?= $(PREFIX)/share 444*22ce4affSfengbojiangmandir ?= $(datarootdir)/man 445*22ce4affSfengbojiangman1dir ?= $(mandir)/man1 446*22ce4affSfengbojiang 447*22ce4affSfengbojiangifneq (,$(filter $(UNAME),OpenBSD FreeBSD NetBSD DragonFly SunOS)) 448*22ce4affSfengbojiang MANDIR ?= $(PREFIX)/man 449*22ce4affSfengbojiang MAN1DIR ?= $(MANDIR)/man1 450*22ce4affSfengbojiangelse 451*22ce4affSfengbojiang MAN1DIR ?= $(man1dir) 452*22ce4affSfengbojiangendif 453*22ce4affSfengbojiang 454*22ce4affSfengbojiangifneq (,$(filter $(UNAME),SunOS)) 455*22ce4affSfengbojiang INSTALL ?= ginstall 456*22ce4affSfengbojiangelse 457*22ce4affSfengbojiang INSTALL ?= install 458*22ce4affSfengbojiangendif 459*22ce4affSfengbojiang 460*22ce4affSfengbojiangINSTALL_PROGRAM ?= $(INSTALL) 461*22ce4affSfengbojiangINSTALL_SCRIPT ?= $(INSTALL_PROGRAM) 462*22ce4affSfengbojiangINSTALL_DATA ?= $(INSTALL) -m 644 463*22ce4affSfengbojiangINSTALL_MAN ?= $(INSTALL_DATA) 464*22ce4affSfengbojiang 465*22ce4affSfengbojiang.PHONY: install 466*22ce4affSfengbojianginstall: 467*22ce4affSfengbojiang # generate zstd only if not already present 468*22ce4affSfengbojiang [ -e zstd ] || $(MAKE) zstd-release 469*22ce4affSfengbojiang [ -e $(DESTDIR)$(BINDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(BINDIR)/ 470*22ce4affSfengbojiang [ -e $(DESTDIR)$(MAN1DIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(MAN1DIR)/ 471*22ce4affSfengbojiang @echo Installing binaries 472*22ce4affSfengbojiang $(INSTALL_PROGRAM) zstd$(EXT) $(DESTDIR)$(BINDIR)/zstd$(EXT) 473*22ce4affSfengbojiang ln -sf zstd$(EXT) $(DESTDIR)$(BINDIR)/zstdcat$(EXT) 474*22ce4affSfengbojiang ln -sf zstd$(EXT) $(DESTDIR)$(BINDIR)/unzstd$(EXT) 475*22ce4affSfengbojiang ln -sf zstd$(EXT) $(DESTDIR)$(BINDIR)/zstdmt$(EXT) 476*22ce4affSfengbojiang $(INSTALL_SCRIPT) zstdless $(DESTDIR)$(BINDIR)/zstdless 477*22ce4affSfengbojiang $(INSTALL_SCRIPT) zstdgrep $(DESTDIR)$(BINDIR)/zstdgrep 478*22ce4affSfengbojiang @echo Installing man pages 479*22ce4affSfengbojiang $(INSTALL_MAN) zstd.1 $(DESTDIR)$(MAN1DIR)/zstd.1 480*22ce4affSfengbojiang ln -sf zstd.1 $(DESTDIR)$(MAN1DIR)/zstdcat.1 481*22ce4affSfengbojiang ln -sf zstd.1 $(DESTDIR)$(MAN1DIR)/unzstd.1 482*22ce4affSfengbojiang $(INSTALL_MAN) zstdgrep.1 $(DESTDIR)$(MAN1DIR)/zstdgrep.1 483*22ce4affSfengbojiang $(INSTALL_MAN) zstdless.1 $(DESTDIR)$(MAN1DIR)/zstdless.1 484*22ce4affSfengbojiang @echo zstd installation completed 485*22ce4affSfengbojiang 486*22ce4affSfengbojiang.PHONY: uninstall 487*22ce4affSfengbojianguninstall: 488*22ce4affSfengbojiang $(RM) $(DESTDIR)$(BINDIR)/zstdgrep 489*22ce4affSfengbojiang $(RM) $(DESTDIR)$(BINDIR)/zstdless 490*22ce4affSfengbojiang $(RM) $(DESTDIR)$(BINDIR)/zstdcat 491*22ce4affSfengbojiang $(RM) $(DESTDIR)$(BINDIR)/unzstd 492*22ce4affSfengbojiang $(RM) $(DESTDIR)$(BINDIR)/zstdmt 493*22ce4affSfengbojiang $(RM) $(DESTDIR)$(BINDIR)/zstd 494*22ce4affSfengbojiang $(RM) $(DESTDIR)$(MAN1DIR)/zstdless.1 495*22ce4affSfengbojiang $(RM) $(DESTDIR)$(MAN1DIR)/zstdgrep.1 496*22ce4affSfengbojiang $(RM) $(DESTDIR)$(MAN1DIR)/zstdcat.1 497*22ce4affSfengbojiang $(RM) $(DESTDIR)$(MAN1DIR)/unzstd.1 498*22ce4affSfengbojiang $(RM) $(DESTDIR)$(MAN1DIR)/zstd.1 499*22ce4affSfengbojiang @echo zstd programs successfully uninstalled 500*22ce4affSfengbojiang 501*22ce4affSfengbojiangendif 502