build_clib.py (5069B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\stdlib\distutils\command\build_clib.py 2 __revision__ = '$Id: build_clib.py 87602 2011-01-01 04:24:26Z richard.tew $' 3 import os 4 from distutils.core import Command 5 from distutils.errors import DistutilsSetupError 6 from distutils.ccompiler import customize_compiler 7 from distutils import log 8 9 def show_compilers(): 10 from distutils.ccompiler import show_compilers 11 show_compilers() 12 13 14 class build_clib(Command): 15 description = 'build C/C++ libraries used by Python extensions' 16 user_options = [('build-clib=', 'b', 'directory to build C/C++ libraries to'), 17 ('build-temp=', 't', 'directory to put temporary build by-products'), 18 ('debug', 'g', 'compile with debugging information'), 19 ('force', 'f', 'forcibly build everything (ignore file timestamps)'), 20 ('compiler=', 'c', 'specify the compiler type')] 21 boolean_options = ['debug', 'force'] 22 help_options = [('help-compiler', 23 None, 24 'list available compilers', 25 show_compilers)] 26 27 def initialize_options(self): 28 self.build_clib = None 29 self.build_temp = None 30 self.libraries = None 31 self.include_dirs = None 32 self.define = None 33 self.undef = None 34 self.debug = None 35 self.force = 0 36 self.compiler = None 37 38 def finalize_options(self): 39 self.set_undefined_options('build', ('build_temp', 'build_clib'), ('build_temp', 'build_temp'), ('compiler', 'compiler'), ('debug', 'debug'), ('force', 'force')) 40 self.libraries = self.distribution.libraries 41 if self.libraries: 42 self.check_library_list(self.libraries) 43 if self.include_dirs is None: 44 self.include_dirs = self.distribution.include_dirs or [] 45 if isinstance(self.include_dirs, str): 46 self.include_dirs = self.include_dirs.split(os.pathsep) 47 48 def run(self): 49 if not self.libraries: 50 return 51 from distutils.ccompiler import new_compiler 52 self.compiler = new_compiler(compiler=self.compiler, dry_run=self.dry_run, force=self.force) 53 customize_compiler(self.compiler) 54 if self.include_dirs is not None: 55 self.compiler.set_include_dirs(self.include_dirs) 56 if self.define is not None: 57 for name, value in self.define: 58 self.compiler.define_macro(name, value) 59 60 if self.undef is not None: 61 for macro in self.undef: 62 self.compiler.undefine_macro(macro) 63 64 self.build_libraries(self.libraries) 65 66 def check_library_list(self, libraries): 67 if not isinstance(libraries, list): 68 raise DistutilsSetupError, "'libraries' option must be a list of tuples" 69 for lib in libraries: 70 if not isinstance(lib, tuple) and len(lib) != 2: 71 raise DistutilsSetupError, "each element of 'libraries' must a 2-tuple" 72 name, build_info = lib 73 if not isinstance(name, str): 74 raise DistutilsSetupError, "first element of each tuple in 'libraries' " + 'must be a string (the library name)' 75 if '/' in name or os.sep != '/' and os.sep in name: 76 raise DistutilsSetupError, ("bad library name '%s': " + 'may not contain directory separators') % lib[0] 77 if not isinstance(build_info, dict): 78 raise DistutilsSetupError, "second element of each tuple in 'libraries' " + 'must be a dictionary (build info)' 79 80 def get_library_names(self): 81 if not self.libraries: 82 return None 83 lib_names = [] 84 for lib_name, build_info in self.libraries: 85 lib_names.append(lib_name) 86 87 return lib_names 88 89 def get_source_files(self): 90 self.check_library_list(self.libraries) 91 filenames = [] 92 for lib_name, build_info in self.libraries: 93 sources = build_info.get('sources') 94 if sources is None or not isinstance(sources, (list, tuple)): 95 raise DistutilsSetupError, "in 'libraries' option (library '%s'), 'sources' must be present and must be a list of source filenames" % lib_name 96 filenames.extend(sources) 97 98 return filenames 99 100 def build_libraries(self, libraries): 101 for lib_name, build_info in libraries: 102 sources = build_info.get('sources') 103 if sources is None or not isinstance(sources, (list, tuple)): 104 raise DistutilsSetupError, ("in 'libraries' option (library '%s'), " + "'sources' must be present and must be " + 'a list of source filenames') % lib_name 105 sources = list(sources) 106 log.info("building '%s' library", lib_name) 107 macros = build_info.get('macros') 108 include_dirs = build_info.get('include_dirs') 109 objects = self.compiler.compile(sources, output_dir=self.build_temp, macros=macros, include_dirs=include_dirs, debug=self.debug) 110 self.compiler.create_static_lib(objects, lib_name, output_dir=self.build_clib, debug=self.debug)