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