1ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh"""distutils.command.bdist_dumb
2ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehImplements the Distutils 'bdist_dumb' command (create a "dumb" built
4ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdistribution -- i.e., just an archive to be unpacked under $prefix or
5ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh$exec_prefix)."""
6ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
7ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh__revision__ = "$Id$"
8ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
9ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport os
10ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
11ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom sysconfig import get_python_version
12ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
13ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom distutils.util import get_platform
14ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom distutils.core import Command
15ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom distutils.dir_util import remove_tree, ensure_relative
16ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom distutils.errors import DistutilsPlatformError
17ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom distutils import log
18ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
19ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass bdist_dumb (Command):
20ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
21ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    description = 'create a "dumb" built distribution'
22ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
23ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    user_options = [('bdist-dir=', 'd',
24ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                     "temporary directory for creating the distribution"),
25ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    ('plat-name=', 'p',
26ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                     "platform name to embed in generated filenames "
27ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                     "(default: %s)" % get_platform()),
28ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    ('format=', 'f',
29ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                     "archive format to create (tar, ztar, gztar, zip)"),
30ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    ('keep-temp', 'k',
31ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                     "keep the pseudo-installation tree around after " +
32ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                     "creating the distribution archive"),
33ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    ('dist-dir=', 'd',
34ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                     "directory to put final built distributions in"),
35ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    ('skip-build', None,
36ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                     "skip rebuilding everything (for testing/debugging)"),
37ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    ('relative', None,
38ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                     "build the archive using relative paths"
39ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                     "(default: false)"),
40ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    ('owner=', 'u',
41ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                     "Owner name used when creating a tar file"
42ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                     " [default: current user]"),
43ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    ('group=', 'g',
44ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                     "Group name used when creating a tar file"
45ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                     " [default: current group]"),
46ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   ]
47ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
48ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    boolean_options = ['keep-temp', 'skip-build', 'relative']
49ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
50ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    default_format = { 'posix': 'gztar',
51ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                       'nt': 'zip',
52ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                       'os2': 'zip' }
53ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
54ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
55ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def initialize_options (self):
56ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.bdist_dir = None
57ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.plat_name = None
58ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.format = None
59ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.keep_temp = 0
60ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.dist_dir = None
61ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.skip_build = None
62ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.relative = 0
63ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.owner = None
64ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.group = None
65ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
66ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def finalize_options(self):
67ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if self.bdist_dir is None:
68ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            bdist_base = self.get_finalized_command('bdist').bdist_base
69ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.bdist_dir = os.path.join(bdist_base, 'dumb')
70ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
71ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if self.format is None:
72ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            try:
73ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.format = self.default_format[os.name]
74ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            except KeyError:
75ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                raise DistutilsPlatformError, \
76ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                      ("don't know how to create dumb built distributions " +
77ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                       "on platform %s") % os.name
78ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
79ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.set_undefined_options('bdist',
80ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                   ('dist_dir', 'dist_dir'),
81ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                   ('plat_name', 'plat_name'),
82ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                   ('skip_build', 'skip_build'))
83ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
84ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def run(self):
85ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if not self.skip_build:
86ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.run_command('build')
87ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
88ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        install = self.reinitialize_command('install', reinit_subcommands=1)
89ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        install.root = self.bdist_dir
90ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        install.skip_build = self.skip_build
91ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        install.warn_dir = 0
92ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
93ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        log.info("installing to %s" % self.bdist_dir)
94ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.run_command('install')
95ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
96ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # And make an archive relative to the root of the
97ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # pseudo-installation tree.
98ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        archive_basename = "%s.%s" % (self.distribution.get_fullname(),
99ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                      self.plat_name)
100ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
101ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # OS/2 objects to any ":" characters in a filename (such as when
102ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # a timestamp is used in a version) so change them to hyphens.
103ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if os.name == "os2":
104ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            archive_basename = archive_basename.replace(":", "-")
105ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
106ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        pseudoinstall_root = os.path.join(self.dist_dir, archive_basename)
107ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if not self.relative:
108ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            archive_root = self.bdist_dir
109ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        else:
110ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            if (self.distribution.has_ext_modules() and
111ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                (install.install_base != install.install_platbase)):
112ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                raise DistutilsPlatformError, \
113ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                      ("can't make a dumb built distribution where "
114ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                       "base and platbase are different (%s, %s)"
115ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                       % (repr(install.install_base),
116ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                          repr(install.install_platbase)))
117ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            else:
118ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                archive_root = os.path.join(self.bdist_dir,
119ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                   ensure_relative(install.install_base))
120ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
121ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Make the archive
122ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        filename = self.make_archive(pseudoinstall_root,
123ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                     self.format, root_dir=archive_root,
124ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                     owner=self.owner, group=self.group)
125ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if self.distribution.has_ext_modules():
126ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            pyversion = get_python_version()
127ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        else:
128ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            pyversion = 'any'
129ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.distribution.dist_files.append(('bdist_dumb', pyversion,
130ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                             filename))
131ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
132ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if not self.keep_temp:
133ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            remove_tree(self.bdist_dir, dry_run=self.dry_run)
134