<br><br><div class="gmail_quote">On Thu, Aug 13, 2009 at 11:23, Jan Matejek <span dir="ltr">&lt;<a href="mailto:jan.matejek@novell.com">jan.matejek@novell.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

Hello,<br>
<br>
I&#39;m cross-posting this to distributions@freedesktop and python-dev,<br>
because the topic is relevant to both groups and should be solved in<br>
cooperation.<br>
<br>
The issue:<br>
<br>
In Python&#39;s default configuration (on linux), both purelib (location for<br>
pure python modules) and platlib (location for platform-dependent binary<br>
extensions) point to $prefix/lib/pythonX.Y/site-packages.<br>
That is no good for two main reasons.<br>
<br>
One, python depends on the &quot;lib&quot; directory. (from distro&#39;s point of<br>
view, prefix is /usr, so let&#39;s talk /usr/lib) Due to this, it&#39;s<br>
impossible to install python under /usr/lib64 without heavy patching.<br>
Repeated attempts to bring python developers to acknowledge and rectify<br>
the situation have all failed (common argument here is &quot;that would mean<br>
redesign of distutils and huge parts of whatnot&quot;).<br>
</blockquote><div><br></div><div>This is now Tarek&#39;s call, so this may or may not have changed in terms of what the (now) distutils maintainer thinks.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<br>
Conversely, that also means that multiarch setup (/usr/lib or lib32 with<br>
32bit python and /usr/lib64 with 64bit python) is not possible with<br>
stock python.<br>
<br>
Two, the default configuration makes purelib and platlib identical,<br>
which somehow defeats the purpose of the distinction in the first place.<br>
You either need to patch the default, or supply some alternate<br>
configuration to take advantage of this feature.<br>
And that&#39;s not the end of it - the next step is to make python aware of<br>
two different locations on sys.path, one for purelib and one for<br>
platlib, which is a different story altogether.<br>
<br>
As distributors, we like to take advantage of purelib/platlib separation<br>
to package pure python modules as platform-independent (noarch for<br>
rpm-speakers). And that&#39;s not easy to do properly.<br>
<br>
The proposal:<br>
<br>
Let&#39;s put our heads together and choose good default locations for<br>
purelib and platlib. Then add support to python for recognizing the<br>
locations by default, and possibly leave note in FHS that &quot;this is the<br>
place&quot;.<br>
<br>
This is IMO a good first step to making python multiarch-aware, and it<br>
would also help a bit with LSB integration [1].<br>
<br>
I&#39;ve come up with three basic options for the configuration (substitute<br>
&quot;/usr&quot; with &quot;$prefix&quot; if you&#39;re not a distributor). This list is by no<br>
means comprehensive, it&#39;s just what looked reasonable at the time of<br>
writing.<br>
<br>
1 - the traditional way<br>
purelib = /usr/lib/pythonX.Y/site-packages<br>
platlib = /usr/lib(64)/pythonX.Y/site-packages<br>
</blockquote><div><br></div><div>Why can&#39;t pure libraries go into lib64 as well? There is nothing saying that a pure Python package won&#39;t have a setup.py that installs different files based on whether it is for a 32-bit or 64-bit CPython install.</div>

<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><br>
pros:<br>
+ this is already the default for 32bit systems<br>
+ major distributions (including Fedora, Mandriva and now finally<br>
openSUSE too) do this<br>
cons:<br>
- 32bit systems have no separation, poor they!<br>
- with multiarch setup, /usr/lib is &quot;cluttered&quot; by both<br>
platform-dependent files for 32bit and platform-independent files shared<br>
by the platforms. Also, 64bit python can pick up 32bit modules. That<br>
doesn&#39;t cause problems in practice, but doesn&#39;t fell like a clean design.<br>
<br>
2 - the sharedir way<br>
purelib = /usr/share/python/X.Y<br>
platlib = /usr/lib(64)/pythonX.Y/site-packages </blockquote><div><br></div><div>Now are you proposing that packages that have both Python source and extensions be split based on the type of files, or that only pure Python packages go to /usr/share/python and any packages that are mixed go into lib(64)? If you are proposing the latter this is more reasonable as the former will require using .pth files to get import to search both locations for files in the same package and that just feels icky to me.</div>

<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><br>
pros:<br>
+ clean separation of purelib - nice!<br>
+ unheard of - a good place to start anew<br>
cons:<br>
- FHS states that /usr/share is for data. But OTOH, they don&#39;t say much<br>
about platform-independent bytecode. We could probably get an exception<br>
for this.<br>
- unheard of - everyone will be surprised </blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><br>
3 - the perl way<br>
purelib = /usr/lib/pythonX.Y<br>
platlib = /usr/lib/pythonX.Y/lib-dynload-(platform-identifier)/site-packages<br>
<br>
pros:<br>
+ possibility of multiarch packages that would install pure python parts<br>
into purelib and extensions or accelerators for more platforms at once -<br>
and therefore, possibility to split large modules into<br>
platform-dependent and platform-independent parts and save space on<br>
installation media<br>
+ &quot;idea compatibility&quot; with perl and ruby, one less install layout to learn<br>
cons:<br>
- completely different from what we have now - would require the most<br>
work from both python developers and distributions<br>
</blockquote><div><br></div><div>I think that last con says what chances this approach has of winning. =)</div><div><br></div><div>-Brett </div></div>