diff options
author | Fred Drake <fdrake@acm.org> | 2004-06-25 23:02:59 (GMT) |
---|---|---|
committer | Fred Drake <fdrake@acm.org> | 2004-06-25 23:02:59 (GMT) |
commit | ec6229e35247ef9eff6c2af254cee4a558d1d46a (patch) | |
tree | e68a681c2a5e01ade9384e4b41ad20d43a3bb865 | |
parent | 8d726eef968177acaae2a6daa7fe8fb5a8026c42 (diff) | |
download | cpython-ec6229e35247ef9eff6c2af254cee4a558d1d46a.zip cpython-ec6229e35247ef9eff6c2af254cee4a558d1d46a.tar.gz cpython-ec6229e35247ef9eff6c2af254cee4a558d1d46a.tar.bz2 |
Make distutils "install --home" support all platforms.
-rw-r--r-- | Doc/inst/inst.tex | 38 | ||||
-rw-r--r-- | Lib/distutils/command/install.py | 34 | ||||
-rw-r--r-- | Lib/distutils/tests/test_install.py | 55 | ||||
-rw-r--r-- | Misc/NEWS | 3 |
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") @@ -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. |