unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
* [PATCH] lib: make notmuch shared library install_name be full path on Mac OS X
@ 2014-09-01  3:13 J. Lewis Muir
  2015-02-25  7:34 ` David Bremner
  2015-02-27  8:24 ` David Bremner
  0 siblings, 2 replies; 7+ messages in thread
From: J. Lewis Muir @ 2014-09-01  3:13 UTC (permalink / raw)
  To: notmuch

The install_name of libnotmuch.dylib on Mac OS X is what is written
into a program that links against it.  If it is just the name of the
shared library file, as opposed to the full path, the program won't be
able to find it when it runs and will abort.  Instead, the install_name
should be the full path to the shared library (in its final installed
location).

An example on Mac OS X Mavericks (10.9.4) follows.

We configure, build, and install notmuch, assuming the user has write
access to /opt:

===
$ CFLAGS='-I/pkg/include' LDFLAGS='-L/pkg/lib' ./configure \
      --prefix=/opt/notmuch-current --without-emacs
$ make
$ make install
===

We inspect the installed notmuch library using the otool system program:

===
$ otool -L /opt/notmuch-current/lib/libnotmuch.dylib
/opt/notmuch-current/lib/libnotmuch.dylib:
  libnotmuch.3.dylib \
(compatibility version 3.1.0, current version 3.1.0)
  /pkg/lib/libgmime-2.4.2.dylib \
(compatibility version 7.0.0, current version 7.33.0)
  /pkg/lib/libgobject-2.0.0.dylib \
(compatibility version 3801.0.0, current version 3801.2.0)
  /pkg/lib/libglib-2.0.0.dylib \
(compatibility version 3801.0.0, current version 3801.2.0)
  /pkg/lib/libintl.8.dylib \
(compatibility version 10.0.0, current version 10.2.0)
  /pkg/lib/libtalloc.2.1.1.dylib \
(compatibility version 0.0.0, current version 0.0.0)
  /pkg/lib/libz.1.dylib \
(compatibility version 2.0.0, current version 2.2.0)
  /pkg/lib/libxapian.22.dylib \
(compatibility version 29.0.0, current version 29.4.0)
  /usr/lib/libc++.1.dylib \
(compatibility version 1.0.0, current version 120.0.0)
  /usr/lib/libSystem.B.dylib \
(compatibility version 1.0.0, current version 1197.1.1)
===

That's not good.  The second line shows the install_name, and it's not a
full path, so any program that links against it as a dependent library
will not be able to find it.

We try running the notmuch program (which is linked against the notmuch
library), and, sure enough, it aborts:

===
$ /opt/notmuch-current/bin/notmuch --version
dyld: Library not loaded: libnotmuch.3.dylib
  Referenced from: /opt/notmuch-current/bin/notmuch
  Reason: image not found
Trace/BPT trap: 5
===

After applying this commit to fix the problem and configuring, building,
and installing again as above, the notmuch library's install_name is now
the correct full path:

===
$ otool -L /opt/notmuch-current/lib/libnotmuch.dylib
/opt/notmuch-current/lib/libnotmuch.dylib:
  /opt/notmuch-current/lib/libnotmuch.3.dylib \
(compatibility version 3.1.0, current version 3.1.0)
  /pkg/lib/libgmime-2.4.2.dylib \
(compatibility version 7.0.0, current version 7.33.0)
  /pkg/lib/libgobject-2.0.0.dylib \
(compatibility version 3801.0.0, current version 3801.2.0)
  /pkg/lib/libglib-2.0.0.dylib \
(compatibility version 3801.0.0, current version 3801.2.0)
  /pkg/lib/libintl.8.dylib \
(compatibility version 10.0.0, current version 10.2.0)
  /pkg/lib/libtalloc.2.1.1.dylib \
(compatibility version 0.0.0, current version 0.0.0)
  /pkg/lib/libz.1.dylib \
(compatibility version 2.0.0, current version 2.2.0)
  /pkg/lib/libxapian.22.dylib \
(compatibility version 29.0.0, current version 29.4.0)
  /usr/lib/libc++.1.dylib \
(compatibility version 1.0.0, current version 120.0.0)
  /usr/lib/libSystem.B.dylib \
(compatibility version 1.0.0, current version 1197.1.1)
===

And the notmuch program is able to find the notmuch library when run:

===
$ /opt/notmuch-current/bin/notmuch --version
notmuch 0.18.1+84~g658a00e
===

References:

* http://www.finkproject.org/doc/porting/porting.en.html#\
shared.build-lib

* https://developer.apple.com/library/mac/documentation/DeveloperTools/\
Conceptual/DynamicLibraries/100-Articles/OverviewOfDynamicLibraries.html
---
 lib/Makefile.local | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/Makefile.local b/lib/Makefile.local
index c56cba9..c83f387 100644
--- a/lib/Makefile.local
+++ b/lib/Makefile.local
@@ -27,7 +27,7 @@ LIBRARY_SUFFIX = dylib
 LINKER_NAME = libnotmuch.$(LIBRARY_SUFFIX)
 SONAME = libnotmuch.$(LIBNOTMUCH_VERSION_MAJOR).$(LIBRARY_SUFFIX)
 LIBNAME = libnotmuch.$(LIBNOTMUCH_VERSION_MAJOR).$(LIBNOTMUCH_VERSION_MINOR).$(LIBNOTMUCH_VERSION_RELEASE).$(LIBRARY_SUFFIX)
-LIBRARY_LINK_FLAG = -dynamiclib -install_name $(SONAME) -compatibility_version $(LIBNOTMUCH_VERSION_MAJOR).$(LIBNOTMUCH_VERSION_MINOR) -current_version $(LIBNOTMUCH_VERSION_MAJOR).$(LIBNOTMUCH_VERSION_MINOR).$(LIBNOTMUCH_VERSION_RELEASE)
+LIBRARY_LINK_FLAG = -dynamiclib -install_name $(libdir)/$(SONAME) -compatibility_version $(LIBNOTMUCH_VERSION_MAJOR).$(LIBNOTMUCH_VERSION_MINOR) -current_version $(LIBNOTMUCH_VERSION_MAJOR).$(LIBNOTMUCH_VERSION_MINOR).$(LIBNOTMUCH_VERSION_RELEASE)
 else
 LIBRARY_SUFFIX = so
 LINKER_NAME = libnotmuch.$(LIBRARY_SUFFIX)
-- 
1.8.5.2 (Apple Git-48)

^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2015-03-04 20:48 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-09-01  3:13 [PATCH] lib: make notmuch shared library install_name be full path on Mac OS X J. Lewis Muir
2015-02-25  7:34 ` David Bremner
2015-02-26 18:14   ` J. Lewis Muir
2015-02-26 19:04     ` Tomi Ollila
2015-03-04 18:23       ` J. Lewis Muir
2015-03-04 20:45         ` David Bremner
2015-02-27  8:24 ` David Bremner

Code repositories for project(s) associated with this public inbox

	https://yhetil.org/notmuch.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).