From d64d0cc8d9f9e9f23fa4432328db2ea4739bae0f Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Fri, 4 Jun 2010 16:52:56 -0700 Subject: [PATCH] make install: Run ldconfig or install a DT_RUNPATH in binary as appropriate. Various users were confused as to why they couldn't run notmuch immediately after "make install", (with linker errors saying that libnotmuch.so could not be found). The errors came from two different causes: 1. The user had installed to a system library directory, but had not yet run ldconfig. 2. The user had installed to some non-system directory, and had not set the LD_LIBRARY_PATH variable. With this change we fix both problems (on Linux) without the user having to do anything additional. We first use ldconfig to find the system library directories. If the user is installing to one of these, then we run ldconfig as part of "make install". For case (2) we use the -rpath and --enable-new-dtags linker options to install a DT_RUNPATH entry in the binary. This entry tells the dynamic linker where to find libnotmuch. Without the --enable-new-dtags option only a DT_RPATH option would be installed, (which has the drawback of not allowing any override with the LD_LIBRARY_PATH variable). Distributions (such as Debian and Fedora) don't want to see binaries packaged with a DT_RPATH or DT_RUNPATH entry. This should be avoided automatically as long as the packages install to standard locations, (such as /usr/lib). --- Makefile.local | 5 +++++ configure | 22 ++++++++++++++++++++++ lib/Makefile.local | 4 ++++ 3 files changed, 31 insertions(+) diff --git a/Makefile.local b/Makefile.local index 59b8d64e..bc61a3c1 100644 --- a/Makefile.local +++ b/Makefile.local @@ -37,6 +37,11 @@ ifneq ($(LINKER_RESOLVES_LIBRARY_DEPENDENCIES),1) FINAL_NOTMUCH_LDFLAGS += $(CONFIGURE_LDFLAGS) FINAL_NOTMUCH_LINKER = CXX endif +ifeq ($(PLATFORM),LINUX) +ifeq ($(LIBDIR_IN_LDCONFIG),0) +FINAL_NOTMUCH_LDFLAGS += -Wl,--enable-new-dtags -Wl,-rpath,$(libdir) +endif +endif FINAL_LIBNOTMUCH_LDFLAGS = $(LDFLAGS) $(CONFIGURE_LDFLAGS) .PHONY: all diff --git a/configure b/configure index 07bac08b..c86a227c 100755 --- a/configure +++ b/configure @@ -167,6 +167,12 @@ for option; do fi done +# We set this value early, (rather than just while printing the +# Makefile.config file later like most values), because we need to +# actually investigate this value compared to the ldconfig_paths value +# below. +libdir_expanded=${LIBDIR:-${PREFIX}/lib} + cat </dev/null | sed -n -e 's,^\(/.*\):\( (.*)\)\?$,\1,p') + for path in $ldconfig_paths; do + echo "Checking $path compared to $libdir_expanded" + if [ "$path" = "$libdir_expanded" ]; then + libdir_in_ldconfig=1 + fi + done else printf "Unknown.\n" cat <