code: def parse_makefile(fn, g=None):
      """Parse a Makefile-style file.
      A dictionary containing name/value pairs is returned.  If an
      optional dictionary is passed in as the second argument, it is
      used instead of a new dictionary.
      """
      from distutils.text_file import TextFile
  
      fp = TextFile(
          fn,
          strip_comments=1,
          skip_blanks=1,
          join_lines=1,
          errors="surrogateescape",
      )
  
      if g is None:
          g = {}
      done = {}
      notdone = {}
  
      while True:
          line = fp.readline()
          if line is None:  # eof
              break
          m = re.match(_variable_rx, line)
          if m:
              n, v = m.group(1, 2)
              v = v.strip()
              # `$$' is a literal `$' in make
              tmpv = v.replace("$$", "")
  
              if "$" in tmpv:
                  notdone[n] = v
              else:
                  try:
                      v = int(v)
                  except ValueError:
                      # insert literal `$'
                      done[n] = v.replace("$$", "$")
                  else:
                      done[n] = v
  
      # Variables with a 'PY_' prefix in the makefile. These need to
      # be made available without that prefix through sysconfig.
      # Special care is needed to ensure that variable expansion works, even
      # if the expansion uses the name without a prefix.
      renamed_variables = ("CFLAGS", "LDFLAGS", "CPPFLAGS")
  
      # do variable interpolation here
      while notdone:
          for name in list(notdone):
              value = notdone[name]
              m = re.search(_findvar1_rx, value) or re.search(
                  _findvar2_rx, value
              )
              if m:
                  n = m.group(1)
                  found = True
                  if n in done:
                      item = str(done[n])
                  elif n in notdone:
                      # get it on a subsequent round
                      found = False
                  elif n in os.environ:
                      # do it like make: fall back to environment
                      item = os.environ[n]
  
                  elif n in renamed_variables:
                      if (
                          name.startswith("PY_")
                          and name[3:] in renamed_variables
                      ):
                          item = ""
  
                      elif "PY_" + n in notdone:
                          found = False
  
                      else:
                          item = str(done["PY_" + n])
                  else:
                      done[n] = item = ""
                  if found:
                      after = value[m.end() :]
                      value = value[: m.start()] + item + after
                      if "$" in after:
                          notdone[name] = value
                      else:
                          try:
                              value = int(value)
                          except ValueError:
                              done[name] = value.strip()
                          else:
                              done[name] = value
                          del notdone[name]
  
                          if (
                              name.startswith("PY_")
                              and name[3:] in renamed_variables
                          ):
                              name = name[3:]
                              if name not in done:
                                  done[name] = value
              else:
                  # bogus variable reference; just drop it since we can't deal
                  del notdone[name]
  
      fp.close()
  
      # strip spurious spaces
      for k, v in done.items():
          if isinstance(v, str):
              done[k] = v.strip()
  
      # save the results in the global dictionary
      g.update(done)
      return g
  
file_path: catboost/contrib/tools/python3/src/Lib/distutils/sysconfig.py
imports: import _imp
  import os
  import re
  import sys
  import warnings
  from functools import partial
  from .errors import DistutilsPlatformError
  from sysconfig import _PREFIX, _BASE_PREFIX, _EXEC_PREFIX, _BASE_EXEC_PREFIX, _PROJECT_BASE, _PYTHON_BUILD, _init_posix, parse_config_h, _init_non_posix, _variable_rx, _findvar1_rx, _findvar2_rx, expand_makefile_vars, is_python_build, get_config_h_filename, get_config_var, get_config_vars, get_makefile_filename, get_python_version
label_desc: Use image node_id 2 for calling a global function with example usage: parse_makefile(fn, g) and returns: g