mirror of
https://github.com/python/cpython.git
synced 2025-07-23 19:25:40 +00:00

This is a conservative version of SF patch 504889. It uses the log module instead of calling print in various places, and it ignores the verbose argument passed to many functions and set as an attribute on some objects. Instead, it uses the verbosity set on the logger via the command line. The log module is now preferred over announce() and warn() methods that exist only for backwards compatibility. XXX This checkin changes a lot of modules that have no test suite and aren't exercised by the Python build process. It will need substantial testing.
251 lines
8.4 KiB
Python
251 lines
8.4 KiB
Python
"""distutils.command.bdist_ packager
|
|
|
|
Modified from bdist_dumb by Mark W. Alexander <slash@dotnetslash.net>
|
|
|
|
Implements the Distutils 'bdist_packager' abstract command
|
|
to be subclassed by binary package creation commands."""
|
|
|
|
|
|
__revision__ = "$Id: bdist_packager.py,v 0.1 2001/04/4 mwa"
|
|
|
|
import os
|
|
from distutils.core import Command
|
|
from distutils.util import get_platform
|
|
from distutils.dir_util import create_tree, remove_tree
|
|
from distutils.file_util import write_file
|
|
from distutils.errors import *
|
|
from distutils import log
|
|
import string, sys
|
|
|
|
class bdist_packager (Command):
|
|
|
|
description = "abstract base for package manager specific bdist commands"
|
|
|
|
# XXX update user_options
|
|
user_options = [
|
|
('bdist-base=', None,
|
|
"base directory for creating built distributions"),
|
|
('pkg-dir=', None,
|
|
"base directory for creating binary packages (defaults to \"binary\" under "),
|
|
('dist-dir=', 'd',
|
|
"directory to put final RPM files in "
|
|
"(and .spec files if --spec-only)"),
|
|
('category=', None,
|
|
"Software category (packager dependent format)"),
|
|
('revision=', None,
|
|
"package revision number"),
|
|
# the following have moved into the distribution class
|
|
#('packager=', None,
|
|
#"Package maintainer"),
|
|
#('packager-mail=', None,
|
|
#"Package maintainer's email address"),
|
|
#('author=', None,
|
|
#"Package author"),
|
|
#('author-mail=', None,
|
|
#"Package author's email address"),
|
|
#('license=', None,
|
|
#"License code"),
|
|
#('licence=', None,
|
|
#"alias for license"),
|
|
('icon=', None,
|
|
"Package icon"),
|
|
('subpackages=', None,
|
|
"Comma seperated list of seperately packaged trees"),
|
|
('preinstall=', None,
|
|
"preinstall script (Bourne shell code)"),
|
|
('postinstall=', None,
|
|
"postinstall script (Bourne shell code)"),
|
|
('preremove=', None,
|
|
"preremove script (Bourne shell code)"),
|
|
('postremove=', None,
|
|
"postremove script (Bourne shell code)"),
|
|
('requires=', None,
|
|
"capabilities required by this package"),
|
|
('keep-temp', 'k',
|
|
"don't clean up RPM build directory"),
|
|
('control-only', None,
|
|
"Generate package control files and stop"),
|
|
('no-autorelocate', None,
|
|
"Inhibit automatic relocation to installed site-packages"),
|
|
]
|
|
|
|
boolean_options = ['keep-temp', 'control-only', 'no_autorelocate']
|
|
|
|
def ensure_string_not_none (self,option,default=None):
|
|
val = getattr(self,option)
|
|
if val is not None:
|
|
return
|
|
Command.ensure_string(self,option,default)
|
|
val = getattr(self,option)
|
|
if val is None:
|
|
raise DistutilsOptionError, "'%s' must be provided" % option
|
|
|
|
def ensure_script (self,arg):
|
|
if not arg:
|
|
return
|
|
try:
|
|
self.ensure_string(arg, None)
|
|
except:
|
|
try:
|
|
self.ensure_filename(arg, None)
|
|
except:
|
|
raise RuntimeError, \
|
|
"cannot decipher script option (%s)" \
|
|
% arg
|
|
|
|
def write_script (self,path,attr,default=None):
|
|
""" write the script specified in attr to path. if attr is None,
|
|
write use default instead """
|
|
val = getattr(self,attr)
|
|
if not val:
|
|
if not default:
|
|
return
|
|
else:
|
|
setattr(self,attr,default)
|
|
val = default
|
|
if val != "":
|
|
log.info('Creating %s script', attr)
|
|
self.execute(write_file,
|
|
(path, self.get_script(attr)),
|
|
"writing '%s'" % path)
|
|
|
|
def get_binary_name(self):
|
|
py_ver = sys.version[0:string.find(sys.version,' ')]
|
|
return self.name + '-' + self.version + '-' + \
|
|
self.revision + '-' + py_ver
|
|
|
|
def get_script (self,attr):
|
|
# accept a script as a string ("line\012line\012..."),
|
|
# a filename, or a list
|
|
# XXX We could probably get away with copy_file, but I'm
|
|
# guessing this will be more flexible later on....
|
|
val = getattr(self,attr)
|
|
ret=None
|
|
if val:
|
|
try:
|
|
os.stat(val)
|
|
# script is a file
|
|
ret=[]
|
|
f=open(val)
|
|
ret=string.split(f.read(),"\012");
|
|
f.close()
|
|
#return ret
|
|
except:
|
|
if type(val)==type(""):
|
|
# script is a string
|
|
ret = string.split(val,"\012")
|
|
elif type(val)==type([]):
|
|
# script is a list
|
|
ret = val
|
|
else:
|
|
raise RuntimeError, \
|
|
"cannot figure out what to do with 'request' option (%s)" \
|
|
% val
|
|
return ret
|
|
|
|
|
|
def initialize_options (self):
|
|
d = self.distribution
|
|
self.keep_temp = 0
|
|
self.control_only = 0
|
|
self.no_autorelocate = 0
|
|
self.pkg_dir = None
|
|
self.plat_name = None
|
|
self.icon = None
|
|
self.requires = None
|
|
self.subpackages = None
|
|
self.category = None
|
|
self.revision = None
|
|
|
|
# PEP 241 Metadata
|
|
self.name = None
|
|
self.version = None
|
|
#self.url = None
|
|
#self.author = None
|
|
#self.author_email = None
|
|
#self.maintainer = None
|
|
#self.maintainer_email = None
|
|
#self.description = None
|
|
#self.long_description = None
|
|
#self.licence = None
|
|
#self.platforms = None
|
|
#self.keywords = None
|
|
self.root_package = None
|
|
|
|
# package installation scripts
|
|
self.preinstall = None
|
|
self.postinstall = None
|
|
self.preremove = None
|
|
self.postremove = None
|
|
# initialize_options()
|
|
|
|
|
|
def finalize_options (self):
|
|
|
|
if self.pkg_dir is None:
|
|
bdist_base = self.get_finalized_command('bdist').bdist_base
|
|
self.pkg_dir = os.path.join(bdist_base, 'binary')
|
|
|
|
if not self.plat_name:
|
|
d = self.distribution
|
|
self.plat = d.get_platforms()
|
|
if self.distribution.has_ext_modules():
|
|
self.plat_name = [sys.platform,]
|
|
else:
|
|
self.plat_name = ["noarch",]
|
|
|
|
d = self.distribution
|
|
self.ensure_string_not_none('name', d.get_name())
|
|
self.ensure_string_not_none('version', d.get_version())
|
|
self.ensure_string('category')
|
|
self.ensure_string('revision',"1")
|
|
#self.ensure_string('url',d.get_url())
|
|
if type(self.distribution.packages) == type([]):
|
|
self.root_package=self.distribution.packages[0]
|
|
else:
|
|
self.root_package=self.name
|
|
self.ensure_string('root_package',self.root_package)
|
|
#self.ensure_string_list('keywords')
|
|
#self.ensure_string_not_none('author', d.get_author())
|
|
#self.ensure_string_not_none('author_email', d.get_author_email())
|
|
self.ensure_filename('icon')
|
|
#self.ensure_string_not_none('maintainer', d.get_maintainer())
|
|
#self.ensure_string_not_none('maintainer_email',
|
|
#d.get_maintainer_email())
|
|
#self.ensure_string_not_none('description', d.get_description())
|
|
#self.ensure_string_not_none('long_description', d.get_long_description())
|
|
#if self.long_description=='UNKNOWN':
|
|
#self.long_description=self.description
|
|
#self.ensure_string_not_none('license', d.get_license())
|
|
self.ensure_string_list('requires')
|
|
self.ensure_filename('preinstall')
|
|
self.ensure_filename('postinstall')
|
|
self.ensure_filename('preremove')
|
|
self.ensure_filename('postremove')
|
|
|
|
# finalize_options()
|
|
|
|
|
|
def run (self):
|
|
|
|
raise RuntimeError, \
|
|
"abstract method -- subclass %s must override" % self.__class__
|
|
self.run_command('build')
|
|
|
|
install = self.reinitialize_command('install', reinit_subcommands=1)
|
|
install.root = self.pkg_dir
|
|
|
|
log.info("installing to %s", self.pkg_dir)
|
|
self.run_command('install')
|
|
|
|
# And make an archive relative to the root of the
|
|
# pseudo-installation tree.
|
|
archive_basename = "%s.%s" % (self.distribution.get_fullname(),
|
|
self.plat_name)
|
|
|
|
if not self.keep_temp:
|
|
remove_tree(self.pkg_dir, dry_run=self.dry_run)
|
|
|
|
# run()
|
|
|
|
# class bdist_packager
|