mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 19:34:08 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			302 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			302 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
 | 
						|
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
 | 
						|
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
 | 
						|
            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
 |