diff options
author | Marc-André Lemburg <mal@egenix.com> | 2002-10-04 09:30:06 (GMT) |
---|---|---|
committer | Marc-André Lemburg <mal@egenix.com> | 2002-10-04 09:30:06 (GMT) |
commit | c7cdd7182aadcbb242ce61e5515cc91964806da4 (patch) | |
tree | 17aff6b791bf5bbf2ddacb1457b405db672df963 /Lib/distutils | |
parent | a7a76d3d9eb77b4dd3129d34ba8df636ce2e6014 (diff) | |
download | cpython-c7cdd7182aadcbb242ce61e5515cc91964806da4.zip cpython-c7cdd7182aadcbb242ce61e5515cc91964806da4.tar.gz cpython-c7cdd7182aadcbb242ce61e5515cc91964806da4.tar.bz2 |
Pulling Mark Alexander's contribution from CVS.
Diffstat (limited to 'Lib/distutils')
-rw-r--r-- | Lib/distutils/command/__init__.py | 5 | ||||
-rw-r--r-- | Lib/distutils/command/bdist.py | 17 | ||||
-rw-r--r-- | Lib/distutils/command/bdist_packager.py | 227 | ||||
-rw-r--r-- | Lib/distutils/command/bdist_pkgtool.py | 411 | ||||
-rw-r--r-- | Lib/distutils/command/bdist_sdux.py | 302 |
5 files changed, 14 insertions, 948 deletions
diff --git a/Lib/distutils/command/__init__.py b/Lib/distutils/command/__init__.py index 8143627..e70429c 100644 --- a/Lib/distutils/command/__init__.py +++ b/Lib/distutils/command/__init__.py @@ -21,8 +21,9 @@ __all__ = ['build', 'bdist_dumb', 'bdist_rpm', 'bdist_wininst', - 'bdist_sdux', - 'bdist_pkgtool', + # These two are reserved for future use: + #'bdist_sdux', + #'bdist_pkgtool', # Note: # bdist_packager is not included because it only provides # an abstract base class diff --git a/Lib/distutils/command/bdist.py b/Lib/distutils/command/bdist.py index f61611e..454c9df 100644 --- a/Lib/distutils/command/bdist.py +++ b/Lib/distutils/command/bdist.py @@ -52,7 +52,9 @@ class bdist (Command): ] # The following commands do not take a format option from bdist - no_format_option = ('bdist_rpm', 'bdist_sdux', 'bdist_pkgtool') + no_format_option = ('bdist_rpm', + #'bdist_sdux', 'bdist_pkgtool' + ) # This won't do in reality: will need to distinguish RPM-ish Linux, # Debian-ish Linux, Solaris, FreeBSD, ..., Windows, Mac OS. @@ -62,20 +64,23 @@ class bdist (Command): # Establish the preferred order (for the --help-formats option). format_commands = ['rpm', 'gztar', 'bztar', 'ztar', 'tar', - 'wininst', 'zip', 'pkgtool', 'sdux'] + 'wininst', 'zip', + #'pkgtool', 'sdux' + ] # And the real information. format_command = { 'rpm': ('bdist_rpm', "RPM distribution"), - 'zip': ('bdist_dumb', "ZIP file"), 'gztar': ('bdist_dumb', "gzip'ed tar file"), + 'zip': ('bdist_dumb', "ZIP file"), + 'gztar': ('bdist_dumb', "gzip'ed tar file"), 'bztar': ('bdist_dumb', "bzip2'ed tar file"), 'ztar': ('bdist_dumb', "compressed tar file"), 'tar': ('bdist_dumb', "tar file"), 'wininst': ('bdist_wininst', "Windows executable installer"), 'zip': ('bdist_dumb', "ZIP file"), - 'pkgtool': ('bdist_pkgtool', - "Solaris pkgtool distribution"), - 'sdux': ('bdist_sdux', "HP-UX swinstall depot"), + #'pkgtool': ('bdist_pkgtool', + # "Solaris pkgtool distribution"), + #'sdux': ('bdist_sdux', "HP-UX swinstall depot"), } diff --git a/Lib/distutils/command/bdist_packager.py b/Lib/distutils/command/bdist_packager.py deleted file mode 100644 index 1960425..0000000 --- a/Lib/distutils/command/bdist_packager.py +++ /dev/null @@ -1,227 +0,0 @@ -"""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"), - ('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) - except: - try: - self.ensure_filename(arg) - 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) - if val is None: - return None - try: - os.stat(val) - # script is a file - ret = [] - f = open(val) - ret = string.split(f.read(), "\012"); - f.close() - 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): - 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: - self.plat = self.distribution.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') - if not self.keep_temp: - remove_tree(self.pkg_dir, dry_run=self.dry_run) - - # run() - -# class bdist_packager diff --git a/Lib/distutils/command/bdist_pkgtool.py b/Lib/distutils/command/bdist_pkgtool.py deleted file mode 100644 index 3b8ca2d..0000000 --- a/Lib/distutils/command/bdist_pkgtool.py +++ /dev/null @@ -1,411 +0,0 @@ -"""distutils.command.bdist_pkgtool - - -Author: Mark W. Alexander <slash@dotnet.net> - -Implements the Distutils 'bdist_pkgtool' command (create Solaris pkgtool -distributions).""" - -import os, string, sys -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 sysconfig -from distutils import log -from commands import getoutput - -__revision__ = "$Id: bdist_pkgtool.py,v 0.3 mwa " - -# default request script - Is also wrapped around user's request script -# unless --no-autorelocate is requested. Finds the python site-packages -# directory and prompts for verification -DEFAULT_REQUEST="""#!/bin/sh -###################################################################### -# Distutils internal package relocation support # -###################################################################### - -PRODUCT="__DISTUTILS_NAME__" - -trap `exit 3` 15 -/usr/bin/which python 2>&1 >/dev/null -if [ $? -ne 0 ]; then - echo "The python interpretor needs to be on your path!" - echo - echo "If you have more than one, make sure the first one is where" - echo "you want this module installed:" - 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` - -echo "" -if [ -z "${PY_DIR}" ]; then - echo "I can't seem to find the python distribution." - echo "I'm assuming the default path for site-packages" -else - BASEDIR="${PY_PKG_DIR}" - cat <<EOF - Python found! The default path: - - ${BASEDIR} - - will install ${PRODUCT} such that all python users - can import it. - - If you just want individual access, you can install into - any directory and add that directory to your \$PYTHONPATH -EOF -fi -echo "" - -BASEDIR=`ckpath -d ${BASEDIR} -ay \ - -p "Where should ${PRODUCT} be installed? [${BASEDIR}]"` || exit $? - -###################################################################### -# user supplied request script follows # -###################################################################### -""" -### request script - -# default postinstall compiles and changes ownership on the module directory -# XXX The ownership change _should_ be handled by adjusting the prototype file -DEFAULT_POSTINSTALL="""#!/bin/sh -/usr/bin/test -d ${BASEDIR}/__DISTUTILS_NAME__ -if [ $? -eq 0 ]; then - python -c "import compileall;compileall.compile_dir(\\"${BASEDIR}/__DISTUTILS_NAME__\\")" - chown -R root:other ${BASEDIR}/__DISTUTILS_NAME__ -fi -""" - -# default preremove deletes *.pyc and *.pyo from the module tree -# This should leave the tree empty, so pkgtool will remove it. -# If the user's scripts place anything else in there (e.g. config files), -# pkgtool will leave the directory intact -DEFAULT_PREREMOVE="""#!/bin/sh - -/usr/bin/which python 2>&1 >/dev/null -if [ $? -ne 0 ]; then - echo "The python interpretor needs to be on your path!" - echo - echo "If you have more than one, make sure the first one is where" - echo "you want this module removed from" - exit 1 -fi - -/usr/bin/test -d ${BASEDIR}/__DISTUTILS_NAME__ -if [ $? -eq 0 ]; then - find ${BASEDIR}/__DISTUTILS_NAME__ -name "*.pyc" -exec rm {} \; - find ${BASEDIR}/__DISTUTILS_NAME__ -name "*.pyo" -exec rm {} \; -fi -""" - -# default postremove removes the module directory _IF_ no files are -# there (Turns out this isn't needed if the preremove does it's job -# Left for posterity -DEFAULT_POSTREMOVE="""#!/bin/sh - -/usr/bin/test -d ${BASEDIR}/__DISTUTILS_NAME__ -if [ $? -eq 0 ]; then - if [ `find ${BASEDIR}/__DISTUTILS_NAME__ ! -type d | wc -l` -eq 0 ]; then - rm -rf ${BASEDIR}/__DISTUTILS_NAME__ - fi -fi -""" - -class bdist_pkgtool (bdist_packager.bdist_packager): - - description = "create an pkgtool (Solaris) package" - - user_options = bdist_packager.bdist_packager.user_options + [ - ('revision=', None, - "package revision number (PSTAMP)"), - ('pkg-abrev=', None, - "Abbreviation (9 characters or less) of the package name"), - ('compver=', None, - "file containing compatible versions of this package (man compver)"), - ('depend=', None, - "file containing dependencies for this package (man depend)"), - #('category=', None, - #"Software category"), - ('request=', None, - "request script (Bourne shell code)"), - ] - - def initialize_options (self): - # XXX Check for pkgtools on path... - bdist_packager.bdist_packager.initialize_options(self) - self.compver = None - self.depend = None - self.vendor = None - self.classes = None - self.request = None - self.pkg_abrev = None - self.revision = None - # I'm not sure I should need to do this, but the setup.cfg - # settings weren't showing up.... - 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_REQUEST, DEFAULT_POSTINSTALL - global DEFAULT_PREREMOVE, DEFAULT_POSTREMOVE - if self.pkg_dir is None: - dist_dir = self.get_finalized_command('bdist').dist_dir - self.pkg_dir = os.path.join(dist_dir, "pkgtool") - - self.ensure_string('classes', None) - self.ensure_string('revision', "1") - self.ensure_script('request') - self.ensure_script('preinstall') - self.ensure_script('postinstall') - self.ensure_script('preremove') - self.ensure_script('postremove') - self.ensure_string('vendor', None) - if self.__dict__.has_key('author'): - if self.__dict__.has_key('author_email'): - self.ensure_string('vendor', - "%s <%s>" % (self.author, - self.author_email)) - else: - self.ensure_string('vendor', - "%s" % (self.author)) - self.ensure_string('category', "System,application") - self.ensure_script('compver') - self.ensure_script('depend') - bdist_packager.bdist_packager.finalize_options(self) - if self.pkg_abrev is None: - self.pkg_abrev=self.name - if len(self.pkg_abrev)>9: - raise DistutilsOptionError, \ - "pkg-abrev (%s) must be less than 9 characters" % self.pkg_abrev - # Update default scripts with our metadata name - DEFAULT_REQUEST = string.replace(DEFAULT_REQUEST, - "__DISTUTILS_NAME__", self.root_package) - DEFAULT_POSTINSTALL = string.replace(DEFAULT_POSTINSTALL, - "__DISTUTILS_NAME__", 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 make_package(self,root=None): - # make directories - self.mkpath(self.pkg_dir) - if root: - pkg_dir = self.pkg_dir+"/"+root - self.mkpath(pkg_dir) - else: - pkg_dir = self.pkg_dir - - self.reinitialize_command('install', reinit_subcommands=1) - # build package - log.info('Building package') - self.run_command('build') - log.info('Creating pkginfo file') - path = os.path.join(pkg_dir, "pkginfo") - self.execute(write_file, - (path, - self._make_info_file()), - "writing '%s'" % path) - # request script handling - if self.request==None: - self.request = self._make_request_script() - if self.request!="": - path = os.path.join(pkg_dir, "request") - self.execute(write_file, - (path, - self.request), - "writing '%s'" % path) - - # Create installation scripts, since compver & depend are - # user created files, they work just fine as scripts - self.write_script(os.path.join(pkg_dir, "postinstall"), - 'postinstall',DEFAULT_POSTINSTALL) - self.write_script(os.path.join(pkg_dir, "preinstall"), - 'preinstall',None) - self.write_script(os.path.join(pkg_dir, "preremove"), - 'preremove',DEFAULT_PREREMOVE) - self.write_script(os.path.join(pkg_dir, "postremove"), - 'postremove',None) - self.write_script(os.path.join(pkg_dir, "compver"), - 'compver',None) - self.write_script(os.path.join(pkg_dir, "depend"), - 'depend',None) - - log.info('Creating prototype file') - path = os.path.join(pkg_dir, "prototype") - self.execute(write_file, - (path, - self._make_prototype()), - "writing '%s'" % path) - - - if self.control_only: # stop if requested - return - - - log.info('Creating package') - pkg_cmd = ['pkgmk', '-o', '-f'] - pkg_cmd.append(path) - pkg_cmd.append('-b') - pkg_cmd.append(os.environ['PWD']) - self.spawn(pkg_cmd) - pkg_cmd = ['pkgtrans', '-s', '/var/spool/pkg'] - path = os.path.join(os.environ['PWD'],pkg_dir, - self.get_binary_name() + ".pkg") - log.info('Transferring package to ' + pkg_dir) - pkg_cmd.append(path) - pkg_cmd.append(self.pkg_abrev) - self.spawn(pkg_cmd) - os.system("rm -rf /var/spool/pkg/%s" % self.pkg_abrev) - - - def run (self): - if self.subpackages: - self.subpackages=string.split(self.subpackages,",") - for pkg in self.subpackages: - self.make_package(pkg) - else: - self.make_package() - # run() - - - def _make_prototype(self): - import pwd, grp - proto_file = ["i pkginfo"] - if self.request: - proto_file.extend(['i request']) - if self.postinstall: - proto_file.extend(['i postinstall']) - if self.postremove: - proto_file.extend(['i postremove']) - if self.preinstall: - proto_file.extend(['i preinstall']) - if self.preremove: - proto_file.extend(['i preremove']) - if self.compver: - proto_file.extend(['i compver']) - if self.requires: - proto_file.extend(['i depend']) - proto_file.extend(['!default 644 root bin']) - build = self.get_finalized_command('build') - - try: - self.distribution.packages[0] - file_list=string.split( - getoutput("pkgproto %s/%s=%s" % \ - (build.build_lib, self.distribution.packages[0], - self.distribution.packages[0])), "\012") - except: - file_list=string.split( - getoutput("pkgproto %s=" % (build.build_lib)),"\012") - ownership="%s %s" % (pwd.getpwuid(os.getuid())[0], - grp.getgrgid(os.getgid())[0]) - for i in range(len(file_list)): - file_list[i] = string.replace(file_list[i],ownership,"root bin") - proto_file.extend(file_list) - return proto_file - - def _make_request_script(self): - global DEFAULT_REQUEST - # A little different from other scripts, if we are to automatically - # relocate to the target site-packages, we have to wrap any provided - # script with the autorelocation script. If no script is provided, - # The request script will simply be the autorelocate script - if self.no_autorelocate==0: - request=string.split(DEFAULT_REQUEST,"\012") - else: - log.info('Creating relocation request script') - if self.request: - users_request=self.get_script('request') - if users_request!=None and users_request!=[]: - if self.no_autorelocate==0 and users_request[0][0:2]=="#!": - users_request.remove(users_request[0]) - for i in users_request: - request.append(i) - - if self.no_autorelocate==0: - request.append("#############################################") - request.append("# finalize relocation support #") - request.append("#############################################") - request.append('echo "BASEDIR=\\"${BASEDIR}\\"" >>$1') - return request - - def _make_info_file(self): - """Generate the text of a pkgtool info file and return it as a - list of strings (one per line). - """ - # definitions and headers - # PKG must be alphanumeric, < 9 characters - info_file = [ - 'PKG="%s"' % self.pkg_abrev, - 'NAME="%s"' % self.name, - 'VERSION="%s"' % self.version, - 'PSTAMP="%s"' % self.revision, - ] - info_file.extend(['VENDOR="%s (%s)"' % (self.distribution.maintainer, \ - self.distribution.license) ]) - info_file.extend(['EMAIL="%s"' % self.distribution.maintainer_email ]) - - p = self.distribution.get_platforms() - if p is None or p==['UNKNOWN']: - archs=getoutput('uname -p') - else: - archs=string.join(self.distribution.get_platforms(),',') - #else: - #print "Assuming a sparc architecure" - #archs='sparc' - info_file.extend(['ARCH="%s"' % archs ]) - - if self.distribution.get_url(): - info_file.extend(['HOTLINE="%s"' % self.distribution.get_url() ]) - if self.classes: - info_file.extend(['CLASSES="%s"' % self.classes ]) - if self.category: - info_file.extend(['CATEGORY="%s"' % self.category ]) - site=None - for i in sys.path: - if i[-13:]=="site-packages": - site=i - break - if site: - info_file.extend(['BASEDIR="%s"' % site ]) - - return info_file - - # _make_info_file () - - def _format_changelog(self, changelog): - """Format the changelog correctly and convert it to a list of strings - """ - if not changelog: - return changelog - new_changelog = [] - for line in string.split(string.strip(changelog), '\n'): - line = string.strip(line) - if line[0] == '*': - new_changelog.extend(['', line]) - elif line[0] == '-': - new_changelog.append(line) - else: - new_changelog.append(' ' + line) - - # strip trailing newline inserted by first changelog entry - if not new_changelog[0]: - del new_changelog[0] - - return new_changelog - - # _format_changelog() - -# class bdist_rpm diff --git a/Lib/distutils/command/bdist_sdux.py b/Lib/distutils/command/bdist_sdux.py deleted file mode 100644 index 875f3d8..0000000 --- a/Lib/distutils/command/bdist_sdux.py +++ /dev/null @@ -1,302 +0,0 @@ -"""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 -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 <copyright']) - if self.readme: - # XX make a readme file XXX - self.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 |