Make distutils "install --home" support all platforms.
This commit is contained in:
parent
8d726eef96
commit
ec6229e352
|
@ -384,26 +384,26 @@ install files. The details differ across platforms, so read whichever
|
|||
of the following sections applies to you.
|
||||
|
||||
|
||||
\subsection{Alternate installation: \UNIX{} (the home scheme)}
|
||||
\subsection{Alternate installation: the home scheme}
|
||||
\label{alt-install-prefix}
|
||||
|
||||
Under \UNIX, there are two ways to perform an alternate installation.
|
||||
The ``prefix scheme'' is similar to how alternate installation works
|
||||
under Windows and Mac OS, but is not necessarily the most useful way to
|
||||
maintain a personal Python library. Hence, we document the more
|
||||
convenient and commonly useful ``home scheme'' first.
|
||||
|
||||
The idea behind the ``home scheme'' is that you build and maintain a
|
||||
personal stash of Python modules, probably under your home directory.
|
||||
personal stash of Python modules. This scheme's name is derived from
|
||||
the idea of a ``home'' directory on \UNIX, since it's not unusual for
|
||||
a \UNIX{} user to make their home directory have a layout similar to
|
||||
\file{/usr/} or \file{/usr/local/}. This scheme can be used by
|
||||
anyone, regardless of the operating system their installing for.
|
||||
|
||||
Installing a new module distribution is as simple as
|
||||
|
||||
\begin{verbatim}
|
||||
python setup.py install --home=<dir>
|
||||
\end{verbatim}
|
||||
|
||||
where you can supply any directory you like for the \longprogramopt{home}
|
||||
option. Lazy typists can just type a tilde (\code{\textasciitilde}); the
|
||||
\command{install} command will expand this to your home directory:
|
||||
where you can supply any directory you like for the
|
||||
\longprogramopt{home} option. On \UNIX, lazy typists can just type a
|
||||
tilde (\code{\textasciitilde}); the \command{install} command will
|
||||
expand this to your home directory:
|
||||
|
||||
\begin{verbatim}
|
||||
python setup.py install --home=~
|
||||
|
@ -417,6 +417,11 @@ installation base as follows:
|
|||
{home}{/bin}
|
||||
{home}{/share}
|
||||
|
||||
|
||||
\versionchanged[The \longprogramopt{home} option used to be supported
|
||||
only on \UNIX]{2.4}
|
||||
|
||||
|
||||
\subsection{Alternate installation: \UNIX{} (the prefix scheme)}
|
||||
\label{alt-install-home}
|
||||
|
||||
|
@ -491,14 +496,13 @@ your \longprogramopt{prefix} and \longprogramopt{exec-prefix} don't even
|
|||
point to an alternate Python installation, this is immaterial.)
|
||||
|
||||
|
||||
\subsection{Alternate installation: Windows}
|
||||
\subsection{Alternate installation: Windows (the prefix scheme)}
|
||||
\label{alt-install-windows}
|
||||
|
||||
Since Windows has no conception of a user's home directory, and since
|
||||
the standard Python installation under Windows is simpler than that
|
||||
under \UNIX, there's no point in having separate \longprogramopt{prefix}
|
||||
and \longprogramopt{home} options. Just use the \longprogramopt{prefix}
|
||||
option to specify a base directory, e.g.
|
||||
Windows has no concept of a user's home directory, and since the
|
||||
standard Python installation under Windows is simpler than under
|
||||
\UNIX, the \longprogramopt{prefix} option has traditionally been used
|
||||
to install additional packages in separate locations on Windows.
|
||||
|
||||
\begin{verbatim}
|
||||
python setup.py install --prefix="\Temp\Python"
|
||||
|
|
|
@ -242,19 +242,15 @@ class install (Command):
|
|||
("must supply either prefix/exec-prefix/home or " +
|
||||
"install-base/install-platbase -- not both")
|
||||
|
||||
if self.home and (self.prefix or self.exec_prefix):
|
||||
raise DistutilsOptionError, \
|
||||
"must supply either home or prefix/exec-prefix -- not both"
|
||||
|
||||
# Next, stuff that's wrong (or dubious) only on certain platforms.
|
||||
if os.name == 'posix':
|
||||
if self.home and (self.prefix or self.exec_prefix):
|
||||
raise DistutilsOptionError, \
|
||||
("must supply either home or prefix/exec-prefix -- " +
|
||||
"not both")
|
||||
else:
|
||||
if os.name != "posix":
|
||||
if self.exec_prefix:
|
||||
self.warn("exec-prefix option ignored on this platform")
|
||||
self.exec_prefix = None
|
||||
if self.home:
|
||||
self.warn("home option ignored on this platform")
|
||||
self.home = None
|
||||
|
||||
# Now the interesting logic -- so interesting that we farm it out
|
||||
# to other methods. The goal of these methods is to set the final
|
||||
|
@ -405,15 +401,19 @@ class install (Command):
|
|||
|
||||
def finalize_other (self): # Windows and Mac OS for now
|
||||
|
||||
if self.prefix is None:
|
||||
self.prefix = os.path.normpath(sys.prefix)
|
||||
if self.home is not None:
|
||||
self.install_base = self.install_platbase = self.home
|
||||
self.select_scheme("unix_home")
|
||||
else:
|
||||
if self.prefix is None:
|
||||
self.prefix = os.path.normpath(sys.prefix)
|
||||
|
||||
self.install_base = self.install_platbase = self.prefix
|
||||
try:
|
||||
self.select_scheme(os.name)
|
||||
except KeyError:
|
||||
raise DistutilsPlatformError, \
|
||||
"I don't know how to install stuff on '%s'" % os.name
|
||||
self.install_base = self.install_platbase = self.prefix
|
||||
try:
|
||||
self.select_scheme(os.name)
|
||||
except KeyError:
|
||||
raise DistutilsPlatformError, \
|
||||
"I don't know how to install stuff on '%s'" % os.name
|
||||
|
||||
# finalize_other ()
|
||||
|
||||
|
|
|
@ -0,0 +1,55 @@
|
|||
"""Tests for distutils.command.install."""
|
||||
|
||||
import os
|
||||
import unittest
|
||||
|
||||
from distutils.command.install import install
|
||||
from distutils.core import Distribution
|
||||
|
||||
from distutils.tests import support
|
||||
|
||||
|
||||
class InstallTestCase(support.TempdirManager, unittest.TestCase):
|
||||
|
||||
def test_home_installation_scheme(self):
|
||||
# This ensure two things:
|
||||
# - that --home generates the desired set of directory names
|
||||
# - test --home is supported on all platforms
|
||||
builddir = self.mkdtemp()
|
||||
destination = os.path.join(builddir, "installation")
|
||||
|
||||
dist = Distribution({"name": "foopkg"})
|
||||
# script_name need not exist, it just need to be initialized
|
||||
dist.script_name = os.path.join(builddir, "setup.py")
|
||||
dist.command_obj["build"] = support.DummyCommand(
|
||||
build_base=builddir,
|
||||
build_lib=os.path.join(builddir, "lib"),
|
||||
)
|
||||
|
||||
cmd = install(dist)
|
||||
cmd.home = destination
|
||||
cmd.ensure_finalized()
|
||||
|
||||
self.assertEqual(cmd.install_base, destination)
|
||||
self.assertEqual(cmd.install_platbase, destination)
|
||||
|
||||
def check_path(got, expected):
|
||||
got = os.path.normpath(got)
|
||||
expected = os.path.normpath(expected)
|
||||
self.assertEqual(got, expected)
|
||||
|
||||
libdir = os.path.join(destination, "lib", "python")
|
||||
check_path(cmd.install_lib, libdir)
|
||||
check_path(cmd.install_platlib, libdir)
|
||||
check_path(cmd.install_purelib, libdir)
|
||||
check_path(cmd.install_headers,
|
||||
os.path.join(destination, "include", "python", "foopkg"))
|
||||
check_path(cmd.install_scripts, os.path.join(destination, "bin"))
|
||||
check_path(cmd.install_data, destination)
|
||||
|
||||
|
||||
def test_suite():
|
||||
return unittest.makeSuite(InstallTestCase)
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main(defaultTest="test_suite")
|
|
@ -365,6 +365,9 @@ Library
|
|||
- refactored site.py into functions. Also wrote regression tests for the
|
||||
module.
|
||||
|
||||
- The distutils install command now supports the --home option and
|
||||
installation scheme for all platforms.
|
||||
|
||||
- The distutils sdist command now ignores all .svn directories, in
|
||||
addition to CVS and RCS directories. .svn directories hold
|
||||
administrative files for the Subversion source control system.
|
||||
|
|
Loading…
Reference in New Issue