Make distutils "install --home" support all platforms.

This commit is contained in:
Fred Drake 2004-06-25 23:02:59 +00:00
parent 8d726eef96
commit ec6229e352
4 changed files with 96 additions and 34 deletions

View File

@ -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"

View File

@ -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 ()

View File

@ -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")

View File

@ -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.