mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			227 lines
		
	
	
	
		
			7.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			227 lines
		
	
	
	
		
			7.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""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
 |