docs: def build_wheel(ireq, sources, hashes=None, cache_dir=None):
      """Build a wheel file for the InstallRequirement object.
  
      An artifact is downloaded (or read from cache). If the artifact is not a
      wheel, build one out of it. The dynamically built wheel is ephemeral; do
      not depend on its existence after the returned wheel goes out of scope.
  
      If `hashes` is truthy, it is assumed to be a list of hashes (as formatted
      in Pipfile.lock) to be checked against the download.
  
      Returns a `distlib.wheel.Wheel` instance. Raises a `WheelBuildError` (a
      `RuntimeError` subclass) if the wheel cannot be built.
      """
      kwargs = _prepare_wheel_building_kwargs(ireq)
      finder = _get_finder(sources, cache_dir=cache_dir)
  
      # Not for upgrade, hash not required. Hashes are not required here even
      # when we provide them, because pip skips local wheel cache if we set it
      # to True. Hashes are checked later if we need to download the file.
      ireq.populate_link(finder, False, False)
  
      # Ensure ireq.source_dir is set.
      # This is intentionally set to build_dir, not src_dir. Comments from pip:
      #   [...] if filesystem packages are not marked editable in a req, a non
      #   deterministic error occurs when the script attempts to unpack the
      #   build directory.
      # Also see comments in `_prepare_wheel_building_kwargs()` -- If the ireq
      # is editable, build_dir is actually src_dir, making the build in-place.
      ireq.ensure_has_source_dir(kwargs["build_dir"])
  
      # Ensure the source is fetched. For wheels, it is enough to just download
      # because we'll use them directly. For an sdist, we need to unpack so we
      # can build it.
      if not ireq.editable or not pip_shims.is_file_url(ireq.link):
          if ireq.is_wheel:
              only_download = True
              download_dir = kwargs["wheel_download_dir"]
          else:
              only_download = False
              download_dir = kwargs["download_dir"]
          ireq.options["hashes"] = _convert_hashes(hashes)
          unpack_url(
              ireq.link, ireq.source_dir, download_dir,
              only_download=only_download, session=finder.session,
              hashes=ireq.hashes(False), progress_bar="off",
          )
  
      if ireq.is_wheel:
          # If this is a wheel, use the downloaded thing.
          output_dir = kwargs["wheel_download_dir"]
          wheel_path = os.path.join(output_dir, ireq.link.filename)
      else:
          # Othereise we need to build an ephemeral wheel.
          wheel_path = _build_wheel(
              ireq, vistir.path.create_tracked_tempdir(prefix="ephem"),
              finder, _get_wheel_cache(cache_dir=cache_dir), kwargs,
          )
          if wheel_path is None or not os.path.exists(wheel_path):
              raise WheelBuildError
      return distlib.wheel.Wheel(wheel_path)