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