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.
|
of the following sections applies to you.
|
||||||
|
|
||||||
|
|
||||||
\subsection{Alternate installation: \UNIX{} (the home scheme)}
|
\subsection{Alternate installation: the home scheme}
|
||||||
\label{alt-install-prefix}
|
\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
|
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
|
Installing a new module distribution is as simple as
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
python setup.py install --home=<dir>
|
python setup.py install --home=<dir>
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
where you can supply any directory you like for the \longprogramopt{home}
|
where you can supply any directory you like for the
|
||||||
option. Lazy typists can just type a tilde (\code{\textasciitilde}); the
|
\longprogramopt{home} option. On \UNIX, lazy typists can just type a
|
||||||
\command{install} command will expand this to your home directory:
|
tilde (\code{\textasciitilde}); the \command{install} command will
|
||||||
|
expand this to your home directory:
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
python setup.py install --home=~
|
python setup.py install --home=~
|
||||||
@ -417,6 +417,11 @@ installation base as follows:
|
|||||||
{home}{/bin}
|
{home}{/bin}
|
||||||
{home}{/share}
|
{home}{/share}
|
||||||
|
|
||||||
|
|
||||||
|
\versionchanged[The \longprogramopt{home} option used to be supported
|
||||||
|
only on \UNIX]{2.4}
|
||||||
|
|
||||||
|
|
||||||
\subsection{Alternate installation: \UNIX{} (the prefix scheme)}
|
\subsection{Alternate installation: \UNIX{} (the prefix scheme)}
|
||||||
\label{alt-install-home}
|
\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.)
|
point to an alternate Python installation, this is immaterial.)
|
||||||
|
|
||||||
|
|
||||||
\subsection{Alternate installation: Windows}
|
\subsection{Alternate installation: Windows (the prefix scheme)}
|
||||||
\label{alt-install-windows}
|
\label{alt-install-windows}
|
||||||
|
|
||||||
Since Windows has no conception of a user's home directory, and since
|
Windows has no concept of a user's home directory, and since the
|
||||||
the standard Python installation under Windows is simpler than that
|
standard Python installation under Windows is simpler than under
|
||||||
under \UNIX, there's no point in having separate \longprogramopt{prefix}
|
\UNIX, the \longprogramopt{prefix} option has traditionally been used
|
||||||
and \longprogramopt{home} options. Just use the \longprogramopt{prefix}
|
to install additional packages in separate locations on Windows.
|
||||||
option to specify a base directory, e.g.
|
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
python setup.py install --prefix="\Temp\Python"
|
python setup.py install --prefix="\Temp\Python"
|
||||||
|
@ -242,19 +242,15 @@ class install (Command):
|
|||||||
("must supply either prefix/exec-prefix/home or " +
|
("must supply either prefix/exec-prefix/home or " +
|
||||||
"install-base/install-platbase -- not both")
|
"install-base/install-platbase -- 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):
|
if self.home and (self.prefix or self.exec_prefix):
|
||||||
raise DistutilsOptionError, \
|
raise DistutilsOptionError, \
|
||||||
("must supply either home or prefix/exec-prefix -- " +
|
"must supply either home or prefix/exec-prefix -- not both"
|
||||||
"not both")
|
|
||||||
else:
|
# Next, stuff that's wrong (or dubious) only on certain platforms.
|
||||||
|
if os.name != "posix":
|
||||||
if self.exec_prefix:
|
if self.exec_prefix:
|
||||||
self.warn("exec-prefix option ignored on this platform")
|
self.warn("exec-prefix option ignored on this platform")
|
||||||
self.exec_prefix = None
|
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
|
# Now the interesting logic -- so interesting that we farm it out
|
||||||
# to other methods. The goal of these methods is to set the final
|
# to other methods. The goal of these methods is to set the final
|
||||||
@ -405,6 +401,10 @@ class install (Command):
|
|||||||
|
|
||||||
def finalize_other (self): # Windows and Mac OS for now
|
def finalize_other (self): # Windows and Mac OS for now
|
||||||
|
|
||||||
|
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:
|
if self.prefix is None:
|
||||||
self.prefix = os.path.normpath(sys.prefix)
|
self.prefix = os.path.normpath(sys.prefix)
|
||||||
|
|
||||||
|
55
Lib/distutils/tests/test_install.py
Normal file
55
Lib/distutils/tests/test_install.py
Normal 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")
|
@ -365,6 +365,9 @@ Library
|
|||||||
- refactored site.py into functions. Also wrote regression tests for the
|
- refactored site.py into functions. Also wrote regression tests for the
|
||||||
module.
|
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
|
- The distutils sdist command now ignores all .svn directories, in
|
||||||
addition to CVS and RCS directories. .svn directories hold
|
addition to CVS and RCS directories. .svn directories hold
|
||||||
administrative files for the Subversion source control system.
|
administrative files for the Subversion source control system.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user