| From f1f1ae369a4cefd3474b3528e8d1847b18750605 Mon Sep 17 00:00:00 2001 |
| From: Christian Marangi <ansuelsmth@gmail.com> |
| 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 <ansuelsmth@gmail.com> |
| --- |
| 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@ |