1653667f9SBaptiste Daroussin# ################################################################ 2b3392d84SAllan Jude# Copyright (c) Yann Collet, Facebook, Inc. 3a19eddc3SBaptiste Daroussin# All rights reserved. 4a19eddc3SBaptiste Daroussin# 5653667f9SBaptiste Daroussin# This source code is licensed under both the BSD-style license (found in the 6653667f9SBaptiste Daroussin# LICENSE file in the root directory of this source tree) and the GPLv2 (found 7653667f9SBaptiste Daroussin# in the COPYING file in the root directory of this source tree). 8bc64b5ceSConrad Meyer# You may select, at your option, one of the above-listed licenses. 9a19eddc3SBaptiste Daroussin# ########################################################################## 10a19eddc3SBaptiste Daroussin# zstd : Command Line Utility, supporting gzip-like arguments 11a19eddc3SBaptiste Daroussin# zstd32 : Same as zstd, but forced to compile in 32-bits mode 12b3392d84SAllan Jude# zstd-nolegacy : zstd without support of decompression of legacy versions 13a19eddc3SBaptiste Daroussin# zstd-small : minimal zstd without dictionary builder and benchmark 14a19eddc3SBaptiste Daroussin# zstd-compress : compressor-only version of zstd 15a19eddc3SBaptiste Daroussin# zstd-decompress : decompressor-only version of zstd 16a19eddc3SBaptiste Daroussin# ########################################################################## 17a19eddc3SBaptiste Daroussin 18f6ae9767SConrad Meyer.PHONY: default 19f6ae9767SConrad Meyerdefault: zstd-release 20f6ae9767SConrad Meyer 21b3392d84SAllan JudeLIBZSTD := ../lib 22f6ae9767SConrad Meyer 23b3392d84SAllan Judeinclude $(LIBZSTD)/libzstd.mk 24706cfae4SConrad Meyer 25706cfae4SConrad Meyerifeq ($(shell $(CC) -v 2>&1 | $(GREP) -c "gcc version "), 1) 26a19eddc3SBaptiste Daroussin ALIGN_LOOP = -falign-loops=32 27a19eddc3SBaptiste Daroussinelse 28a19eddc3SBaptiste Daroussin ALIGN_LOOP = 29a19eddc3SBaptiste Daroussinendif 30a19eddc3SBaptiste Daroussin 31b3392d84SAllan JudeZSTDLIB_COMMON_SRC := $(sort $(ZSTD_COMMON_FILES)) 32b3392d84SAllan JudeZSTDLIB_COMPRESS_SRC := $(sort $(ZSTD_COMPRESS_FILES)) 33b3392d84SAllan JudeZSTDLIB_DECOMPRESS_SRC := $(sort $(ZSTD_DECOMPRESS_FILES)) 34b3392d84SAllan JudeZSTDLIB_CORE_SRC := $(sort $(ZSTD_DECOMPRESS_FILES) $(ZSTD_COMMON_FILES) $(ZSTD_COMPRESS_FILES)) 35b3392d84SAllan JudeZDICT_SRC := $(sort $(ZSTD_DICTBUILDER_FILES)) 36b3392d84SAllan JudeZSTDLEGACY_SRC := $(sort $(ZSTD_LEGACY_FILES)) 37a19eddc3SBaptiste Daroussin 381767cc49SConrad Meyer# Sort files in alphabetical order for reproducible builds 39f6ae9767SConrad MeyerZSTDLIB_FULL_SRC = $(sort $(ZSTDLIB_CORE_SRC) $(ZSTDLEGACY_SRC) $(ZDICT_SRC)) 40b3392d84SAllan JudeZSTDLIB_LOCAL_SRC = $(notdir $(ZSTDLIB_FULL_SRC)) 41b3392d84SAllan JudeZSTDLIB_LOCAL_OBJ0 := $(ZSTDLIB_LOCAL_SRC:.c=.o) 42b3392d84SAllan JudeZSTDLIB_LOCAL_OBJ := $(ZSTDLIB_LOCAL_OBJ0:.S=.o) 43a19eddc3SBaptiste Daroussin 44b3392d84SAllan JudeZSTD_CLI_SRC := $(sort $(wildcard *.c)) 45f6ae9767SConrad MeyerZSTD_CLI_OBJ := $(ZSTD_CLI_SRC:.c=.o) 46f6ae9767SConrad Meyer 47b3392d84SAllan JudeZSTD_ALL_SRC = $(ZSTDLIB_LOCAL_SRC) $(ZSTD_CLI_SRC) 48b3392d84SAllan JudeZSTD_ALL_OBJ0 := $(ZSTD_ALL_SRC:.c=.o) 49b3392d84SAllan JudeZSTD_ALL_OBJ := $(ZSTD_ALL_OBJ0:.S=.o) 50bc64b5ceSConrad Meyer 51a19eddc3SBaptiste Daroussin# Define *.exe as extension for Windows systems 52a19eddc3SBaptiste Daroussinifneq (,$(filter Windows%,$(OS))) 53a19eddc3SBaptiste Daroussin EXT =.exe 54a19eddc3SBaptiste Daroussin RES64_FILE = windres/zstd64.res 55a19eddc3SBaptiste Daroussin RES32_FILE = windres/zstd32.res 56a19eddc3SBaptiste Daroussinifneq (,$(filter x86_64%,$(shell $(CC) -dumpmachine))) 57a19eddc3SBaptiste Daroussin RES_FILE = $(RES64_FILE) 58a19eddc3SBaptiste Daroussinelse 59a19eddc3SBaptiste Daroussin RES_FILE = $(RES32_FILE) 60a19eddc3SBaptiste Daroussinendif 61a19eddc3SBaptiste Daroussinelse 62a19eddc3SBaptiste Daroussin EXT = 63a19eddc3SBaptiste Daroussinendif 64a19eddc3SBaptiste Daroussin 65ffcbc2d7SBaptiste Daroussin# thread detection 66ffcbc2d7SBaptiste DaroussinNO_THREAD_MSG := ==> no threads, building without multithreading support 67bc64b5ceSConrad MeyerHAVE_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) 68ffcbc2d7SBaptiste DaroussinHAVE_THREAD := $(shell [ "$(HAVE_PTHREAD)" -eq "1" -o -n "$(filter Windows%,$(OS))" ] && echo 1 || echo 0) 69ffcbc2d7SBaptiste Daroussinifeq ($(HAVE_THREAD), 1) 70ffcbc2d7SBaptiste Daroussin THREAD_MSG := ==> building with threading support 71ffcbc2d7SBaptiste Daroussin THREAD_CPP := -DZSTD_MULTITHREAD 72ffcbc2d7SBaptiste Daroussin THREAD_LD := -pthread 73ffcbc2d7SBaptiste Daroussinelse 74ffcbc2d7SBaptiste Daroussin THREAD_MSG := $(NO_THREAD_MSG) 75ffcbc2d7SBaptiste Daroussinendif 76ffcbc2d7SBaptiste Daroussin 77a19eddc3SBaptiste Daroussin# zlib detection 78a19eddc3SBaptiste DaroussinNO_ZLIB_MSG := ==> no zlib, building zstd without .gz support 79b3392d84SAllan JudeHAVE_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) 80a19eddc3SBaptiste Daroussinifeq ($(HAVE_ZLIB), 1) 81a19eddc3SBaptiste Daroussin ZLIB_MSG := ==> building zstd with .gz compression support 82a19eddc3SBaptiste Daroussin ZLIBCPP = -DZSTD_GZCOMPRESS -DZSTD_GZDECOMPRESS 83a19eddc3SBaptiste Daroussin ZLIBLD = -lz 84a19eddc3SBaptiste Daroussinelse 85a19eddc3SBaptiste Daroussin ZLIB_MSG := $(NO_ZLIB_MSG) 86a19eddc3SBaptiste Daroussinendif 87ffcbc2d7SBaptiste Daroussin 88a19eddc3SBaptiste Daroussin# lzma detection 89a19eddc3SBaptiste DaroussinNO_LZMA_MSG := ==> no liblzma, building zstd without .xz/.lzma support 90b3392d84SAllan JudeHAVE_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) 91a19eddc3SBaptiste Daroussinifeq ($(HAVE_LZMA), 1) 92a19eddc3SBaptiste Daroussin LZMA_MSG := ==> building zstd with .xz/.lzma compression support 93a19eddc3SBaptiste Daroussin LZMACPP = -DZSTD_LZMACOMPRESS -DZSTD_LZMADECOMPRESS 94a19eddc3SBaptiste Daroussin LZMALD = -llzma 95a19eddc3SBaptiste Daroussinelse 96a19eddc3SBaptiste Daroussin LZMA_MSG := $(NO_LZMA_MSG) 97a19eddc3SBaptiste Daroussinendif 98a19eddc3SBaptiste Daroussin 99ffcbc2d7SBaptiste Daroussin# lz4 detection 100ffcbc2d7SBaptiste DaroussinNO_LZ4_MSG := ==> no liblz4, building zstd without .lz4 support 101b3392d84SAllan JudeHAVE_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) 102ffcbc2d7SBaptiste Daroussinifeq ($(HAVE_LZ4), 1) 103ffcbc2d7SBaptiste Daroussin LZ4_MSG := ==> building zstd with .lz4 compression support 104ffcbc2d7SBaptiste Daroussin LZ4CPP = -DZSTD_LZ4COMPRESS -DZSTD_LZ4DECOMPRESS 105ffcbc2d7SBaptiste Daroussin LZ4LD = -llz4 106ffcbc2d7SBaptiste Daroussinelse 107ffcbc2d7SBaptiste Daroussin LZ4_MSG := $(NO_LZ4_MSG) 108ffcbc2d7SBaptiste Daroussinendif 109a19eddc3SBaptiste Daroussin 110706cfae4SConrad Meyer# explicit backtrace enable/disable for Linux & Darwin 111706cfae4SConrad Meyerifeq ($(BACKTRACE), 0) 112706cfae4SConrad Meyer DEBUGFLAGS += -DBACKTRACE_ENABLE=0 113706cfae4SConrad Meyerendif 114706cfae4SConrad Meyerifeq (,$(filter Windows%, $(OS))) 115706cfae4SConrad Meyerifeq ($(BACKTRACE), 1) 116706cfae4SConrad Meyer DEBUGFLAGS += -DBACKTRACE_ENABLE=1 117706cfae4SConrad Meyer DEBUGFLAGS_LD += -rdynamic 118706cfae4SConrad Meyerendif 119706cfae4SConrad Meyerendif 120706cfae4SConrad Meyer 121f6ae9767SConrad MeyerSET_CACHE_DIRECTORY = \ 122b3392d84SAllan Jude +$(MAKE) --no-print-directory $@ \ 123f6ae9767SConrad Meyer BUILD_DIR=obj/$(HASH_DIR) \ 124f6ae9767SConrad Meyer CPPFLAGS="$(CPPFLAGS)" \ 125f6ae9767SConrad Meyer CFLAGS="$(CFLAGS)" \ 126b3392d84SAllan Jude LDFLAGS="$(LDFLAGS)" \ 127b3392d84SAllan Jude LDLIBS="$(LDLIBS)" \ 128b3392d84SAllan Jude ZSTD_ALL_SRC="$(ZSTD_ALL_SRC)" 129706cfae4SConrad Meyer 130a19eddc3SBaptiste Daroussin 131902c8ce7SBaptiste Daroussin.PHONY: all 132a19eddc3SBaptiste Daroussinall: zstd 133a19eddc3SBaptiste Daroussin 134902c8ce7SBaptiste Daroussin.PHONY: allVariants 135b3392d84SAllan JudeallVariants: zstd zstd-compress zstd-decompress zstd-small zstd-frugal zstd-nolegacy zstd-dictBuilder 136902c8ce7SBaptiste Daroussin 137f6ae9767SConrad Meyer.PHONY: zstd # must always be run 138653667f9SBaptiste Daroussinzstd : CPPFLAGS += $(THREAD_CPP) $(ZLIBCPP) $(LZMACPP) $(LZ4CPP) 139b3392d84SAllan Judezstd : LDFLAGS += $(THREAD_LD) $(DEBUGFLAGS_LD) 140b3392d84SAllan Judezstd : LDLIBS += $(ZLIBLD) $(LZMALD) $(LZ4LD) 141653667f9SBaptiste Daroussinzstd : CPPFLAGS += -DZSTD_LEGACY_SUPPORT=$(ZSTD_LEGACY_SUPPORT) 142bc64b5ceSConrad Meyerifneq (,$(filter Windows%,$(OS))) 143bc64b5ceSConrad Meyerzstd : $(RES_FILE) 144bc64b5ceSConrad Meyerendif 145f6ae9767SConrad Meyer 146f6ae9767SConrad Meyerifndef BUILD_DIR 147f6ae9767SConrad Meyer# generate BUILD_DIR from flags 148f6ae9767SConrad Meyer 149f6ae9767SConrad Meyerzstd: 150f6ae9767SConrad Meyer $(SET_CACHE_DIRECTORY) 151f6ae9767SConrad Meyer 152f6ae9767SConrad Meyerelse 153f6ae9767SConrad Meyer# BUILD_DIR is defined 154f6ae9767SConrad Meyer 155f6ae9767SConrad MeyerZSTD_OBJ := $(addprefix $(BUILD_DIR)/, $(ZSTD_ALL_OBJ)) 156f6ae9767SConrad Meyer$(BUILD_DIR)/zstd : $(ZSTD_OBJ) 157ffcbc2d7SBaptiste Daroussin @echo "$(THREAD_MSG)" 158a19eddc3SBaptiste Daroussin @echo "$(ZLIB_MSG)" 159a19eddc3SBaptiste Daroussin @echo "$(LZMA_MSG)" 160ffcbc2d7SBaptiste Daroussin @echo "$(LZ4_MSG)" 161f6ae9767SConrad Meyer @echo LINK $@ 162b3392d84SAllan Jude $(CC) $(FLAGS) $^ $(LDLIBS) -o $@$(EXT) 163a19eddc3SBaptiste Daroussin 164f6ae9767SConrad Meyerifeq ($(HAVE_HASH),1) 165b3392d84SAllan JudeSRCBIN_HASH = $(shell cat $(BUILD_DIR)/zstd$(EXT) 2> $(VOID) | $(HASH) | cut -f 1 -d " ") 166b3392d84SAllan JudeDSTBIN_HASH = $(shell cat zstd$(EXT) 2> $(VOID) | $(HASH) | cut -f 1 -d " ") 167f6ae9767SConrad MeyerBIN_ISDIFFERENT = $(if $(filter $(SRCBIN_HASH),$(DSTBIN_HASH)),0,1) 168f6ae9767SConrad Meyerelse 169f6ae9767SConrad MeyerBIN_ISDIFFERENT = 1 170f6ae9767SConrad Meyerendif 171f6ae9767SConrad Meyer 172f6ae9767SConrad Meyerzstd : $(BUILD_DIR)/zstd 173f6ae9767SConrad Meyer if [ $(BIN_ISDIFFERENT) -eq 1 ]; then \ 174b3392d84SAllan Jude cp -f $<$(EXT) $@$(EXT); \ 175f6ae9767SConrad Meyer echo zstd build completed; \ 176f6ae9767SConrad Meyer else \ 177f6ae9767SConrad Meyer echo zstd already built; \ 178f6ae9767SConrad Meyer fi 179f6ae9767SConrad Meyer 180f6ae9767SConrad Meyerendif # BUILD_DIR 181f6ae9767SConrad Meyer 182f6ae9767SConrad Meyer 183902c8ce7SBaptiste Daroussin.PHONY: zstd-release 184706cfae4SConrad Meyerzstd-release: DEBUGFLAGS := -DBACKTRACE_ENABLE=0 185706cfae4SConrad Meyerzstd-release: DEBUGFLAGS_LD := 186a19eddc3SBaptiste Daroussinzstd-release: zstd 187a19eddc3SBaptiste Daroussin 18842239e68SConrad Meyerzstd32 : CPPFLAGS += $(THREAD_CPP) 18942239e68SConrad Meyerzstd32 : LDFLAGS += $(THREAD_LD) 190a19eddc3SBaptiste Daroussinzstd32 : CPPFLAGS += -DZSTD_LEGACY_SUPPORT=$(ZSTD_LEGACY_SUPPORT) 191a19eddc3SBaptiste Daroussinifneq (,$(filter Windows%,$(OS))) 192bc64b5ceSConrad Meyerzstd32 : $(RES32_FILE) 193a19eddc3SBaptiste Daroussinendif 194f6ae9767SConrad Meyerzstd32 : $(ZSTDLIB_FULL_SRC) $(ZSTD_CLI_SRC) 195bc64b5ceSConrad Meyer $(CC) -m32 $(FLAGS) $^ -o $@$(EXT) 196a19eddc3SBaptiste Daroussin 197bc64b5ceSConrad Meyer## zstd-nolegacy: same scope as zstd, with just support of legacy formats removed 198bc64b5ceSConrad Meyerzstd-nolegacy : LDFLAGS += $(THREAD_LD) $(ZLIBLD) $(LZMALD) $(LZ4LD) $(DEBUGFLAGS_LD) 199b3392d84SAllan Judezstd-nolegacy : CPPFLAGS += -UZSTD_LEGACY_SUPPORT -DZSTD_LEGACY_SUPPORT=0 200f6ae9767SConrad Meyerzstd-nolegacy : $(ZSTDLIB_CORE_SRC) $(ZDICT_SRC) $(ZSTD_CLI_OBJ) 201902c8ce7SBaptiste Daroussin $(CC) $(FLAGS) $^ -o $@$(EXT) $(LDFLAGS) 202a19eddc3SBaptiste Daroussin 203b3392d84SAllan Jude.PHONY: zstd-nomt 204ffcbc2d7SBaptiste Daroussinzstd-nomt : THREAD_CPP := 205ffcbc2d7SBaptiste Daroussinzstd-nomt : THREAD_LD := 206ffcbc2d7SBaptiste Daroussinzstd-nomt : THREAD_MSG := - multi-threading disabled 207ffcbc2d7SBaptiste Daroussinzstd-nomt : zstd 208ffcbc2d7SBaptiste Daroussin 209b3392d84SAllan Jude.PHONY: zstd-nogz 210ffcbc2d7SBaptiste Daroussinzstd-nogz : ZLIBCPP := 211ffcbc2d7SBaptiste Daroussinzstd-nogz : ZLIBLD := 212ffcbc2d7SBaptiste Daroussinzstd-nogz : ZLIB_MSG := - gzip support is disabled 213ffcbc2d7SBaptiste Daroussinzstd-nogz : zstd 214ffcbc2d7SBaptiste Daroussin 215b3392d84SAllan Jude.PHONY: zstd-noxz 216affe9eafSBaptiste Daroussinzstd-noxz : LZMACPP := 217affe9eafSBaptiste Daroussinzstd-noxz : LZMALD := 218affe9eafSBaptiste Daroussinzstd-noxz : LZMA_MSG := - xz/lzma support is disabled 219affe9eafSBaptiste Daroussinzstd-noxz : zstd 220affe9eafSBaptiste Daroussin 221b3392d84SAllan Jude## zstd-dll: zstd executable linked to dynamic library libzstd (must have same version) 222bc64b5ceSConrad Meyer.PHONY: zstd-dll 223b3392d84SAllan Judezstd-dll : LDFLAGS+= -L$(LIBZSTD) 224b3392d84SAllan Judezstd-dll : LDLIBS += -lzstd 225b3392d84SAllan Judezstd-dll : ZSTDLIB_LOCAL_SRC = xxhash.c 226b3392d84SAllan Judezstd-dll : zstd 227ffcbc2d7SBaptiste Daroussin 228bc64b5ceSConrad Meyer 229f6ae9767SConrad Meyer## zstd-pgo: zstd executable optimized with PGO. 230b3392d84SAllan Jude.PHONY: zstd-pgo 231af73257bSConrad Meyerzstd-pgo : 232af73257bSConrad Meyer $(MAKE) clean 233af73257bSConrad Meyer $(MAKE) zstd MOREFLAGS=-fprofile-generate 234a19eddc3SBaptiste Daroussin ./zstd -b19i1 $(PROFILE_WITH) 235a19eddc3SBaptiste Daroussin ./zstd -b16i1 $(PROFILE_WITH) 236a19eddc3SBaptiste Daroussin ./zstd -b9i2 $(PROFILE_WITH) 237a19eddc3SBaptiste Daroussin ./zstd -b $(PROFILE_WITH) 238a19eddc3SBaptiste Daroussin ./zstd -b7i2 $(PROFILE_WITH) 239a19eddc3SBaptiste Daroussin ./zstd -b5 $(PROFILE_WITH) 240f6ae9767SConrad Meyer $(RM) zstd *.o 241bc64b5ceSConrad Meyer case $(CC) in *clang*) if ! [ -e default.profdata ]; then llvm-profdata merge -output=default.profdata default*.profraw; fi ;; esac 242a19eddc3SBaptiste Daroussin $(MAKE) zstd MOREFLAGS=-fprofile-use 243a19eddc3SBaptiste Daroussin 244bc64b5ceSConrad Meyer## zstd-small: minimal target, supporting only zstd compression and decompression. no bench. no legacy. no other format. 245902c8ce7SBaptiste Daroussinzstd-small: CFLAGS = -Os -s 246f6ae9767SConrad Meyerzstd-frugal zstd-small: $(ZSTDLIB_CORE_SRC) zstdcli.c util.c timefn.c fileio.c 247b3392d84SAllan Jude $(CC) $(FLAGS) -DZSTD_NOBENCH -DZSTD_NODICT -DZSTD_NOTRACE -UZSTD_LEGACY_SUPPORT -DZSTD_LEGACY_SUPPORT=0 $^ -o $@$(EXT) 248a19eddc3SBaptiste Daroussin 249b3392d84SAllan Judezstd-decompress: $(ZSTDLIB_COMMON_SRC) $(ZSTDLIB_DECOMPRESS_SRC) zstdcli.c util.c timefn.c fileio.c 250b3392d84SAllan Jude $(CC) $(FLAGS) -DZSTD_NOBENCH -DZSTD_NODICT -DZSTD_NOCOMPRESS -DZSTD_NOTRACE -UZSTD_LEGACY_SUPPORT -DZSTD_LEGACY_SUPPORT=0 $^ -o $@$(EXT) 251a19eddc3SBaptiste Daroussin 252b3392d84SAllan Judezstd-compress: $(ZSTDLIB_COMMON_SRC) $(ZSTDLIB_COMPRESS_SRC) zstdcli.c util.c timefn.c fileio.c 253b3392d84SAllan Jude $(CC) $(FLAGS) -DZSTD_NOBENCH -DZSTD_NODICT -DZSTD_NODECOMPRESS -DZSTD_NOTRACE -UZSTD_LEGACY_SUPPORT -DZSTD_LEGACY_SUPPORT=0 $^ -o $@$(EXT) 254a19eddc3SBaptiste Daroussin 255bc64b5ceSConrad Meyer## zstd-dictBuilder: executable supporting dictionary creation and compression (only) 256b3392d84SAllan Judezstd-dictBuilder: $(ZSTDLIB_COMMON_SRC) $(ZSTDLIB_COMPRESS_SRC) $(ZDICT_SRC) zstdcli.c util.c timefn.c fileio.c dibio.c 257b3392d84SAllan Jude $(CC) $(FLAGS) -DZSTD_NOBENCH -DZSTD_NODECOMPRESS -DZSTD_NOTRACE $^ -o $@$(EXT) 258bc64b5ceSConrad Meyer 259a19eddc3SBaptiste Daroussinzstdmt: zstd 260653667f9SBaptiste Daroussin ln -sf zstd zstdmt 261a19eddc3SBaptiste Daroussin 262902c8ce7SBaptiste Daroussin.PHONY: generate_res 263bc64b5ceSConrad Meyergenerate_res: $(RES64_FILE) $(RES32_FILE) 264bc64b5ceSConrad Meyer 265bc64b5ceSConrad Meyerifneq (,$(filter Windows%,$(OS))) 266bc64b5ceSConrad MeyerRC ?= windres 267bc64b5ceSConrad Meyer# http://stackoverflow.com/questions/708238/how-do-i-add-an-icon-to-a-mingw-gcc-compiled-executable 268bc64b5ceSConrad Meyer$(RES64_FILE): windres/zstd.rc 269bc64b5ceSConrad Meyer $(RC) -o $@ -I ../lib -I windres -i $< -O coff -F pe-x86-64 270bc64b5ceSConrad Meyer$(RES32_FILE): windres/zstd.rc 271bc64b5ceSConrad Meyer $(RC) -o $@ -I ../lib -I windres -i $< -O coff -F pe-i386 272bc64b5ceSConrad Meyerendif 273a19eddc3SBaptiste Daroussin 274902c8ce7SBaptiste Daroussin.PHONY: clean 275a19eddc3SBaptiste Daroussinclean: 276f6ae9767SConrad Meyer $(RM) core *.o tmp* result* *.gcda dictionary *.zst \ 277b3392d84SAllan Jude zstd$(EXT) zstd32$(EXT) zstd-dll$(EXT) \ 278b3392d84SAllan Jude zstd-compress$(EXT) zstd-decompress$(EXT) \ 279902c8ce7SBaptiste Daroussin zstd-small$(EXT) zstd-frugal$(EXT) zstd-nolegacy$(EXT) zstd4$(EXT) \ 280b3392d84SAllan Jude zstd-dictBuilder$(EXT) \ 281b3392d84SAllan Jude *.gcda default*.profraw default.profdata have_zlib$(EXT) 282f6ae9767SConrad Meyer $(RM) -r obj/* 283a19eddc3SBaptiste Daroussin @echo Cleaning completed 284a19eddc3SBaptiste Daroussin 285ffcbc2d7SBaptiste DaroussinMD2ROFF = ronn 286ffcbc2d7SBaptiste DaroussinMD2ROFF_FLAGS = --roff --warnings --manual="User Commands" --organization="zstd $(ZSTD_VERSION)" 287ffcbc2d7SBaptiste Daroussin 2881767cc49SConrad Meyerzstd.1: zstd.1.md ../lib/zstd.h 2891767cc49SConrad Meyer cat $< | $(MD2ROFF) $(MD2ROFF_FLAGS) | sed -n '/^\.\\\".*/!p' > $@ 290ffcbc2d7SBaptiste Daroussin 291706cfae4SConrad Meyerzstdgrep.1: zstdgrep.1.md ../lib/zstd.h 292706cfae4SConrad Meyer cat $< | $(MD2ROFF) $(MD2ROFF_FLAGS) | sed -n '/^\.\\\".*/!p' > $@ 293706cfae4SConrad Meyer 294706cfae4SConrad Meyerzstdless.1: zstdless.1.md ../lib/zstd.h 295706cfae4SConrad Meyer cat $< | $(MD2ROFF) $(MD2ROFF_FLAGS) | sed -n '/^\.\\\".*/!p' > $@ 296706cfae4SConrad Meyer 297902c8ce7SBaptiste Daroussin.PHONY: man 298706cfae4SConrad Meyerman: zstd.1 zstdgrep.1 zstdless.1 299ffcbc2d7SBaptiste Daroussin 300902c8ce7SBaptiste Daroussin.PHONY: clean-man 301ffcbc2d7SBaptiste Daroussinclean-man: 3023f774a5eSConrad Meyer $(RM) zstd.1 3033f774a5eSConrad Meyer $(RM) zstdgrep.1 3043f774a5eSConrad Meyer $(RM) zstdless.1 305ffcbc2d7SBaptiste Daroussin 306902c8ce7SBaptiste Daroussin.PHONY: preview-man 307ffcbc2d7SBaptiste Daroussinpreview-man: clean-man man 308ffcbc2d7SBaptiste Daroussin man ./zstd.1 309706cfae4SConrad Meyer man ./zstdgrep.1 310706cfae4SConrad Meyer man ./zstdless.1 311a19eddc3SBaptiste Daroussin 312f6ae9767SConrad Meyer 313f6ae9767SConrad Meyer# Generate .h dependencies automatically 314f6ae9767SConrad Meyer 315f6ae9767SConrad MeyerDEPFLAGS = -MT $@ -MMD -MP -MF 316f6ae9767SConrad Meyer 317f6ae9767SConrad Meyer$(BUILD_DIR)/%.o : %.c $(BUILD_DIR)/%.d | $(BUILD_DIR) 318f6ae9767SConrad Meyer @echo CC $@ 319f6ae9767SConrad Meyer $(COMPILE.c) $(DEPFLAGS) $(BUILD_DIR)/$*.d $(OUTPUT_OPTION) $< 320f6ae9767SConrad Meyer 321b3392d84SAllan Jude$(BUILD_DIR)/%.o : %.S | $(BUILD_DIR) 322b3392d84SAllan Jude @echo AS $@ 323b3392d84SAllan Jude $(COMPILE.S) $(OUTPUT_OPTION) $< 324b3392d84SAllan Jude 325f6ae9767SConrad MeyerMKDIR ?= mkdir 326f6ae9767SConrad Meyer$(BUILD_DIR): ; $(MKDIR) -p $@ 327f6ae9767SConrad Meyer 328f6ae9767SConrad MeyerDEPFILES := $(ZSTD_OBJ:.o=.d) 329f6ae9767SConrad Meyer$(DEPFILES): 330f6ae9767SConrad Meyer 331f6ae9767SConrad Meyerinclude $(wildcard $(DEPFILES)) 332f6ae9767SConrad Meyer 333f6ae9767SConrad Meyer 334f6ae9767SConrad Meyer 335a19eddc3SBaptiste Daroussin#----------------------------------------------------------------------------- 336706cfae4SConrad Meyer# make install is validated only for Linux, macOS, BSD, Hurd and Solaris targets 337a19eddc3SBaptiste Daroussin#----------------------------------------------------------------------------- 338b3392d84SAllan Judeifneq (,$(filter $(UNAME),Linux Darwin GNU/kFreeBSD GNU OpenBSD FreeBSD NetBSD DragonFly SunOS Haiku AIX)) 339a19eddc3SBaptiste Daroussin 340af73257bSConrad MeyerHAVE_COLORNEVER = $(shell echo a | egrep --color=never a > /dev/null 2> /dev/null && echo 1 || echo 0) 341af73257bSConrad MeyerEGREP_OPTIONS ?= 342af73257bSConrad Meyerifeq ($HAVE_COLORNEVER, 1) 343af73257bSConrad Meyer EGREP_OPTIONS += --color=never 344af73257bSConrad Meyerendif 345af73257bSConrad MeyerEGREP = egrep $(EGREP_OPTIONS) 346bc64b5ceSConrad MeyerAWK = awk 347706cfae4SConrad Meyer 348706cfae4SConrad Meyer# Print a two column output of targets and their description. To add a target description, put a 349706cfae4SConrad Meyer# comment in the Makefile with the format "## <TARGET>: <DESCRIPTION>". For example: 350706cfae4SConrad Meyer# 351706cfae4SConrad Meyer## list: Print all targets and their descriptions (if provided) 352902c8ce7SBaptiste Daroussin.PHONY: list 353902c8ce7SBaptiste Daroussinlist: 354f6ae9767SConrad Meyer TARGETS=$$($(MAKE) -pRrq -f $(lastword $(MAKEFILE_LIST)) : 2>/dev/null \ 355bc64b5ceSConrad Meyer | $(AWK) -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' \ 356706cfae4SConrad Meyer | $(EGREP) -v -e '^[^[:alnum:]]' | sort); \ 357706cfae4SConrad Meyer { \ 358706cfae4SConrad Meyer printf "Target Name\tDescription\n"; \ 359706cfae4SConrad Meyer printf "%0.s-" {1..16}; printf "\t"; printf "%0.s-" {1..40}; printf "\n"; \ 360706cfae4SConrad Meyer for target in $$TARGETS; do \ 361706cfae4SConrad Meyer line=$$($(EGREP) "^##[[:space:]]+$$target:" $(lastword $(MAKEFILE_LIST))); \ 362bc64b5ceSConrad Meyer description=$$(echo $$line | $(AWK) '{i=index($$0,":"); print substr($$0,i+1)}' | xargs); \ 363706cfae4SConrad Meyer printf "$$target\t$$description\n"; \ 364706cfae4SConrad Meyer done \ 365706cfae4SConrad Meyer } | column -t -s $$'\t' 366706cfae4SConrad Meyer 367902c8ce7SBaptiste Daroussin 368653667f9SBaptiste DaroussinDESTDIR ?= 369653667f9SBaptiste Daroussin# directory variables : GNU conventions prefer lowercase 370653667f9SBaptiste Daroussin# see https://www.gnu.org/prep/standards/html_node/Makefile-Conventions.html 371653667f9SBaptiste Daroussin# support both lower and uppercase (BSD), use uppercase in script 372653667f9SBaptiste Daroussinprefix ?= /usr/local 373653667f9SBaptiste DaroussinPREFIX ?= $(prefix) 374653667f9SBaptiste Daroussinexec_prefix ?= $(PREFIX) 375653667f9SBaptiste Daroussinbindir ?= $(exec_prefix)/bin 376653667f9SBaptiste DaroussinBINDIR ?= $(bindir) 377653667f9SBaptiste Daroussindatarootdir ?= $(PREFIX)/share 378653667f9SBaptiste Daroussinmandir ?= $(datarootdir)/man 379653667f9SBaptiste Daroussinman1dir ?= $(mandir)/man1 380653667f9SBaptiste Daroussin 381f6ae9767SConrad Meyerifneq (,$(filter $(UNAME),OpenBSD FreeBSD NetBSD DragonFly SunOS)) 3821767cc49SConrad Meyer MANDIR ?= $(PREFIX)/man 3831767cc49SConrad Meyer MAN1DIR ?= $(MANDIR)/man1 384653667f9SBaptiste Daroussinelse 3851767cc49SConrad Meyer MAN1DIR ?= $(man1dir) 386653667f9SBaptiste Daroussinendif 387653667f9SBaptiste Daroussin 388f6ae9767SConrad Meyerifneq (,$(filter $(UNAME),SunOS)) 389a19eddc3SBaptiste Daroussin INSTALL ?= ginstall 390a19eddc3SBaptiste Daroussinelse 391a19eddc3SBaptiste Daroussin INSTALL ?= install 392a19eddc3SBaptiste Daroussinendif 393a19eddc3SBaptiste Daroussin 394653667f9SBaptiste DaroussinINSTALL_PROGRAM ?= $(INSTALL) 395653667f9SBaptiste DaroussinINSTALL_SCRIPT ?= $(INSTALL_PROGRAM) 396653667f9SBaptiste DaroussinINSTALL_DATA ?= $(INSTALL) -m 644 397653667f9SBaptiste DaroussinINSTALL_MAN ?= $(INSTALL_DATA) 398a19eddc3SBaptiste Daroussin 399902c8ce7SBaptiste Daroussin.PHONY: install 400f6ae9767SConrad Meyerinstall: 401f6ae9767SConrad Meyer # generate zstd only if not already present 402f6ae9767SConrad Meyer [ -e zstd ] || $(MAKE) zstd-release 403f6ae9767SConrad Meyer [ -e $(DESTDIR)$(BINDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(BINDIR)/ 404f6ae9767SConrad Meyer [ -e $(DESTDIR)$(MAN1DIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(MAN1DIR)/ 405a19eddc3SBaptiste Daroussin @echo Installing binaries 406f6ae9767SConrad Meyer $(INSTALL_PROGRAM) zstd$(EXT) $(DESTDIR)$(BINDIR)/zstd$(EXT) 407f6ae9767SConrad Meyer ln -sf zstd$(EXT) $(DESTDIR)$(BINDIR)/zstdcat$(EXT) 408f6ae9767SConrad Meyer ln -sf zstd$(EXT) $(DESTDIR)$(BINDIR)/unzstd$(EXT) 409f6ae9767SConrad Meyer ln -sf zstd$(EXT) $(DESTDIR)$(BINDIR)/zstdmt$(EXT) 410f6ae9767SConrad Meyer $(INSTALL_SCRIPT) zstdless $(DESTDIR)$(BINDIR)/zstdless 411f6ae9767SConrad Meyer $(INSTALL_SCRIPT) zstdgrep $(DESTDIR)$(BINDIR)/zstdgrep 412a19eddc3SBaptiste Daroussin @echo Installing man pages 413f6ae9767SConrad Meyer $(INSTALL_MAN) zstd.1 $(DESTDIR)$(MAN1DIR)/zstd.1 414f6ae9767SConrad Meyer ln -sf zstd.1 $(DESTDIR)$(MAN1DIR)/zstdcat.1 415f6ae9767SConrad Meyer ln -sf zstd.1 $(DESTDIR)$(MAN1DIR)/unzstd.1 416f6ae9767SConrad Meyer $(INSTALL_MAN) zstdgrep.1 $(DESTDIR)$(MAN1DIR)/zstdgrep.1 417f6ae9767SConrad Meyer $(INSTALL_MAN) zstdless.1 $(DESTDIR)$(MAN1DIR)/zstdless.1 418a19eddc3SBaptiste Daroussin @echo zstd installation completed 419a19eddc3SBaptiste Daroussin 420902c8ce7SBaptiste Daroussin.PHONY: uninstall 421a19eddc3SBaptiste Daroussinuninstall: 422f6ae9767SConrad Meyer $(RM) $(DESTDIR)$(BINDIR)/zstdgrep 423f6ae9767SConrad Meyer $(RM) $(DESTDIR)$(BINDIR)/zstdless 424f6ae9767SConrad Meyer $(RM) $(DESTDIR)$(BINDIR)/zstdcat 425f6ae9767SConrad Meyer $(RM) $(DESTDIR)$(BINDIR)/unzstd 426f6ae9767SConrad Meyer $(RM) $(DESTDIR)$(BINDIR)/zstdmt 427f6ae9767SConrad Meyer $(RM) $(DESTDIR)$(BINDIR)/zstd 428f6ae9767SConrad Meyer $(RM) $(DESTDIR)$(MAN1DIR)/zstdless.1 429f6ae9767SConrad Meyer $(RM) $(DESTDIR)$(MAN1DIR)/zstdgrep.1 430f6ae9767SConrad Meyer $(RM) $(DESTDIR)$(MAN1DIR)/zstdcat.1 431f6ae9767SConrad Meyer $(RM) $(DESTDIR)$(MAN1DIR)/unzstd.1 432f6ae9767SConrad Meyer $(RM) $(DESTDIR)$(MAN1DIR)/zstd.1 433a19eddc3SBaptiste Daroussin @echo zstd programs successfully uninstalled 434902c8ce7SBaptiste Daroussin 435a19eddc3SBaptiste Daroussinendif 436