xref: /freebsd/sys/contrib/zstd/lib/Makefile (revision 148a8da8)
1# ################################################################
2# Copyright (c) 2015-present, Yann Collet, Facebook, Inc.
3# All rights reserved.
4#
5# This source code is licensed under both the BSD-style license (found in the
6# LICENSE file in the root directory of this source tree) and the GPLv2 (found
7# in the COPYING file in the root directory of this source tree).
8# ################################################################
9
10# Version numbers
11LIBVER_MAJOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MAJOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < ./zstd.h`
12LIBVER_MINOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MINOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < ./zstd.h`
13LIBVER_PATCH_SCRIPT:=`sed -n '/define ZSTD_VERSION_RELEASE/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < ./zstd.h`
14LIBVER_SCRIPT:= $(LIBVER_MAJOR_SCRIPT).$(LIBVER_MINOR_SCRIPT).$(LIBVER_PATCH_SCRIPT)
15LIBVER_MAJOR := $(shell echo $(LIBVER_MAJOR_SCRIPT))
16LIBVER_MINOR := $(shell echo $(LIBVER_MINOR_SCRIPT))
17LIBVER_PATCH := $(shell echo $(LIBVER_PATCH_SCRIPT))
18LIBVER := $(shell echo $(LIBVER_SCRIPT))
19VERSION?= $(LIBVER)
20
21CPPFLAGS+= -I. -I./common -DXXH_NAMESPACE=ZSTD_
22ifeq ($(OS),Windows_NT)   # MinGW assumed
23CPPFLAGS   += -D__USE_MINGW_ANSI_STDIO   # compatibility with %zu formatting
24endif
25CFLAGS  ?= -O3
26DEBUGFLAGS= -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow \
27            -Wstrict-aliasing=1 -Wswitch-enum -Wdeclaration-after-statement \
28            -Wstrict-prototypes -Wundef -Wpointer-arith \
29            -Wvla -Wformat=2 -Winit-self -Wfloat-equal -Wwrite-strings \
30            -Wredundant-decls -Wmissing-prototypes -Wc++-compat
31CFLAGS  += $(DEBUGFLAGS) $(MOREFLAGS)
32FLAGS    = $(CPPFLAGS) $(CFLAGS)
33
34HAVE_COLORNEVER = $(shell echo a | grep --color=never a > /dev/null 2> /dev/null && echo 1 || echo 0)
35GREP_OPTIONS ?=
36ifeq ($HAVE_COLORNEVER, 1)
37GREP_OPTIONS += --color=never
38endif
39GREP = grep $(GREP_OPTIONS)
40
41ZSTDCOMMON_FILES := $(sort $(wildcard common/*.c))
42ZSTDCOMP_FILES := $(sort $(wildcard compress/*.c))
43ZSTDDECOMP_FILES := $(sort $(wildcard decompress/*.c))
44ZDICT_FILES := $(sort $(wildcard dictBuilder/*.c))
45ZDEPR_FILES := $(sort $(wildcard deprecated/*.c))
46ZSTD_FILES := $(ZSTDCOMMON_FILES)
47
48ZSTD_LEGACY_SUPPORT ?= 5
49ZSTD_LIB_COMPRESSION ?= 1
50ZSTD_LIB_DECOMPRESSION ?= 1
51ZSTD_LIB_DICTBUILDER ?= 1
52ZSTD_LIB_DEPRECATED ?= 1
53HUF_FORCE_DECOMPRESS_X1 ?= 0
54HUF_FORCE_DECOMPRESS_X2 ?= 0
55ZSTD_FORCE_DECOMPRESS_SHORT ?= 0
56ZSTD_FORCE_DECOMPRESS_LONG ?= 0
57ZSTD_NO_INLINE ?= 0
58ZSTD_STRIP_ERROR_STRINGS ?= 0
59ZSTD_LEGACY_MULTITHREADED_API ?= 0
60
61ifeq ($(ZSTD_LIB_COMPRESSION), 0)
62	ZSTD_LIB_DICTBUILDER = 0
63	ZSTD_LIB_DEPRECATED = 0
64endif
65
66ifeq ($(ZSTD_LIB_DECOMPRESSION), 0)
67	ZSTD_LEGACY_SUPPORT = 0
68	ZSTD_LIB_DEPRECATED = 0
69endif
70
71ifneq ($(ZSTD_LIB_COMPRESSION), 0)
72	ZSTD_FILES += $(ZSTDCOMP_FILES)
73endif
74
75ifneq ($(ZSTD_LIB_DECOMPRESSION), 0)
76	ZSTD_FILES += $(ZSTDDECOMP_FILES)
77endif
78
79ifneq ($(ZSTD_LIB_DEPRECATED), 0)
80	ZSTD_FILES += $(ZDEPR_FILES)
81endif
82
83ifneq ($(ZSTD_LIB_DICTBUILDER), 0)
84	ZSTD_FILES += $(ZDICT_FILES)
85endif
86
87ifneq ($(HUF_FORCE_DECOMPRESS_X1), 0)
88	CFLAGS += -DHUF_FORCE_DECOMPRESS_X1
89endif
90
91ifneq ($(HUF_FORCE_DECOMPRESS_X2), 0)
92	CFLAGS += -DHUF_FORCE_DECOMPRESS_X2
93endif
94
95ifneq ($(ZSTD_FORCE_DECOMPRESS_SHORT), 0)
96	CFLAGS += -DZSTD_FORCE_DECOMPRESS_SHORT
97endif
98
99ifneq ($(ZSTD_FORCE_DECOMPRESS_LONG), 0)
100	CFLAGS += -DZSTD_FORCE_DECOMPRESS_LONG
101endif
102
103ifneq ($(ZSTD_NO_INLINE), 0)
104	CFLAGS += -DZSTD_NO_INLINE
105endif
106
107ifneq ($(ZSTD_STRIP_ERROR_STRINGS), 0)
108	CFLAGS += -DZSTD_STRIP_ERROR_STRINGS
109endif
110
111ifneq ($(ZSTD_LEGACY_MULTITHREADED_API), 0)
112	CFLAGS += -DZSTD_LEGACY_MULTITHREADED_API
113endif
114
115ifneq ($(ZSTD_LEGACY_SUPPORT), 0)
116ifeq ($(shell test $(ZSTD_LEGACY_SUPPORT) -lt 8; echo $$?), 0)
117	ZSTD_FILES += $(shell ls legacy/*.c | $(GREP) 'v0[$(ZSTD_LEGACY_SUPPORT)-7]')
118endif
119	CPPFLAGS += -I./legacy
120endif
121CPPFLAGS  += -DZSTD_LEGACY_SUPPORT=$(ZSTD_LEGACY_SUPPORT)
122
123ZSTD_OBJ   := $(patsubst %.c,%.o,$(ZSTD_FILES))
124
125# macOS linker doesn't support -soname, and use different extension
126# see : https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/DynamicLibraries/100-Articles/DynamicLibraryDesignGuidelines.html
127ifeq ($(shell uname), Darwin)
128	SHARED_EXT = dylib
129	SHARED_EXT_MAJOR = $(LIBVER_MAJOR).$(SHARED_EXT)
130	SHARED_EXT_VER = $(LIBVER).$(SHARED_EXT)
131	SONAME_FLAGS = -install_name $(LIBDIR)/libzstd.$(SHARED_EXT_MAJOR) -compatibility_version $(LIBVER_MAJOR) -current_version $(LIBVER)
132else
133	SONAME_FLAGS = -Wl,-soname=libzstd.$(SHARED_EXT).$(LIBVER_MAJOR)
134	SHARED_EXT = so
135	SHARED_EXT_MAJOR = $(SHARED_EXT).$(LIBVER_MAJOR)
136	SHARED_EXT_VER = $(SHARED_EXT).$(LIBVER)
137endif
138
139
140.PHONY: default all clean install uninstall
141
142default: lib-release
143
144all: lib
145
146libzstd.a: ARFLAGS = rcs
147libzstd.a: $(ZSTD_OBJ)
148	@echo compiling static library
149	@$(AR) $(ARFLAGS) $@ $^
150
151libzstd.a-mt: CPPFLAGS += -DZSTD_MULTITHREAD
152libzstd.a-mt: libzstd.a
153
154ifneq (,$(filter Windows%,$(OS)))
155
156LIBZSTD = dll\libzstd.dll
157$(LIBZSTD): $(ZSTD_FILES)
158	@echo compiling dynamic library $(LIBVER)
159	$(CC) $(FLAGS) -DZSTD_DLL_EXPORT=1 -Wl,--out-implib,dll\libzstd.lib -shared $^ -o $@
160
161else
162
163LIBZSTD = libzstd.$(SHARED_EXT_VER)
164$(LIBZSTD): LDFLAGS += -shared -fPIC -fvisibility=hidden
165$(LIBZSTD): $(ZSTD_FILES)
166	@echo compiling dynamic library $(LIBVER)
167	@$(CC) $(FLAGS) $^ $(LDFLAGS) $(SONAME_FLAGS) -o $@
168	@echo creating versioned links
169	@ln -sf $@ libzstd.$(SHARED_EXT_MAJOR)
170	@ln -sf $@ libzstd.$(SHARED_EXT)
171
172endif
173
174
175libzstd : $(LIBZSTD)
176
177libzstd-mt : CPPFLAGS += -DZSTD_MULTITHREAD
178libzstd-mt : libzstd
179
180lib: libzstd.a libzstd
181
182lib-mt: CPPFLAGS += -DZSTD_MULTITHREAD
183lib-mt: lib
184
185lib-release lib-release-mt: DEBUGFLAGS :=
186lib-release: lib
187lib-release-mt: lib-mt
188
189# Special case : building library in single-thread mode _and_ without zstdmt_compress.c
190ZSTDMT_FILES = compress/zstdmt_compress.c
191ZSTD_NOMT_FILES = $(filter-out $(ZSTDMT_FILES),$(ZSTD_FILES))
192libzstd-nomt: LDFLAGS += -shared -fPIC -fvisibility=hidden
193libzstd-nomt: $(ZSTD_NOMT_FILES)
194	@echo compiling single-thread dynamic library $(LIBVER)
195	@echo files : $(ZSTD_NOMT_FILES)
196	@$(CC) $(FLAGS) $^ $(LDFLAGS) $(SONAME_FLAGS) -o $@
197
198clean:
199	@$(RM) -r *.dSYM   # macOS-specific
200	@$(RM) core *.o *.a *.gcda *.$(SHARED_EXT) *.$(SHARED_EXT).* libzstd.pc
201	@$(RM) dll/libzstd.dll dll/libzstd.lib libzstd-nomt*
202	@$(RM) common/*.o compress/*.o decompress/*.o dictBuilder/*.o legacy/*.o deprecated/*.o
203	@echo Cleaning library completed
204
205#-----------------------------------------------------------------------------
206# make install is validated only for Linux, macOS, BSD, Hurd and Solaris targets
207#-----------------------------------------------------------------------------
208ifneq (,$(filter $(shell uname),Linux Darwin GNU/kFreeBSD GNU OpenBSD FreeBSD NetBSD DragonFly SunOS Haiku))
209
210DESTDIR     ?=
211# directory variables : GNU conventions prefer lowercase
212# see https://www.gnu.org/prep/standards/html_node/Makefile-Conventions.html
213# support both lower and uppercase (BSD), use uppercase in script
214prefix      ?= /usr/local
215PREFIX      ?= $(prefix)
216exec_prefix ?= $(PREFIX)
217libdir      ?= $(exec_prefix)/lib
218LIBDIR      ?= $(libdir)
219includedir  ?= $(PREFIX)/include
220INCLUDEDIR  ?= $(includedir)
221
222ifneq (,$(filter $(shell uname),FreeBSD NetBSD DragonFly))
223PKGCONFIGDIR ?= $(PREFIX)/libdata/pkgconfig
224else
225PKGCONFIGDIR ?= $(LIBDIR)/pkgconfig
226endif
227
228ifneq (,$(filter $(shell uname),SunOS))
229INSTALL ?= ginstall
230else
231INSTALL ?= install
232endif
233
234INSTALL_PROGRAM ?= $(INSTALL)
235INSTALL_DATA    ?= $(INSTALL) -m 644
236
237
238libzstd.pc:
239libzstd.pc: libzstd.pc.in
240	@echo creating pkgconfig
241	@sed -e 's|@PREFIX@|$(PREFIX)|' \
242             -e 's|@LIBDIR@|$(LIBDIR)|' \
243             -e 's|@INCLUDEDIR@|$(INCLUDEDIR)|' \
244             -e 's|@VERSION@|$(VERSION)|' \
245             $< >$@
246
247install: install-pc install-static install-shared install-includes
248	@echo zstd static and shared library installed
249
250install-pc: libzstd.pc
251	@$(INSTALL) -d -m 755 $(DESTDIR)$(PKGCONFIGDIR)/
252	@$(INSTALL_DATA) libzstd.pc $(DESTDIR)$(PKGCONFIGDIR)/
253
254install-static: libzstd.a
255	@echo Installing static library
256	@$(INSTALL) -d -m 755 $(DESTDIR)$(LIBDIR)/
257	@$(INSTALL_DATA) libzstd.a $(DESTDIR)$(LIBDIR)
258
259install-shared: libzstd
260	@echo Installing shared library
261	@$(INSTALL) -d -m 755 $(DESTDIR)$(LIBDIR)/
262	@$(INSTALL_PROGRAM) $(LIBZSTD) $(DESTDIR)$(LIBDIR)
263	@ln -sf $(LIBZSTD) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT_MAJOR)
264	@ln -sf $(LIBZSTD) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT)
265
266install-includes:
267	@echo Installing includes
268	@$(INSTALL) -d -m 755 $(DESTDIR)$(INCLUDEDIR)/
269	@$(INSTALL_DATA) zstd.h $(DESTDIR)$(INCLUDEDIR)
270	@$(INSTALL_DATA) common/zstd_errors.h $(DESTDIR)$(INCLUDEDIR)
271	@$(INSTALL_DATA) deprecated/zbuff.h $(DESTDIR)$(INCLUDEDIR)     # prototypes generate deprecation warnings
272	@$(INSTALL_DATA) dictBuilder/zdict.h $(DESTDIR)$(INCLUDEDIR)
273
274uninstall:
275	@$(RM) $(DESTDIR)$(LIBDIR)/libzstd.a
276	@$(RM) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT)
277	@$(RM) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT_MAJOR)
278	@$(RM) $(DESTDIR)$(LIBDIR)/$(LIBZSTD)
279	@$(RM) $(DESTDIR)$(PKGCONFIGDIR)/libzstd.pc
280	@$(RM) $(DESTDIR)$(INCLUDEDIR)/zstd.h
281	@$(RM) $(DESTDIR)$(INCLUDEDIR)/zstd_errors.h
282	@$(RM) $(DESTDIR)$(INCLUDEDIR)/zbuff.h   # Deprecated streaming functions
283	@$(RM) $(DESTDIR)$(INCLUDEDIR)/zdict.h
284	@echo zstd libraries successfully uninstalled
285
286endif
287