xref: /freebsd/sys/contrib/zstd/lib/Makefile (revision f7cd7fe51c4140960ebea00410ed62894f5625d1)
10c16b537SWarner Losh# ################################################################
237f1f268SConrad Meyer# Copyright (c) 2015-2020, Yann Collet, Facebook, Inc.
30c16b537SWarner Losh# All rights reserved.
40c16b537SWarner Losh#
50c16b537SWarner Losh# This source code is licensed under both the BSD-style license (found in the
60c16b537SWarner Losh# LICENSE file in the root directory of this source tree) and the GPLv2 (found
70c16b537SWarner Losh# in the COPYING file in the root directory of this source tree).
837f1f268SConrad Meyer# You may select, at your option, one of the above-listed licenses.
90c16b537SWarner Losh# ################################################################
100c16b537SWarner Losh
11*f7cd7fe5SConrad Meyer.PHONY: default
12*f7cd7fe5SConrad Meyerdefault: lib-release
1337f1f268SConrad Meyer
14*f7cd7fe5SConrad Meyer# define silent mode as default (verbose mode with V=1 or VERBOSE=1)
15*f7cd7fe5SConrad Meyer$(V)$(VERBOSE).SILENT:
16*f7cd7fe5SConrad Meyer
17*f7cd7fe5SConrad Meyer# When cross-compiling from linux to windows,
18*f7cd7fe5SConrad Meyer# one might need to specify TARGET_SYSTEM as "Windows."
19*f7cd7fe5SConrad Meyer# Building from Fedora fails without it.
20*f7cd7fe5SConrad Meyer# (but Ubuntu and Debian don't need to set anything)
2137f1f268SConrad MeyerTARGET_SYSTEM ?= $(OS)
2237f1f268SConrad Meyer
230c16b537SWarner Losh# Version numbers
240c16b537SWarner LoshLIBVER_MAJOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MAJOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < ./zstd.h`
250c16b537SWarner LoshLIBVER_MINOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MINOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < ./zstd.h`
260c16b537SWarner LoshLIBVER_PATCH_SCRIPT:=`sed -n '/define ZSTD_VERSION_RELEASE/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < ./zstd.h`
270c16b537SWarner LoshLIBVER_SCRIPT:= $(LIBVER_MAJOR_SCRIPT).$(LIBVER_MINOR_SCRIPT).$(LIBVER_PATCH_SCRIPT)
280c16b537SWarner LoshLIBVER_MAJOR := $(shell echo $(LIBVER_MAJOR_SCRIPT))
290c16b537SWarner LoshLIBVER_MINOR := $(shell echo $(LIBVER_MINOR_SCRIPT))
300c16b537SWarner LoshLIBVER_PATCH := $(shell echo $(LIBVER_PATCH_SCRIPT))
310c16b537SWarner LoshLIBVER := $(shell echo $(LIBVER_SCRIPT))
320c16b537SWarner LoshVERSION?= $(LIBVER)
334d3f1eafSConrad MeyerCCVER := $(shell $(CC) --version)
340c16b537SWarner Losh
35*f7cd7fe5SConrad Meyer# ZSTD_LIB_MINIFY is a helper variable that
36*f7cd7fe5SConrad Meyer# configures a bunch of other variables to space-optimized defaults.
3737f1f268SConrad MeyerZSTD_LIB_MINIFY ?= 0
3837f1f268SConrad Meyerifneq ($(ZSTD_LIB_MINIFY), 0)
3937f1f268SConrad Meyer  HAVE_CC_OZ ?= $(shell echo "" | $(CC) -Oz -x c -c - -o /dev/null 2> /dev/null && echo 1 || echo 0)
4037f1f268SConrad Meyer  ZSTD_LEGACY_SUPPORT ?= 0
4137f1f268SConrad Meyer  ZSTD_LIB_DEPRECATED ?= 0
4237f1f268SConrad Meyer  HUF_FORCE_DECOMPRESS_X1 ?= 1
4337f1f268SConrad Meyer  ZSTD_FORCE_DECOMPRESS_SHORT ?= 1
4437f1f268SConrad Meyer  ZSTD_NO_INLINE ?= 1
4537f1f268SConrad Meyer  ZSTD_STRIP_ERROR_STRINGS ?= 1
4637f1f268SConrad Meyerifneq ($(HAVE_CC_OZ), 0)
4737f1f268SConrad Meyer    # Some compilers (clang) support an even more space-optimized setting.
4837f1f268SConrad Meyer    CFLAGS += -Oz
4937f1f268SConrad Meyerelse
5037f1f268SConrad Meyer    CFLAGS += -Os
5137f1f268SConrad Meyerendif
5237f1f268SConrad Meyer  CFLAGS += -fno-stack-protector -fomit-frame-pointer -fno-ident \
5337f1f268SConrad Meyer            -DDYNAMIC_BMI2=0 -DNDEBUG
5437f1f268SConrad Meyerelse
5537f1f268SConrad Meyer  CFLAGS += -O3
5637f1f268SConrad Meyerendif
5737f1f268SConrad Meyer
58*f7cd7fe5SConrad MeyerDEBUGLEVEL ?= 0
59*f7cd7fe5SConrad MeyerCPPFLAGS += -DXXH_NAMESPACE=ZSTD_ -DDEBUGLEVEL=$(DEBUGLEVEL)
60*f7cd7fe5SConrad Meyerifeq ($(TARGET_SYSTEM),Windows_NT)   # MinGW assumed
61*f7cd7fe5SConrad Meyer  CPPFLAGS += -D__USE_MINGW_ANSI_STDIO   # compatibility with %zu formatting
62*f7cd7fe5SConrad Meyerendif
63*f7cd7fe5SConrad MeyerDEBUGFLAGS= -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow \
64*f7cd7fe5SConrad Meyer            -Wstrict-aliasing=1 -Wswitch-enum -Wdeclaration-after-statement \
65*f7cd7fe5SConrad Meyer            -Wstrict-prototypes -Wundef -Wpointer-arith \
66*f7cd7fe5SConrad Meyer            -Wvla -Wformat=2 -Winit-self -Wfloat-equal -Wwrite-strings \
67*f7cd7fe5SConrad Meyer            -Wredundant-decls -Wmissing-prototypes -Wc++-compat
68*f7cd7fe5SConrad MeyerCFLAGS   += $(DEBUGFLAGS) $(MOREFLAGS)
69*f7cd7fe5SConrad MeyerFLAGS     = $(CPPFLAGS) $(CFLAGS)
70*f7cd7fe5SConrad Meyer
71*f7cd7fe5SConrad MeyerHAVE_COLORNEVER = $(shell echo a | grep --color=never a > /dev/null 2> /dev/null && echo 1 || echo 0)
72*f7cd7fe5SConrad MeyerGREP_OPTIONS ?=
73*f7cd7fe5SConrad Meyerifeq ($HAVE_COLORNEVER, 1)
74*f7cd7fe5SConrad Meyer  GREP_OPTIONS += --color=never
75*f7cd7fe5SConrad Meyerendif
76*f7cd7fe5SConrad MeyerGREP = grep $(GREP_OPTIONS)
77*f7cd7fe5SConrad MeyerSED_ERE_OPT ?= -E
78*f7cd7fe5SConrad Meyer
79*f7cd7fe5SConrad MeyerZSTDCOMMON_FILES := $(sort $(wildcard common/*.c))
80*f7cd7fe5SConrad MeyerZSTDCOMP_FILES := $(sort $(wildcard compress/*.c))
81*f7cd7fe5SConrad MeyerZSTDDECOMP_FILES := $(sort $(wildcard decompress/*.c))
82*f7cd7fe5SConrad MeyerZDICT_FILES := $(sort $(wildcard dictBuilder/*.c))
83*f7cd7fe5SConrad MeyerZDEPR_FILES := $(sort $(wildcard deprecated/*.c))
84*f7cd7fe5SConrad MeyerZSTD_FILES := $(ZSTDCOMMON_FILES)
85*f7cd7fe5SConrad Meyer
86*f7cd7fe5SConrad Meyerifeq ($(findstring GCC,$(CCVER)),GCC)
87*f7cd7fe5SConrad Meyerdecompress/zstd_decompress_block.o : CFLAGS+=-fno-tree-vectorize
88*f7cd7fe5SConrad Meyerendif
89*f7cd7fe5SConrad Meyer
9037f1f268SConrad Meyer# Modules
910f743729SConrad MeyerZSTD_LIB_COMPRESSION ?= 1
920f743729SConrad MeyerZSTD_LIB_DECOMPRESSION ?= 1
930f743729SConrad MeyerZSTD_LIB_DICTBUILDER ?= 1
940f743729SConrad MeyerZSTD_LIB_DEPRECATED ?= 1
9537f1f268SConrad Meyer
9637f1f268SConrad Meyer# Legacy support
9737f1f268SConrad MeyerZSTD_LEGACY_SUPPORT ?= 5
9837f1f268SConrad MeyerZSTD_LEGACY_MULTITHREADED_API ?= 0
9937f1f268SConrad Meyer
10037f1f268SConrad Meyer# Build size optimizations
101a0483764SConrad MeyerHUF_FORCE_DECOMPRESS_X1 ?= 0
102a0483764SConrad MeyerHUF_FORCE_DECOMPRESS_X2 ?= 0
103a0483764SConrad MeyerZSTD_FORCE_DECOMPRESS_SHORT ?= 0
104a0483764SConrad MeyerZSTD_FORCE_DECOMPRESS_LONG ?= 0
105a0483764SConrad MeyerZSTD_NO_INLINE ?= 0
106a0483764SConrad MeyerZSTD_STRIP_ERROR_STRINGS ?= 0
1070f743729SConrad Meyer
1080f743729SConrad Meyerifeq ($(ZSTD_LIB_COMPRESSION), 0)
1090f743729SConrad Meyer  ZSTD_LIB_DICTBUILDER = 0
1100f743729SConrad Meyer  ZSTD_LIB_DEPRECATED = 0
1110f743729SConrad Meyerendif
1120f743729SConrad Meyer
1130f743729SConrad Meyerifeq ($(ZSTD_LIB_DECOMPRESSION), 0)
1140f743729SConrad Meyer  ZSTD_LEGACY_SUPPORT = 0
1150f743729SConrad Meyer  ZSTD_LIB_DEPRECATED = 0
1160f743729SConrad Meyerendif
1170f743729SConrad Meyer
1180f743729SConrad Meyerifneq ($(ZSTD_LIB_COMPRESSION), 0)
1190f743729SConrad Meyer  ZSTD_FILES += $(ZSTDCOMP_FILES)
1200f743729SConrad Meyerendif
1210f743729SConrad Meyer
1220f743729SConrad Meyerifneq ($(ZSTD_LIB_DECOMPRESSION), 0)
1230f743729SConrad Meyer  ZSTD_FILES += $(ZSTDDECOMP_FILES)
1240f743729SConrad Meyerendif
1250f743729SConrad Meyer
1260f743729SConrad Meyerifneq ($(ZSTD_LIB_DEPRECATED), 0)
1270f743729SConrad Meyer  ZSTD_FILES += $(ZDEPR_FILES)
1280f743729SConrad Meyerendif
1290f743729SConrad Meyer
1300f743729SConrad Meyerifneq ($(ZSTD_LIB_DICTBUILDER), 0)
1310f743729SConrad Meyer  ZSTD_FILES += $(ZDICT_FILES)
1320f743729SConrad Meyerendif
1330c16b537SWarner Losh
134a0483764SConrad Meyerifneq ($(HUF_FORCE_DECOMPRESS_X1), 0)
135a0483764SConrad Meyer  CFLAGS += -DHUF_FORCE_DECOMPRESS_X1
136a0483764SConrad Meyerendif
137a0483764SConrad Meyer
138a0483764SConrad Meyerifneq ($(HUF_FORCE_DECOMPRESS_X2), 0)
139a0483764SConrad Meyer  CFLAGS += -DHUF_FORCE_DECOMPRESS_X2
140a0483764SConrad Meyerendif
141a0483764SConrad Meyer
142a0483764SConrad Meyerifneq ($(ZSTD_FORCE_DECOMPRESS_SHORT), 0)
143a0483764SConrad Meyer  CFLAGS += -DZSTD_FORCE_DECOMPRESS_SHORT
144a0483764SConrad Meyerendif
145a0483764SConrad Meyer
146a0483764SConrad Meyerifneq ($(ZSTD_FORCE_DECOMPRESS_LONG), 0)
147a0483764SConrad Meyer  CFLAGS += -DZSTD_FORCE_DECOMPRESS_LONG
148a0483764SConrad Meyerendif
149a0483764SConrad Meyer
150a0483764SConrad Meyerifneq ($(ZSTD_NO_INLINE), 0)
151a0483764SConrad Meyer  CFLAGS += -DZSTD_NO_INLINE
152a0483764SConrad Meyerendif
153a0483764SConrad Meyer
154a0483764SConrad Meyerifneq ($(ZSTD_STRIP_ERROR_STRINGS), 0)
155a0483764SConrad Meyer  CFLAGS += -DZSTD_STRIP_ERROR_STRINGS
156a0483764SConrad Meyerendif
157a0483764SConrad Meyer
1582b9c00cbSConrad Meyerifneq ($(ZSTD_LEGACY_MULTITHREADED_API), 0)
1592b9c00cbSConrad Meyer  CFLAGS += -DZSTD_LEGACY_MULTITHREADED_API
1602b9c00cbSConrad Meyerendif
1612b9c00cbSConrad Meyer
1620c16b537SWarner Loshifneq ($(ZSTD_LEGACY_SUPPORT), 0)
1630c16b537SWarner Loshifeq ($(shell test $(ZSTD_LEGACY_SUPPORT) -lt 8; echo $$?), 0)
1640f743729SConrad Meyer  ZSTD_FILES += $(shell ls legacy/*.c | $(GREP) 'v0[$(ZSTD_LEGACY_SUPPORT)-7]')
1650c16b537SWarner Loshendif
1660c16b537SWarner Loshendif
1670c16b537SWarner LoshCPPFLAGS  += -DZSTD_LEGACY_SUPPORT=$(ZSTD_LEGACY_SUPPORT)
1680c16b537SWarner Losh
169*f7cd7fe5SConrad MeyerZSTD_LOCAL_SRC := $(notdir $(ZSTD_FILES))
170*f7cd7fe5SConrad MeyerZSTD_LOCAL_OBJ := $(ZSTD_LOCAL_SRC:.c=.o)
171*f7cd7fe5SConrad Meyer
172*f7cd7fe5SConrad MeyerZSTD_SUBDIR := common compress decompress dictBuilder legacy deprecated
173*f7cd7fe5SConrad Meyervpath %.c $(ZSTD_SUBDIR)
174*f7cd7fe5SConrad Meyer
175*f7cd7fe5SConrad MeyerUNAME := $(shell uname)
176*f7cd7fe5SConrad Meyer
177*f7cd7fe5SConrad Meyerifndef BUILD_DIR
178*f7cd7fe5SConrad Meyerifeq ($(UNAME), Darwin)
179*f7cd7fe5SConrad Meyer  HASH ?= md5
180*f7cd7fe5SConrad Meyerelse ifeq ($(UNAME), FreeBSD)
181*f7cd7fe5SConrad Meyer  HASH ?= gmd5sum
182*f7cd7fe5SConrad Meyerelse ifeq ($(UNAME), OpenBSD)
183*f7cd7fe5SConrad Meyer  HASH ?= md5
184*f7cd7fe5SConrad Meyerendif
185*f7cd7fe5SConrad MeyerHASH ?= md5sum
186*f7cd7fe5SConrad Meyer
187*f7cd7fe5SConrad MeyerHASH_DIR = conf_$(shell echo $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(ZSTD_FILES) | $(HASH) | cut -f 1 -d " " )
188*f7cd7fe5SConrad MeyerHAVE_HASH :=$(shell echo 1 | $(HASH) > /dev/null && echo 1 || echo 0)
189*f7cd7fe5SConrad Meyerifeq ($(HAVE_HASH),0)
190*f7cd7fe5SConrad Meyer  $(info warning : could not find HASH ($(HASH)), needed to differentiate builds using different flags)
191*f7cd7fe5SConrad Meyer  BUILD_DIR := obj/generic_noconf
192*f7cd7fe5SConrad Meyerendif
193*f7cd7fe5SConrad Meyerendif # BUILD_DIR
194*f7cd7fe5SConrad Meyer
1950c16b537SWarner Losh
1960f743729SConrad Meyer# macOS linker doesn't support -soname, and use different extension
1970c16b537SWarner Losh# see : https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/DynamicLibraries/100-Articles/DynamicLibraryDesignGuidelines.html
198*f7cd7fe5SConrad Meyerifeq ($(UNAME), Darwin)
1990c16b537SWarner Losh  SHARED_EXT = dylib
2000c16b537SWarner Losh  SHARED_EXT_MAJOR = $(LIBVER_MAJOR).$(SHARED_EXT)
2010c16b537SWarner Losh  SHARED_EXT_VER = $(LIBVER).$(SHARED_EXT)
2020c16b537SWarner Losh  SONAME_FLAGS = -install_name $(LIBDIR)/libzstd.$(SHARED_EXT_MAJOR) -compatibility_version $(LIBVER_MAJOR) -current_version $(LIBVER)
2030c16b537SWarner Loshelse
2040c16b537SWarner Losh  SONAME_FLAGS = -Wl,-soname=libzstd.$(SHARED_EXT).$(LIBVER_MAJOR)
2050c16b537SWarner Losh  SHARED_EXT = so
2060c16b537SWarner Losh  SHARED_EXT_MAJOR = $(SHARED_EXT).$(LIBVER_MAJOR)
2070c16b537SWarner Losh  SHARED_EXT_VER = $(SHARED_EXT).$(LIBVER)
2080c16b537SWarner Loshendif
2090c16b537SWarner Losh
210*f7cd7fe5SConrad MeyerSET_CACHE_DIRECTORY = \
211*f7cd7fe5SConrad Meyer	$(MAKE) --no-print-directory $@ \
212*f7cd7fe5SConrad Meyer    BUILD_DIR=obj/$(HASH_DIR) \
213*f7cd7fe5SConrad Meyer    CPPFLAGS="$(CPPFLAGS)" \
214*f7cd7fe5SConrad Meyer    CFLAGS="$(CFLAGS)" \
215*f7cd7fe5SConrad Meyer    LDFLAGS="$(LDFLAGS)"
2160c16b537SWarner Losh
2170c16b537SWarner Losh
218*f7cd7fe5SConrad Meyer.PHONY: lib-all all clean install uninstall
2190c16b537SWarner Losh
22037f1f268SConrad Meyer# alias
22137f1f268SConrad Meyerlib-all: all
22237f1f268SConrad Meyer
2230c16b537SWarner Loshall: lib
2240c16b537SWarner Losh
225*f7cd7fe5SConrad Meyer.PHONY: libzstd.a  # must be run every time
226*f7cd7fe5SConrad Meyer
227*f7cd7fe5SConrad Meyerifndef BUILD_DIR
228*f7cd7fe5SConrad Meyer# determine BUILD_DIR from compilation flags
229*f7cd7fe5SConrad Meyer
230*f7cd7fe5SConrad Meyerlibzstd.a:
231*f7cd7fe5SConrad Meyer	$(SET_CACHE_DIRECTORY)
232*f7cd7fe5SConrad Meyer
233*f7cd7fe5SConrad Meyerelse
234*f7cd7fe5SConrad Meyer# BUILD_DIR is defined
235*f7cd7fe5SConrad Meyer
236*f7cd7fe5SConrad MeyerZSTD_STATLIB_DIR := $(BUILD_DIR)/static
237*f7cd7fe5SConrad MeyerZSTD_STATLIB := $(ZSTD_STATLIB_DIR)/libzstd.a
238*f7cd7fe5SConrad MeyerZSTD_STATLIB_OBJ := $(addprefix $(ZSTD_STATLIB_DIR)/,$(ZSTD_LOCAL_OBJ))
239*f7cd7fe5SConrad Meyer$(ZSTD_STATLIB): ARFLAGS = rcs
240*f7cd7fe5SConrad Meyer$(ZSTD_STATLIB): | $(ZSTD_STATLIB_DIR)
241*f7cd7fe5SConrad Meyer$(ZSTD_STATLIB): $(ZSTD_STATLIB_OBJ)
2420c16b537SWarner Losh	@echo compiling static library
243*f7cd7fe5SConrad Meyer	$(AR) $(ARFLAGS) $@ $^
244*f7cd7fe5SConrad Meyer
245*f7cd7fe5SConrad Meyerlibzstd.a: $(ZSTD_STATLIB)
246*f7cd7fe5SConrad Meyer	cp -f $< $@
247*f7cd7fe5SConrad Meyer
248*f7cd7fe5SConrad Meyerendif
2490c16b537SWarner Losh
25037f1f268SConrad Meyerifneq (,$(filter Windows%,$(TARGET_SYSTEM)))
2510f743729SConrad Meyer
252*f7cd7fe5SConrad MeyerLIBZSTD = dll/libzstd.dll
2530f743729SConrad Meyer$(LIBZSTD): $(ZSTD_FILES)
2540f743729SConrad Meyer	@echo compiling dynamic library $(LIBVER)
255*f7cd7fe5SConrad Meyer	$(CC) $(FLAGS) -DZSTD_DLL_EXPORT=1 -Wl,--out-implib,dll/libzstd.dll.a -shared $^ -o $@
2560f743729SConrad Meyer
257*f7cd7fe5SConrad Meyerelse  # not Windows
2580f743729SConrad Meyer
2590f743729SConrad MeyerLIBZSTD = libzstd.$(SHARED_EXT_VER)
260*f7cd7fe5SConrad Meyer.PHONY: $(LIBZSTD)  # must be run every time
261*f7cd7fe5SConrad Meyer$(LIBZSTD): CFLAGS += -fPIC
262*f7cd7fe5SConrad Meyer$(LIBZSTD): LDFLAGS += -shared -fvisibility=hidden
2630f743729SConrad Meyer
264*f7cd7fe5SConrad Meyerifndef BUILD_DIR
265*f7cd7fe5SConrad Meyer# determine BUILD_DIR from compilation flags
266*f7cd7fe5SConrad Meyer
267*f7cd7fe5SConrad Meyer$(LIBZSTD):
268*f7cd7fe5SConrad Meyer	$(SET_CACHE_DIRECTORY)
269*f7cd7fe5SConrad Meyer
270*f7cd7fe5SConrad Meyerelse
271*f7cd7fe5SConrad Meyer# BUILD_DIR is defined
272*f7cd7fe5SConrad Meyer
273*f7cd7fe5SConrad MeyerZSTD_DYNLIB_DIR := $(BUILD_DIR)/dynamic
274*f7cd7fe5SConrad MeyerZSTD_DYNLIB := $(ZSTD_DYNLIB_DIR)/$(LIBZSTD)
275*f7cd7fe5SConrad MeyerZSTD_DYNLIB_OBJ := $(addprefix $(ZSTD_DYNLIB_DIR)/,$(ZSTD_LOCAL_OBJ))
276*f7cd7fe5SConrad Meyer
277*f7cd7fe5SConrad Meyer$(ZSTD_DYNLIB): | $(ZSTD_DYNLIB_DIR)
278*f7cd7fe5SConrad Meyer$(ZSTD_DYNLIB): $(ZSTD_DYNLIB_OBJ)
279*f7cd7fe5SConrad Meyer	@echo compiling dynamic library $(LIBVER)
280*f7cd7fe5SConrad Meyer	$(CC) $(FLAGS) $^ $(LDFLAGS) $(SONAME_FLAGS) -o $@
281*f7cd7fe5SConrad Meyer	@echo creating versioned links
282*f7cd7fe5SConrad Meyer	ln -sf $@ libzstd.$(SHARED_EXT_MAJOR)
283*f7cd7fe5SConrad Meyer	ln -sf $@ libzstd.$(SHARED_EXT)
284*f7cd7fe5SConrad Meyer
285*f7cd7fe5SConrad Meyer$(LIBZSTD): $(ZSTD_DYNLIB)
286*f7cd7fe5SConrad Meyer	cp -f $< $@
287*f7cd7fe5SConrad Meyer
288*f7cd7fe5SConrad Meyerendif  # ifndef BUILD_DIR
289*f7cd7fe5SConrad Meyerendif  # if windows
2900c16b537SWarner Losh
29137f1f268SConrad Meyer.PHONY: libzstd
2920c16b537SWarner Loshlibzstd : $(LIBZSTD)
2930c16b537SWarner Losh
29437f1f268SConrad Meyer.PHONY: lib
2950c16b537SWarner Loshlib : libzstd.a libzstd
2960c16b537SWarner Losh
297*f7cd7fe5SConrad Meyer
298*f7cd7fe5SConrad Meyer# note : do not define lib-mt or lib-release as .PHONY
299*f7cd7fe5SConrad Meyer# make does not consider implicit pattern rule for .PHONY target
300*f7cd7fe5SConrad Meyer
30137f1f268SConrad Meyer%-mt : CPPFLAGS += -DZSTD_MULTITHREAD
30237f1f268SConrad Meyer%-mt : LDFLAGS  += -pthread
30337f1f268SConrad Meyer%-mt : %
30437f1f268SConrad Meyer	@echo multi-threading build completed
3050c16b537SWarner Losh
30637f1f268SConrad Meyer%-release : DEBUGFLAGS :=
30737f1f268SConrad Meyer%-release : %
30837f1f268SConrad Meyer	@echo release build completed
30937f1f268SConrad Meyer
3100c16b537SWarner Losh
311*f7cd7fe5SConrad Meyer# Generate .h dependencies automatically
312*f7cd7fe5SConrad Meyer
313*f7cd7fe5SConrad MeyerDEPFLAGS = -MT $@ -MMD -MP -MF
314*f7cd7fe5SConrad Meyer
315*f7cd7fe5SConrad Meyer$(ZSTD_DYNLIB_DIR)/%.o : %.c $(ZSTD_DYNLIB_DIR)/%.d | $(ZSTD_DYNLIB_DIR)
316*f7cd7fe5SConrad Meyer	@echo CC $@
317*f7cd7fe5SConrad Meyer	$(COMPILE.c) $(DEPFLAGS) $(ZSTD_DYNLIB_DIR)/$*.d $(OUTPUT_OPTION) $<
318*f7cd7fe5SConrad Meyer
319*f7cd7fe5SConrad Meyer$(ZSTD_STATLIB_DIR)/%.o : %.c $(ZSTD_STATLIB_DIR)/%.d | $(ZSTD_STATLIB_DIR)
320*f7cd7fe5SConrad Meyer	@echo CC $@
321*f7cd7fe5SConrad Meyer	$(COMPILE.c) $(DEPFLAGS) $(ZSTD_STATLIB_DIR)/$*.d $(OUTPUT_OPTION) $<
322*f7cd7fe5SConrad Meyer
323*f7cd7fe5SConrad MeyerMKDIR ?= mkdir
324*f7cd7fe5SConrad Meyer$(BUILD_DIR) $(ZSTD_DYNLIB_DIR) $(ZSTD_STATLIB_DIR):
325*f7cd7fe5SConrad Meyer	$(MKDIR) -p $@
326*f7cd7fe5SConrad Meyer
327*f7cd7fe5SConrad MeyerDEPFILES := $(ZSTD_DYNLIB_OBJ:.o=.d) $(ZSTD_STATLIB_OBJ:.o=.d)
328*f7cd7fe5SConrad Meyer$(DEPFILES):
329*f7cd7fe5SConrad Meyer
330*f7cd7fe5SConrad Meyerinclude $(wildcard $(DEPFILES))
331*f7cd7fe5SConrad Meyer
332*f7cd7fe5SConrad Meyer
3330c16b537SWarner Losh# Special case : building library in single-thread mode _and_ without zstdmt_compress.c
3340c16b537SWarner LoshZSTDMT_FILES = compress/zstdmt_compress.c
3350c16b537SWarner LoshZSTD_NOMT_FILES = $(filter-out $(ZSTDMT_FILES),$(ZSTD_FILES))
3360c16b537SWarner Loshlibzstd-nomt: LDFLAGS += -shared -fPIC -fvisibility=hidden
3370c16b537SWarner Loshlibzstd-nomt: $(ZSTD_NOMT_FILES)
3380c16b537SWarner Losh	@echo compiling single-thread dynamic library $(LIBVER)
3390c16b537SWarner Losh	@echo files : $(ZSTD_NOMT_FILES)
340*f7cd7fe5SConrad Meyer	$(CC) $(FLAGS) $^ $(LDFLAGS) $(SONAME_FLAGS) -o $@
3410c16b537SWarner Losh
3420c16b537SWarner Loshclean:
343*f7cd7fe5SConrad Meyer	$(RM) -r *.dSYM   # macOS-specific
344*f7cd7fe5SConrad Meyer	$(RM) core *.o *.a *.gcda *.$(SHARED_EXT) *.$(SHARED_EXT).* libzstd.pc
345*f7cd7fe5SConrad Meyer	$(RM) dll/libzstd.dll dll/libzstd.lib libzstd-nomt*
346*f7cd7fe5SConrad Meyer	$(RM) -r obj/*
3470c16b537SWarner Losh	@echo Cleaning library completed
3480c16b537SWarner Losh
3490c16b537SWarner Losh#-----------------------------------------------------------------------------
35037f1f268SConrad Meyer# make install is validated only for below listed environments
3510c16b537SWarner Losh#-----------------------------------------------------------------------------
352*f7cd7fe5SConrad Meyerifneq (,$(filter $(UNAME),Linux Darwin GNU/kFreeBSD GNU OpenBSD FreeBSD NetBSD DragonFly SunOS Haiku))
3530c16b537SWarner Losh
35437f1f268SConrad Meyerall: libzstd.pc
35537f1f268SConrad Meyer
356*f7cd7fe5SConrad MeyerHAS_EXPLICIT_EXEC_PREFIX := $(if $(or $(EXEC_PREFIX),$(exec_prefix)),1,)
357*f7cd7fe5SConrad Meyer
3580c16b537SWarner LoshDESTDIR     ?=
3590c16b537SWarner Losh# directory variables : GNU conventions prefer lowercase
3600c16b537SWarner Losh# see https://www.gnu.org/prep/standards/html_node/Makefile-Conventions.html
3610c16b537SWarner Losh# support both lower and uppercase (BSD), use uppercase in script
3620c16b537SWarner Loshprefix      ?= /usr/local
3630c16b537SWarner LoshPREFIX      ?= $(prefix)
3640c16b537SWarner Loshexec_prefix ?= $(PREFIX)
36537f1f268SConrad MeyerEXEC_PREFIX ?= $(exec_prefix)
36637f1f268SConrad Meyerlibdir      ?= $(EXEC_PREFIX)/lib
3670c16b537SWarner LoshLIBDIR      ?= $(libdir)
3680c16b537SWarner Loshincludedir  ?= $(PREFIX)/include
3690c16b537SWarner LoshINCLUDEDIR  ?= $(includedir)
3700c16b537SWarner Losh
371*f7cd7fe5SConrad MeyerPCINCDIR := $(patsubst $(PREFIX)%,%,$(INCLUDEDIR))
372*f7cd7fe5SConrad MeyerPCLIBDIR := $(patsubst $(EXEC_PREFIX)%,%,$(LIBDIR))
37337f1f268SConrad Meyer
374*f7cd7fe5SConrad Meyer# If we successfully stripped off a prefix, we'll add a reference to the
375*f7cd7fe5SConrad Meyer# relevant pc variable.
376*f7cd7fe5SConrad MeyerPCINCPREFIX := $(if $(findstring $(INCLUDEDIR),$(PCINCDIR)),,$${prefix})
377*f7cd7fe5SConrad MeyerPCLIBPREFIX := $(if $(findstring $(LIBDIR),$(PCLIBDIR)),,$${exec_prefix})
37837f1f268SConrad Meyer
379*f7cd7fe5SConrad Meyer# If no explicit EXEC_PREFIX was set by the caller, write it out as a reference
380*f7cd7fe5SConrad Meyer# to PREFIX, rather than as a resolved value.
381*f7cd7fe5SConrad MeyerPCEXEC_PREFIX := $(if $(HAS_EXPLICIT_EXEC_PREFIX),$(EXEC_PREFIX),$${prefix})
38237f1f268SConrad Meyer
383*f7cd7fe5SConrad Meyerifneq (,$(filter $(UNAME),FreeBSD NetBSD DragonFly))
3840c16b537SWarner Losh  PKGCONFIGDIR ?= $(PREFIX)/libdata/pkgconfig
3850c16b537SWarner Loshelse
3860c16b537SWarner Losh  PKGCONFIGDIR ?= $(LIBDIR)/pkgconfig
3870c16b537SWarner Loshendif
3880c16b537SWarner Losh
389*f7cd7fe5SConrad Meyerifneq (,$(filter $(UNAME),SunOS))
3900c16b537SWarner Losh  INSTALL ?= ginstall
3910c16b537SWarner Loshelse
3920c16b537SWarner Losh  INSTALL ?= install
3930c16b537SWarner Loshendif
3940c16b537SWarner Losh
3950c16b537SWarner LoshINSTALL_PROGRAM ?= $(INSTALL)
3960c16b537SWarner LoshINSTALL_DATA    ?= $(INSTALL) -m 644
3970c16b537SWarner Losh
3980c16b537SWarner Losh
3990c16b537SWarner Loshlibzstd.pc:
4000c16b537SWarner Loshlibzstd.pc: libzstd.pc.in
4010c16b537SWarner Losh	@echo creating pkgconfig
402*f7cd7fe5SConrad Meyer	@sed $(SED_ERE_OPT) \
403*f7cd7fe5SConrad Meyer	        -e 's|@PREFIX@|$(PREFIX)|' \
404*f7cd7fe5SConrad Meyer	        -e 's|@EXEC_PREFIX@|$(PCEXEC_PREFIX)|' \
405*f7cd7fe5SConrad Meyer          -e 's|@INCLUDEDIR@|$(PCINCPREFIX)$(PCINCDIR)|' \
406*f7cd7fe5SConrad Meyer          -e 's|@LIBDIR@|$(PCLIBPREFIX)$(PCLIBDIR)|' \
4070c16b537SWarner Losh          -e 's|@VERSION@|$(VERSION)|' \
4080c16b537SWarner Losh          $< >$@
4090c16b537SWarner Losh
4100f743729SConrad Meyerinstall: install-pc install-static install-shared install-includes
4110f743729SConrad Meyer	@echo zstd static and shared library installed
4120f743729SConrad Meyer
4130f743729SConrad Meyerinstall-pc: libzstd.pc
414*f7cd7fe5SConrad Meyer	[ -e $(DESTDIR)$(PKGCONFIGDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(PKGCONFIGDIR)/
415*f7cd7fe5SConrad Meyer	$(INSTALL_DATA) libzstd.pc $(DESTDIR)$(PKGCONFIGDIR)/
4160f743729SConrad Meyer
417*f7cd7fe5SConrad Meyerinstall-static:
418*f7cd7fe5SConrad Meyer	# only generate libzstd.a if it's not already present
419*f7cd7fe5SConrad Meyer	[ -e libzstd.a ] || $(MAKE) libzstd.a-release
420*f7cd7fe5SConrad Meyer	[ -e $(DESTDIR)$(LIBDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(LIBDIR)/
4210f743729SConrad Meyer	@echo Installing static library
422*f7cd7fe5SConrad Meyer	$(INSTALL_DATA) libzstd.a $(DESTDIR)$(LIBDIR)
4230f743729SConrad Meyer
424*f7cd7fe5SConrad Meyerinstall-shared:
425*f7cd7fe5SConrad Meyer	# only generate libzstd.so if it's not already present
426*f7cd7fe5SConrad Meyer	[ -e $(LIBZSTD) ] || $(MAKE) libzstd-release
427*f7cd7fe5SConrad Meyer	[ -e $(DESTDIR)$(LIBDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(LIBDIR)/
4280f743729SConrad Meyer	@echo Installing shared library
429*f7cd7fe5SConrad Meyer	$(INSTALL_PROGRAM) $(LIBZSTD) $(DESTDIR)$(LIBDIR)
430*f7cd7fe5SConrad Meyer	ln -sf $(LIBZSTD) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT_MAJOR)
431*f7cd7fe5SConrad Meyer	ln -sf $(LIBZSTD) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT)
4320f743729SConrad Meyer
4330f743729SConrad Meyerinstall-includes:
434*f7cd7fe5SConrad Meyer	[ -e $(DESTDIR)$(INCLUDEDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(INCLUDEDIR)/
4350c16b537SWarner Losh	@echo Installing includes
436*f7cd7fe5SConrad Meyer	$(INSTALL_DATA) zstd.h $(DESTDIR)$(INCLUDEDIR)
437*f7cd7fe5SConrad Meyer	$(INSTALL_DATA) common/zstd_errors.h $(DESTDIR)$(INCLUDEDIR)
438*f7cd7fe5SConrad Meyer	$(INSTALL_DATA) dictBuilder/zdict.h $(DESTDIR)$(INCLUDEDIR)
4390c16b537SWarner Losh
4400c16b537SWarner Loshuninstall:
441*f7cd7fe5SConrad Meyer	$(RM) $(DESTDIR)$(LIBDIR)/libzstd.a
442*f7cd7fe5SConrad Meyer	$(RM) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT)
443*f7cd7fe5SConrad Meyer	$(RM) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT_MAJOR)
444*f7cd7fe5SConrad Meyer	$(RM) $(DESTDIR)$(LIBDIR)/$(LIBZSTD)
445*f7cd7fe5SConrad Meyer	$(RM) $(DESTDIR)$(PKGCONFIGDIR)/libzstd.pc
446*f7cd7fe5SConrad Meyer	$(RM) $(DESTDIR)$(INCLUDEDIR)/zstd.h
447*f7cd7fe5SConrad Meyer	$(RM) $(DESTDIR)$(INCLUDEDIR)/zstd_errors.h
448*f7cd7fe5SConrad Meyer	$(RM) $(DESTDIR)$(INCLUDEDIR)/zdict.h
4490c16b537SWarner Losh	@echo zstd libraries successfully uninstalled
4500c16b537SWarner Losh
4510c16b537SWarner Loshendif
452