Makefile 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. # ################################################################
  2. # Copyright (c) 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. # You may select, at your option, one of the above-listed licenses.
  9. # ################################################################
  10. # Modules
  11. ZSTD_LIB_COMPRESSION ?= 1
  12. ZSTD_LIB_DECOMPRESSION ?= 1
  13. ZSTD_LIB_DICTBUILDER ?= 1
  14. ZSTD_LIB_DEPRECATED ?= 0
  15. # Input variables for libzstd.mk
  16. ifeq ($(ZSTD_LIB_COMPRESSION), 0)
  17. ZSTD_LIB_DICTBUILDER = 0
  18. ZSTD_LIB_DEPRECATED = 0
  19. endif
  20. ifeq ($(ZSTD_LIB_DECOMPRESSION), 0)
  21. ZSTD_LEGACY_SUPPORT = 0
  22. ZSTD_LIB_DEPRECATED = 0
  23. endif
  24. include libzstd.mk
  25. ZSTD_FILES := $(ZSTD_COMMON_FILES) $(ZSTD_LEGACY_FILES)
  26. ifneq ($(ZSTD_LIB_COMPRESSION), 0)
  27. ZSTD_FILES += $(ZSTD_COMPRESS_FILES)
  28. endif
  29. ifneq ($(ZSTD_LIB_DECOMPRESSION), 0)
  30. ZSTD_FILES += $(ZSTD_DECOMPRESS_FILES)
  31. endif
  32. ifneq ($(ZSTD_LIB_DEPRECATED), 0)
  33. ZSTD_FILES += $(ZSTD_DEPRECATED_FILES)
  34. endif
  35. ifneq ($(ZSTD_LIB_DICTBUILDER), 0)
  36. ZSTD_FILES += $(ZSTD_DICTBUILDER_FILES)
  37. endif
  38. ZSTD_LOCAL_SRC := $(notdir $(ZSTD_FILES))
  39. ZSTD_LOCAL_OBJ0 := $(ZSTD_LOCAL_SRC:.c=.o)
  40. ZSTD_LOCAL_OBJ := $(ZSTD_LOCAL_OBJ0:.S=.o)
  41. VERSION := $(ZSTD_VERSION)
  42. # Note: by default, the static library is built single-threaded and dynamic library is built
  43. # multi-threaded. It is possible to force multi or single threaded builds by appending
  44. # -mt or -nomt to the build target (like lib-mt for multi-threaded, lib-nomt for single-threaded).
  45. .PHONY: default
  46. default: lib-release
  47. CPPFLAGS_DYNLIB += -DZSTD_MULTITHREAD # dynamic library build defaults to multi-threaded
  48. LDFLAGS_DYNLIB += -pthread
  49. CPPFLAGS_STATLIB += # static library build defaults to single-threaded
  50. ifeq ($(findstring GCC,$(CCVER)),GCC)
  51. decompress/zstd_decompress_block.o : CFLAGS+=-fno-tree-vectorize
  52. endif
  53. # macOS linker doesn't support -soname, and use different extension
  54. # see : https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/DynamicLibraries/100-Articles/DynamicLibraryDesignGuidelines.html
  55. ifeq ($(UNAME), Darwin)
  56. SHARED_EXT = dylib
  57. SHARED_EXT_MAJOR = $(LIBVER_MAJOR).$(SHARED_EXT)
  58. SHARED_EXT_VER = $(LIBVER).$(SHARED_EXT)
  59. SONAME_FLAGS = -install_name $(LIBDIR)/libzstd.$(SHARED_EXT_MAJOR) -compatibility_version $(LIBVER_MAJOR) -current_version $(LIBVER)
  60. else
  61. ifeq ($(UNAME), AIX)
  62. SONAME_FLAGS =
  63. else
  64. SONAME_FLAGS = -Wl,-soname=libzstd.$(SHARED_EXT).$(LIBVER_MAJOR)
  65. endif
  66. SHARED_EXT = so
  67. SHARED_EXT_MAJOR = $(SHARED_EXT).$(LIBVER_MAJOR)
  68. SHARED_EXT_VER = $(SHARED_EXT).$(LIBVER)
  69. endif
  70. .PHONY: all
  71. all: lib
  72. .PHONY: libzstd.a # must be run every time
  73. libzstd.a: CPPFLAGS += $(CPPFLAGS_STATLIB)
  74. SET_CACHE_DIRECTORY = \
  75. +$(MAKE) --no-print-directory $@ \
  76. BUILD_DIR=obj/$(HASH_DIR) \
  77. CPPFLAGS="$(CPPFLAGS)" \
  78. CFLAGS="$(CFLAGS)" \
  79. LDFLAGS="$(LDFLAGS)"
  80. ifndef BUILD_DIR
  81. # determine BUILD_DIR from compilation flags
  82. libzstd.a:
  83. $(SET_CACHE_DIRECTORY)
  84. else
  85. # BUILD_DIR is defined
  86. ZSTD_STATLIB_DIR := $(BUILD_DIR)/static
  87. ZSTD_STATLIB := $(ZSTD_STATLIB_DIR)/libzstd.a
  88. ZSTD_STATLIB_OBJ := $(addprefix $(ZSTD_STATLIB_DIR)/,$(ZSTD_LOCAL_OBJ))
  89. $(ZSTD_STATLIB): ARFLAGS = rcs
  90. $(ZSTD_STATLIB): | $(ZSTD_STATLIB_DIR)
  91. $(ZSTD_STATLIB): $(ZSTD_STATLIB_OBJ)
  92. # Check for multithread flag at target execution time
  93. $(if $(filter -DZSTD_MULTITHREAD,$(CPPFLAGS)),\
  94. @echo compiling multi-threaded static library $(LIBVER),\
  95. @echo compiling single-threaded static library $(LIBVER))
  96. $(AR) $(ARFLAGS) $@ $^
  97. libzstd.a: $(ZSTD_STATLIB)
  98. cp -f $< $@
  99. endif
  100. ifneq (,$(filter Windows%,$(TARGET_SYSTEM)))
  101. LIBZSTD = dll/libzstd.dll
  102. $(LIBZSTD): $(ZSTD_FILES)
  103. @echo compiling dynamic library $(LIBVER)
  104. $(CC) $(FLAGS) -DZSTD_DLL_EXPORT=1 -Wl,--out-implib,dll/libzstd.dll.a -shared $^ -o $@
  105. else # not Windows
  106. LIBZSTD = libzstd.$(SHARED_EXT_VER)
  107. .PHONY: $(LIBZSTD) # must be run every time
  108. $(LIBZSTD): CPPFLAGS += $(CPPFLAGS_DYNLIB)
  109. $(LIBZSTD): CFLAGS += -fPIC -fvisibility=hidden
  110. $(LIBZSTD): LDFLAGS += -shared $(LDFLAGS_DYNLIB)
  111. ifndef BUILD_DIR
  112. # determine BUILD_DIR from compilation flags
  113. $(LIBZSTD):
  114. $(SET_CACHE_DIRECTORY)
  115. else
  116. # BUILD_DIR is defined
  117. ZSTD_DYNLIB_DIR := $(BUILD_DIR)/dynamic
  118. ZSTD_DYNLIB := $(ZSTD_DYNLIB_DIR)/$(LIBZSTD)
  119. ZSTD_DYNLIB_OBJ := $(addprefix $(ZSTD_DYNLIB_DIR)/,$(ZSTD_LOCAL_OBJ))
  120. $(ZSTD_DYNLIB): | $(ZSTD_DYNLIB_DIR)
  121. $(ZSTD_DYNLIB): $(ZSTD_DYNLIB_OBJ)
  122. # Check for multithread flag at target execution time
  123. $(if $(filter -DZSTD_MULTITHREAD,$(CPPFLAGS)),\
  124. @echo compiling multi-threaded dynamic library $(LIBVER),\
  125. @echo compiling single-threaded dynamic library $(LIBVER))
  126. $(CC) $(FLAGS) $^ $(LDFLAGS) $(SONAME_FLAGS) -o $@
  127. @echo creating versioned links
  128. ln -sf $@ libzstd.$(SHARED_EXT_MAJOR)
  129. ln -sf $@ libzstd.$(SHARED_EXT)
  130. $(LIBZSTD): $(ZSTD_DYNLIB)
  131. cp -f $< $@
  132. endif # ifndef BUILD_DIR
  133. endif # if windows
  134. .PHONY: libzstd
  135. libzstd : $(LIBZSTD)
  136. .PHONY: lib
  137. lib : libzstd.a libzstd
  138. # note : do not define lib-mt or lib-release as .PHONY
  139. # make does not consider implicit pattern rule for .PHONY target
  140. %-mt : CPPFLAGS_DYNLIB := -DZSTD_MULTITHREAD
  141. %-mt : CPPFLAGS_STATLIB := -DZSTD_MULTITHREAD
  142. %-mt : LDFLAGS_DYNLIB := -pthread
  143. %-mt : %
  144. @echo multi-threaded build completed
  145. %-nomt : CPPFLAGS_DYNLIB :=
  146. %-nomt : LDFLAGS_DYNLIB :=
  147. %-nomt : CPPFLAGS_STATLIB :=
  148. %-nomt : %
  149. @echo single-threaded build completed
  150. %-release : DEBUGFLAGS :=
  151. %-release : %
  152. @echo release build completed
  153. # Generate .h dependencies automatically
  154. DEPFLAGS = -MT $@ -MMD -MP -MF
  155. $(ZSTD_DYNLIB_DIR)/%.o : %.c $(ZSTD_DYNLIB_DIR)/%.d | $(ZSTD_DYNLIB_DIR)
  156. @echo CC $@
  157. $(COMPILE.c) $(DEPFLAGS) $(ZSTD_DYNLIB_DIR)/$*.d $(OUTPUT_OPTION) $<
  158. $(ZSTD_STATLIB_DIR)/%.o : %.c $(ZSTD_STATLIB_DIR)/%.d | $(ZSTD_STATLIB_DIR)
  159. @echo CC $@
  160. $(COMPILE.c) $(DEPFLAGS) $(ZSTD_STATLIB_DIR)/$*.d $(OUTPUT_OPTION) $<
  161. $(ZSTD_DYNLIB_DIR)/%.o : %.S | $(ZSTD_DYNLIB_DIR)
  162. @echo AS $@
  163. $(COMPILE.c) $(OUTPUT_OPTION) $<
  164. $(ZSTD_STATLIB_DIR)/%.o : %.S | $(ZSTD_STATLIB_DIR)
  165. @echo AS $@
  166. $(COMPILE.c) $(OUTPUT_OPTION) $<
  167. MKDIR ?= mkdir
  168. $(BUILD_DIR) $(ZSTD_DYNLIB_DIR) $(ZSTD_STATLIB_DIR):
  169. $(MKDIR) -p $@
  170. DEPFILES := $(ZSTD_DYNLIB_OBJ:.o=.d) $(ZSTD_STATLIB_OBJ:.o=.d)
  171. $(DEPFILES):
  172. include $(wildcard $(DEPFILES))
  173. # Special case : building library in single-thread mode _and_ without zstdmt_compress.c
  174. ZSTDMT_FILES = compress/zstdmt_compress.c
  175. ZSTD_NOMT_FILES = $(filter-out $(ZSTDMT_FILES),$(ZSTD_FILES))
  176. libzstd-nomt: CFLAGS += -fPIC -fvisibility=hidden
  177. libzstd-nomt: LDFLAGS += -shared
  178. libzstd-nomt: $(ZSTD_NOMT_FILES)
  179. @echo compiling single-thread dynamic library $(LIBVER)
  180. @echo files : $(ZSTD_NOMT_FILES)
  181. $(CC) $(FLAGS) $^ $(LDFLAGS) $(SONAME_FLAGS) -o $@
  182. .PHONY: clean
  183. clean:
  184. $(RM) -r *.dSYM # macOS-specific
  185. $(RM) core *.o *.a *.gcda *.$(SHARED_EXT) *.$(SHARED_EXT).* libzstd.pc
  186. $(RM) dll/libzstd.dll dll/libzstd.lib libzstd-nomt*
  187. $(RM) -r obj/*
  188. @echo Cleaning library completed
  189. #-----------------------------------------------------------------------------
  190. # make install is validated only for below listed environments
  191. #-----------------------------------------------------------------------------
  192. ifneq (,$(filter $(UNAME),Linux Darwin GNU/kFreeBSD GNU OpenBSD FreeBSD NetBSD DragonFly SunOS Haiku AIX))
  193. lib: libzstd.pc
  194. HAS_EXPLICIT_EXEC_PREFIX := $(if $(or $(EXEC_PREFIX),$(exec_prefix)),1,)
  195. DESTDIR ?=
  196. # directory variables : GNU conventions prefer lowercase
  197. # see https://www.gnu.org/prep/standards/html_node/Makefile-Conventions.html
  198. # support both lower and uppercase (BSD), use uppercase in script
  199. prefix ?= /usr/local
  200. PREFIX ?= $(prefix)
  201. exec_prefix ?= $(PREFIX)
  202. EXEC_PREFIX ?= $(exec_prefix)
  203. libdir ?= $(EXEC_PREFIX)/lib
  204. LIBDIR ?= $(libdir)
  205. includedir ?= $(PREFIX)/include
  206. INCLUDEDIR ?= $(includedir)
  207. PCINCDIR := $(patsubst $(PREFIX)%,%,$(INCLUDEDIR))
  208. PCLIBDIR := $(patsubst $(EXEC_PREFIX)%,%,$(LIBDIR))
  209. # If we successfully stripped off a prefix, we'll add a reference to the
  210. # relevant pc variable.
  211. PCINCPREFIX := $(if $(findstring $(INCLUDEDIR),$(PCINCDIR)),,$${prefix})
  212. PCLIBPREFIX := $(if $(findstring $(LIBDIR),$(PCLIBDIR)),,$${exec_prefix})
  213. # If no explicit EXEC_PREFIX was set by the caller, write it out as a reference
  214. # to PREFIX, rather than as a resolved value.
  215. PCEXEC_PREFIX := $(if $(HAS_EXPLICIT_EXEC_PREFIX),$(EXEC_PREFIX),$${prefix})
  216. ifneq (,$(filter $(UNAME),FreeBSD NetBSD DragonFly))
  217. PKGCONFIGDIR ?= $(PREFIX)/libdata/pkgconfig
  218. else
  219. PKGCONFIGDIR ?= $(LIBDIR)/pkgconfig
  220. endif
  221. ifneq (,$(filter $(UNAME),SunOS))
  222. INSTALL ?= ginstall
  223. else
  224. INSTALL ?= install
  225. endif
  226. INSTALL_PROGRAM ?= $(INSTALL)
  227. INSTALL_DATA ?= $(INSTALL) -m 644
  228. libzstd.pc: libzstd.pc.in
  229. @echo creating pkgconfig
  230. @sed $(SED_ERE_OPT) \
  231. -e 's|@PREFIX@|$(PREFIX)|' \
  232. -e 's|@EXEC_PREFIX@|$(PCEXEC_PREFIX)|' \
  233. -e 's|@INCLUDEDIR@|$(PCINCPREFIX)$(PCINCDIR)|' \
  234. -e 's|@LIBDIR@|$(PCLIBPREFIX)$(PCLIBDIR)|' \
  235. -e 's|@VERSION@|$(VERSION)|' \
  236. -e 's|@LIBS_PRIVATE@|$(LDFLAGS_DYNLIB)|' \
  237. $< >$@
  238. .PHONY: install
  239. install: install-pc install-static install-shared install-includes
  240. @echo zstd static and shared library installed
  241. .PHONY: install-pc
  242. install-pc: libzstd.pc
  243. [ -e $(DESTDIR)$(PKGCONFIGDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(PKGCONFIGDIR)/
  244. $(INSTALL_DATA) libzstd.pc $(DESTDIR)$(PKGCONFIGDIR)/
  245. .PHONY: install-static
  246. install-static:
  247. # only generate libzstd.a if it's not already present
  248. [ -e libzstd.a ] || $(MAKE) libzstd.a-release
  249. [ -e $(DESTDIR)$(LIBDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(LIBDIR)/
  250. @echo Installing static library
  251. $(INSTALL_DATA) libzstd.a $(DESTDIR)$(LIBDIR)
  252. .PHONY: install-shared
  253. install-shared:
  254. # only generate libzstd.so if it's not already present
  255. [ -e $(LIBZSTD) ] || $(MAKE) libzstd-release
  256. [ -e $(DESTDIR)$(LIBDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(LIBDIR)/
  257. @echo Installing shared library
  258. $(INSTALL_PROGRAM) $(LIBZSTD) $(DESTDIR)$(LIBDIR)
  259. ln -sf $(LIBZSTD) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT_MAJOR)
  260. ln -sf $(LIBZSTD) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT)
  261. .PHONY: install-includes
  262. install-includes:
  263. [ -e $(DESTDIR)$(INCLUDEDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(INCLUDEDIR)/
  264. @echo Installing includes
  265. $(INSTALL_DATA) zstd.h $(DESTDIR)$(INCLUDEDIR)
  266. $(INSTALL_DATA) zstd_errors.h $(DESTDIR)$(INCLUDEDIR)
  267. $(INSTALL_DATA) zdict.h $(DESTDIR)$(INCLUDEDIR)
  268. .PHONY: uninstall
  269. uninstall:
  270. $(RM) $(DESTDIR)$(LIBDIR)/libzstd.a
  271. $(RM) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT)
  272. $(RM) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT_MAJOR)
  273. $(RM) $(DESTDIR)$(LIBDIR)/$(LIBZSTD)
  274. $(RM) $(DESTDIR)$(PKGCONFIGDIR)/libzstd.pc
  275. $(RM) $(DESTDIR)$(INCLUDEDIR)/zstd.h
  276. $(RM) $(DESTDIR)$(INCLUDEDIR)/zstd_errors.h
  277. $(RM) $(DESTDIR)$(INCLUDEDIR)/zdict.h
  278. @echo zstd libraries successfully uninstalled
  279. endif