"""distutils.command.bdist_pkgtool Implements the Distutils 'bdist_sdux' command to create HP-UX swinstall depot. """ # Mark Alexander __revision__ = "$Id: bdist_sdux.py,v 0.2 " import os, string from types import * from distutils.util import get_platform from distutils.file_util import write_file from distutils.errors import * from distutils.command import bdist_packager from distutils import log import sys from commands import getoutput DEFAULT_CHECKINSTALL="""#!/bin/sh /usr/bin/which python 2>&1 >/dev/null if [ $? -ne 0 ]; then echo "ERROR: Python must be on your PATH" &>2 echo "ERROR: (You may need to link it to /usr/bin) " &>2 exit 1 fi PY_DIR=`python -c "import sys;print '%s/lib/python%s' % (sys.exec_prefix,sys.version[0:3])" #2>/dev/null` PY_PKG_DIR=`python -c "import sys;print '%s/lib/python%s/site-packages' % (sys.exec_prefix,sys.version[0:3])" #2>/dev/null` PY_LIB_DIR=`dirname $PY_PKG_DIR` if [ "`dirname ${SW_LOCATION}`" = "__DISTUTILS_PKG_DIR__" ]; then # swinstall to default location if [ "${PY_PKG_DIR}" != "__DISTUTILS_PKG_DIR__" ]; then echo "ERROR: " &>2 echo "ERROR: Python is not installed where this package expected!" &>2 echo "ERROR: You need to manually relocate this package to your python installation." &>2 echo "ERROR: " &>2 echo "ERROR: Re-run swinstall specifying the product name:location, e.g.:" &>2 echo "ERROR: " &>2 echo "ERROR: swinstall -s [source] __DISTUTILS_NAME__:${PY_PKG_DIR}/__DISTUTILS_DIRNAME__" &>2 echo "ERROR: " &>2 echo "ERROR: to relocate this package to match your python installation" &>2 echo "ERROR: " &>2 exit 1 fi else if [ "`dirname ${SW_LOCATION}`" != "${PY_PKG_DIR}" -a "`dirname ${SWLOCATION}`" != "${PY_LIB_DIR}" ]; then echo "WARNING: " &>2 echo "WARNING: Package is being installed outside the 'normal' python search path!" &>2 echo "WARNING: Add ${SW_LOCATION} to PYTHONPATH to use this package" &>2 echo "WARNING: " &>2 fi fi """ DEFAULT_POSTINSTALL="""#!/bin/sh /usr/bin/which python 2>&1 >/dev/null if [ $? -ne 0 ]; then echo "ERROR: Python must be on your PATH" &>2 echo "ERROR: (You may need to link it to /usr/bin) " &>2 exit 1 fi python -c "import compileall;compileall.compile_dir(\\"${SW_LOCATION}\\")" """ DEFAULT_PREREMOVE="""#!/bin/sh # remove compiled bytecode files find ${SW_LOCATION} -name "*.pyc" -exec rm {} \; find ${SW_LOCATION} -name "*.pyo" -exec rm {} \; """ DEFAULT_POSTREMOVE="""#!/bin/sh if [ `find ${SW_LOCATION} ! -type d | wc -l` -eq 0 ]; then # remove if there's nothing but empty directories left rm -rf ${SW_LOCATION} fi """ class bdist_sdux(bdist_packager.bdist_packager): description = "create an HP swinstall depot" user_options = bdist_packager.bdist_packager.user_options + [ #('revision=', None, #"package revision number (PSTAMP)"), ('keep-permissions', None, "Don't reset permissions and ownership to root/bin"), # XXX ('corequisites=', None, "corequisites"), # XXX ('prerequisites=', None, "prerequisites"), # XXX #('category=', None, #"Software category"), ('checkinstall=', None, # XXX ala request "checkinstall script (Bourne shell code)"), ('configure=', None, # XXX "configure script (Bourne shell code)"), ('unconfigure=', None, # XXX "unconfigure script (Bourne shell code)"), ('verify=', None, # XXX "verify script (Bourne shell code)"), ('unpreinstall=', None, # XXX "unpreinstall script (Bourne shell code)"), ('unpostinstall=', None, # XXX "unpostinstall script (Bourne shell code)"), ] boolean_options = ['keep-permissions'] def initialize_options (self): bdist_packager.bdist_packager.initialize_options(self) self.corequisites = None self.prerequesites = None self.checkinstall = None self.configure = None self.unconfigure = None self.verify = None self.unpreinstall = None self.unpostinstall = None # More self.copyright = None self.readme = None self.machine_type = None self.os_name = None self.os_release = None self.directory = None self.readme = None self.copyright = None self.architecture= None self.keep_permissions= None options = self.distribution.get_option_dict('bdist_packager') for key in options.keys(): setattr(self,key,options[key][1]) # initialize_options() def finalize_options (self): global DEFAULT_CHECKINSTALL, DEFAULT_POSTINSTALL global DEFAULT_PREREMOVE, DEFAULT_POSTREMOVE if self.pkg_dir==None: dist_dir = self.get_finalized_command('bdist').dist_dir self.pkg_dir = os.path.join(dist_dir, "sdux") self.ensure_script('corequisites') self.ensure_script('prerequesites') self.ensure_script('checkinstall') self.ensure_script('configure') self.ensure_script('unconfigure') self.ensure_script('verify') self.ensure_script('unpreinstall') self.ensure_script('unpostinstall') self.ensure_script('copyright') self.ensure_script('readme') self.ensure_string('machine_type','*') if not self.__dict__.has_key('platforms'): # This is probably HP, but if it's not, use sys.platform if sys.platform[0:5] == "hp-ux": self.platforms = "HP-UX" else: self.platforms = string.upper(sys.platform) else: # we can only handle one self.platforms=string.join(self.platforms[0]) self.ensure_string('os_release','*') self.ensure_string('directory','%s/lib/python%s/site-packages' % \ (sys.exec_prefix, sys.version[0:3])) bdist_packager.bdist_packager.finalize_options(self) DEFAULT_CHECKINSTALL = string.replace(DEFAULT_CHECKINSTALL, "__DISTUTILS_NAME__", self.name) DEFAULT_CHECKINSTALL = string.replace(DEFAULT_CHECKINSTALL, "__DISTUTILS_DIRNAME__", self.root_package) DEFAULT_CHECKINSTALL = string.replace(DEFAULT_CHECKINSTALL, "__DISTUTILS_PKG_DIR__", self.directory) DEFAULT_POSTINSTALL = string.replace(DEFAULT_POSTINSTALL, "__DISTUTILS_DIRNAME__", self.root_package) #DEFAULT_PREREMOVE = string.replace(DEFAULT_PREREMOVE, #"__DISTUTILS_NAME__", self.root_package) #DEFAULT_POSTREMOVE = string.replace(DEFAULT_POSTREMOVE, #"__DISTUTILS_NAME__", self.root_package) # finalize_options() def run (self): # make directories self.mkpath(self.pkg_dir) psf_path = os.path.join(self.pkg_dir, "%s.psf" % self.get_binary_name()) # build package log.info('Building package') self.run_command('build') log.info('Creating psf file') self.execute(write_file, (psf_path, self._make_control_file()), "writing '%s'" % psf_path) if self.control_only: # stop if requested return log.info('Creating package') spawn_cmd = ['swpackage', '-s'] spawn_cmd.append(psf_path) spawn_cmd.append('-x') spawn_cmd.append('target_type=tape') spawn_cmd.append('@') spawn_cmd.append(self.pkg_dir+"/"+self.get_binary_name()+'.depot') self.spawn(spawn_cmd) # run() def _make_control_file(self): # Generate a psf file and return it as list of strings (one per line). # definitions and headers title = "%s %s" % (self.maintainer,self.maintainer_email) title=title[0:80] #top=self.distribution.packages[0] psf_file = [ 'vendor', # Vendor information ' tag %s' % "DISTUTILS", ' title %s' % title, ' description Distutils package maintainer (%s)' % self.license, 'end', # end of vendor 'product', # Product information ' tag %s' % self.name, ' title %s' % self.description, ' description %s' % self.description, ' revision %s' % self.version, ' architecture %s' % self.platforms, ' machine_type %s' % self.machine_type, ' os_name %s' % self.platforms, ' os_release %s' % self.os_release, ' directory %s' % self.directory + "/" + self.root_package, ] self.write_script(os.path.join(self.pkg_dir, "checkinstall"), 'checkinstall',DEFAULT_CHECKINSTALL) psf_file.extend([' checkinstall %s/checkinstall' % self.pkg_dir]) self.write_script(os.path.join(self.pkg_dir, "postinstall"), 'postinstall',DEFAULT_POSTINSTALL) psf_file.extend([' postinstall %s/postinstall' % self.pkg_dir]) self.write_script(os.path.join(self.pkg_dir, "preremove"), 'preremove',DEFAULT_PREREMOVE) psf_file.extend([' preremove %s/preremove' % self.pkg_dir]) self.write_script(os.path.join(self.pkg_dir, "postremove"), 'postremove',DEFAULT_POSTREMOVE) psf_file.extend([' postremove %s/postremove' % self.pkg_dir]) if self.preinstall: self.write_script(self.pkg_dir+"/preinstall", 'preinstall', None) psf_file.extend([' preinstall %s/preinstall' % self.pkg_dir]) if self.configure: self.write_script(self.pkg_dir+"/configure", 'configure', None) psf_file.extend([' configure %s/configure' % self.pkg_dir]) if self.unconfigure: self.write_script(self.pkg_dir+"/unconfigure", 'unconfigure', None) psf_file.extend([' unconfigure %s/unconfigure' % self.pkg_dir]) if self.verify: self.write_script(self.pkg_dir+"/verify", 'verify', None) psf_file.extend([' verify %s/verify' % self.pkg_dir]) if self.unpreinstall: self.write_script(self.pkg_dir+"/unpreinstall", 'unpreinstall', None) psf_file.extend([' unpreinstall %s/unpreinstall' % self.pkg_dir]) if self.unpostinstall: self.write_script(self.pkg_dir+"/unpostinstall", 'unpostinstall', None) psf_file.extend([' unpostinstall %s/unpostinstall' % self.pkg_dir]) psf_file.extend([' is_locatable true']) #if self.long_description: #psf_file.extend([self.long_description]) if self.copyright: # XX make a copyright file XXX self.write_script('copyright') psf_file.extend([' copyright