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