| """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 * |
| 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!="": |
| self.announce('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 |
| |
| self.announce("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, self.verbose, self.dry_run) |
| |
| # run() |
| |
| # class bdist_packager |