|
@@ -0,0 +1,126 @@
|
|
|
+From f1f1ae369a4cefd3474b3528e8d1847b18750605 Mon Sep 17 00:00:00 2001
|
|
|
+From: Christian Marangi <[email protected]>
|
|
|
+Date: Sat, 6 Apr 2024 14:41:54 +0200
|
|
|
+Subject: [PATCH] Provide variant pkg-config file for multi-threaded static lib
|
|
|
+
|
|
|
+Multi-threaded static library require -pthread to correctly link and works.
|
|
|
+The pkg-config we provide tho only works with dynamic multi-threaded library
|
|
|
+and won't provide the correct libs and cflags values if lib-mt is used.
|
|
|
+
|
|
|
+To handle this, introduce an env variable MT to permit advanced user to
|
|
|
+install and generate a correct pkg-config file for lib-mt or detect if
|
|
|
+lib-mt target is called.
|
|
|
+
|
|
|
+With MT env set on calling make install-pc, libzstd.pc.in is a
|
|
|
+pkg-config file for a multi-threaded static library.
|
|
|
+
|
|
|
+On calling make lib-mt, a libzstd.pc is generated for a multi-threaded
|
|
|
+static library as it's what asked by the user by forcing it.
|
|
|
+
|
|
|
+libzstd.pc is changed to PHONY to force regeneration of it on calling
|
|
|
+lib targets or install-pc to handle case where the same directory is
|
|
|
+used for mixed compilation.
|
|
|
+
|
|
|
+This was notice while migrating from meson to make build system where
|
|
|
+meson generates a correct .pc file while make doesn't.
|
|
|
+
|
|
|
+Signed-off-by: Christian Marangi <[email protected]>
|
|
|
+---
|
|
|
+ lib/Makefile | 20 +++++++++++++++++++-
|
|
|
+ lib/README.md | 4 ++++
|
|
|
+ lib/libzstd.pc.in | 4 ++--
|
|
|
+ 3 files changed, 25 insertions(+), 3 deletions(-)
|
|
|
+
|
|
|
+--- a/lib/Makefile
|
|
|
++++ b/lib/Makefile
|
|
|
+@@ -63,6 +63,8 @@ CPPFLAGS_DYNLIB += -DZSTD_MULTITHREAD #
|
|
|
+ LDFLAGS_DYNLIB += -pthread
|
|
|
+ CPPFLAGS_STATICLIB += # static library build defaults to single-threaded
|
|
|
+
|
|
|
++# pkg-config Libs.private points to LDFLAGS_DYNLIB
|
|
|
++PCLIB := $(LDFLAGS_DYNLIB)
|
|
|
+
|
|
|
+ ifeq ($(findstring GCC,$(CCVER)),GCC)
|
|
|
+ decompress/zstd_decompress_block.o : CFLAGS+=-fno-tree-vectorize
|
|
|
+@@ -186,12 +188,15 @@ lib : libzstd.a libzstd
|
|
|
+ %-mt : CPPFLAGS_DYNLIB := -DZSTD_MULTITHREAD
|
|
|
+ %-mt : CPPFLAGS_STATICLIB := -DZSTD_MULTITHREAD
|
|
|
+ %-mt : LDFLAGS_DYNLIB := -pthread
|
|
|
++%-mt : PCLIB :=
|
|
|
++%-mt : PCMTLIB := $(LDFLAGS_DYNLIB)
|
|
|
+ %-mt : %
|
|
|
+ @echo multi-threaded build completed
|
|
|
+
|
|
|
+ %-nomt : CPPFLAGS_DYNLIB :=
|
|
|
+ %-nomt : LDFLAGS_DYNLIB :=
|
|
|
+ %-nomt : CPPFLAGS_STATICLIB :=
|
|
|
++%-nomt : PCLIB :=
|
|
|
+ %-nomt : %
|
|
|
+ @echo single-threaded build completed
|
|
|
+
|
|
|
+@@ -292,6 +297,14 @@ PCLIBPREFIX := $(if $(findstring $(LIBDI
|
|
|
+ # to PREFIX, rather than as a resolved value.
|
|
|
+ PCEXEC_PREFIX := $(if $(HAS_EXPLICIT_EXEC_PREFIX),$(EXEC_PREFIX),$${prefix})
|
|
|
+
|
|
|
++
|
|
|
++ifneq ($(MT),)
|
|
|
++ PCLIB :=
|
|
|
++ PCMTLIB := $(LDFLAGS_DYNLIB)
|
|
|
++else
|
|
|
++ PCLIB := $(LDFLAGS_DYNLIB)
|
|
|
++endif
|
|
|
++
|
|
|
+ ifneq (,$(filter $(UNAME),FreeBSD NetBSD DragonFly))
|
|
|
+ PKGCONFIGDIR ?= $(PREFIX)/libdata/pkgconfig
|
|
|
+ else
|
|
|
+@@ -308,6 +321,10 @@ INSTALL_PROGRAM ?= $(INSTALL)
|
|
|
+ INSTALL_DATA ?= $(INSTALL) -m 644
|
|
|
+
|
|
|
+
|
|
|
++# pkg-config library define.
|
|
|
++# For static single-threaded library declare -pthread in Libs.private
|
|
|
++# For static multi-threaded library declare -pthread in Libs and Cflags
|
|
|
++.PHONY: libzstd.pc
|
|
|
+ libzstd.pc: libzstd.pc.in
|
|
|
+ @echo creating pkgconfig
|
|
|
+ @sed \
|
|
|
+@@ -316,7 +333,8 @@ libzstd.pc: libzstd.pc.in
|
|
|
+ -e 's|@INCLUDEDIR@|$(PCINCPREFIX)$(PCINCDIR)|' \
|
|
|
+ -e 's|@LIBDIR@|$(PCLIBPREFIX)$(PCLIBDIR)|' \
|
|
|
+ -e 's|@VERSION@|$(VERSION)|' \
|
|
|
+- -e 's|@LIBS_PRIVATE@|$(LDFLAGS_DYNLIB)|' \
|
|
|
++ -e 's|@LIBS_MT@|$(PCMTLIB)|' \
|
|
|
++ -e 's|@LIBS_PRIVATE@|$(PCLIB)|' \
|
|
|
+ $< >$@
|
|
|
+
|
|
|
+ .PHONY: install
|
|
|
+--- a/lib/README.md
|
|
|
++++ b/lib/README.md
|
|
|
+@@ -27,12 +27,16 @@ Enabling multithreading requires 2 condi
|
|
|
+
|
|
|
+ For convenience, we provide a build target to generate multi and single threaded libraries:
|
|
|
+ - Force enable multithreading on both dynamic and static libraries by appending `-mt` to the target, e.g. `make lib-mt`.
|
|
|
++ Note that the `.pc` generated on calling `make lib-mt` will already include the require Libs and Cflags.
|
|
|
+ - Force disable multithreading on both dynamic and static libraries by appending `-nomt` to the target, e.g. `make lib-nomt`.
|
|
|
+ - By default, as mentioned before, dynamic library is multithreaded, and static library is single-threaded, e.g. `make lib`.
|
|
|
+
|
|
|
+ When linking a POSIX program with a multithreaded version of `libzstd`,
|
|
|
+ note that it's necessary to invoke the `-pthread` flag during link stage.
|
|
|
+
|
|
|
++The `.pc` generated from `make install` or `make install-pc` always assume a single-threaded static library
|
|
|
++is compiled. To correctly generate a `.pc` for the multi-threaded static library, set `MT=1` as ENV variable.
|
|
|
++
|
|
|
+ Multithreading capabilities are exposed
|
|
|
+ via the [advanced API defined in `lib/zstd.h`](https://github.com/facebook/zstd/blob/v1.4.3/lib/zstd.h#L351).
|
|
|
+
|
|
|
+--- a/lib/libzstd.pc.in
|
|
|
++++ b/lib/libzstd.pc.in
|
|
|
+@@ -11,6 +11,6 @@ Name: zstd
|
|
|
+ Description: fast lossless compression algorithm library
|
|
|
+ URL: https://facebook.github.io/zstd/
|
|
|
+ Version: @VERSION@
|
|
|
+-Libs: -L${libdir} -lzstd
|
|
|
++Libs: -L${libdir} -lzstd @LIBS_MT@
|
|
|
+ Libs.private: @LIBS_PRIVATE@
|
|
|
+-Cflags: -I${includedir}
|
|
|
++Cflags: -I${includedir} @LIBS_MT@
|