1From 7be7e35d61d8d499599623502a35460d410de114 Mon Sep 17 00:00:00 2001
2From: Alexander Shpilkin <ashpilkin@gmail.com>
3Date: Thu, 26 May 2022 16:03:27 +0300
4Subject: [PATCH] Squashed commit of the following:
5
6commit 9aacb9d5da65a64c3845937a6f9eede329d43989
7Author: W. Felix Handte <w@felixhandte.com>
8Date: Tue Dec 8 20:46:02 2020 -0500
9
10 Apply Same Strategy to CMake
11
12 (cherry picked from commit a75f9ce3e924564ab358c2c1aa95b6268383ec42)
13
14commit e21b7ad0d98d1322ea92f99fcd1f85e2d6b6f6b7
15Author: W. Felix Handte <w@felixhandte.com>
16Date: Tue Dec 8 20:10:05 2020 -0500
17
18 Avoid Use of Regexes in Building Package-Config File
19
20 (cherry picked from commit b521183c74795bd9bdd9bdebe74af01cae4d3d43)
21---
22 build/cmake/lib/CMakeLists.txt | 29 ++++++++++++++++++++++++----
23 lib/Makefile | 35 ++++++++++++++++------------------
24 lib/libzstd.pc.in | 6 +++---
25 3 files changed, 44 insertions(+), 26 deletions(-)
26
27diff --git a/build/cmake/lib/CMakeLists.txt b/build/cmake/lib/CMakeLists.txt
28index 32ae7525..466c2c7b 100644
29--- a/build/cmake/lib/CMakeLists.txt
30+++ b/build/cmake/lib/CMakeLists.txt
31@@ -137,12 +137,33 @@ endif ()
32 if (UNIX)
33 # pkg-config
34 set(PREFIX "${CMAKE_INSTALL_PREFIX}")
35- set(LIBDIR "${CMAKE_INSTALL_LIBDIR}")
36- set(INCLUDEDIR "${CMAKE_INSTALL_INCLUDEDIR}")
37+ set(EXEC_PREFIX "\\$$\{prefix}")
38+ set(LIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}")
39+ set(INCLUDEDIR "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
40 set(VERSION "${zstd_VERSION}")
41+
42+ string(LENGTH "${PREFIX}" PREFIX_LENGTH)
43+ string(SUBSTRING "${LIBDIR}" 0 ${PREFIX_LENGTH} LIBDIR_PREFIX)
44+ string(SUBSTRING "${LIBDIR}" ${PREFIX_LENGTH} -1 LIBDIR_SUFFIX)
45+ string(SUBSTRING "${INCLUDEDIR}" 0 ${PREFIX_LENGTH} INCLUDEDIR_PREFIX)
46+ string(SUBSTRING "${INCLUDEDIR}" ${PREFIX_LENGTH} -1 INCLUDEDIR_SUFFIX)
47+
48+ if ("${INCLUDEDIR_PREFIX}" STREQUAL "${PREFIX}")
49+ set(INCLUDEDIR_PREFIX "\\$$\{prefix}")
50+ endif()
51+ if ("${LIBDIR_PREFIX}" STREQUAL "${PREFIX}")
52+ set(LIBDIR_PREFIX "\\$$\{exec_prefix}")
53+ endif()
54+
55 add_custom_target(libzstd.pc ALL
56- ${CMAKE_COMMAND} -DIN="${LIBRARY_DIR}/libzstd.pc.in" -DOUT="libzstd.pc"
57- -DPREFIX="${PREFIX}" -DLIBDIR="${LIBDIR}" -DINCLUDEDIR="${INCLUDEDIR}" -DVERSION="${VERSION}"
58+ ${CMAKE_COMMAND}
59+ -DIN="${LIBRARY_DIR}/libzstd.pc.in"
60+ -DOUT="libzstd.pc"
61+ -DPREFIX="${PREFIX}"
62+ -DEXEC_PREFIX="${EXEC_PREFIX}"
63+ -DINCLUDEDIR="${INCLUDEDIR_PREFIX}${INCLUDEDIR_SUFFIX}"
64+ -DLIBDIR="${LIBDIR_PREFIX}${LIBDIR_SUFFIX}"
65+ -DVERSION="${VERSION}"
66 -P "${CMAKE_CURRENT_SOURCE_DIR}/pkgconfig.cmake"
67 COMMENT "Creating pkg-config file")
68
69diff --git a/lib/Makefile b/lib/Makefile
70index 4a9ab799..2893ec21 100644
71--- a/lib/Makefile
72+++ b/lib/Makefile
73@@ -257,6 +257,8 @@ ifneq (,$(filter $(shell uname),Linux Darwin GNU/kFreeBSD GNU OpenBSD FreeBSD Ne
74
75 all: libzstd.pc
76
77+HAS_EXPLICIT_EXEC_PREFIX := $(if $(or $(EXEC_PREFIX),$(exec_prefix)),1,)
78+
79 DESTDIR ?=
80 # directory variables : GNU conventions prefer lowercase
81 # see https://www.gnu.org/prep/standards/html_node/Makefile-Conventions.html
82@@ -270,24 +272,17 @@ LIBDIR ?= $(libdir)
83 includedir ?= $(PREFIX)/include
84 INCLUDEDIR ?= $(includedir)
85
86-PCLIBDIR ?= $(shell echo "$(LIBDIR)" | sed -n $(SED_ERE_OPT) -e "s@^$(EXEC_PREFIX)(/|$$)@@p")
87-PCINCDIR ?= $(shell echo "$(INCLUDEDIR)" | sed -n $(SED_ERE_OPT) -e "s@^$(PREFIX)(/|$$)@@p")
88+PCINCDIR := $(patsubst $(PREFIX)%,%,$(INCLUDEDIR))
89+PCLIBDIR := $(patsubst $(EXEC_PREFIX)%,%,$(LIBDIR))
90
91-ifeq (,$(PCLIBDIR))
92-# Additional prefix check is required, since the empty string is technically a
93-# valid PCLIBDIR
94-ifeq (,$(shell echo "$(LIBDIR)" | sed -n $(SED_ERE_OPT) -e "\\@^$(EXEC_PREFIX)(/|$$)@ p"))
95-$(error configured libdir ($(LIBDIR)) is outside of prefix ($(PREFIX)), can't generate pkg-config file)
96-endif
97-endif
98+# If we successfully stripped off a prefix, we'll add a reference to the
99+# relevant pc variable.
100+PCINCPREFIX := $(if $(findstring $(INCLUDEDIR),$(PCINCDIR)),,$${prefix})
101+PCLIBPREFIX := $(if $(findstring $(LIBDIR),$(PCLIBDIR)),,$${exec_prefix})
102
103-ifeq (,$(PCINCDIR))
104-# Additional prefix check is required, since the empty string is technically a
105-# valid PCINCDIR
106-ifeq (,$(shell echo "$(INCLUDEDIR)" | sed -n $(SED_ERE_OPT) -e "\\@^$(PREFIX)(/|$$)@ p"))
107-$(error configured includedir ($(INCLUDEDIR)) is outside of exec_prefix ($(EXEC_PREFIX)), can't generate pkg-config file)
108-endif
109-endif
110+# If no explicit EXEC_PREFIX was set by the caller, write it out as a reference
111+# to PREFIX, rather than as a resolved value.
112+PCEXEC_PREFIX := $(if $(HAS_EXPLICIT_EXEC_PREFIX),$(EXEC_PREFIX),$${prefix})
113
114 ifneq (,$(filter $(shell uname),FreeBSD NetBSD DragonFly))
115 PKGCONFIGDIR ?= $(PREFIX)/libdata/pkgconfig
116@@ -308,9 +303,11 @@ INSTALL_DATA ?= $(INSTALL) -m 644
117 libzstd.pc:
118 libzstd.pc: libzstd.pc.in
119 @echo creating pkgconfig
120- $(Q)@sed $(SED_ERE_OPT) -e 's|@PREFIX@|$(PREFIX)|' \
121- -e 's|@LIBDIR@|$(PCLIBDIR)|' \
122- -e 's|@INCLUDEDIR@|$(PCINCDIR)|' \
123+ $(Q)@sed $(SED_ERE_OPT) \
124+ -e 's|@PREFIX@|$(PREFIX)|' \
125+ -e 's|@EXEC_PREFIX@|$(PCEXEC_PREFIX)|' \
126+ -e 's|@INCLUDEDIR@|$(PCINCPREFIX)$(PCINCDIR)|' \
127+ -e 's|@LIBDIR@|$(PCLIBPREFIX)$(PCLIBDIR)|' \
128 -e 's|@VERSION@|$(VERSION)|' \
129 $< >$@
130
131diff --git a/lib/libzstd.pc.in b/lib/libzstd.pc.in
132index 8ec0235a..8465c977 100644
133--- a/lib/libzstd.pc.in
134+++ b/lib/libzstd.pc.in
135@@ -3,9 +3,9 @@
136 # BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
137
138 prefix=@PREFIX@
139-exec_prefix=${prefix}
140-includedir=${prefix}/@INCLUDEDIR@
141-libdir=${exec_prefix}/@LIBDIR@
142+exec_prefix=@EXEC_PREFIX@
143+includedir=@INCLUDEDIR@
144+libdir=@LIBDIR@
145
146 Name: zstd
147 Description: fast lossless compression algorithm library
148--
1492.36.0
150