Re: [PATCH] Fix shared library loading in Python bindings.
authorJustus Winter <4winter@informatik.uni-hamburg.de>
Thu, 30 May 2013 12:26:08 +0000 (14:26 +0200)
committerW. Trevor King <wking@tremily.us>
Fri, 7 Nov 2014 17:55:09 +0000 (09:55 -0800)
06/9c51317e3a9f020e3d83b27af957c56afff1f3 [new file with mode: 0644]

diff --git a/06/9c51317e3a9f020e3d83b27af957c56afff1f3 b/06/9c51317e3a9f020e3d83b27af957c56afff1f3
new file mode 100644 (file)
index 0000000..5e818e8
--- /dev/null
@@ -0,0 +1,240 @@
+Return-Path: <teythoon@jade-hamburg.de>\r
+X-Original-To: notmuch@notmuchmail.org\r
+Delivered-To: notmuch@notmuchmail.org\r
+Received: from localhost (localhost [127.0.0.1])\r
+       by olra.theworths.org (Postfix) with ESMTP id 868DB431FAF\r
+       for <notmuch@notmuchmail.org>; Thu, 30 May 2013 05:26:44 -0700 (PDT)\r
+X-Virus-Scanned: Debian amavisd-new at olra.theworths.org\r
+X-Spam-Flag: NO\r
+X-Spam-Score: 0\r
+X-Spam-Level: \r
+X-Spam-Status: No, score=0 tagged_above=-999 required=5 tests=[none]\r
+       autolearn=disabled\r
+Received: from olra.theworths.org ([127.0.0.1])\r
+       by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024)\r
+       with ESMTP id i+1BCzKjDItp for <notmuch@notmuchmail.org>;\r
+       Thu, 30 May 2013 05:26:36 -0700 (PDT)\r
+Received: from mail.cryptobitch.de (cryptobitch.de [88.198.7.68])\r
+       (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits))\r
+       (No client certificate requested)\r
+       by olra.theworths.org (Postfix) with ESMTPS id 224E5431FAE\r
+       for <notmuch@notmuchmail.org>; Thu, 30 May 2013 05:26:35 -0700 (PDT)\r
+Received: from mail.jade-hamburg.de (mail.jade-hamburg.de [85.183.11.228])\r
+       (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits))\r
+       (No client certificate requested)\r
+       by mail.cryptobitch.de (Postfix) with ESMTPSA id 1D44F64C63D\r
+       for <notmuch@notmuchmail.org>; Thu, 30 May 2013 14:26:16 +0200 (CEST)\r
+Received: by mail.jade-hamburg.de (Postfix, from userid 401)\r
+       id 5FAE6DF28B; Thu, 30 May 2013 14:26:14 +0200 (CEST)\r
+Received: from thinkbox.jade-hamburg.de (cryptobitch.de [88.198.7.68])\r
+       (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits))\r
+       (No client certificate requested) (Authenticated sender: teythoon)\r
+       by mail.jade-hamburg.de (Postfix) with ESMTPSA id 8B725DF28B;\r
+       Thu, 30 May 2013 14:26:10 +0200 (CEST)\r
+Received: from teythoon by thinkbox.jade-hamburg.de with local (Exim 4.80)\r
+       (envelope-from <teythoon@thinkbox.jade-hamburg.de>)\r
+       id 1Ui1vl-0003KD-2H; Thu, 30 May 2013 14:26:09 +0200\r
+Content-Type: multipart/signed; protocol="application/pgp-signature";\r
+       micalg="pgp-sha256"; boundary="===============4092482392989916922=="\r
+MIME-Version: 1.0\r
+Content-Disposition: inline\r
+From: Justus Winter <4winter@informatik.uni-hamburg.de>\r
+User-Agent: alot/0.3.4\r
+To: Julian Berman <Julian@GrayVines.com>,  notmuch@notmuchmail.org\r
+References: <1369540418-94177-1-git-send-email-Julian@GrayVines.com>\r
+In-Reply-To: <1369540418-94177-1-git-send-email-Julian@GrayVines.com>\r
+Message-ID: <20130530122608.20099.26290@thinkbox.jade-hamburg.de>\r
+Subject: Re: [PATCH] Fix shared library loading in Python bindings.\r
+Date: Thu, 30 May 2013 14:26:08 +0200\r
+X-BeenThere: notmuch@notmuchmail.org\r
+X-Mailman-Version: 2.1.13\r
+Precedence: list\r
+List-Id: "Use and development of the notmuch mail system."\r
+       <notmuch.notmuchmail.org>\r
+List-Unsubscribe: <http://notmuchmail.org/mailman/options/notmuch>,\r
+       <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
+List-Archive: <http://notmuchmail.org/pipermail/notmuch>\r
+List-Post: <mailto:notmuch@notmuchmail.org>\r
+List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
+List-Subscribe: <http://notmuchmail.org/mailman/listinfo/notmuch>,\r
+       <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
+X-List-Received-Date: Thu, 30 May 2013 12:26:44 -0000\r
+\r
+--===============4092482392989916922==\r
+Content-Type: text/plain; charset="utf-8"\r
+MIME-Version: 1.0\r
+Content-Transfer-Encoding: quoted-printable\r
+\r
+Hi Julian :)\r
+\r
+Quoting Julian Berman (2013-05-26 05:53:38)\r
+> Specifically, fixes loading on OS X, where libnotmuch will be\r
+> a dylib.:\r
+> ---\r
+>  bindings/python/notmuch/globals.py | 3 ++-\r
+>  1 file changed, 2 insertions(+), 1 deletion(-)\r
+> =\r
+\r
+> diff --git a/bindings/python/notmuch/globals.py b/bindings/python/notmuch=\r
+/globals.py\r
+> index c7632c3..5e08e73 100644\r
+> --- a/bindings/python/notmuch/globals.py\r
+> +++ b/bindings/python/notmuch/globals.py\r
+> @@ -18,11 +18,12 @@ Copyright 2010 Sebastian Spaeth <Sebastian@SSpaeth.de>\r
+>  """\r
+>  =\r
+\r
+>  from ctypes import CDLL, Structure, POINTER\r
+> +from ctypes.util import find_library\r
+>  =\r
+\r
+>  #-----------------------------------------------------------------------=\r
+------\r
+>  #package-global instance of the notmuch library\r
+>  try:\r
+> -    nmlib =3D CDLL("libnotmuch.so.3")\r
+> +    nmlib =3D CDLL(find_library("libnotmuch"))\r
+\r
+Does this work for you on Darwin? On my box (Debian/Linux) I have to\r
+use "notmuch" instead of "libnotmuch" to get anything from\r
+find_library:\r
+\r
+In [5]: print ctypes.util.find_library("notmuch")\r
+libnotmuch.so.3\r
+\r
+In [6]: print ctypes.util.find_library("libnotmuch")\r
+None\r
+\r
+Then again, find_library is different for every architecture under the\r
+sun...\r
+\r
+>  except:\r
+>      raise ImportError("Could not find shared 'notmuch' library.")\r
+\r
+I'm leaning towards declining the patch in it's current form. If the\r
+bindings do not work on OS X, we need to find another solution. There\r
+are two reasons for this:\r
+\r
+1. find_library was once used, but was removed since it is (has?) been\r
+problematic wrt to LD_LIBRARY_PATH usage:\r
+\r
+% git show f378f458\r
+commit f378f45893bb4263402008b2abd8aab522901fb6\r
+Author: Cedric Cabessa <ced@ryick.net>\r
+Date:   Mon Apr 5 03:03:51 2010 +0200\r
+\r
+    find_library does not read LD_LIBRARY_PATH, but CDLL does.\r
+\r
+diff --git a/cnotmuch/globals.py b/cnotmuch/globals.py\r
+index ef2686f..fa20ae8 100644\r
+--- a/cnotmuch/globals.py\r
++++ b/cnotmuch/globals.py\r
+@@ -3,17 +3,17 @@ from ctypes.util import find_library\r
+ =\r
+\r
+ #-------------------------------------------------------------------------=\r
+----\r
+ #package-global instance of the notmuch library\r
+-#TODO: lazy load this on first access?\r
+-so =3D find_library('notmuch')\r
+-if so is None:\r
+-  raise ImportError("Could not find shared 'notmuch' library.")\r
+-nmlib =3D CDLL(so)\r
++try:\r
++    nmlib =3D CDLL("libnotmuch.so.1")\r
++except:\r
++    raise ImportError("Could not find shared 'notmuch' library.")\r
+[...]\r
+\r
+As a heavy LD_LIBRARY_PATH user I don't want to break this. So I tried\r
+to test whether find_library now respects LD_LIBRARY_PATH or not:\r
+\r
+teythoon@thinkbox ~ % echo $LD_LIBRARY_PATH\r
+/home/teythoon/.local/lib\r
+teythoon@thinkbox ~ % strace -e trace=3Dopen python -c 'import ctypes; ctyp=\r
+es.CDLL("libnotmuch.so.3")' 2>&1 | grep notmuch\r
+open("/home/teythoon/.local/lib/libnotmuch.so.3", O_RDONLY) =3D 3\r
+\r
+That's how it's done now and indeed it finds my libnotmuch.\r
+\r
+teythoon@thinkbox ~ % strace -f -e trace=3Dstat,open python -c 'import ctyp=\r
+es.util; ctypes.util.find_library("notmuch")' 2>&1 | grep notmuch\r
+\r
+Nothing. Funny. Let's see:\r
+\r
+teythoon@thinkbox ~ % strace -f -e trace=3Dfork,execve,clone python -c 'imp=\r
+ort ctypes.util; print ctypes.util.find_library("notmuch")'\r
+execve("/usr/bin/python", ["python", "-c", "import ctypes.util; print ctype=\r
+s"...], [/* 63 vars */]) =3D 0\r
+clone(Process 12000 attached\r
+child_stack=3D0, flags=3DCLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, c=\r
+hild_tidptr=3D0x7f0734a649d0) =3D 12000\r
+[pid 12000] execve("/bin/sh", ["sh", "-c", "/sbin/ldconfig -p 2>/dev/null"]=\r
+, [/* 63 vars */]) =3D 0\r
+[pid 12000] clone(Process 12001 attached\r
+child_stack=3D0, flags=3DCLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, c=\r
+hild_tidptr=3D0x7f119d5479d0) =3D 12001\r
+[pid 12001] execve("/sbin/ldconfig", ["/sbin/ldconfig", "-p"], [/* 63 vars =\r
+*/]) =3D 0\r
+Process 12001 detached\r
+[pid 12000] --- SIGCHLD (Child exited) @ 0 (0) ---\r
+Process 12000 detached\r
+--- SIGCHLD (Child exited) @ 0 (0) ---\r
+libnotmuch.so.3\r
+\r
+So it also prints libnotmuch.so.3, but only because the version\r
+installed from the Debian archive is also libnotmuch.so.3:\r
+\r
+teythoon@thinkbox ~ % /sbin/ldconfig -p | grep notmuch\r
+        libnotmuch.so.3 (libc6,x86-64) =3D> /usr/lib/libnotmuch.so.3\r
+\r
+So I guess *if* I had a libnotmuch.so.2 in my ldconfig(8) cache (-p\r
+prints the cache), find_library would have returned libnotmuch.so.2\r
+and not my libnotmuch.so.3. So your patch would most likely break this\r
+kind of setup.\r
+\r
+2. Uh. I actually looked at /usr/lib/python2.7/ctypes/util.py and I\r
+almost got eye cancer from just looking briefly at it... The\r
+implementation of find_library differs for various operating systems\r
+and most (all?) of them use fork/exec some program (even gcc in some\r
+cases) to look up the libraries. I'd like to avoid this if possible,\r
+maybe even if this means handling OS X as a special case in our\r
+bindings. For reference, our current solution does not require any\r
+fork/exec calls:\r
+\r
+teythoon@thinkbox ~ % strace -f -e trace=3Dexecve,fork,clone python -c 'imp=\r
+ort ctypes; ctypes.CDLL("libnotmuch.so.3")' =\r
+\r
+execve("/usr/bin/python", ["python", "-c", "import ctypes; ctypes.CDLL(\"li=\r
+bn"...], [/* 63 vars */]) =3D 0\r
+\r
+Thoughts anyone?\r
+\r
+Cheers,\r
+Justus\r
+\r
+--===============4092482392989916922==\r
+MIME-Version: 1.0\r
+Content-Transfer-Encoding: 7bit\r
+Content-Description: signature\r
+Content-Type: application/pgp-signature; name="signature.asc"; charset="us-ascii"\r
+\r
+-----BEGIN PGP SIGNATURE-----\r
+Version: GnuPG v1.4.12 (GNU/Linux)\r
+\r
+iQIcBAABCAAGBQJRp0VcAAoJENMeiILK3jZYJwMP/R4VQYUmEDFYHX7xuiLL4zoC\r
+r+afAVY4OE2u2c9bncT54QairXuDGlLs8wmpDwkfZeiZ1N8OXeEwDlcMZYZ8BpQD\r
+/5LW0Gcf4u91UIsQ6t3wQLj6slvnMEQmLgyWbHpZIjFMbi/sMF7akJ+Ov/eZf0Si\r
+/9ZTrXteoUWw7kw9NhIqyxRC9/WHB9TwSdCVj7QPRBxK78B3+OxoX7DIp40QB3eZ\r
+MPiaOWRqV/6PrEmM1CxIRAEb5EoNB5LdgMM+0Ip6DtoEoKGbt3E7BbBk//tVTtaZ\r
+OYTCDEDtUfv0bfKL/VHVyihFZDJjDN1H+VgJZ4Sai3rjME1k/HphT/ZiBSO8b995\r
+tpsc3yBB76kWEnHd1wf6DFJTLiKDwhm46V9WeNZiZ9auUm4RfcHozejPIooog9Bo\r
++qubc9r7FhZpV7qrh9+PfS5MPf7qXb+Q5BpZMU30Cqksy1BwrPtmWJ6dDqucI+pR\r
+/9LxMTxfm8Qub8Fy811nOuG8vcKuL0GxvN/cSM2oqgceDiTXqwCWDO6y3jO3+HBf\r
+yChjoPioIdxfsyRv3UWjxVI0am3lkN0lKHp7tUbCxank9Yaj1yW/DOQhvpt5pNLe\r
+NvuNfYPG+Gk0IIsdOWM+R7EBkkPZmnMGdIJ+fsKPxgFZegeYJRP0FejHtw/HoWhG\r
+R9uuna4ewRUTTFnhxxLU\r
+=IPQn\r
+-----END PGP SIGNATURE-----\r
+\r
+--===============4092482392989916922==--\r