class_docstr: Abstract base class to define the interface that must be implemented
  by real compiler classes.  Also has some utility methods used by
  several compiler classes.
  
  The basic idea behind a compiler abstraction class is that each
  instance can be used for all the compile/link steps in building a
  single project.  Thus, attributes common to all of those compile and
  link steps -- include directories, macros to define, libraries to link
  against, etc. -- are attributes of the compiler instance.  To allow for
  variability in how individual files are treated, most of those
  attributes may be varied on a per-compilation or per-link basis.
class_docstr_tok: ["Abstract","base","class","to","define","the","interface","that","must","be","implemented","by","real","compiler","classes",".","Also","has","some","utility","methods","used","by","several","compiler","classes",".","The","basic","idea","behind","a","compiler","abstraction","class","is","that","each","instance","can","be","used","for","all","the","compile\/link","steps","in","building","a","single","project",".","Thus",",","attributes","common","to","all","of","those","compile","and","link","steps","--","include","directories",",","macros","to","define",",","libraries","to","link","against",",","etc",".","--","are","attributes","of","the","compiler","instance",".","To","allow","for","variability","in","how","individual","files","are","treated",",","most","of","those","attributes","may","be","varied","on","a","per-compilation","or","per-link","basis","."]
docstr: Process arguments and decide which source files to compile.
code: def _setup_compile(
      self, outdir, macros, incdirs, sources, depends, extra
  ):
      """Process arguments and decide which source files to compile."""
      if outdir is None:
          outdir = self.output_dir
      elif not isinstance(outdir, str):
          raise TypeError("'output_dir' must be a string or None")
  
      if macros is None:
          macros = self.macros
      elif isinstance(macros, list):
          macros = macros + (self.macros or [])
      else:
          raise TypeError(
              "'macros' (if supplied) must be a list of tuples"
          )
  
      if incdirs is None:
          incdirs = self.include_dirs
      elif isinstance(incdirs, (list, tuple)):
          incdirs = list(incdirs) + (self.include_dirs or [])
      else:
          raise TypeError(
              "'include_dirs' (if supplied) must be a list of strings"
          )
  
      if extra is None:
          extra = []
  
      # Get the list of expected output (object) files
      objects = self.object_filenames(
          sources, strip_dir=0, output_dir=outdir
      )
      assert len(objects) == len(sources)
  
      pp_opts = gen_preprocess_options(macros, incdirs)
  
      build = {}
      for i in range(len(sources)):
          src = sources[i]
          obj = objects[i]
          ext = os.path.splitext(src)[1]
          self.mkpath(os.path.dirname(obj))
          build[obj] = (src, ext)
  
      return macros, objects, extra, pp_opts, build
  
imports: import sys, os, re
  from distutils.errors import *
  from distutils.spawn import spawn
  from distutils.file_util import move_file
  from distutils.dir_util import mkpath
  from distutils.dep_util import newer_group
  from distutils.util import split_quoted, execute
  from distutils import log
label_desc: Use image node_id 18 for calling the CCompiler obj's underlying member method code with example usage: obj._setup_compile(outdir, macros, incdirs, sources, depends, extra) and returns: macros,  objects,  extra,  pp_opts,  build