From e668c9b52896e1cf92c99da3b01e3bdbbae77100 Mon Sep 17 00:00:00 2001 From: "W. Felix Handte" Date: Tue, 18 Feb 2020 10:50:38 -0500 Subject: [PATCH 1/3] Fix pkg-config File Generation Again Revises #1851. Fixes #1900. Replaces #1930. Thanks to @orbea, @neheb, @Polynomial-C, and particularly @eli-schwartz for pointing out the problem and suggesting solutions. Tested with ``` make -C lib clean libzstd.pc cat lib/libzstd.pc # should fail make -C lib clean libzstd.pc LIBDIR=/foo make -C lib clean libzstd.pc INCLUDEDIR=/foo make -C lib clean libzstd.pc LIBDIR=/usr/localfoo make -C lib clean libzstd.pc INCLUDEDIR=/usr/localfoo make -C lib clean libzstd.pc LIBDIR=/usr/local/lib prefix=/foo make -C lib clean libzstd.pc INCLUDEDIR=/usr/local/include prefix=/foo # should succeed make -C lib clean libzstd.pc LIBDIR=/usr/local/foo make -C lib clean libzstd.pc INCLUDEDIR=/usr/local/foo make -C lib clean libzstd.pc LIBDIR=/usr/local/ make -C lib clean libzstd.pc INCLUDEDIR=/usr/local/ make -C lib clean libzstd.pc LIBDIR=/usr/local make -C lib clean libzstd.pc INCLUDEDIR=/usr/local make -C lib clean libzstd.pc LIBDIR=/tmp/foo prefix=/tmp make -C lib clean libzstd.pc INCLUDEDIR=/tmp/foo prefix=/tmp make -C lib clean libzstd.pc LIBDIR=/tmp/foo prefix=/tmp/foo make -C lib clean libzstd.pc INCLUDEDIR=/tmp/foo prefix=/tmp/foo # should also succeed make -C lib clean libzstd.pc prefix=/foo LIBDIR=/foo/bar INCLUDEDIR=/foo/ cat lib/libzstd.pc mkdir out cd out cmake ../build/cmake make cat lib/libzstd.pc ``` --- build/cmake/lib/CMakeLists.txt | 5 +++-- lib/Makefile | 14 ++++++++++++-- lib/libzstd.pc.in | 4 ++-- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/build/cmake/lib/CMakeLists.txt b/build/cmake/lib/CMakeLists.txt index e92647bf1..29ff57aa0 100644 --- a/build/cmake/lib/CMakeLists.txt +++ b/build/cmake/lib/CMakeLists.txt @@ -134,11 +134,12 @@ endif () if (UNIX) # pkg-config set(PREFIX "${CMAKE_INSTALL_PREFIX}") - set(LIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}") + set(LIBDIR "${CMAKE_INSTALL_LIBDIR}") + set(INCLUDEDIR "${CMAKE_INSTALL_INCLUDEDIR}") set(VERSION "${zstd_VERSION_MAJOR}.${zstd_VERSION_MINOR}.${zstd_VERSION_PATCH}") add_custom_target(libzstd.pc ALL ${CMAKE_COMMAND} -DIN="${LIBRARY_DIR}/libzstd.pc.in" -DOUT="libzstd.pc" - -DPREFIX="${PREFIX}" -DVERSION="${VERSION}" + -DPREFIX="${PREFIX}" -DLIBDIR="${LIBDIR}" -DINCLUDEDIR="${INCLUDEDIR}" -DVERSION="${VERSION}" -P "${CMAKE_CURRENT_SOURCE_DIR}/pkgconfig.cmake" COMMENT "Creating pkg-config file") diff --git a/lib/Makefile b/lib/Makefile index fd1710cf1..dbd64994c 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -224,6 +224,16 @@ LIBDIR ?= $(libdir) includedir ?= $(PREFIX)/include INCLUDEDIR ?= $(includedir) +PCLIBDIR ?= $(shell echo "$(LIBDIR)" | sed -n -e "s@^$(exec_prefix)\\(/\\|$$\\)@@p") +PCINCDIR ?= $(shell echo "$(INCLUDEDIR)" | sed -n -e "s@^$(prefix)\\(/\\|$$\\)@@p") + +ifeq (,$(shell echo "$(LIBDIR)" | sed -n -e "\\@^$(exec_prefix)\\(/\\|$$\\)@ p")) +$(error configured libdir ($(LIBDIR)) is outside of prefix ($(prefix)), can't generate pkg-config file) +endif +ifeq (,$(shell echo "$(INCLUDEDIR)" | sed -n -e "\\@^$(prefix)\\(/\\|$$\\)@ p")) +$(error configured includedir ($(INCLUDEDIR)) is outside of exec_prefix ($(exec_prefix)), can't generate pkg-config file) +endif + ifneq (,$(filter $(shell uname),FreeBSD NetBSD DragonFly)) PKGCONFIGDIR ?= $(PREFIX)/libdata/pkgconfig else @@ -239,11 +249,11 @@ endif INSTALL_PROGRAM ?= $(INSTALL) INSTALL_DATA ?= $(INSTALL) -m 644 - -libzstd.pc: libzstd.pc: libzstd.pc.in @echo creating pkgconfig @sed -e 's|@PREFIX@|$(PREFIX)|' \ + -e 's|@LIBDIR@|$(PCLIBDIR)|' \ + -e 's|@INCLUDEDIR@|$(PCINCDIR)|' \ -e 's|@VERSION@|$(VERSION)|' \ $< >$@ diff --git a/lib/libzstd.pc.in b/lib/libzstd.pc.in index e7880be47..8ec0235ad 100644 --- a/lib/libzstd.pc.in +++ b/lib/libzstd.pc.in @@ -4,8 +4,8 @@ prefix=@PREFIX@ exec_prefix=${prefix} -includedir=${prefix}/include -libdir=${exec_prefix}/lib +includedir=${prefix}/@INCLUDEDIR@ +libdir=${exec_prefix}/@LIBDIR@ Name: zstd Description: fast lossless compression algorithm library From 73737231b95976f24b7b9bff96240976b11dcce0 Mon Sep 17 00:00:00 2001 From: "W. Felix Handte" Date: Tue, 18 Feb 2020 13:17:17 -0500 Subject: [PATCH 2/3] Allow Manual Overriding of pkg-config Lib and Include Dirs When the `PCLIBDIR` or `PCINCDIR` is non-empty (either because we succeeded in removing the prefix, or because it was manually set), we don't need to perform the check. This lets us trust users who go to the trouble of setting a manual override, rather than still blindly failing the make. They'll still be prefixed with `${prefix}/` / `${exec_prefix}/` in the pkg-config file though. --- lib/Makefile | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/Makefile b/lib/Makefile index dbd64994c..b067c11a2 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -227,12 +227,21 @@ INCLUDEDIR ?= $(includedir) PCLIBDIR ?= $(shell echo "$(LIBDIR)" | sed -n -e "s@^$(exec_prefix)\\(/\\|$$\\)@@p") PCINCDIR ?= $(shell echo "$(INCLUDEDIR)" | sed -n -e "s@^$(prefix)\\(/\\|$$\\)@@p") +ifeq (,$(PCLIBDIR)) +# Additional prefix check is required, since the empty string is technically a +# valid PCLIBDIR ifeq (,$(shell echo "$(LIBDIR)" | sed -n -e "\\@^$(exec_prefix)\\(/\\|$$\\)@ p")) $(error configured libdir ($(LIBDIR)) is outside of prefix ($(prefix)), can't generate pkg-config file) endif +endif + +ifeq (,$(PCINCDIR)) +# Additional prefix check is required, since the empty string is technically a +# valid PCINCDIR ifeq (,$(shell echo "$(INCLUDEDIR)" | sed -n -e "\\@^$(prefix)\\(/\\|$$\\)@ p")) $(error configured includedir ($(INCLUDEDIR)) is outside of exec_prefix ($(exec_prefix)), can't generate pkg-config file) endif +endif ifneq (,$(filter $(shell uname),FreeBSD NetBSD DragonFly)) PKGCONFIGDIR ?= $(PREFIX)/libdata/pkgconfig From e5ef935cf6160768e20cd73db3d9450aa8b7f8cf Mon Sep 17 00:00:00 2001 From: "W. Felix Handte" Date: Tue, 18 Feb 2020 13:40:58 -0500 Subject: [PATCH 3/3] Fix Variable Capitalization --- lib/Makefile | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/Makefile b/lib/Makefile index b067c11a2..db35207bb 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -219,27 +219,28 @@ DESTDIR ?= prefix ?= /usr/local PREFIX ?= $(prefix) exec_prefix ?= $(PREFIX) -libdir ?= $(exec_prefix)/lib +EXEC_PREFIX ?= $(exec_prefix) +libdir ?= $(EXEC_PREFIX)/lib LIBDIR ?= $(libdir) includedir ?= $(PREFIX)/include INCLUDEDIR ?= $(includedir) -PCLIBDIR ?= $(shell echo "$(LIBDIR)" | sed -n -e "s@^$(exec_prefix)\\(/\\|$$\\)@@p") -PCINCDIR ?= $(shell echo "$(INCLUDEDIR)" | sed -n -e "s@^$(prefix)\\(/\\|$$\\)@@p") +PCLIBDIR ?= $(shell echo "$(LIBDIR)" | sed -n -e "s@^$(EXEC_PREFIX)\\(/\\|$$\\)@@p") +PCINCDIR ?= $(shell echo "$(INCLUDEDIR)" | sed -n -e "s@^$(PREFIX)\\(/\\|$$\\)@@p") ifeq (,$(PCLIBDIR)) # Additional prefix check is required, since the empty string is technically a # valid PCLIBDIR -ifeq (,$(shell echo "$(LIBDIR)" | sed -n -e "\\@^$(exec_prefix)\\(/\\|$$\\)@ p")) -$(error configured libdir ($(LIBDIR)) is outside of prefix ($(prefix)), can't generate pkg-config file) +ifeq (,$(shell echo "$(LIBDIR)" | sed -n -e "\\@^$(EXEC_PREFIX)\\(/\\|$$\\)@ p")) +$(error configured libdir ($(LIBDIR)) is outside of prefix ($(PREFIX)), can't generate pkg-config file) endif endif ifeq (,$(PCINCDIR)) # Additional prefix check is required, since the empty string is technically a # valid PCINCDIR -ifeq (,$(shell echo "$(INCLUDEDIR)" | sed -n -e "\\@^$(prefix)\\(/\\|$$\\)@ p")) -$(error configured includedir ($(INCLUDEDIR)) is outside of exec_prefix ($(exec_prefix)), can't generate pkg-config file) +ifeq (,$(shell echo "$(INCLUDEDIR)" | sed -n -e "\\@^$(PREFIX)\\(/\\|$$\\)@ p")) +$(error configured includedir ($(INCLUDEDIR)) is outside of exec_prefix ($(EXEC_PREFIX)), can't generate pkg-config file) endif endif