summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFred Drake <fdrake@acm.org>2004-06-25 23:02:59 (GMT)
committerFred Drake <fdrake@acm.org>2004-06-25 23:02:59 (GMT)
commitec6229e35247ef9eff6c2af254cee4a558d1d46a (patch)
treee68a681c2a5e01ade9384e4b41ad20d43a3bb865
parent8d726eef968177acaae2a6daa7fe8fb5a8026c42 (diff)
downloadcpython-ec6229e35247ef9eff6c2af254cee4a558d1d46a.zip
cpython-ec6229e35247ef9eff6c2af254cee4a558d1d46a.tar.gz
cpython-ec6229e35247ef9eff6c2af254cee4a558d1d46a.tar.bz2
Make distutils "install --home" support all platforms.
-rw-r--r--Doc/inst/inst.tex38
-rw-r--r--Lib/distutils/command/install.py34
-rw-r--r--Lib/distutils/tests/test_install.py55
-rw-r--r--Misc/NEWS3
4 files changed, 96 insertions, 34 deletions
diff --git a/Doc/inst/inst.tex b/Doc/inst/inst.tex
index 35ea161..51802c0 100644
--- a/Doc/inst/inst.tex
+++ b/Doc/inst/inst.tex
@@ -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"
diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py
index 7fb46a7..3c36ede 100644
--- a/Lib/distutils/command/install.py
+++ b/Lib/distutils/command/install.py
@@ -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 ()
diff --git a/Lib/distutils/tests/test_install.py b/Lib/distutils/tests/test_install.py
new file mode 100644
index 0000000..c834b91
--- /dev/null
+++ b/Lib/distutils/tests/test_install.py
@@ -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")
diff --git a/Misc/NEWS b/Misc/NEWS
index b5038f7..caaed29 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.