xref: /aosp_15_r20/external/zstd/lib/Makefile (revision 01826a4963a0d8a59bc3812d29bdf0fb76416722)
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# default target (when running `make` with no argument)
12*01826a49SYabin Cuilib-release:
13*01826a49SYabin Cui
14*01826a49SYabin Cui# Modules
15*01826a49SYabin CuiZSTD_LIB_COMPRESSION ?= 1
16*01826a49SYabin CuiZSTD_LIB_DECOMPRESSION ?= 1
17*01826a49SYabin CuiZSTD_LIB_DICTBUILDER ?= 1
18*01826a49SYabin CuiZSTD_LIB_DEPRECATED ?= 0
19*01826a49SYabin Cui
20*01826a49SYabin Cui# Input variables for libzstd.mk
21*01826a49SYabin Cuiifeq ($(ZSTD_LIB_COMPRESSION), 0)
22*01826a49SYabin Cui  ZSTD_LIB_DICTBUILDER = 0
23*01826a49SYabin Cui  ZSTD_LIB_DEPRECATED = 0
24*01826a49SYabin Cuiendif
25*01826a49SYabin Cui
26*01826a49SYabin Cuiifeq ($(ZSTD_LIB_DECOMPRESSION), 0)
27*01826a49SYabin Cui  ZSTD_LEGACY_SUPPORT = 0
28*01826a49SYabin Cui  ZSTD_LIB_DEPRECATED = 0
29*01826a49SYabin Cuiendif
30*01826a49SYabin Cui
31*01826a49SYabin Cuiinclude libzstd.mk
32*01826a49SYabin Cui
33*01826a49SYabin CuiZSTD_FILES := $(ZSTD_COMMON_FILES) $(ZSTD_LEGACY_FILES)
34*01826a49SYabin Cui
35*01826a49SYabin Cuiifneq ($(ZSTD_LIB_COMPRESSION), 0)
36*01826a49SYabin Cui  ZSTD_FILES += $(ZSTD_COMPRESS_FILES)
37*01826a49SYabin Cuiendif
38*01826a49SYabin Cui
39*01826a49SYabin Cuiifneq ($(ZSTD_LIB_DECOMPRESSION), 0)
40*01826a49SYabin Cui  ZSTD_FILES += $(ZSTD_DECOMPRESS_FILES)
41*01826a49SYabin Cuiendif
42*01826a49SYabin Cui
43*01826a49SYabin Cuiifneq ($(ZSTD_LIB_DEPRECATED), 0)
44*01826a49SYabin Cui  ZSTD_FILES += $(ZSTD_DEPRECATED_FILES)
45*01826a49SYabin Cuiendif
46*01826a49SYabin Cui
47*01826a49SYabin Cuiifneq ($(ZSTD_LIB_DICTBUILDER), 0)
48*01826a49SYabin Cui  ZSTD_FILES += $(ZSTD_DICTBUILDER_FILES)
49*01826a49SYabin Cuiendif
50*01826a49SYabin Cui
51*01826a49SYabin CuiZSTD_LOCAL_SRC := $(notdir $(ZSTD_FILES))
52*01826a49SYabin CuiZSTD_LOCAL_OBJ0 := $(ZSTD_LOCAL_SRC:.c=.o)
53*01826a49SYabin CuiZSTD_LOCAL_OBJ := $(ZSTD_LOCAL_OBJ0:.S=.o)
54*01826a49SYabin Cui
55*01826a49SYabin CuiVERSION := $(ZSTD_VERSION)
56*01826a49SYabin Cui
57*01826a49SYabin Cui# Note: by default, the static library is built single-threaded and dynamic library is built
58*01826a49SYabin Cui# multi-threaded. It is possible to force multi or single threaded builds by appending
59*01826a49SYabin Cui# -mt or -nomt to the build target (like lib-mt for multi-threaded, lib-nomt for single-threaded).
60*01826a49SYabin Cui
61*01826a49SYabin Cui
62*01826a49SYabin CuiCPPFLAGS_DYNLIB  += -DZSTD_MULTITHREAD # dynamic library build defaults to multi-threaded
63*01826a49SYabin CuiLDFLAGS_DYNLIB   += -pthread
64*01826a49SYabin CuiCPPFLAGS_STATICLIB +=                  # static library build defaults to single-threaded
65*01826a49SYabin Cui
66*01826a49SYabin Cui
67*01826a49SYabin Cuiifeq ($(findstring GCC,$(CCVER)),GCC)
68*01826a49SYabin Cuidecompress/zstd_decompress_block.o : CFLAGS+=-fno-tree-vectorize
69*01826a49SYabin Cuiendif
70*01826a49SYabin Cui
71*01826a49SYabin Cui
72*01826a49SYabin Cui# macOS linker doesn't support -soname, and use different extension
73*01826a49SYabin Cui# see : https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/DynamicLibraries/100-Articles/DynamicLibraryDesignGuidelines.html
74*01826a49SYabin Cuiifeq ($(UNAME), Darwin)
75*01826a49SYabin Cui  SHARED_EXT = dylib
76*01826a49SYabin Cui  SHARED_EXT_MAJOR = $(LIBVER_MAJOR).$(SHARED_EXT)
77*01826a49SYabin Cui  SHARED_EXT_VER = $(LIBVER).$(SHARED_EXT)
78*01826a49SYabin Cui  SONAME_FLAGS = -install_name $(LIBDIR)/libzstd.$(SHARED_EXT_MAJOR) -compatibility_version $(LIBVER_MAJOR) -current_version $(LIBVER)
79*01826a49SYabin Cuielse
80*01826a49SYabin Cui  ifeq ($(UNAME), AIX)
81*01826a49SYabin Cui    SONAME_FLAGS =
82*01826a49SYabin Cui  else
83*01826a49SYabin Cui    SONAME_FLAGS = -Wl,-soname=libzstd.$(SHARED_EXT).$(LIBVER_MAJOR)
84*01826a49SYabin Cui  endif
85*01826a49SYabin Cui  SHARED_EXT = so
86*01826a49SYabin Cui  SHARED_EXT_MAJOR = $(SHARED_EXT).$(LIBVER_MAJOR)
87*01826a49SYabin Cui  SHARED_EXT_VER = $(SHARED_EXT).$(LIBVER)
88*01826a49SYabin Cuiendif
89*01826a49SYabin Cui
90*01826a49SYabin Cui
91*01826a49SYabin Cui.PHONY: all
92*01826a49SYabin Cuiall: lib
93*01826a49SYabin Cui
94*01826a49SYabin Cui
95*01826a49SYabin Cui.PHONY: libzstd.a  # must be run every time
96*01826a49SYabin Cuilibzstd.a: CPPFLAGS += $(CPPFLAGS_STATICLIB)
97*01826a49SYabin Cui
98*01826a49SYabin CuiSET_CACHE_DIRECTORY = \
99*01826a49SYabin Cui   +$(MAKE) --no-print-directory $@ \
100*01826a49SYabin Cui    BUILD_DIR=obj/$(HASH_DIR) \
101*01826a49SYabin Cui    CPPFLAGS="$(CPPFLAGS)" \
102*01826a49SYabin Cui    CFLAGS="$(CFLAGS)" \
103*01826a49SYabin Cui    LDFLAGS="$(LDFLAGS)"
104*01826a49SYabin Cui
105*01826a49SYabin Cuiifndef BUILD_DIR
106*01826a49SYabin Cui# determine BUILD_DIR from compilation flags
107*01826a49SYabin Cui
108*01826a49SYabin Cuilibzstd.a:
109*01826a49SYabin Cui	$(SET_CACHE_DIRECTORY)
110*01826a49SYabin Cui
111*01826a49SYabin Cuielse
112*01826a49SYabin Cui# BUILD_DIR is defined
113*01826a49SYabin Cui
114*01826a49SYabin CuiZSTD_STATICLIB_DIR := $(BUILD_DIR)/static
115*01826a49SYabin CuiZSTD_STATICLIB := $(ZSTD_STATICLIB_DIR)/libzstd.a
116*01826a49SYabin CuiZSTD_STATICLIB_OBJ := $(addprefix $(ZSTD_STATICLIB_DIR)/,$(ZSTD_LOCAL_OBJ))
117*01826a49SYabin Cui$(ZSTD_STATICLIB): ARFLAGS = rcs
118*01826a49SYabin Cui$(ZSTD_STATICLIB): | $(ZSTD_STATICLIB_DIR)
119*01826a49SYabin Cui$(ZSTD_STATICLIB): $(ZSTD_STATICLIB_OBJ)
120*01826a49SYabin Cui  # Check for multithread flag at target execution time
121*01826a49SYabin Cui	$(if $(filter -DZSTD_MULTITHREAD,$(CPPFLAGS)),\
122*01826a49SYabin Cui    @echo compiling multi-threaded static library $(LIBVER),\
123*01826a49SYabin Cui    @echo compiling single-threaded static library $(LIBVER))
124*01826a49SYabin Cui	$(AR) $(ARFLAGS) $@ $^
125*01826a49SYabin Cui
126*01826a49SYabin Cuilibzstd.a: $(ZSTD_STATICLIB)
127*01826a49SYabin Cui	cp -f $< $@
128*01826a49SYabin Cui
129*01826a49SYabin Cuiendif
130*01826a49SYabin Cui
131*01826a49SYabin Cuiifneq (,$(filter Windows%,$(TARGET_SYSTEM)))
132*01826a49SYabin Cui
133*01826a49SYabin CuiLIBZSTD = dll/libzstd.dll
134*01826a49SYabin Cui$(LIBZSTD): $(ZSTD_FILES)
135*01826a49SYabin Cui	@echo compiling dynamic library $(LIBVER)
136*01826a49SYabin Cui	$(CC) $(FLAGS) -DZSTD_DLL_EXPORT=1 -Wl,--out-implib,dll/libzstd.dll.a -shared $^ -o $@
137*01826a49SYabin Cui
138*01826a49SYabin Cuielse  # not Windows
139*01826a49SYabin Cui
140*01826a49SYabin CuiLIBZSTD = libzstd.$(SHARED_EXT_VER)
141*01826a49SYabin Cui.PHONY: $(LIBZSTD)  # must be run every time
142*01826a49SYabin Cui$(LIBZSTD): CPPFLAGS += $(CPPFLAGS_DYNLIB)
143*01826a49SYabin Cui$(LIBZSTD): CFLAGS   += -fPIC -fvisibility=hidden
144*01826a49SYabin Cui$(LIBZSTD): LDFLAGS  += -shared $(LDFLAGS_DYNLIB)
145*01826a49SYabin Cui
146*01826a49SYabin Cuiifndef BUILD_DIR
147*01826a49SYabin Cui# determine BUILD_DIR from compilation flags
148*01826a49SYabin Cui
149*01826a49SYabin Cui$(LIBZSTD):
150*01826a49SYabin Cui	$(SET_CACHE_DIRECTORY)
151*01826a49SYabin Cui
152*01826a49SYabin Cuielse
153*01826a49SYabin Cui# BUILD_DIR is defined
154*01826a49SYabin Cui
155*01826a49SYabin CuiZSTD_DYNLIB_DIR := $(BUILD_DIR)/dynamic
156*01826a49SYabin CuiZSTD_DYNLIB := $(ZSTD_DYNLIB_DIR)/$(LIBZSTD)
157*01826a49SYabin CuiZSTD_DYNLIB_OBJ := $(addprefix $(ZSTD_DYNLIB_DIR)/,$(ZSTD_LOCAL_OBJ))
158*01826a49SYabin Cui
159*01826a49SYabin Cui$(ZSTD_DYNLIB): | $(ZSTD_DYNLIB_DIR)
160*01826a49SYabin Cui$(ZSTD_DYNLIB): $(ZSTD_DYNLIB_OBJ)
161*01826a49SYabin Cui# Check for multithread flag at target execution time
162*01826a49SYabin Cui	$(if $(filter -DZSTD_MULTITHREAD,$(CPPFLAGS)),\
163*01826a49SYabin Cui    @echo compiling multi-threaded dynamic library $(LIBVER),\
164*01826a49SYabin Cui    @echo compiling single-threaded dynamic library $(LIBVER))
165*01826a49SYabin Cui	$(CC) $(FLAGS) $^ $(LDFLAGS) $(SONAME_FLAGS) -o $@
166*01826a49SYabin Cui	@echo creating versioned links
167*01826a49SYabin Cui	ln -sf $@ libzstd.$(SHARED_EXT_MAJOR)
168*01826a49SYabin Cui	ln -sf $@ libzstd.$(SHARED_EXT)
169*01826a49SYabin Cui
170*01826a49SYabin Cui$(LIBZSTD): $(ZSTD_DYNLIB)
171*01826a49SYabin Cui	cp -f $< $@
172*01826a49SYabin Cui
173*01826a49SYabin Cuiendif  # ifndef BUILD_DIR
174*01826a49SYabin Cuiendif  # if windows
175*01826a49SYabin Cui
176*01826a49SYabin Cui.PHONY: libzstd
177*01826a49SYabin Cuilibzstd : $(LIBZSTD)
178*01826a49SYabin Cui
179*01826a49SYabin Cui.PHONY: lib
180*01826a49SYabin Cuilib : libzstd.a libzstd
181*01826a49SYabin Cui
182*01826a49SYabin Cui
183*01826a49SYabin Cui# note : do not define lib-mt or lib-release as .PHONY
184*01826a49SYabin Cui# make does not consider implicit pattern rule for .PHONY target
185*01826a49SYabin Cui
186*01826a49SYabin Cui%-mt : CPPFLAGS_DYNLIB  := -DZSTD_MULTITHREAD
187*01826a49SYabin Cui%-mt : CPPFLAGS_STATICLIB := -DZSTD_MULTITHREAD
188*01826a49SYabin Cui%-mt : LDFLAGS_DYNLIB   := -pthread
189*01826a49SYabin Cui%-mt : %
190*01826a49SYabin Cui	@echo multi-threaded build completed
191*01826a49SYabin Cui
192*01826a49SYabin Cui%-nomt : CPPFLAGS_DYNLIB  :=
193*01826a49SYabin Cui%-nomt : LDFLAGS_DYNLIB   :=
194*01826a49SYabin Cui%-nomt : CPPFLAGS_STATICLIB :=
195*01826a49SYabin Cui%-nomt : %
196*01826a49SYabin Cui	@echo single-threaded build completed
197*01826a49SYabin Cui
198*01826a49SYabin Cui%-release : DEBUGFLAGS :=
199*01826a49SYabin Cui%-release : %
200*01826a49SYabin Cui	@echo release build completed
201*01826a49SYabin Cui
202*01826a49SYabin Cui
203*01826a49SYabin Cui# Generate .h dependencies automatically
204*01826a49SYabin Cui
205*01826a49SYabin Cui# -MMD: compiler generates dependency information as a side-effect of compilation, without system headers
206*01826a49SYabin Cui# -MP: adds phony target for each dependency other than main file.
207*01826a49SYabin CuiDEPFLAGS = -MMD -MP
208*01826a49SYabin Cui
209*01826a49SYabin Cui# ensure that ZSTD_DYNLIB_DIR exists prior to generating %.o
210*01826a49SYabin Cui$(ZSTD_DYNLIB_DIR)/%.o : %.c | $(ZSTD_DYNLIB_DIR)
211*01826a49SYabin Cui	@echo CC $@
212*01826a49SYabin Cui	$(COMPILE.c) $(DEPFLAGS) $(OUTPUT_OPTION) $<
213*01826a49SYabin Cui
214*01826a49SYabin Cui$(ZSTD_STATICLIB_DIR)/%.o : %.c | $(ZSTD_STATICLIB_DIR)
215*01826a49SYabin Cui	@echo CC $@
216*01826a49SYabin Cui	$(COMPILE.c) $(DEPFLAGS) $(OUTPUT_OPTION) $<
217*01826a49SYabin Cui
218*01826a49SYabin Cui$(ZSTD_DYNLIB_DIR)/%.o : %.S | $(ZSTD_DYNLIB_DIR)
219*01826a49SYabin Cui	@echo AS $@
220*01826a49SYabin Cui	$(COMPILE.S) $(OUTPUT_OPTION) $<
221*01826a49SYabin Cui
222*01826a49SYabin Cui$(ZSTD_STATICLIB_DIR)/%.o : %.S | $(ZSTD_STATICLIB_DIR)
223*01826a49SYabin Cui	@echo AS $@
224*01826a49SYabin Cui	$(COMPILE.S) $(OUTPUT_OPTION) $<
225*01826a49SYabin Cui
226*01826a49SYabin CuiMKDIR ?= mkdir -p
227*01826a49SYabin Cui$(BUILD_DIR) $(ZSTD_DYNLIB_DIR) $(ZSTD_STATICLIB_DIR):
228*01826a49SYabin Cui	$(MKDIR) $@
229*01826a49SYabin Cui
230*01826a49SYabin CuiDEPFILES := $(ZSTD_DYNLIB_OBJ:.o=.d) $(ZSTD_STATICLIB_OBJ:.o=.d)
231*01826a49SYabin Cui$(DEPFILES):
232*01826a49SYabin Cui
233*01826a49SYabin Cui# The leading '-' means: do not fail is include fails (ex: directory does not exist yet)
234*01826a49SYabin Cui-include $(wildcard $(DEPFILES))
235*01826a49SYabin Cui
236*01826a49SYabin Cui
237*01826a49SYabin Cui# Special case : build library in single-thread mode _and_ without zstdmt_compress.c
238*01826a49SYabin Cui# Note : we still need threading.c and pool.c for the dictionary builder,
239*01826a49SYabin Cui# but they will correctly behave single-threaded.
240*01826a49SYabin CuiZSTDMT_FILES = zstdmt_compress.c
241*01826a49SYabin CuiZSTD_NOMT_FILES = $(filter-out $(ZSTDMT_FILES),$(notdir $(ZSTD_FILES)))
242*01826a49SYabin Cuilibzstd-nomt: CFLAGS += -fPIC -fvisibility=hidden
243*01826a49SYabin Cuilibzstd-nomt: LDFLAGS += -shared
244*01826a49SYabin Cuilibzstd-nomt: $(ZSTD_NOMT_FILES)
245*01826a49SYabin Cui	@echo compiling single-thread dynamic library $(LIBVER)
246*01826a49SYabin Cui	@echo files : $(ZSTD_NOMT_FILES)
247*01826a49SYabin Cui	@if echo "$(ZSTD_NOMT_FILES)" | tr ' ' '\n' | $(GREP) -q zstdmt; then \
248*01826a49SYabin Cui        echo "Error: Found zstdmt in list."; \
249*01826a49SYabin Cui        exit 1; \
250*01826a49SYabin Cui    fi
251*01826a49SYabin Cui	$(CC) $(FLAGS) $^ $(LDFLAGS) $(SONAME_FLAGS) -o $@
252*01826a49SYabin Cui
253*01826a49SYabin Cui.PHONY: clean
254*01826a49SYabin Cuiclean:
255*01826a49SYabin Cui	$(RM) -r *.dSYM   # macOS-specific
256*01826a49SYabin Cui	$(RM) core *.o *.a *.gcda *.$(SHARED_EXT) *.$(SHARED_EXT).* libzstd.pc
257*01826a49SYabin Cui	$(RM) dll/libzstd.dll dll/libzstd.lib libzstd-nomt*
258*01826a49SYabin Cui	$(RM) -r obj/*
259*01826a49SYabin Cui	@echo Cleaning library completed
260*01826a49SYabin Cui
261*01826a49SYabin Cui#-----------------------------------------------------------------------------
262*01826a49SYabin Cui# make install is validated only for below listed environments
263*01826a49SYabin Cui#-----------------------------------------------------------------------------
264*01826a49SYabin Cuiifneq (,$(filter $(UNAME),Linux Darwin GNU/kFreeBSD GNU OpenBSD FreeBSD NetBSD DragonFly SunOS Haiku AIX MSYS_NT CYGWIN_NT))
265*01826a49SYabin Cui
266*01826a49SYabin Cuilib: libzstd.pc
267*01826a49SYabin Cui
268*01826a49SYabin CuiHAS_EXPLICIT_EXEC_PREFIX := $(if $(or $(EXEC_PREFIX),$(exec_prefix)),1,)
269*01826a49SYabin Cui
270*01826a49SYabin CuiDESTDIR     ?=
271*01826a49SYabin Cui# directory variables : GNU conventions prefer lowercase
272*01826a49SYabin Cui# see https://www.gnu.org/prep/standards/html_node/Makefile-Conventions.html
273*01826a49SYabin Cui# support both lower and uppercase (BSD), use uppercase in script
274*01826a49SYabin Cuiprefix      ?= /usr/local
275*01826a49SYabin CuiPREFIX      ?= $(prefix)
276*01826a49SYabin Cuiexec_prefix ?= $(PREFIX)
277*01826a49SYabin CuiEXEC_PREFIX ?= $(exec_prefix)
278*01826a49SYabin Cuilibdir      ?= $(EXEC_PREFIX)/lib
279*01826a49SYabin CuiLIBDIR      ?= $(libdir)
280*01826a49SYabin Cuiincludedir  ?= $(PREFIX)/include
281*01826a49SYabin CuiINCLUDEDIR  ?= $(includedir)
282*01826a49SYabin Cui
283*01826a49SYabin CuiPCINCDIR := $(patsubst $(PREFIX)%,%,$(INCLUDEDIR))
284*01826a49SYabin CuiPCLIBDIR := $(patsubst $(EXEC_PREFIX)%,%,$(LIBDIR))
285*01826a49SYabin Cui
286*01826a49SYabin Cui# If we successfully stripped off a prefix, we'll add a reference to the
287*01826a49SYabin Cui# relevant pc variable.
288*01826a49SYabin CuiPCINCPREFIX := $(if $(findstring $(INCLUDEDIR),$(PCINCDIR)),,$${prefix})
289*01826a49SYabin CuiPCLIBPREFIX := $(if $(findstring $(LIBDIR),$(PCLIBDIR)),,$${exec_prefix})
290*01826a49SYabin Cui
291*01826a49SYabin Cui# If no explicit EXEC_PREFIX was set by the caller, write it out as a reference
292*01826a49SYabin Cui# to PREFIX, rather than as a resolved value.
293*01826a49SYabin CuiPCEXEC_PREFIX := $(if $(HAS_EXPLICIT_EXEC_PREFIX),$(EXEC_PREFIX),$${prefix})
294*01826a49SYabin Cui
295*01826a49SYabin Cuiifneq (,$(filter $(UNAME),FreeBSD NetBSD DragonFly))
296*01826a49SYabin Cui  PKGCONFIGDIR ?= $(PREFIX)/libdata/pkgconfig
297*01826a49SYabin Cuielse
298*01826a49SYabin Cui  PKGCONFIGDIR ?= $(LIBDIR)/pkgconfig
299*01826a49SYabin Cuiendif
300*01826a49SYabin Cui
301*01826a49SYabin Cuiifneq (,$(filter $(UNAME),SunOS))
302*01826a49SYabin Cui  INSTALL ?= ginstall
303*01826a49SYabin Cuielse
304*01826a49SYabin Cui  INSTALL ?= install
305*01826a49SYabin Cuiendif
306*01826a49SYabin Cui
307*01826a49SYabin CuiINSTALL_PROGRAM ?= $(INSTALL)
308*01826a49SYabin CuiINSTALL_DATA    ?= $(INSTALL) -m 644
309*01826a49SYabin Cui
310*01826a49SYabin Cui
311*01826a49SYabin Cuilibzstd.pc: libzstd.pc.in
312*01826a49SYabin Cui	@echo creating pkgconfig
313*01826a49SYabin Cui	@sed \
314*01826a49SYabin Cui	        -e 's|@PREFIX@|$(PREFIX)|' \
315*01826a49SYabin Cui	        -e 's|@EXEC_PREFIX@|$(PCEXEC_PREFIX)|' \
316*01826a49SYabin Cui	        -e 's|@INCLUDEDIR@|$(PCINCPREFIX)$(PCINCDIR)|' \
317*01826a49SYabin Cui	        -e 's|@LIBDIR@|$(PCLIBPREFIX)$(PCLIBDIR)|' \
318*01826a49SYabin Cui	        -e 's|@VERSION@|$(VERSION)|' \
319*01826a49SYabin Cui	        -e 's|@LIBS_PRIVATE@|$(LDFLAGS_DYNLIB)|' \
320*01826a49SYabin Cui	        $< >$@
321*01826a49SYabin Cui
322*01826a49SYabin Cui.PHONY: install
323*01826a49SYabin Cuiinstall: install-pc install-static install-shared install-includes
324*01826a49SYabin Cui	@echo zstd static and shared library installed
325*01826a49SYabin Cui
326*01826a49SYabin Cui.PHONY: install-pc
327*01826a49SYabin Cuiinstall-pc: libzstd.pc
328*01826a49SYabin Cui	[ -e $(DESTDIR)$(PKGCONFIGDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(PKGCONFIGDIR)/
329*01826a49SYabin Cui	$(INSTALL_DATA) libzstd.pc $(DESTDIR)$(PKGCONFIGDIR)/
330*01826a49SYabin Cui
331*01826a49SYabin Cui.PHONY: install-static
332*01826a49SYabin Cuiinstall-static:
333*01826a49SYabin Cui	# only generate libzstd.a if it's not already present
334*01826a49SYabin Cui	[ -e libzstd.a ] || $(MAKE) libzstd.a-release
335*01826a49SYabin Cui	[ -e $(DESTDIR)$(LIBDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(LIBDIR)/
336*01826a49SYabin Cui	@echo Installing static library
337*01826a49SYabin Cui	$(INSTALL_DATA) libzstd.a $(DESTDIR)$(LIBDIR)
338*01826a49SYabin Cui
339*01826a49SYabin Cui.PHONY: install-shared
340*01826a49SYabin Cuiinstall-shared:
341*01826a49SYabin Cui	# only generate libzstd.so if it's not already present
342*01826a49SYabin Cui	[ -e $(LIBZSTD) ] || $(MAKE) libzstd-release
343*01826a49SYabin Cui	[ -e $(DESTDIR)$(LIBDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(LIBDIR)/
344*01826a49SYabin Cui	@echo Installing shared library
345*01826a49SYabin Cui	$(INSTALL_PROGRAM) $(LIBZSTD) $(DESTDIR)$(LIBDIR)
346*01826a49SYabin Cui	ln -sf $(LIBZSTD) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT_MAJOR)
347*01826a49SYabin Cui	ln -sf $(LIBZSTD) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT)
348*01826a49SYabin Cui
349*01826a49SYabin Cui.PHONY: install-includes
350*01826a49SYabin Cuiinstall-includes:
351*01826a49SYabin Cui	[ -e $(DESTDIR)$(INCLUDEDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(INCLUDEDIR)/
352*01826a49SYabin Cui	@echo Installing includes
353*01826a49SYabin Cui	$(INSTALL_DATA) zstd.h $(DESTDIR)$(INCLUDEDIR)
354*01826a49SYabin Cui	$(INSTALL_DATA) zstd_errors.h $(DESTDIR)$(INCLUDEDIR)
355*01826a49SYabin Cui	$(INSTALL_DATA) zdict.h $(DESTDIR)$(INCLUDEDIR)
356*01826a49SYabin Cui
357*01826a49SYabin Cui.PHONY: uninstall
358*01826a49SYabin Cuiuninstall:
359*01826a49SYabin Cui	$(RM) $(DESTDIR)$(LIBDIR)/libzstd.a
360*01826a49SYabin Cui	$(RM) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT)
361*01826a49SYabin Cui	$(RM) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT_MAJOR)
362*01826a49SYabin Cui	$(RM) $(DESTDIR)$(LIBDIR)/$(LIBZSTD)
363*01826a49SYabin Cui	$(RM) $(DESTDIR)$(PKGCONFIGDIR)/libzstd.pc
364*01826a49SYabin Cui	$(RM) $(DESTDIR)$(INCLUDEDIR)/zstd.h
365*01826a49SYabin Cui	$(RM) $(DESTDIR)$(INCLUDEDIR)/zstd_errors.h
366*01826a49SYabin Cui	$(RM) $(DESTDIR)$(INCLUDEDIR)/zdict.h
367*01826a49SYabin Cui	@echo zstd libraries successfully uninstalled
368*01826a49SYabin Cui
369*01826a49SYabin Cuiendif
370