summaryrefslogtreecommitdiffstats
path: root/Lib/distutils/command/bdist_packager.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/distutils/command/bdist_packager.py')
-rw-r--r--Lib/distutils/command/bdist_packager.py250
1 files changed, 250 insertions, 0 deletions
diff --git a/Lib/distutils/command/bdist_packager.py b/Lib/distutils/command/bdist_packager.py
new file mode 100644
index 0000000..a812307
--- /dev/null
+++ b/Lib/distutils/command/bdist_packager.py
@@ -0,0 +1,250 @@
+"""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