From 3ff3b039ac25f70cf6be3775dca0e21c2666d3d3 Mon Sep 17 00:00:00 2001 From: Greg Ward Date: Wed, 21 Jun 2000 02:58:46 +0000 Subject: Added 'preprocess()' method to CCompiler interface, and implemented it in UnixCCompiler. Still needs to be implemented in MSVCCompiler (and whatever other compiler classes are lurking out there, waiting to be checked in). --- Lib/distutils/ccompiler.py | 16 ++++++++++++++++ Lib/distutils/unixccompiler.py | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/Lib/distutils/ccompiler.py b/Lib/distutils/ccompiler.py index b146f89..53d4fa5 100644 --- a/Lib/distutils/ccompiler.py +++ b/Lib/distutils/ccompiler.py @@ -414,6 +414,22 @@ class CCompiler: # -- Worker methods ------------------------------------------------ # (must be implemented by subclasses) + def preprocess (self, + source, + output_file=None, + macros=None, + include_dirs=None, + extra_preargs=None, + extra_postargs=None): + """Preprocess a single C/C++ source file, named in 'source'. + Output will be written to file named 'output_file', or stdout if + 'output_file' not supplied. 'macros' is a list of macro + definitions as for 'compile()', which will augment the macros set + with 'define_macro()' and 'undefine_macro()'. 'include_dirs' is a + list of directory names that will be added to the default list. + """ + pass + def compile (self, sources, output_dir=None, diff --git a/Lib/distutils/unixccompiler.py b/Lib/distutils/unixccompiler.py index 4d38e4d..47d8ad6 100644 --- a/Lib/distutils/unixccompiler.py +++ b/Lib/distutils/unixccompiler.py @@ -21,6 +21,7 @@ import string, re, os from types import * from copy import copy from distutils import sysconfig +from distutils.dep_util import newer from distutils.ccompiler import \ CCompiler, gen_preprocess_options, gen_lib_options from distutils.errors import \ @@ -104,6 +105,37 @@ class UnixCCompiler (CCompiler): # __init__ () + 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) + cc_args = ['-E'] + pp_opts + if output_file: + cc_args.extend(['-o', output_file]) + if extra_preargs: + cc_args[:0] = extra_preargs + if extra_postargs: + extra_postargs.extend(extra_postargs) + + # 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 and newer(source, output_file)): + if output_file: + self.mkpath(os.path.dirname(output_file)) + try: + self.spawn ([self.cc] + cc_args) + except DistutilsExecError, msg: + raise CompileError, msg + + def compile (self, sources, output_dir=None, -- cgit v0.12