Kaydet (Commit) ec6229e3 authored tarafından Fred Drake's avatar Fred Drake

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

üst 8d726eef
......@@ -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 ()
......
"""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.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment