303 lines
12 KiB
Python
303 lines
12 KiB
Python
|
"""distutils.command.bdist_pkgtool
|
||
|
|
||
|
Implements the Distutils 'bdist_sdux' command to create HP-UX
|
||
|
swinstall depot"""
|
||
|
|
||
|
# Mark Alexander <slash@dotnetslash.net>
|
||
|
|
||
|
__revision__ = "$Id: bdist_sdux.py,v 0.2 "
|
||
|
import os, string
|
||
|
import glob
|
||
|
from types import *
|
||
|
from distutils.core import Command, DEBUG
|
||
|
from distutils.util import get_platform
|
||
|
from distutils.file_util import write_file
|
||
|
from distutils.errors import *
|
||
|
from distutils.command import bdist_packager
|
||
|
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
|
||
|
self.announce('Building package')
|
||
|
self.run_command('build')
|
||
|
self.announce('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
|
||
|
|
||
|
self.announce('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
|
||
|
write_script('copyright')
|
||
|
psf_file.extend([' copyright <copyright'])
|
||
|
if self.readme:
|
||
|
# XX make a readme file XXX
|
||
|
write_script('readme')
|
||
|
psf_file.extend([' readme <readme'])
|
||
|
|
||
|
psf_file.extend([' fileset']) # start fileset
|
||
|
if self.distribution.ext_modules:
|
||
|
platlib=self.get_finalized_command('build').build_platlib
|
||
|
else:
|
||
|
platlib=self.get_finalized_command('build').build_lib
|
||
|
title = "%s installation files" % (self.name)
|
||
|
psf_file.extend([
|
||
|
' tag %s' % 'FILES',
|
||
|
' title %s' % "%s installation files" % (self.name),
|
||
|
' revision %s' % self.version,
|
||
|
' directory %s/%s=%s/%s' % (platlib,self.root_package,self.directory,self.root_package),
|
||
|
])
|
||
|
if not self.keep_permissions:
|
||
|
psf_file.extend([' file_permissions -m 555 -o root -g bin'])
|
||
|
psf_file.extend([' file *'])
|
||
|
psf_file.extend([' end']) # end of fileset
|
||
|
psf_file.extend(['end']) # end of product
|
||
|
|
||
|
# XXX add fileset information
|
||
|
|
||
|
|
||
|
return psf_file
|
||
|
|
||
|
# _make_control_file ()
|
||
|
|
||
|
|
||
|
# class bdist_sdux
|