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