| """distutils.bcppcompiler |
| |
| Contains BorlandCCompiler, an implementation of the abstract CCompiler class |
| for the Borland C++ compiler. |
| """ |
| |
| # This implementation by Lyle Johnson, based on the original msvccompiler.py |
| # module and using the directions originally published by Gordon Williams. |
| |
| # XXX looks like there's a LOT of overlap between these two classes: |
| # someone should sit down and factor out the common code as |
| # WindowsCCompiler! --GPW |
| |
| |
| import os |
| from distutils.errors import DistutilsExecError, CompileError |
| from distutils.ccompiler import \ |
| CCompiler, gen_preprocess_options |
| from distutils.dep_util import newer |
| |
| class BCPPCompiler(CCompiler) : |
| """Concrete class that implements an interface to the Borland C/C++ |
| compiler, as defined by the CCompiler abstract class. |
| """ |
| |
| compiler_type = 'bcpp' |
| |
| # Just set this so CCompiler's constructor doesn't barf. We currently |
| # don't use the 'set_executables()' bureaucracy provided by CCompiler, |
| # as it really isn't necessary for this sort of single-compiler class. |
| # Would be nice to have a consistent interface with UnixCCompiler, |
| # though, so it's worth thinking about. |
| executables = {} |
| |
| # Private class data (need to distinguish C from C++ source for compiler) |
| _c_extensions = ['.c'] |
| _cpp_extensions = ['.cc', '.cpp', '.cxx'] |
| |
| # Needed for the filename generation methods provided by the |
| # base class, CCompiler. |
| src_extensions = _c_extensions + _cpp_extensions |
| obj_extension = '.obj' |
| static_lib_extension = '.lib' |
| shared_lib_extension = '.dll' |
| static_lib_format = shared_lib_format = '%s%s' |
| exe_extension = '.exe' |
| |
| |
| def __init__ (self, |
| verbose=0, |
| dry_run=0, |
| force=0): |
| |
| CCompiler.__init__ (self, verbose, dry_run, force) |
| |
| # These executables are assumed to all be in the path. |
| # Borland doesn't seem to use any special registry settings to |
| # indicate their installation locations. |
| |
| self.cc = "bcc32.exe" |
| self.linker = "ilink32.exe" |
| self.lib = "tlib.exe" |
| |
| self.preprocess_options = None |
| self.compile_options = ['/tWM', '/O2', '/q', '/g0'] |
| self.compile_options_debug = ['/tWM', '/Od', '/q', '/g0'] |
| |
| self.ldflags_shared = ['/Tpd', '/Gn', '/q', '/x'] |
| self.ldflags_shared_debug = ['/Tpd', '/Gn', '/q', '/x'] |
| self.ldflags_static = [] |
| self.ldflags_exe = ['/Gn', '/q', '/x'] |
| self.ldflags_exe_debug = ['/Gn', '/q', '/x','/r'] |
| |
| |
| # -- Worker methods ------------------------------------------------ |
| |
| def preprocess (self, |
| source, |
| output_file=None, |
| macros=None, |
| include_dirs=None, |
| extra_preargs=None, |
| extra_postargs=None): |
| |
| (_, macros, include_dirs) = \ |
| self._fix_compile_args(None, macros, include_dirs) |
| pp_opts = gen_preprocess_options(macros, include_dirs) |
| pp_args = ['cpp32.exe'] + pp_opts |
| if output_file is not None: |
| pp_args.append('-o' + output_file) |
| if extra_preargs: |
| pp_args[:0] = extra_preargs |
| if extra_postargs: |
| pp_args.extend(extra_postargs) |
| pp_args.append(source) |
| |
| # We need to preprocess: either we're being forced to, or the |
| # source file is newer than the target (or the target doesn't |
| # exist). |
| if self.force or output_file is None or newer(source, output_file): |
| if output_file: |
| self.mkpath(os.path.dirname(output_file)) |
| try: |
| self.spawn(pp_args) |
| except DistutilsExecError as msg: |
| print(msg) |
| raise CompileError(msg) |
| |
| # preprocess() |