NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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()