mirror of
https://github.com/python/cpython.git
synced 2025-07-23 11:15:24 +00:00

This method was named reinitialize_command in distutils and accompanied by a comment suggesting to change it to get_reinitialized_command. Following that, I did the change for distutils2, but it proved confusing: The Distribution object has an internal cache of command objects, to make sure only one instance is ever used, and the name get_reinitialized_command could suggest that the object returned was independent of that cache, which it was not. I’m reverting the name change to make code clearer.
139 lines
5.2 KiB
Python
139 lines
5.2 KiB
Python
"""Create a "dumb" built distribution.
|
|
|
|
A dumb distribution is just an archive meant to be unpacked under
|
|
sys.prefix or sys.exec_prefix.
|
|
"""
|
|
|
|
import os
|
|
from shutil import rmtree
|
|
from sysconfig import get_python_version
|
|
|
|
from packaging.util import get_platform
|
|
from packaging.command.cmd import Command
|
|
from packaging.errors import PackagingPlatformError
|
|
from packaging import logger
|
|
|
|
|
|
class bdist_dumb(Command):
|
|
|
|
description = 'create a "dumb" built distribution'
|
|
|
|
user_options = [('bdist-dir=', 'd',
|
|
"temporary directory for creating the distribution"),
|
|
('plat-name=', 'p',
|
|
"platform name to embed in generated filenames "
|
|
"(default: %s)" % get_platform()),
|
|
('format=', 'f',
|
|
"archive format to create (tar, gztar, bztar, zip)"),
|
|
('keep-temp', 'k',
|
|
"keep the pseudo-installation tree around after " +
|
|
"creating the distribution archive"),
|
|
('dist-dir=', 'd',
|
|
"directory to put final built distributions in"),
|
|
('skip-build', None,
|
|
"skip rebuilding everything (for testing/debugging)"),
|
|
('relative', None,
|
|
"build the archive using relative paths"
|
|
"(default: false)"),
|
|
('owner=', 'u',
|
|
"Owner name used when creating a tar file"
|
|
" [default: current user]"),
|
|
('group=', 'g',
|
|
"Group name used when creating a tar file"
|
|
" [default: current group]"),
|
|
]
|
|
|
|
boolean_options = ['keep-temp', 'skip-build', 'relative']
|
|
|
|
default_format = {'posix': 'gztar',
|
|
'nt': 'zip',
|
|
'os2': 'zip'}
|
|
|
|
def initialize_options(self):
|
|
self.bdist_dir = None
|
|
self.plat_name = None
|
|
self.format = None
|
|
self.keep_temp = False
|
|
self.dist_dir = None
|
|
self.skip_build = None
|
|
self.relative = False
|
|
self.owner = None
|
|
self.group = None
|
|
|
|
def finalize_options(self):
|
|
if self.bdist_dir is None:
|
|
bdist_base = self.get_finalized_command('bdist').bdist_base
|
|
self.bdist_dir = os.path.join(bdist_base, 'dumb')
|
|
|
|
if self.format is None:
|
|
try:
|
|
self.format = self.default_format[os.name]
|
|
except KeyError:
|
|
raise PackagingPlatformError(
|
|
"don't know how to create dumb built distributions "
|
|
"on platform %s" % os.name)
|
|
|
|
self.set_undefined_options('bdist',
|
|
'dist_dir', 'plat_name', 'skip_build')
|
|
|
|
def run(self):
|
|
if not self.skip_build:
|
|
self.run_command('build')
|
|
|
|
install = self.reinitialize_command('install_dist',
|
|
reinit_subcommands=True)
|
|
install.root = self.bdist_dir
|
|
install.skip_build = self.skip_build
|
|
install.warn_dir = False
|
|
|
|
logger.info("installing to %s", self.bdist_dir)
|
|
self.run_command('install_dist')
|
|
|
|
# And make an archive relative to the root of the
|
|
# pseudo-installation tree.
|
|
archive_basename = "%s.%s" % (self.distribution.get_fullname(),
|
|
self.plat_name)
|
|
|
|
# OS/2 objects to any ":" characters in a filename (such as when
|
|
# a timestamp is used in a version) so change them to hyphens.
|
|
if os.name == "os2":
|
|
archive_basename = archive_basename.replace(":", "-")
|
|
|
|
pseudoinstall_root = os.path.join(self.dist_dir, archive_basename)
|
|
if not self.relative:
|
|
archive_root = self.bdist_dir
|
|
else:
|
|
if (self.distribution.has_ext_modules() and
|
|
(install.install_base != install.install_platbase)):
|
|
raise PackagingPlatformError(
|
|
"can't make a dumb built distribution where base and "
|
|
"platbase are different (%r, %r)" %
|
|
(install.install_base, install.install_platbase))
|
|
else:
|
|
archive_root = os.path.join(
|
|
self.bdist_dir,
|
|
self._ensure_relative(install.install_base))
|
|
|
|
# Make the archive
|
|
filename = self.make_archive(pseudoinstall_root,
|
|
self.format, root_dir=archive_root,
|
|
owner=self.owner, group=self.group)
|
|
if self.distribution.has_ext_modules():
|
|
pyversion = get_python_version()
|
|
else:
|
|
pyversion = 'any'
|
|
self.distribution.dist_files.append(('bdist_dumb', pyversion,
|
|
filename))
|
|
|
|
if not self.keep_temp:
|
|
if self.dry_run:
|
|
logger.info('removing %s', self.bdist_dir)
|
|
else:
|
|
rmtree(self.bdist_dir)
|
|
|
|
def _ensure_relative(self, path):
|
|
# copied from dir_util, deleted
|
|
drive, path = os.path.splitdrive(path)
|
|
if path[0:1] == os.sep:
|
|
path = drive + path[1:]
|
|
return path
|