123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- import os
- import distutils
- from distutils.errors import (DistutilsExecError, CompileError, LibError,
- LinkError, UnknownFileError)
- from distutils.ccompiler import CCompiler, gen_preprocess_options
- from distutils.dep_util import newer
- def get_msvc_compiler():
- return MSVCCompiler()
- class MSVCCompiler(distutils.msvccompiler.MSVCCompiler):
- def __init__(self, verbose=0, dry_run=0, force=0):
- CCompiler.__init__(self, verbose, dry_run, force)
- self.__paths = []
- self.__arch = None
- if os.name == 'nt':
- if isinstance(self, distutils.msvc9compiler.MSVCCompiler):
- self.__version = distutils.msvc9compiler.VERSION
- self.initialized = False
- self.preprocess_options = None
- def preprocess(self,
- source,
- output_file=None,
- macros=None,
- include_dirs=None,
- extra_preargs=None,
- extra_postargs=None):
- if self.initialized is False:
- self.initialize()
- (_, macros, include_dirs) = \
- self._fix_compile_args(None, macros, include_dirs)
- pp_opts = gen_preprocess_options(macros, include_dirs)
- preprocess_options = ['-E']
- source_basename = None
- if output_file is not None:
- preprocess_options.append('-P')
- source_basename = self._get_file_basename(source)
- cpp_args = self.cc.split()
- if extra_preargs is not None:
- cpp_args[:0] = extra_preargs
- if extra_postargs is not None:
- preprocess_options.extend(extra_postargs)
- cpp_args.extend(preprocess_options)
- cpp_args.extend(pp_opts)
- cpp_args.append(source)
-
-
-
- if self.force or output_file is None or newer(source, output_file):
- try:
- self.spawn(cpp_args)
- except DistutilsExecError as msg:
- print(msg)
- raise CompileError
-
-
-
-
- if output_file is not None:
- if output_file != source_basename + '.i':
- os.rename(source_basename + '.i', output_file)
- def _get_file_basename(self, filename):
- if filename is None:
- return None
- if filename.rfind('.') == -1:
- return filename[filename.rfind('\\') + 1:]
- else:
- return filename[filename.rfind('\\') + 1:filename.rfind('.')]
|