blob: 68d6227adafc437cc509e572bfe67baf519b6a05 [file] [log] [blame]
Greg Ward13ae1c81999-03-22 14:55:25 +00001"""distutils.command.install
2
3Implements the Distutils 'install' command."""
4
Greg Ward3ce77fd2000-03-02 01:49:45 +00005__revision__ = "$Id$"
Greg Ward13ae1c81999-03-22 14:55:25 +00006
Tarek Ziadée616c532009-06-04 07:31:52 +00007import sys
8import os
9
Tarek Ziadé5633a802010-01-23 09:23:15 +000010from sysconfig import (get_config_vars, get_platform, get_paths, get_path,
11 get_config_var)
12
Tarek Ziadée616c532009-06-04 07:31:52 +000013from distutils import log
Jeremy Hyltonfcd73532002-09-11 16:31:53 +000014from distutils.core import Command
15from distutils.debug import DEBUG
Andrew M. Kuchling665f2482001-08-10 18:59:59 +000016from distutils.errors import DistutilsPlatformError
Greg Wardab3a0f32000-08-05 01:31:54 +000017from distutils.file_util import write_file
Tarek Ziadé5633a802010-01-23 09:23:15 +000018from distutils.util import convert_path, change_root
Greg Ward4f08e4f2000-02-26 00:49:04 +000019from distutils.errors import DistutilsOptionError
Christian Heimesaf748c32008-05-06 22:41:46 +000020
Tarek Ziadé5633a802010-01-23 09:23:15 +000021def _subst_vars(s, local_vars):
22 try:
23 return s.format(**local_vars)
24 except KeyError:
25 try:
26 return s.format(**os.environ)
27 except KeyError, var:
28 raise AttributeError('{%s}' % var)
Greg Warda233d862000-03-22 00:15:45 +000029
Tarek Ziadée616c532009-06-04 07:31:52 +000030class install(Command):
Greg Ward13ae1c81999-03-22 14:55:25 +000031
Greg Ward37bc8152000-01-30 18:34:15 +000032 description = "install everything from build directory"
33
Greg Wardbbeceea2000-02-18 00:25:39 +000034 user_options = [
Greg Warda233d862000-03-22 00:15:45 +000035 # Select installation scheme and set base director(y|ies)
36 ('prefix=', None,
37 "installation prefix"),
Greg Wardbbeceea2000-02-18 00:25:39 +000038 ('exec-prefix=', None,
Greg Warda233d862000-03-22 00:15:45 +000039 "(Unix only) prefix for platform-specific files"),
40 ('home=', None,
41 "(Unix only) home directory to install under"),
Greg Ward13ae1c81999-03-22 14:55:25 +000042
Greg Warda233d862000-03-22 00:15:45 +000043 # Or, just set the base director(y|ies)
44 ('install-base=', None,
45 "base installation directory (instead of --prefix or --home)"),
46 ('install-platbase=', None,
47 "base installation directory for platform-specific files " +
48 "(instead of --exec-prefix or --home)"),
Greg Ward6a647bb2000-04-27 01:56:38 +000049 ('root=', None,
50 "install everything relative to this alternate root directory"),
Greg Warda233d862000-03-22 00:15:45 +000051
52 # Or, explicitly set the installation scheme
53 ('install-purelib=', None,
54 "installation directory for pure Python module distributions"),
Greg Ward4f08e4f2000-02-26 00:49:04 +000055 ('install-platlib=', None,
Greg Warda233d862000-03-22 00:15:45 +000056 "installation directory for non-pure module distributions"),
57 ('install-lib=', None,
58 "installation directory for all module distributions " +
59 "(overrides --install-purelib and --install-platlib)"),
60
Greg Wardcae5a1f2000-05-27 01:33:12 +000061 ('install-headers=', None,
62 "installation directory for C/C++ headers"),
Greg Warda233d862000-03-22 00:15:45 +000063 ('install-scripts=', None,
64 "installation directory for Python scripts"),
65 ('install-data=', None,
66 "installation directory for data files"),
Greg Ward4f08e4f2000-02-26 00:49:04 +000067
Greg Ward81610222000-10-02 02:16:04 +000068 # Byte-compilation options -- see install_lib.py for details, as
69 # these are duplicated from there (but only install_lib does
70 # anything with them).
71 ('compile', 'c', "compile .py to .pyc [default]"),
72 ('no-compile', None, "don't compile .py files"),
73 ('optimize=', 'O',
74 "also compile with optimization: -O1 for \"python -O\", "
75 "-O2 for \"python -OO\", and -O0 to disable [default: -O0]"),
Fred Drake21d45352001-12-06 21:01:19 +000076
Greg Ward3a0310a2000-09-13 01:02:25 +000077 # Miscellaneous control options
78 ('force', 'f',
79 "force installation (overwrite any existing files)"),
Gregory P. Smith74ead8f2000-05-12 01:46:47 +000080 ('skip-build', None,
81 "skip rebuilding everything (for testing/debugging)"),
82
Greg Wardbbeceea2000-02-18 00:25:39 +000083 # Where to install documentation (eventually!)
Greg Ward4f08e4f2000-02-26 00:49:04 +000084 #('doc-format=', None, "format of documentation to generate"),
85 #('install-man=', None, "directory for Unix man pages"),
86 #('install-html=', None, "directory for HTML documentation"),
87 #('install-info=', None, "directory for GNU info files"),
Greg Ward13ae1c81999-03-22 14:55:25 +000088
Gregory P. Smith0ec8ef12000-05-13 02:16:45 +000089 ('record=', None,
90 "filename in which to record list of installed files"),
Gregory P. Smith8cb67612000-05-13 01:58:19 +000091 ]
Greg Ward9a337071999-06-08 02:04:36 +000092
Tarek Ziadédda92f72009-02-27 12:53:34 +000093 boolean_options = ['compile', 'force', 'skip-build']
94
Tarek Ziadé5633a802010-01-23 09:23:15 +000095 user_options.append(('user', None,
96 "install in user site-package '%s'" % \
97 get_path('purelib', '%s_user' % os.name)))
98 boolean_options.append('user')
Greg Warda9d37832000-10-03 03:31:52 +000099 negative_opt = {'no-compile' : 'compile'}
Greg Ward99b032e2000-09-25 01:41:15 +0000100
Greg Wardee94c572000-03-29 02:15:57 +0000101
Tarek Ziadée616c532009-06-04 07:31:52 +0000102 def initialize_options(self):
103 """Initializes options."""
Greg Ward790c1102000-03-22 00:51:18 +0000104 # High-level options: these select both an installation base
105 # and scheme.
Greg Ward13ae1c81999-03-22 14:55:25 +0000106 self.prefix = None
107 self.exec_prefix = None
Greg Warda233d862000-03-22 00:15:45 +0000108 self.home = None
Christian Heimesaf748c32008-05-06 22:41:46 +0000109 self.user = 0
Greg Warda233d862000-03-22 00:15:45 +0000110
Greg Ward790c1102000-03-22 00:51:18 +0000111 # These select only the installation base; it's up to the user to
112 # specify the installation scheme (currently, that means supplying
113 # the --install-{platlib,purelib,scripts,data} options).
Greg Warda233d862000-03-22 00:15:45 +0000114 self.install_base = None
115 self.install_platbase = None
Greg Ward6a647bb2000-04-27 01:56:38 +0000116 self.root = None
Greg Ward13ae1c81999-03-22 14:55:25 +0000117
Greg Ward790c1102000-03-22 00:51:18 +0000118 # These options are the actual installation directories; if not
119 # supplied by the user, they are filled in using the installation
120 # scheme implied by prefix/exec-prefix/home and the contents of
121 # that installation scheme.
122 self.install_purelib = None # for pure module distributions
123 self.install_platlib = None # non-pure (dists w/ extensions)
Greg Wardcae5a1f2000-05-27 01:33:12 +0000124 self.install_headers = None # for C/C++ headers
Greg Ward790c1102000-03-22 00:51:18 +0000125 self.install_lib = None # set to either purelib or platlib
Greg Warda233d862000-03-22 00:15:45 +0000126 self.install_scripts = None
127 self.install_data = None
Tarek Ziadé5633a802010-01-23 09:23:15 +0000128 self.install_userbase = get_config_var('userbase')
129 self.install_usersite = get_path('purelib', '%s_user' % os.name)
Greg Ward13ae1c81999-03-22 14:55:25 +0000130
Andrew M. Kuchlingb26ca9d2002-03-22 15:35:17 +0000131 self.compile = None
Greg Ward81610222000-10-02 02:16:04 +0000132 self.optimize = None
133
Greg Ward790c1102000-03-22 00:51:18 +0000134 # These two are for putting non-packagized distributions into their
135 # own directory and creating a .pth file if it makes sense.
Greg Ward379a02f2000-09-22 01:31:08 +0000136 # 'extra_path' comes from the setup file; 'install_path_file' can
137 # be turned off if it makes no sense to install a .pth file. (But
138 # better to install it uselessly than to guess wrong and not
139 # install it when it's necessary and would be used!) Currently,
140 # 'install_path_file' is always true unless some outsider meddles
141 # with it.
Greg Warda233d862000-03-22 00:15:45 +0000142 self.extra_path = None
Greg Ward379a02f2000-09-22 01:31:08 +0000143 self.install_path_file = 1
Greg Warda233d862000-03-22 00:15:45 +0000144
Greg Ward379a02f2000-09-22 01:31:08 +0000145 # 'force' forces installation, even if target files are not
146 # out-of-date. 'skip_build' skips running the "build" command,
Anthony Baxterf2113f02004-10-13 12:35:28 +0000147 # handy if you know it's not necessary. 'warn_dir' (which is *not*
Greg Ward379a02f2000-09-22 01:31:08 +0000148 # a user option, it's just there so the bdist_* commands can turn
149 # it off) determines whether we warn about installing to a
150 # directory not in sys.path.
Greg Ward3a0310a2000-09-13 01:02:25 +0000151 self.force = 0
Gregory P. Smith74ead8f2000-05-12 01:46:47 +0000152 self.skip_build = 0
Greg Ward379a02f2000-09-22 01:31:08 +0000153 self.warn_dir = 1
Gregory P. Smith74ead8f2000-05-12 01:46:47 +0000154
Greg Ward066af102000-03-22 00:30:54 +0000155 # These are only here as a conduit from the 'build' command to the
156 # 'install_*' commands that do the real work. ('build_base' isn't
157 # actually used anywhere, but it might be useful in future.) They
158 # are not user options, because if the user told the install
159 # command where the build directory is, that wouldn't affect the
160 # build command.
161 self.build_base = None
162 self.build_lib = None
163
Greg Ward790c1102000-03-22 00:51:18 +0000164 # Not defined yet because we don't know anything about
165 # documentation yet.
Greg Warda233d862000-03-22 00:15:45 +0000166 #self.install_man = None
167 #self.install_html = None
168 #self.install_info = None
Greg Ward13ae1c81999-03-22 14:55:25 +0000169
Gregory P. Smith8cb67612000-05-13 01:58:19 +0000170 self.record = None
Greg Ward13ae1c81999-03-22 14:55:25 +0000171
Greg Ward70b1fd12000-09-30 17:05:37 +0000172
173 # -- Option finalizing methods -------------------------------------
174 # (This is rather more involved than for most commands,
175 # because this is where the policy for installing third-
176 # party Python modules on various platforms given a wide
177 # array of user input is decided. Yes, it's quite complex!)
178
Tarek Ziadée616c532009-06-04 07:31:52 +0000179 def finalize_options(self):
180 """Finalizes options."""
Greg Ward790c1102000-03-22 00:51:18 +0000181 # This method (and its pliant slaves, like 'finalize_unix()',
182 # 'finalize_other()', and 'select_scheme()') is where the default
183 # installation directories for modules, extension modules, and
184 # anything else we care to install from a Python module
185 # distribution. Thus, this code makes a pretty important policy
186 # statement about how third-party stuff is added to a Python
187 # installation! Note that the actual work of installation is done
188 # by the relatively simple 'install_*' commands; they just take
189 # their orders from the installation directory options determined
190 # here.
Greg Ward9a337071999-06-08 02:04:36 +0000191
Greg Ward790c1102000-03-22 00:51:18 +0000192 # Check for errors/inconsistencies in the options; first, stuff
193 # that's wrong on any platform.
Greg Ward13ae1c81999-03-22 14:55:25 +0000194
Greg Warda233d862000-03-22 00:15:45 +0000195 if ((self.prefix or self.exec_prefix or self.home) and
196 (self.install_base or self.install_platbase)):
197 raise DistutilsOptionError, \
198 ("must supply either prefix/exec-prefix/home or " +
199 "install-base/install-platbase -- not both")
Greg Ward4f08e4f2000-02-26 00:49:04 +0000200
Fred Drakeec6229e2004-06-25 23:02:59 +0000201 if self.home and (self.prefix or self.exec_prefix):
202 raise DistutilsOptionError, \
203 "must supply either home or prefix/exec-prefix -- not both"
204
Christian Heimesaf748c32008-05-06 22:41:46 +0000205 if self.user and (self.prefix or self.exec_prefix or self.home or
206 self.install_base or self.install_platbase):
207 raise DistutilsOptionError("can't combine user with with prefix/"
208 "exec_prefix/home or install_(plat)base")
209
Greg Ward790c1102000-03-22 00:51:18 +0000210 # Next, stuff that's wrong (or dubious) only on certain platforms.
Fred Drakeec6229e2004-06-25 23:02:59 +0000211 if os.name != "posix":
Greg Warda233d862000-03-22 00:15:45 +0000212 if self.exec_prefix:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000213 self.warn("exec-prefix option ignored on this platform")
Greg Warda233d862000-03-22 00:15:45 +0000214 self.exec_prefix = None
Greg Ward865de831999-09-21 18:31:14 +0000215
Greg Warda233d862000-03-22 00:15:45 +0000216 # Now the interesting logic -- so interesting that we farm it out
217 # to other methods. The goal of these methods is to set the final
218 # values for the install_{lib,scripts,data,...} options, using as
219 # input a heady brew of prefix, exec_prefix, home, install_base,
220 # install_platbase, user-supplied versions of
221 # install_{purelib,platlib,lib,scripts,data,...}, and the
222 # INSTALL_SCHEME dictionary above. Phew!
Greg Ward865de831999-09-21 18:31:14 +0000223
Greg Wardcb1f4c42000-09-30 18:27:54 +0000224 self.dump_dirs("pre-finalize_{unix,other}")
Greg Wardff2d9b72000-04-26 02:38:01 +0000225
Greg Warda233d862000-03-22 00:15:45 +0000226 if os.name == 'posix':
Greg Wardcb1f4c42000-09-30 18:27:54 +0000227 self.finalize_unix()
Greg Warda233d862000-03-22 00:15:45 +0000228 else:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000229 self.finalize_other()
Greg Warda233d862000-03-22 00:15:45 +0000230
Greg Wardcb1f4c42000-09-30 18:27:54 +0000231 self.dump_dirs("post-finalize_{unix,other}()")
Greg Wardff2d9b72000-04-26 02:38:01 +0000232
233 # Expand configuration variables, tilde, etc. in self.install_base
234 # and self.install_platbase -- that way, we can use $base or
235 # $platbase in the other installation directories and not worry
236 # about needing recursive variable expansion (shudder).
237
Tarek Ziadée616c532009-06-04 07:31:52 +0000238 py_version = sys.version.split()[0]
Tarek Ziadé5633a802010-01-23 09:23:15 +0000239 prefix, exec_prefix, srcdir = get_config_vars('prefix', 'exec_prefix',
240 'srcdir')
241
Greg Wardcae5a1f2000-05-27 01:33:12 +0000242 self.config_vars = {'dist_name': self.distribution.get_name(),
243 'dist_version': self.distribution.get_version(),
244 'dist_fullname': self.distribution.get_fullname(),
245 'py_version': py_version,
246 'py_version_short': py_version[0:3],
Christian Heimesaf748c32008-05-06 22:41:46 +0000247 'py_version_nodot': py_version[0] + py_version[2],
Greg Ward9bd3e9b2000-09-15 01:20:10 +0000248 'sys_prefix': prefix,
249 'prefix': prefix,
250 'sys_exec_prefix': exec_prefix,
251 'exec_prefix': exec_prefix,
Tarek Ziadé5633a802010-01-23 09:23:15 +0000252 'srcdir': srcdir,
Greg Wardff2d9b72000-04-26 02:38:01 +0000253 }
Tarek Ziadédda92f72009-02-27 12:53:34 +0000254
Tarek Ziadé5633a802010-01-23 09:23:15 +0000255 self.config_vars['userbase'] = self.install_userbase
256 self.config_vars['usersite'] = self.install_usersite
Greg Wardcb1f4c42000-09-30 18:27:54 +0000257 self.expand_basedirs()
Greg Wardff2d9b72000-04-26 02:38:01 +0000258
Greg Wardcb1f4c42000-09-30 18:27:54 +0000259 self.dump_dirs("post-expand_basedirs()")
Greg Wardff2d9b72000-04-26 02:38:01 +0000260
261 # Now define config vars for the base directories so we can expand
262 # everything else.
263 self.config_vars['base'] = self.install_base
264 self.config_vars['platbase'] = self.install_platbase
265
Greg Wardfbb04c42000-05-28 23:47:31 +0000266 if DEBUG:
267 from pprint import pprint
268 print "config vars:"
Greg Wardcb1f4c42000-09-30 18:27:54 +0000269 pprint(self.config_vars)
Greg Wardff2d9b72000-04-26 02:38:01 +0000270
Greg Warda233d862000-03-22 00:15:45 +0000271 # Expand "~" and configuration variables in the installation
272 # directories.
Greg Wardcb1f4c42000-09-30 18:27:54 +0000273 self.expand_dirs()
Greg Warda233d862000-03-22 00:15:45 +0000274
Greg Wardcb1f4c42000-09-30 18:27:54 +0000275 self.dump_dirs("post-expand_dirs()")
Greg Wardff2d9b72000-04-26 02:38:01 +0000276
Christian Heimesaf748c32008-05-06 22:41:46 +0000277 # Create directories in the home dir:
278 if self.user:
279 self.create_home_path()
280
Greg Warda233d862000-03-22 00:15:45 +0000281 # Pick the actual directory to install all modules to: either
282 # install_purelib or install_platlib, depending on whether this
283 # module distribution is pure or not. Of course, if the user
284 # already specified install_lib, use their selection.
285 if self.install_lib is None:
286 if self.distribution.ext_modules: # has extensions: non-pure
287 self.install_lib = self.install_platlib
288 else:
289 self.install_lib = self.install_purelib
Fred Drake21d45352001-12-06 21:01:19 +0000290
Greg Ward379a02f2000-09-22 01:31:08 +0000291
292 # Convert directories from Unix /-separated syntax to the local
293 # convention.
294 self.convert_paths('lib', 'purelib', 'platlib',
Christian Heimesaf748c32008-05-06 22:41:46 +0000295 'scripts', 'data', 'headers',
296 'userbase', 'usersite')
Greg Ward379a02f2000-09-22 01:31:08 +0000297
Greg Warda233d862000-03-22 00:15:45 +0000298 # Well, we're not actually fully completely finalized yet: we still
299 # have to deal with 'extra_path', which is the hack for allowing
300 # non-packagized module distributions (hello, Numerical Python!) to
301 # get their own directories.
Greg Wardcb1f4c42000-09-30 18:27:54 +0000302 self.handle_extra_path()
Greg Warda233d862000-03-22 00:15:45 +0000303 self.install_libbase = self.install_lib # needed for .pth file
Greg Wardcb1f4c42000-09-30 18:27:54 +0000304 self.install_lib = os.path.join(self.install_lib, self.extra_dirs)
Greg Ward865de831999-09-21 18:31:14 +0000305
Greg Ward6a647bb2000-04-27 01:56:38 +0000306 # If a new root directory was supplied, make all the installation
307 # dirs relative to it.
308 if self.root is not None:
Greg Ward379a02f2000-09-22 01:31:08 +0000309 self.change_roots('libbase', 'lib', 'purelib', 'platlib',
310 'scripts', 'data', 'headers')
Greg Ward6a647bb2000-04-27 01:56:38 +0000311
Greg Wardcb1f4c42000-09-30 18:27:54 +0000312 self.dump_dirs("after prepending root")
Greg Ward6a647bb2000-04-27 01:56:38 +0000313
Greg Ward790c1102000-03-22 00:51:18 +0000314 # Find out the build directories, ie. where to install from.
Greg Wardcb1f4c42000-09-30 18:27:54 +0000315 self.set_undefined_options('build',
316 ('build_base', 'build_base'),
317 ('build_lib', 'build_lib'))
Greg Ward13ae1c81999-03-22 14:55:25 +0000318
319 # Punt on doc directories for now -- after all, we're punting on
320 # documentation completely!
321
Tarek Ziadée616c532009-06-04 07:31:52 +0000322 def dump_dirs(self, msg):
323 """Dumps the list of user options."""
324 if not DEBUG:
325 return
326 from distutils.fancy_getopt import longopt_xlate
327 log.debug(msg + ":")
328 for opt in self.user_options:
329 opt_name = opt[0]
330 if opt_name[-1] == "=":
331 opt_name = opt_name[0:-1]
332 if opt_name in self.negative_opt:
333 opt_name = self.negative_opt[opt_name]
334 opt_name = opt_name.translate(longopt_xlate)
335 val = not getattr(self, opt_name)
336 else:
337 opt_name = opt_name.translate(longopt_xlate)
338 val = getattr(self, opt_name)
339 log.debug(" %s: %s" % (opt_name, val))
Greg Ward13ae1c81999-03-22 14:55:25 +0000340
Tarek Ziadée616c532009-06-04 07:31:52 +0000341 def finalize_unix(self):
342 """Finalizes options for posix platforms."""
Greg Warda233d862000-03-22 00:15:45 +0000343 if self.install_base is not None or self.install_platbase is not None:
344 if ((self.install_lib is None and
345 self.install_purelib is None and
346 self.install_platlib is None) or
Greg Wardcae5a1f2000-05-27 01:33:12 +0000347 self.install_headers is None or
Greg Warda233d862000-03-22 00:15:45 +0000348 self.install_scripts is None or
349 self.install_data is None):
350 raise DistutilsOptionError, \
Jeremy Hyltondc8412e2002-06-04 21:20:08 +0000351 ("install-base or install-platbase supplied, but "
352 "installation scheme is incomplete")
Greg Warda233d862000-03-22 00:15:45 +0000353 return
354
Christian Heimesaf748c32008-05-06 22:41:46 +0000355 if self.user:
356 if self.install_userbase is None:
357 raise DistutilsPlatformError(
358 "User base directory is not specified")
359 self.install_base = self.install_platbase = self.install_userbase
Tarek Ziadé5633a802010-01-23 09:23:15 +0000360 self.select_scheme("posix_user")
Christian Heimesaf748c32008-05-06 22:41:46 +0000361 elif self.home is not None:
Greg Warda233d862000-03-22 00:15:45 +0000362 self.install_base = self.install_platbase = self.home
Tarek Ziadé5633a802010-01-23 09:23:15 +0000363 self.select_scheme("posix_home")
Greg Warda233d862000-03-22 00:15:45 +0000364 else:
365 if self.prefix is None:
366 if self.exec_prefix is not None:
367 raise DistutilsOptionError, \
368 "must not supply exec-prefix without prefix"
369
Greg Wardcb1f4c42000-09-30 18:27:54 +0000370 self.prefix = os.path.normpath(sys.prefix)
371 self.exec_prefix = os.path.normpath(sys.exec_prefix)
Greg Warda233d862000-03-22 00:15:45 +0000372
373 else:
374 if self.exec_prefix is None:
375 self.exec_prefix = self.prefix
376
Greg Warda233d862000-03-22 00:15:45 +0000377 self.install_base = self.prefix
378 self.install_platbase = self.exec_prefix
Tarek Ziadé5633a802010-01-23 09:23:15 +0000379 self.select_scheme("posix_prefix")
Greg Warda233d862000-03-22 00:15:45 +0000380
Tarek Ziadée616c532009-06-04 07:31:52 +0000381 def finalize_other(self):
382 """Finalizes options for non-posix platforms"""
Christian Heimesaf748c32008-05-06 22:41:46 +0000383 if self.user:
384 if self.install_userbase is None:
385 raise DistutilsPlatformError(
386 "User base directory is not specified")
387 self.install_base = self.install_platbase = self.install_userbase
388 self.select_scheme(os.name + "_user")
389 elif self.home is not None:
Fred Drakeec6229e2004-06-25 23:02:59 +0000390 self.install_base = self.install_platbase = self.home
Tarek Ziadé5633a802010-01-23 09:23:15 +0000391 self.select_scheme("posix_home")
Fred Drakeec6229e2004-06-25 23:02:59 +0000392 else:
393 if self.prefix is None:
394 self.prefix = os.path.normpath(sys.prefix)
Greg Warda233d862000-03-22 00:15:45 +0000395
Fred Drakeec6229e2004-06-25 23:02:59 +0000396 self.install_base = self.install_platbase = self.prefix
397 try:
398 self.select_scheme(os.name)
399 except KeyError:
400 raise DistutilsPlatformError, \
401 "I don't know how to install stuff on '%s'" % os.name
Greg Warda233d862000-03-22 00:15:45 +0000402
Tarek Ziadée616c532009-06-04 07:31:52 +0000403 def select_scheme(self, name):
404 """Sets the install directories by applying the install schemes."""
Greg Warda233d862000-03-22 00:15:45 +0000405 # it's the caller's problem if they supply a bad name!
Tarek Ziadé5633a802010-01-23 09:23:15 +0000406 scheme = get_paths(name, expand=False)
407 for key, value in scheme.items():
408 if key == 'platinclude':
409 key = 'headers'
410 value = os.path.join(value, self.distribution.get_name())
Gregory P. Smith17f641c2000-05-12 01:54:50 +0000411 attrname = 'install_' + key
Tarek Ziadé5633a802010-01-23 09:23:15 +0000412 if hasattr(self, attrname):
413 if getattr(self, attrname) is None:
414 setattr(self, attrname, value)
Greg Warda233d862000-03-22 00:15:45 +0000415
Tarek Ziadée616c532009-06-04 07:31:52 +0000416 def _expand_attrs(self, attrs):
Greg Wardff2d9b72000-04-26 02:38:01 +0000417 for attr in attrs:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000418 val = getattr(self, attr)
Greg Wardff2d9b72000-04-26 02:38:01 +0000419 if val is not None:
Christian Heimesaf748c32008-05-06 22:41:46 +0000420 if os.name == 'posix' or os.name == 'nt':
Greg Wardcb1f4c42000-09-30 18:27:54 +0000421 val = os.path.expanduser(val)
Tarek Ziadé5633a802010-01-23 09:23:15 +0000422 try:
423 val = _subst_vars(val, self.config_vars)
424 except:
425 import pdb; pdb.set_trace()
Greg Wardcb1f4c42000-09-30 18:27:54 +0000426 setattr(self, attr, val)
Greg Wardff2d9b72000-04-26 02:38:01 +0000427
Tarek Ziadée616c532009-06-04 07:31:52 +0000428 def expand_basedirs(self):
429 """Calls `os.path.expanduser` on install_base, install_platbase and
430 root."""
431 self._expand_attrs(['install_base', 'install_platbase', 'root'])
Greg Wardff2d9b72000-04-26 02:38:01 +0000432
Tarek Ziadée616c532009-06-04 07:31:52 +0000433 def expand_dirs(self):
434 """Calls `os.path.expanduser` on install dirs."""
435 self._expand_attrs(['install_purelib', 'install_platlib',
436 'install_lib', 'install_headers',
437 'install_scripts', 'install_data',])
Greg Wardff2d9b72000-04-26 02:38:01 +0000438
Tarek Ziadée616c532009-06-04 07:31:52 +0000439 def convert_paths(self, *names):
440 """Call `convert_path` over `names`."""
Greg Ward379a02f2000-09-22 01:31:08 +0000441 for name in names:
442 attr = "install_" + name
443 setattr(self, attr, convert_path(getattr(self, attr)))
444
Tarek Ziadée616c532009-06-04 07:31:52 +0000445 def handle_extra_path(self):
446 """Set `path_file` and `extra_dirs` using `extra_path`."""
Greg Warda233d862000-03-22 00:15:45 +0000447 if self.extra_path is None:
448 self.extra_path = self.distribution.extra_path
449
450 if self.extra_path is not None:
Tarek Ziadée616c532009-06-04 07:31:52 +0000451 if isinstance(self.extra_path, str):
452 self.extra_path = self.extra_path.split(',')
Greg Warda233d862000-03-22 00:15:45 +0000453
Greg Wardcb1f4c42000-09-30 18:27:54 +0000454 if len(self.extra_path) == 1:
Greg Warda233d862000-03-22 00:15:45 +0000455 path_file = extra_dirs = self.extra_path[0]
Greg Wardcb1f4c42000-09-30 18:27:54 +0000456 elif len(self.extra_path) == 2:
Tarek Ziadée616c532009-06-04 07:31:52 +0000457 path_file, extra_dirs = self.extra_path
Greg Warda233d862000-03-22 00:15:45 +0000458 else:
459 raise DistutilsOptionError, \
Jeremy Hyltondc8412e2002-06-04 21:20:08 +0000460 ("'extra_path' option must be a list, tuple, or "
461 "comma-separated string with 1 or 2 elements")
Greg Warda233d862000-03-22 00:15:45 +0000462
463 # convert to local form in case Unix notation used (as it
464 # should be in setup scripts)
Greg Wardcb1f4c42000-09-30 18:27:54 +0000465 extra_dirs = convert_path(extra_dirs)
Greg Warda233d862000-03-22 00:15:45 +0000466 else:
467 path_file = None
468 extra_dirs = ''
469
470 # XXX should we warn if path_file and not extra_dirs? (in which
471 # case the path file would be harmless but pointless)
472 self.path_file = path_file
473 self.extra_dirs = extra_dirs
474
Tarek Ziadée616c532009-06-04 07:31:52 +0000475 def change_roots(self, *names):
476 """Change the install direcories pointed by name using root."""
Greg Ward379a02f2000-09-22 01:31:08 +0000477 for name in names:
478 attr = "install_" + name
479 setattr(self, attr, change_root(self.root, getattr(self, attr)))
480
Christian Heimesaf748c32008-05-06 22:41:46 +0000481 def create_home_path(self):
Tarek Ziadée616c532009-06-04 07:31:52 +0000482 """Create directories under ~."""
Christian Heimesaf748c32008-05-06 22:41:46 +0000483 if not self.user:
484 return
485 home = convert_path(os.path.expanduser("~"))
486 for name, path in self.config_vars.iteritems():
487 if path.startswith(home) and not os.path.isdir(path):
488 self.debug_print("os.makedirs('%s', 0700)" % path)
489 os.makedirs(path, 0700)
Greg Ward379a02f2000-09-22 01:31:08 +0000490
Greg Ward70b1fd12000-09-30 17:05:37 +0000491 # -- Command execution methods -------------------------------------
492
Tarek Ziadée616c532009-06-04 07:31:52 +0000493 def run(self):
494 """Runs the command."""
Greg Ward9a337071999-06-08 02:04:36 +0000495 # Obviously have to build before we can install
Gregory P. Smith74ead8f2000-05-12 01:46:47 +0000496 if not self.skip_build:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000497 self.run_command('build')
Mark Hammond495cf992008-04-07 01:53:39 +0000498 # If we built for any other platform, we can't install.
499 build_plat = self.distribution.get_command_obj('build').plat_name
500 # check warn_dir - it is a clue that the 'install' is happening
501 # internally, and not to sys.path, so we don't check the platform
502 # matches what we are running.
503 if self.warn_dir and build_plat != get_platform():
504 raise DistutilsPlatformError("Can't install when "
505 "cross-compiling")
Greg Ward9a337071999-06-08 02:04:36 +0000506
Greg Warda4adafd2000-05-20 15:17:09 +0000507 # Run all sub-commands (at least those that need to be run)
508 for cmd_name in self.get_sub_commands():
Greg Wardcb1f4c42000-09-30 18:27:54 +0000509 self.run_command(cmd_name)
Greg Ward865de831999-09-21 18:31:14 +0000510
511 if self.path_file:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000512 self.create_path_file()
Greg Ward13ae1c81999-03-22 14:55:25 +0000513
Gregory P. Smith8cb67612000-05-13 01:58:19 +0000514 # write list of installed files, if requested.
515 if self.record:
516 outputs = self.get_outputs()
Gregory P. Smith7e855ef2000-05-13 02:13:53 +0000517 if self.root: # strip any package prefix
Gregory P. Smith8cb67612000-05-13 01:58:19 +0000518 root_len = len(self.root)
Greg Wardcb1f4c42000-09-30 18:27:54 +0000519 for counter in xrange(len(outputs)):
Gregory P. Smith8cb67612000-05-13 01:58:19 +0000520 outputs[counter] = outputs[counter][root_len:]
521 self.execute(write_file,
Gregory P. Smith0ec8ef12000-05-13 02:16:45 +0000522 (self.record, outputs),
523 "writing list of installed files to '%s'" %
524 self.record)
Gregory P. Smithf9ebf982000-05-13 02:01:22 +0000525
Greg Ward0b4dafc2000-10-14 03:47:07 +0000526 sys_path = map(os.path.normpath, sys.path)
Greg Wardfa9ff762000-10-14 04:06:40 +0000527 sys_path = map(os.path.normcase, sys_path)
Greg Ward0b4dafc2000-10-14 03:47:07 +0000528 install_lib = os.path.normcase(os.path.normpath(self.install_lib))
Greg Ward379a02f2000-09-22 01:31:08 +0000529 if (self.warn_dir and
530 not (self.path_file and self.install_path_file) and
Greg Ward0b4dafc2000-10-14 03:47:07 +0000531 install_lib not in sys_path):
Jeremy Hyltondc8412e2002-06-04 21:20:08 +0000532 log.debug(("modules installed to '%s', which is not in "
Tim Peters182b5ac2004-07-18 06:16:08 +0000533 "Python's module search path (sys.path) -- "
Jeremy Hyltondc8412e2002-06-04 21:20:08 +0000534 "you'll have to change the search path yourself"),
535 self.install_lib)
Gregory P. Smith8cb67612000-05-13 01:58:19 +0000536
Tarek Ziadée616c532009-06-04 07:31:52 +0000537 def create_path_file(self):
538 """Creates the .pth file"""
Greg Wardcb1f4c42000-09-30 18:27:54 +0000539 filename = os.path.join(self.install_libbase,
540 self.path_file + ".pth")
Greg Ward70b1fd12000-09-30 17:05:37 +0000541 if self.install_path_file:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000542 self.execute(write_file,
543 (filename, [self.extra_dirs]),
544 "creating %s" % filename)
Greg Ward70b1fd12000-09-30 17:05:37 +0000545 else:
546 self.warn("path file '%s' not created" % filename)
547
548
549 # -- Reporting methods ---------------------------------------------
550
Tarek Ziadée616c532009-06-04 07:31:52 +0000551 def get_outputs(self):
552 """Assembles the outputs of all the sub-commands."""
Greg Ward70b1fd12000-09-30 17:05:37 +0000553 outputs = []
554 for cmd_name in self.get_sub_commands():
Greg Wardcb1f4c42000-09-30 18:27:54 +0000555 cmd = self.get_finalized_command(cmd_name)
Andrew M. Kuchling97102972001-01-16 16:16:03 +0000556 # Add the contents of cmd.get_outputs(), ensuring
557 # that outputs doesn't contain duplicate entries
558 for filename in cmd.get_outputs():
559 if filename not in outputs:
560 outputs.append(filename)
Greg Ward70b1fd12000-09-30 17:05:37 +0000561
Andrew M. Kuchlinga8ea5ba2001-09-04 20:06:43 +0000562 if self.path_file and self.install_path_file:
563 outputs.append(os.path.join(self.install_libbase,
564 self.path_file + ".pth"))
Fred Drake21d45352001-12-06 21:01:19 +0000565
Greg Ward70b1fd12000-09-30 17:05:37 +0000566 return outputs
567
Tarek Ziadée616c532009-06-04 07:31:52 +0000568 def get_inputs(self):
569 """Returns the inputs of all the sub-commands"""
Greg Ward70b1fd12000-09-30 17:05:37 +0000570 # XXX gee, this looks familiar ;-(
571 inputs = []
572 for cmd_name in self.get_sub_commands():
Greg Wardcb1f4c42000-09-30 18:27:54 +0000573 cmd = self.get_finalized_command(cmd_name)
574 inputs.extend(cmd.get_inputs())
Greg Ward70b1fd12000-09-30 17:05:37 +0000575
576 return inputs
577
Greg Wardfadefed2000-09-16 15:06:57 +0000578 # -- Predicates for sub-command list -------------------------------
579
Tarek Ziadée616c532009-06-04 07:31:52 +0000580 def has_lib(self):
581 """Returns true if the current distribution has any Python
Greg Warda4adafd2000-05-20 15:17:09 +0000582 modules to install."""
583 return (self.distribution.has_pure_modules() or
584 self.distribution.has_ext_modules())
585
Tarek Ziadée616c532009-06-04 07:31:52 +0000586 def has_headers(self):
587 """Returns true if the current distribution has any headers to
588 install."""
Greg Wardcae5a1f2000-05-27 01:33:12 +0000589 return self.distribution.has_headers()
590
Tarek Ziadée616c532009-06-04 07:31:52 +0000591 def has_scripts(self):
592 """Returns true if the current distribution has any scripts to.
593 install."""
Greg Warda4adafd2000-05-20 15:17:09 +0000594 return self.distribution.has_scripts()
595
Tarek Ziadée616c532009-06-04 07:31:52 +0000596 def has_data(self):
597 """Returns true if the current distribution has any data to.
598 install."""
Greg Warda4adafd2000-05-20 15:17:09 +0000599 return self.distribution.has_data_files()
600
Greg Wardfadefed2000-09-16 15:06:57 +0000601 # 'sub_commands': a list of commands this command might have to run to
602 # get its work done. See cmd.py for more info.
603 sub_commands = [('install_lib', has_lib),
604 ('install_headers', has_headers),
605 ('install_scripts', has_scripts),
606 ('install_data', has_data),
Phillip J. Eby02e19972006-03-27 21:55:21 +0000607 ('install_egg_info', lambda self:True),
Greg Wardfadefed2000-09-16 15:06:57 +0000608 ]