config.py (8079B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\stdlib\distutils\command\config.py 2 __revision__ = '$Id: config.py 82110 2010-06-20 13:38:51Z kristjan.jonsson $' 3 import os 4 import re 5 from distutils.core import Command 6 from distutils.errors import DistutilsExecError 7 from distutils.ccompiler import customize_compiler 8 from distutils import log 9 LANG_EXT = {'c': '.c', 10 'c++': '.cxx'} 11 12 class config(Command): 13 description = 'prepare to build' 14 user_options = [('compiler=', None, 'specify the compiler type'), 15 ('cc=', None, 'specify the compiler executable'), 16 ('include-dirs=', 'I', 'list of directories to search for header files'), 17 ('define=', 'D', 'C preprocessor macros to define'), 18 ('undef=', 'U', 'C preprocessor macros to undefine'), 19 ('libraries=', 'l', 'external C libraries to link with'), 20 ('library-dirs=', 'L', 'directories to search for external C libraries'), 21 ('noisy', None, 'show every action (compile, link, run, ...) taken'), 22 ('dump-source', None, 'dump generated source files before attempting to compile them')] 23 24 def initialize_options(self): 25 self.compiler = None 26 self.cc = None 27 self.include_dirs = None 28 self.libraries = None 29 self.library_dirs = None 30 self.noisy = 1 31 self.dump_source = 1 32 self.temp_files = [] 33 34 def finalize_options(self): 35 if self.include_dirs is None: 36 self.include_dirs = self.distribution.include_dirs or [] 37 elif isinstance(self.include_dirs, str): 38 self.include_dirs = self.include_dirs.split(os.pathsep) 39 if self.libraries is None: 40 self.libraries = [] 41 elif isinstance(self.libraries, str): 42 self.libraries = [self.libraries] 43 if self.library_dirs is None: 44 self.library_dirs = [] 45 elif isinstance(self.library_dirs, str): 46 self.library_dirs = self.library_dirs.split(os.pathsep) 47 48 def run(self): 49 pass 50 51 def _check_compiler(self): 52 from distutils.ccompiler import CCompiler, new_compiler 53 if not isinstance(self.compiler, CCompiler): 54 self.compiler = new_compiler(compiler=self.compiler, dry_run=self.dry_run, force=1) 55 customize_compiler(self.compiler) 56 if self.include_dirs: 57 self.compiler.set_include_dirs(self.include_dirs) 58 if self.libraries: 59 self.compiler.set_libraries(self.libraries) 60 if self.library_dirs: 61 self.compiler.set_library_dirs(self.library_dirs) 62 63 def _gen_temp_sourcefile(self, body, headers, lang): 64 filename = '_configtest' + LANG_EXT[lang] 65 file = open(filename, 'w') 66 if headers: 67 for header in headers: 68 file.write('#include <%s>\n' % header) 69 70 file.write('\n') 71 file.write(body) 72 if body[-1] != '\n': 73 file.write('\n') 74 file.close() 75 return filename 76 77 def _preprocess(self, body, headers, include_dirs, lang): 78 src = self._gen_temp_sourcefile(body, headers, lang) 79 out = '_configtest.i' 80 self.temp_files.extend([src, out]) 81 self.compiler.preprocess(src, out, include_dirs=include_dirs) 82 return (src, out) 83 84 def _compile(self, body, headers, include_dirs, lang): 85 src = self._gen_temp_sourcefile(body, headers, lang) 86 if self.dump_source: 87 dump_file(src, "compiling '%s':" % src) 88 obj, = self.compiler.object_filenames([src]) 89 self.temp_files.extend([src, obj]) 90 self.compiler.compile([src], include_dirs=include_dirs) 91 return (src, obj) 92 93 def _link(self, body, headers, include_dirs, libraries, library_dirs, lang): 94 src, obj = self._compile(body, headers, include_dirs, lang) 95 prog = os.path.splitext(os.path.basename(src))[0] 96 self.compiler.link_executable([obj], prog, libraries=libraries, library_dirs=library_dirs, target_lang=lang) 97 if self.compiler.exe_extension is not None: 98 prog = prog + self.compiler.exe_extension 99 self.temp_files.append(prog) 100 return (src, obj, prog) 101 102 def _clean(self, *filenames): 103 if not filenames: 104 filenames = self.temp_files 105 self.temp_files = [] 106 log.info('removing: %s', ' '.join(filenames)) 107 for filename in filenames: 108 try: 109 os.remove(filename) 110 except OSError: 111 pass 112 113 def try_cpp(self, body = None, headers = None, include_dirs = None, lang = 'c'): 114 from distutils.ccompiler import CompileError 115 self._check_compiler() 116 ok = 1 117 try: 118 self._preprocess(body, headers, include_dirs, lang) 119 except CompileError: 120 ok = 0 121 122 self._clean() 123 return ok 124 125 def search_cpp(self, pattern, body = None, headers = None, include_dirs = None, lang = 'c'): 126 self._check_compiler() 127 src, out = self._preprocess(body, headers, include_dirs, lang) 128 if isinstance(pattern, str): 129 pattern = re.compile(pattern) 130 file = open(out) 131 match = 0 132 while 1: 133 line = file.readline() 134 if line == '': 135 break 136 if pattern.search(line): 137 match = 1 138 break 139 140 file.close() 141 self._clean() 142 return match 143 144 def try_compile(self, body, headers = None, include_dirs = None, lang = 'c'): 145 from distutils.ccompiler import CompileError 146 self._check_compiler() 147 try: 148 self._compile(body, headers, include_dirs, lang) 149 ok = 1 150 except CompileError: 151 ok = 0 152 153 log.info(ok and 'success!' or 'failure.') 154 self._clean() 155 return ok 156 157 def try_link(self, body, headers = None, include_dirs = None, libraries = None, library_dirs = None, lang = 'c'): 158 from distutils.ccompiler import CompileError, LinkError 159 self._check_compiler() 160 try: 161 self._link(body, headers, include_dirs, libraries, library_dirs, lang) 162 ok = 1 163 except (CompileError, LinkError): 164 ok = 0 165 166 log.info(ok and 'success!' or 'failure.') 167 self._clean() 168 return ok 169 170 def try_run(self, body, headers = None, include_dirs = None, libraries = None, library_dirs = None, lang = 'c'): 171 from distutils.ccompiler import CompileError, LinkError 172 self._check_compiler() 173 try: 174 src, obj, exe = self._link(body, headers, include_dirs, libraries, library_dirs, lang) 175 self.spawn([exe]) 176 ok = 1 177 except (CompileError, LinkError, DistutilsExecError): 178 ok = 0 179 180 log.info(ok and 'success!' or 'failure.') 181 self._clean() 182 return ok 183 184 def check_func(self, func, headers = None, include_dirs = None, libraries = None, library_dirs = None, decl = 0, call = 0): 185 self._check_compiler() 186 body = [] 187 if decl: 188 body.append('int %s ();' % func) 189 body.append('int main () {') 190 if call: 191 body.append(' %s();' % func) 192 else: 193 body.append(' %s;' % func) 194 body.append('}') 195 body = '\n'.join(body) + '\n' 196 return self.try_link(body, headers, include_dirs, libraries, library_dirs) 197 198 def check_lib(self, library, library_dirs = None, headers = None, include_dirs = None, other_libraries = []): 199 self._check_compiler() 200 return self.try_link('int main (void) { }', headers, include_dirs, [library] + other_libraries, library_dirs) 201 202 def check_header(self, header, include_dirs = None, library_dirs = None, lang = 'c'): 203 return self.try_cpp(body='/* No body */', headers=[header], include_dirs=include_dirs) 204 205 206 def dump_file(filename, head = None): 207 if head is None: 208 log.info('%s' % filename) 209 else: 210 log.info(head) 211 file = open(filename) 212 try: 213 log.info(file.read()) 214 finally: 215 file.close()