install_lib.py (5149B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\stdlib\distutils\command\install_lib.py 2 __revision__ = '$Id: install_lib.py 82110 2010-06-20 13:38:51Z kristjan.jonsson $' 3 import os 4 import sys 5 from distutils.core import Command 6 from distutils.errors import DistutilsOptionError 7 if hasattr(os, 'extsep'): 8 PYTHON_SOURCE_EXTENSION = os.extsep + 'py' 9 else: 10 PYTHON_SOURCE_EXTENSION = '.py' 11 12 class install_lib(Command): 13 description = 'install all Python modules (extensions and pure Python)' 14 user_options = [('install-dir=', 'd', 'directory to install to'), 15 ('build-dir=', 'b', 'build directory (where to install from)'), 16 ('force', 'f', 'force installation (overwrite existing files)'), 17 ('compile', 'c', 'compile .py to .pyc [default]'), 18 ('no-compile', None, "don't compile .py files"), 19 ('optimize=', 'O', 'also compile with optimization: -O1 for "python -O", -O2 for "python -OO", and -O0 to disable [default: -O0]'), 20 ('skip-build', None, 'skip the build steps')] 21 boolean_options = ['force', 'compile', 'skip-build'] 22 negative_opt = {'no-compile': 'compile'} 23 24 def initialize_options(self): 25 self.install_dir = None 26 self.build_dir = None 27 self.force = 0 28 self.compile = None 29 self.optimize = None 30 self.skip_build = None 31 32 def finalize_options(self): 33 self.set_undefined_options('install', ('build_lib', 'build_dir'), ('install_lib', 'install_dir'), ('force', 'force'), ('compile', 'compile'), ('optimize', 'optimize'), ('skip_build', 'skip_build')) 34 if self.compile is None: 35 self.compile = 1 36 if self.optimize is None: 37 self.optimize = 0 38 if not isinstance(self.optimize, int): 39 try: 40 self.optimize = int(self.optimize) 41 if self.optimize not in (0, 1, 2): 42 raise AssertionError 43 except (ValueError, AssertionError): 44 raise DistutilsOptionError, 'optimize must be 0, 1, or 2' 45 46 def run(self): 47 self.build() 48 outfiles = self.install() 49 if outfiles is not None and self.distribution.has_pure_modules(): 50 self.byte_compile(outfiles) 51 52 def build(self): 53 if not self.skip_build: 54 if self.distribution.has_pure_modules(): 55 self.run_command('build_py') 56 if self.distribution.has_ext_modules(): 57 self.run_command('build_ext') 58 59 def install(self): 60 if os.path.isdir(self.build_dir): 61 outfiles = self.copy_tree(self.build_dir, self.install_dir) 62 else: 63 self.warn("'%s' does not exist -- no Python modules to install" % self.build_dir) 64 return 65 return outfiles 66 67 def byte_compile(self, files): 68 if sys.dont_write_bytecode: 69 self.warn('byte-compiling is disabled, skipping.') 70 return 71 from distutils.util import byte_compile 72 install_root = self.get_finalized_command('install').root 73 if self.compile: 74 byte_compile(files, optimize=0, force=self.force, prefix=install_root, dry_run=self.dry_run) 75 if self.optimize > 0: 76 byte_compile(files, optimize=self.optimize, force=self.force, prefix=install_root, verbose=self.verbose, dry_run=self.dry_run) 77 78 def _mutate_outputs(self, has_any, build_cmd, cmd_option, output_dir): 79 if not has_any: 80 return [] 81 build_cmd = self.get_finalized_command(build_cmd) 82 build_files = build_cmd.get_outputs() 83 build_dir = getattr(build_cmd, cmd_option) 84 prefix_len = len(build_dir) + len(os.sep) 85 outputs = [] 86 for file in build_files: 87 outputs.append(os.path.join(output_dir, file[prefix_len:])) 88 89 return outputs 90 91 def _bytecode_filenames(self, py_filenames): 92 bytecode_files = [] 93 for py_file in py_filenames: 94 ext = os.path.splitext(os.path.normcase(py_file))[1] 95 if ext != PYTHON_SOURCE_EXTENSION: 96 continue 97 if self.compile: 98 bytecode_files.append(py_file + 'c') 99 if self.optimize > 0: 100 bytecode_files.append(py_file + 'o') 101 102 return bytecode_files 103 104 def get_outputs(self): 105 pure_outputs = self._mutate_outputs(self.distribution.has_pure_modules(), 'build_py', 'build_lib', self.install_dir) 106 if self.compile: 107 bytecode_outputs = self._bytecode_filenames(pure_outputs) 108 else: 109 bytecode_outputs = [] 110 ext_outputs = self._mutate_outputs(self.distribution.has_ext_modules(), 'build_ext', 'build_lib', self.install_dir) 111 return pure_outputs + bytecode_outputs + ext_outputs 112 113 def get_inputs(self): 114 inputs = [] 115 if self.distribution.has_pure_modules(): 116 build_py = self.get_finalized_command('build_py') 117 inputs.extend(build_py.get_outputs()) 118 if self.distribution.has_ext_modules(): 119 build_ext = self.get_finalized_command('build_ext') 120 inputs.extend(build_ext.get_outputs()) 121 return inputs