code: def _compiler_to_string(compiler):
      props = []
      mx = 0
      keys = list(compiler.executables.keys())
      for key in [
          "version",
          "libraries",
          "library_dirs",
          "object_switch",
          "compile_switch",
          "include_dirs",
          "define",
          "undef",
          "rpath",
          "link_objects",
      ]:
          if key not in keys:
              keys.append(key)
      for key in keys:
          if hasattr(compiler, key):
              v = getattr(compiler, key)
              mx = max(mx, len(key))
              props.append((key, repr(v)))
      fmt = "%-" + repr(mx + 1) + "s = %s"
      lines = [fmt % prop for prop in props]
      return "\n".join(lines)
  
imports: from __future__ import division, absolute_import, print_function
  import os
  import re
  import sys
  import types
  import shlex
  import time
  import subprocess
  from copy import copy
  from distutils import ccompiler
  from distutils.ccompiler import *
  from distutils.errors import DistutilsExecError, DistutilsModuleError, DistutilsPlatformError, CompileError
  from distutils.sysconfig import customize_compiler
  from distutils.version import LooseVersion
  from numpy.distutils import log
  from numpy.distutils.compat import get_exception
  from numpy.distutils.exec_command import filepath_from_subprocess_output, forward_bytes_to_stdout
  from numpy.distutils.misc_util import cyg2win32, is_sequence, mingw32, get_num_build_jobs, _commandline_dep_string
label_desc: Use image node_id 8 for calling a global function with example usage: _compiler_to_string(compiler) and returns: str