docs: def raise_unresolved_targets(build_context, conf, unknown_seeds, seed_refs):
      """Raise error about unresolved targets during graph parsing."""
  
      def format_target(target_name):
          # TODO: suggest similar known target names
          build_module = split_build_module(target_name)
          return '{} (in {})'.format(target_name,
                                     conf.get_build_file_path(build_module))
  
      def format_unresolved(seed):
          if seed not in seed_refs:
              return seed
          seed_ref = seed_refs[seed]
          reasons = []
          if seed_ref.on_cli:
              reasons.append('seen on command line')
          if seed_ref.from_default:
              reasons.append('specified as default target in {}'
                             .format(conf.get_project_build_file))
          if seed_ref.dep_of:
              reasons.append(
                  'dependency of ' +
                  ', '.join(format_target(target_name)
                            for target_name in sorted(seed_ref.dep_of)))
          if seed_ref.buildenv_of:
              reasons.append(
                  'buildenv of ' +
                  ', '.join(format_target(target_name)
                            for target_name in sorted(seed_ref.buildenv_of)))
  
          return '{} - {}'.format(seed, ', '.join(reasons))
  
      unresolved_str = '\n'.join(format_unresolved(target_name)
                                 for target_name in sorted(unknown_seeds))
      num_target_str = '{} target'.format(len(unknown_seeds))
      if len(unknown_seeds) > 1:
          num_target_str += 's'
      raise ValueError('Could not resolve {}:\n{}'
                       .format(num_target_str, unresolved_str))