# -- 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,
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 \
# __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,