'Compile one or more source files.
\'sources\' must be a list of filenames, most likely C/C++
files, but in reality anything that can be handled by a
particular compiler and compiler class (eg. MSVCCompiler can
handle resource files in \'sources\').  Return a list of object
filenames, one per source filename in \'sources\'.  Depending on
the implementation, not all source files will necessarily be
compiled, but all corresponding object filenames will be
returned.
If \'output_dir\' is given, object files will be put under it, while
retaining their original path component.  That is, "foo/bar.c"
normally compiles to "foo/bar.o" (for a Unix implementation); if
\'output_dir\' is "build", then it would compile to
"build/foo/bar.o".
\'macros\', if given, must be a list of macro definitions.  A macro
definition is either a (name, value) 2-tuple or a (name,) 1-tuple.
The former defines a macro; if the value is None, the macro is
defined without an explicit value.  The 1-tuple case undefines a
macro.  Later definitions/redefinitions/ undefinitions take
precedence.
\'include_dirs\', if given, must be a list of strings, the
directories to add to the default include file search path for this
compilation only.
\'debug\' is a boolean; if true, the compiler will be instructed to
output debug symbols in (or alongside) the object file(s).
\'extra_preargs\' and \'extra_postargs\' are implementation- dependent.
On platforms that have the notion of a command-line (e.g. Unix,
DOS/Windows), they are most likely lists of strings: extra
command-line arguments to prepand/append to the compiler command
line.  On other platforms, consult the implementation class
documentation.  In any event, they are intended as an escape hatch
for those occasions when the abstract compiler framework doesn\'t
cut the mustard.
\'depends\', if given, is a list of filenames that all targets
depend on.  If a source file is older than any file in
depends, then the source file will be recompiled.  This
supports dependency tracking, but only at a coarse
granularity.
Raises CompileError on failure.'

def compile(self, sources, output_dir=None, macros=None, include_dirs=None, debug=0, extra_preargs=None, extra_postargs=None, depends=None):

    (macros, objects, extra_postargs, pp_opts, build) = self._setup_compile(output_dir, macros, include_dirs, sources, depends, extra_postargs)
    cc_args = self._get_cc_args(pp_opts, debug, extra_preargs)
    for obj in objects:
        try:
            (src, ext) = build[obj]
        except KeyError:
            continue
        self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)
    return objects
