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: Return a boolean indicating whether funcname is supported on
  the current platform.  The optional arguments can be used to
  augment the compilation environment.
code: def has_function(
      self,
      funcname,
      includes=None,
      include_dirs=None,
      libraries=None,
      library_dirs=None,
  ):
      """Return a boolean indicating whether funcname is supported on
      the current platform.  The optional arguments can be used to
      augment the compilation environment.
      """
      # this can't be included at module scope because it tries to
      # import math which might not be available at that point - maybe
      # the necessary logic should just be inlined?
      import tempfile
  
      if includes is None:
          includes = []
      if include_dirs is None:
          include_dirs = []
      if libraries is None:
          libraries = []
      if library_dirs is None:
          library_dirs = []
      fd, fname = tempfile.mkstemp(".c", funcname, text=True)
      f = os.fdopen(fd, "w")
      try:
          for incl in includes:
              f.write("""#include "%s"\n""" % incl)
          f.write(
              """\
  int main (int argc, char **argv) {
      %s();
      return 0;
  }
  """
              % funcname
          )
      finally:
          f.close()
      try:
          objects = self.compile([fname], include_dirs=include_dirs)
      except CompileError:
          return False
  
      try:
          self.link_executable(
              objects,
              "a.out",
              libraries=libraries,
              library_dirs=library_dirs,
          )
      except (LinkError, TypeError):
          return False
      return True
  
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 37 for calling the CCompiler obj's underlying member method code with example usage: obj.has_function(funcname, includes, include_dirs, libraries, library_dirs) and returns: True, False, False