Return-Path: X-Original-To: notmuch@notmuchmail.org Delivered-To: notmuch@notmuchmail.org Received: from localhost (localhost [127.0.0.1]) by olra.theworths.org (Postfix) with ESMTP id 58946431FBF for ; Sun, 31 Aug 2014 20:14:38 -0700 (PDT) X-Virus-Scanned: Debian amavisd-new at olra.theworths.org X-Spam-Flag: NO X-Spam-Score: 0 X-Spam-Level: X-Spam-Status: No, score=0 tagged_above=-999 required=5 tests=[none] autolearn=disabled Received: from olra.theworths.org ([127.0.0.1]) by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id isOzsMot1If9 for ; Sun, 31 Aug 2014 20:14:30 -0700 (PDT) Received: from tuna.imca.aps.anl.gov (tuna.imca.aps.anl.gov [164.54.200.33]) by olra.theworths.org (Postfix) with ESMTP id 4A650431FAE for ; Sun, 31 Aug 2014 20:14:30 -0700 (PDT) Received: from localhost (seal.imca.aps.anl.gov [164.54.200.39]) by tuna.imca.aps.anl.gov (Postfix) with ESMTP id DFE3F2004B; Sun, 31 Aug 2014 22:14:29 -0500 (CDT) From: "J. Lewis Muir" To: notmuch@notmuchmail.org Subject: [PATCH] lib: make notmuch shared library install_name be full path on Mac OS X Date: Sun, 31 Aug 2014 22:13:47 -0500 Message-Id: <1409541227-38895-1-git-send-email-jlmuir@imca-cat.org> X-Mailer: git-send-email 1.8.5.2 (Apple Git-48) X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 01 Sep 2014 03:14:38 -0000 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)