blob: be3a1d6e0fdf93dd7515ff8bf0b60bb220f1c494 [file] [log] [blame]
Greg Ward2689e3d1999-03-22 14:52:19 +00001"""distutils.util
2
Greg Wardaebf7062000-04-04 02:05:59 +00003Miscellaneous utility functions -- anything that doesn't fit into
4one of the other *util.py modules."""
Greg Ward2689e3d1999-03-22 14:52:19 +00005
6# created 1999/03/08, Greg Ward
7
Greg Ward3ce77fd2000-03-02 01:49:45 +00008__revision__ = "$Id$"
Greg Ward2689e3d1999-03-22 14:52:19 +00009
Greg Warda7540bd2000-03-23 04:39:16 +000010import sys, os, string, re, shutil
Greg Ward2689e3d1999-03-22 14:52:19 +000011from distutils.errors import *
Greg Ward7c1a6d42000-03-29 02:48:40 +000012from distutils.spawn import spawn
Greg Ward2689e3d1999-03-22 14:52:19 +000013
Greg Wardaebf7062000-04-04 02:05:59 +000014# for backwards compatibility:
15from distutils.file_util import *
16from distutils.dir_util import *
17from distutils.dep_util import *
18from distutils.archive_util import *
Greg Ward585df892000-03-01 14:40:15 +000019
20
21def get_platform ():
22 """Return a string (suitable for tacking onto directory names) that
23 identifies the current platform. Under Unix, identifies both the OS
24 and hardware architecture, e.g. "linux-i586", "solaris-sparc",
25 "irix-mips". For Windows and Mac OS, just returns 'sys.platform' --
26 i.e. "???" or "???"."""
27
28 if os.name == 'posix':
Greg Ward6ce00b42000-03-31 04:40:25 +000029 (OS, _, rel, _, arch) = os.uname()
30 return "%s%c-%s" % (string.lower (OS), rel[0], string.lower (arch))
Greg Ward585df892000-03-01 14:40:15 +000031 else:
32 return sys.platform
33
34# get_platform()
Greg Ward50919292000-03-07 03:27:08 +000035
36
37def native_path (pathname):
38 """Return 'pathname' as a name that will work on the native
39 filesystem, i.e. split it on '/' and put it back together again
40 using the current directory separator. Needed because filenames in
41 the setup script are always supplied in Unix style, and have to be
42 converted to the local convention before we can actually use them in
Greg Ward02a1a2b2000-04-15 22:15:07 +000043 the filesystem. Raises ValueError if 'pathname' is
Greg Ward50919292000-03-07 03:27:08 +000044 absolute (starts with '/') or contains local directory separators
45 (unless the local separator is '/', of course)."""
46
47 if pathname[0] == '/':
Greg Ward02a1a2b2000-04-15 22:15:07 +000048 raise ValueError, "path '%s' cannot be absolute" % pathname
Greg Ward50919292000-03-07 03:27:08 +000049 if pathname[-1] == '/':
Greg Ward02a1a2b2000-04-15 22:15:07 +000050 raise ValueError, "path '%s' cannot end with '/'" % pathname
Greg Ward1b4ede52000-03-22 00:22:44 +000051 if os.sep != '/' and os.sep in pathname:
Greg Ward02a1a2b2000-04-15 22:15:07 +000052 raise ValueError, \
Greg Ward1b4ede52000-03-22 00:22:44 +000053 "path '%s' cannot contain '%c' character" % \
54 (pathname, os.sep)
Greg Ward50919292000-03-07 03:27:08 +000055
56 paths = string.split (pathname, '/')
57 return apply (os.path.join, paths)
58 else:
59 return pathname
60
61# native_path ()
Greg Ward1b4ede52000-03-22 00:22:44 +000062
63
64def _check_environ ():
65 """Ensure that 'os.environ' has all the environment variables we
66 guarantee that users can use in config files, command-line
67 options, etc. Currently this includes:
68 HOME - user's home directory (Unix only)
69 PLAT - desription of the current platform, including hardware
70 and OS (see 'get_platform()')
71 """
72
73 if os.name == 'posix' and not os.environ.has_key('HOME'):
74 import pwd
75 os.environ['HOME'] = pwd.getpwuid (os.getuid())[5]
76
77 if not os.environ.has_key('PLAT'):
78 os.environ['PLAT'] = get_platform ()
79
80
81def subst_vars (str, local_vars):
82 """Perform shell/Perl-style variable substitution on 'string'.
83 Every occurence of '$' followed by a name, or a name enclosed in
84 braces, is considered a variable. Every variable is substituted by
85 the value found in the 'local_vars' dictionary, or in 'os.environ'
86 if it's not in 'local_vars'. 'os.environ' is first checked/
87 augmented to guarantee that it contains certain values: see
88 '_check_environ()'. Raise ValueError for any variables not found in
89 either 'local_vars' or 'os.environ'."""
90
91 _check_environ ()
92 def _subst (match, local_vars=local_vars):
93 var_name = match.group(1)
94 if local_vars.has_key (var_name):
95 return str (local_vars[var_name])
96 else:
97 return os.environ[var_name]
98
99 return re.sub (r'\$([a-zA-Z_][a-zA-Z_0-9]*)', _subst, str)
100
101# subst_vars ()
Greg Ward7c1a6d42000-03-29 02:48:40 +0000102
103