mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	Bastian Kleineidam: the "build_scripts" command and changes
necessary to support it.
Details:
  - build command additionally calls build_scripts
  - build_scripts builds your scripts in 'build/scripts' and adjusts the
    first line if it begins with "#!" and ends with "python", optionally
    ending with commandline options (like -O, -t ...).  Adjusting means we
    write the current path to the Python interpreter in the first line.
  - install_scripts copies the scripts to the install_scripts dir
  - install_data copies your data_files in install_data. You can
    supply individual directories for your data_files:
    data_files = ['doc/info.txt', # copy this file in install_scripts dir
      ('testdata', ['a.dat', 'b.dat']), # copy these files in
                                        # install_scripts/testdata
      ('/etc', ['packagerc']),    # copy this in /etc. When --root is
                                  # given, copy this in rootdir/etc
    ]
    So you can use the --root option with absolute data paths.
			
			
This commit is contained in:
		
							parent
							
								
									fcd974efbb
								
							
						
					
					
						commit
						8d5881a2ba
					
				
					 4 changed files with 74 additions and 11 deletions
				
			
		| 
						 | 
					@ -9,6 +9,7 @@
 | 
				
			||||||
           'build_py',
 | 
					           'build_py',
 | 
				
			||||||
           'build_ext',
 | 
					           'build_ext',
 | 
				
			||||||
           'build_clib',
 | 
					           'build_clib',
 | 
				
			||||||
 | 
					           'build_scripts',
 | 
				
			||||||
           'install',
 | 
					           'install',
 | 
				
			||||||
           'install_lib',
 | 
					           'install_lib',
 | 
				
			||||||
           'install_scripts',
 | 
					           'install_scripts',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,6 +24,8 @@ class build (Command):
 | 
				
			||||||
        ('build-lib=', None,
 | 
					        ('build-lib=', None,
 | 
				
			||||||
         "build directory for all distribution (defaults to either " +
 | 
					         "build directory for all distribution (defaults to either " +
 | 
				
			||||||
         "build-purelib or build-platlib"),
 | 
					         "build-purelib or build-platlib"),
 | 
				
			||||||
 | 
					        ('build-scripts=', None,
 | 
				
			||||||
 | 
					         "build directory for scripts"),
 | 
				
			||||||
        ('build-temp=', 't',
 | 
					        ('build-temp=', 't',
 | 
				
			||||||
         "temporary build directory"),
 | 
					         "temporary build directory"),
 | 
				
			||||||
        ('compiler=', 'c',
 | 
					        ('compiler=', 'c',
 | 
				
			||||||
| 
						 | 
					@ -42,6 +44,7 @@ def initialize_options (self):
 | 
				
			||||||
        self.build_platlib = None
 | 
					        self.build_platlib = None
 | 
				
			||||||
        self.build_lib = None
 | 
					        self.build_lib = None
 | 
				
			||||||
        self.build_temp = None
 | 
					        self.build_temp = None
 | 
				
			||||||
 | 
					        self.build_scripts = None
 | 
				
			||||||
        self.compiler = None
 | 
					        self.compiler = None
 | 
				
			||||||
        self.debug = None
 | 
					        self.debug = None
 | 
				
			||||||
        self.force = 0
 | 
					        self.force = 0
 | 
				
			||||||
| 
						 | 
					@ -76,6 +79,8 @@ def finalize_options (self):
 | 
				
			||||||
        if self.build_temp is None:
 | 
					        if self.build_temp is None:
 | 
				
			||||||
            self.build_temp = os.path.join (self.build_base,
 | 
					            self.build_temp = os.path.join (self.build_base,
 | 
				
			||||||
                                            'temp.' + self.plat)
 | 
					                                            'temp.' + self.plat)
 | 
				
			||||||
 | 
					        if self.build_scripts is None:
 | 
				
			||||||
 | 
					            self.build_scripts = os.path.join (self.build_base, 'scripts')
 | 
				
			||||||
    # finalize_options ()
 | 
					    # finalize_options ()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -100,4 +105,7 @@ def run (self):
 | 
				
			||||||
        if self.distribution.has_ext_modules():
 | 
					        if self.distribution.has_ext_modules():
 | 
				
			||||||
            self.run_peer ('build_ext')
 | 
					            self.run_peer ('build_ext')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if self.distribution.scripts:
 | 
				
			||||||
 | 
					            self.run_peer ('build_scripts')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# class build
 | 
					# class build
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,17 +7,52 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__revision__ = "$Id$"
 | 
					__revision__ = "$Id$"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from distutils.cmd import install_misc
 | 
					import os
 | 
				
			||||||
 | 
					from types import StringType
 | 
				
			||||||
 | 
					from distutils.core import Command
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class install_data (install_misc):
 | 
					class install_data (Command):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    description = "install data files"
 | 
					    description = "install data files"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    user_options = [
 | 
				
			||||||
 | 
					        ('install-dir=', 'd',
 | 
				
			||||||
 | 
					         "directory to install the files to"),
 | 
				
			||||||
 | 
					        ('root=', None,
 | 
				
			||||||
 | 
					         "install everything relative to this alternate root directory"),
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def initialize_options (self):
 | 
				
			||||||
 | 
					        self.install_dir = None
 | 
				
			||||||
 | 
					        self.outfiles = None
 | 
				
			||||||
 | 
					        self.root = None
 | 
				
			||||||
 | 
					        self.data_files = self.distribution.data_files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def finalize_options (self):
 | 
					    def finalize_options (self):
 | 
				
			||||||
        self._install_dir_from('install_data')
 | 
					        self.set_undefined_options('install',
 | 
				
			||||||
 | 
						                           ('install_data', 'install_dir'),
 | 
				
			||||||
 | 
									   ('root', 'root'),
 | 
				
			||||||
 | 
									  )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def run (self):
 | 
					    def run (self):
 | 
				
			||||||
        self._copy_files(self.distribution.data_files)
 | 
					        self.mkpath(self.install_dir)
 | 
				
			||||||
 | 
					        for f in self.data_files:
 | 
				
			||||||
 | 
					            if type(f) == StringType:
 | 
				
			||||||
 | 
					                # its a simple file, so copy it
 | 
				
			||||||
 | 
					                self.copy_file(f, self.install_dir)
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                # its a tuple with path to install to and a list of files
 | 
				
			||||||
 | 
					                dir = f[0]
 | 
				
			||||||
 | 
					                if not os.path.isabs(dir):
 | 
				
			||||||
 | 
					                    dir = os.path.join(self.install_dir, dir)
 | 
				
			||||||
 | 
					                elif self.root:
 | 
				
			||||||
 | 
					                    dir = os.path.join(self.root, dir[1:])
 | 
				
			||||||
 | 
					                self.mkpath(dir)
 | 
				
			||||||
 | 
					                for data in f[1]:
 | 
				
			||||||
 | 
					                    self.copy_file(data, dir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_inputs (self):
 | 
					    def get_inputs (self):
 | 
				
			||||||
        return self.distribution.data_files or []
 | 
					        return self.data_files or []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_outputs (self):
 | 
				
			||||||
 | 
					        return self.outfiles
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,23 +8,39 @@
 | 
				
			||||||
__revision__ = "$Id$"
 | 
					__revision__ = "$Id$"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
from distutils.cmd import install_misc
 | 
					from distutils.core import Command
 | 
				
			||||||
from stat import ST_MODE
 | 
					from stat import ST_MODE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class install_scripts(install_misc):
 | 
					class install_scripts(Command):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    description = "install scripts"
 | 
					    description = "install scripts"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    user_options = [
 | 
				
			||||||
 | 
					        ('install-dir=', 'd', "directory to install to"),
 | 
				
			||||||
 | 
					        ('build-dir=','b', "build directory (where to install from)"),
 | 
				
			||||||
 | 
					        ('skip-build', None, "skip the build steps"),
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def initialize_options (self):
 | 
				
			||||||
 | 
					        self.install_dir = None
 | 
				
			||||||
 | 
					        self.build_dir = None
 | 
				
			||||||
 | 
					        self.skip_build = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def finalize_options (self):
 | 
					    def finalize_options (self):
 | 
				
			||||||
        self._install_dir_from('install_scripts')
 | 
					        self.set_undefined_options('build', ('build_scripts', 'build_dir'))
 | 
				
			||||||
 | 
					        self.set_undefined_options ('install',
 | 
				
			||||||
 | 
					                                    ('install_scripts', 'install_dir'),
 | 
				
			||||||
 | 
					                                    ('skip_build', 'skip_build'),
 | 
				
			||||||
 | 
					                                   )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def run (self):
 | 
					    def run (self):
 | 
				
			||||||
        self._copy_files(self.distribution.scripts)
 | 
					        if not self.skip_build:
 | 
				
			||||||
 | 
					            self.run_peer('build_scripts')
 | 
				
			||||||
 | 
					        self.outfiles = self.copy_tree (self.build_dir, self.install_dir)
 | 
				
			||||||
        if os.name == 'posix':
 | 
					        if os.name == 'posix':
 | 
				
			||||||
            # Set the executable bits (owner, group, and world) on
 | 
					            # Set the executable bits (owner, group, and world) on
 | 
				
			||||||
            # all the scripts we just installed.
 | 
					            # all the scripts we just installed.
 | 
				
			||||||
            files = self.get_outputs()
 | 
					            for file in self.get_outputs():
 | 
				
			||||||
            for file in files:
 | 
					 | 
				
			||||||
                if self.dry_run:
 | 
					                if self.dry_run:
 | 
				
			||||||
                    self.announce("changing mode of %s" % file)
 | 
					                    self.announce("changing mode of %s" % file)
 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
| 
						 | 
					@ -35,4 +51,7 @@ def run (self):
 | 
				
			||||||
    def get_inputs (self):
 | 
					    def get_inputs (self):
 | 
				
			||||||
        return self.distribution.scripts or []
 | 
					        return self.distribution.scripts or []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_outputs(self):
 | 
				
			||||||
 | 
					        return self.outfiles or []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# class install_scripts
 | 
					# class install_scripts
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue