python (3.11.7)

(root)/
lib/
python3.11/
site-packages/
pip/
_internal/
commands/
wheel.py
       1  import logging
       2  import os
       3  import shutil
       4  from optparse import Values
       5  from typing import List
       6  
       7  from pip._internal.cache import WheelCache
       8  from pip._internal.cli import cmdoptions
       9  from pip._internal.cli.req_command import RequirementCommand, with_cleanup
      10  from pip._internal.cli.status_codes import SUCCESS
      11  from pip._internal.exceptions import CommandError
      12  from pip._internal.operations.build.build_tracker import get_build_tracker
      13  from pip._internal.req.req_install import (
      14      InstallRequirement,
      15      check_legacy_setup_py_options,
      16  )
      17  from pip._internal.utils.misc import ensure_dir, normalize_path
      18  from pip._internal.utils.temp_dir import TempDirectory
      19  from pip._internal.wheel_builder import build, should_build_for_wheel_command
      20  
      21  logger = logging.getLogger(__name__)
      22  
      23  
      24  class ESC[4;38;5;81mWheelCommand(ESC[4;38;5;149mRequirementCommand):
      25      """
      26      Build Wheel archives for your requirements and dependencies.
      27  
      28      Wheel is a built-package format, and offers the advantage of not
      29      recompiling your software during every install. For more details, see the
      30      wheel docs: https://wheel.readthedocs.io/en/latest/
      31  
      32      'pip wheel' uses the build system interface as described here:
      33      https://pip.pypa.io/en/stable/reference/build-system/
      34  
      35      """
      36  
      37      usage = """
      38        %prog [options] <requirement specifier> ...
      39        %prog [options] -r <requirements file> ...
      40        %prog [options] [-e] <vcs project url> ...
      41        %prog [options] [-e] <local project path> ...
      42        %prog [options] <archive url/path> ..."""
      43  
      44      def add_options(self) -> None:
      45          self.cmd_opts.add_option(
      46              "-w",
      47              "--wheel-dir",
      48              dest="wheel_dir",
      49              metavar="dir",
      50              default=os.curdir,
      51              help=(
      52                  "Build wheels into <dir>, where the default is the "
      53                  "current working directory."
      54              ),
      55          )
      56          self.cmd_opts.add_option(cmdoptions.no_binary())
      57          self.cmd_opts.add_option(cmdoptions.only_binary())
      58          self.cmd_opts.add_option(cmdoptions.prefer_binary())
      59          self.cmd_opts.add_option(cmdoptions.no_build_isolation())
      60          self.cmd_opts.add_option(cmdoptions.use_pep517())
      61          self.cmd_opts.add_option(cmdoptions.no_use_pep517())
      62          self.cmd_opts.add_option(cmdoptions.check_build_deps())
      63          self.cmd_opts.add_option(cmdoptions.constraints())
      64          self.cmd_opts.add_option(cmdoptions.editable())
      65          self.cmd_opts.add_option(cmdoptions.requirements())
      66          self.cmd_opts.add_option(cmdoptions.src())
      67          self.cmd_opts.add_option(cmdoptions.ignore_requires_python())
      68          self.cmd_opts.add_option(cmdoptions.no_deps())
      69          self.cmd_opts.add_option(cmdoptions.progress_bar())
      70  
      71          self.cmd_opts.add_option(
      72              "--no-verify",
      73              dest="no_verify",
      74              action="store_true",
      75              default=False,
      76              help="Don't verify if built wheel is valid.",
      77          )
      78  
      79          self.cmd_opts.add_option(cmdoptions.config_settings())
      80          self.cmd_opts.add_option(cmdoptions.build_options())
      81          self.cmd_opts.add_option(cmdoptions.global_options())
      82  
      83          self.cmd_opts.add_option(
      84              "--pre",
      85              action="store_true",
      86              default=False,
      87              help=(
      88                  "Include pre-release and development versions. By default, "
      89                  "pip only finds stable versions."
      90              ),
      91          )
      92  
      93          self.cmd_opts.add_option(cmdoptions.require_hashes())
      94  
      95          index_opts = cmdoptions.make_option_group(
      96              cmdoptions.index_group,
      97              self.parser,
      98          )
      99  
     100          self.parser.insert_option_group(0, index_opts)
     101          self.parser.insert_option_group(0, self.cmd_opts)
     102  
     103      @with_cleanup
     104      def run(self, options: Values, args: List[str]) -> int:
     105          session = self.get_default_session(options)
     106  
     107          finder = self._build_package_finder(options, session)
     108  
     109          options.wheel_dir = normalize_path(options.wheel_dir)
     110          ensure_dir(options.wheel_dir)
     111  
     112          build_tracker = self.enter_context(get_build_tracker())
     113  
     114          directory = TempDirectory(
     115              delete=not options.no_clean,
     116              kind="wheel",
     117              globally_managed=True,
     118          )
     119  
     120          reqs = self.get_requirements(args, options, finder, session)
     121          check_legacy_setup_py_options(options, reqs)
     122  
     123          wheel_cache = WheelCache(options.cache_dir)
     124  
     125          preparer = self.make_requirement_preparer(
     126              temp_build_dir=directory,
     127              options=options,
     128              build_tracker=build_tracker,
     129              session=session,
     130              finder=finder,
     131              download_dir=options.wheel_dir,
     132              use_user_site=False,
     133              verbosity=self.verbosity,
     134          )
     135  
     136          resolver = self.make_resolver(
     137              preparer=preparer,
     138              finder=finder,
     139              options=options,
     140              wheel_cache=wheel_cache,
     141              ignore_requires_python=options.ignore_requires_python,
     142              use_pep517=options.use_pep517,
     143          )
     144  
     145          self.trace_basic_info(finder)
     146  
     147          requirement_set = resolver.resolve(reqs, check_supported_wheels=True)
     148  
     149          reqs_to_build: List[InstallRequirement] = []
     150          for req in requirement_set.requirements.values():
     151              if req.is_wheel:
     152                  preparer.save_linked_requirement(req)
     153              elif should_build_for_wheel_command(req):
     154                  reqs_to_build.append(req)
     155  
     156          preparer.prepare_linked_requirements_more(requirement_set.requirements.values())
     157          requirement_set.warn_legacy_versions_and_specifiers()
     158  
     159          # build wheels
     160          build_successes, build_failures = build(
     161              reqs_to_build,
     162              wheel_cache=wheel_cache,
     163              verify=(not options.no_verify),
     164              build_options=options.build_options or [],
     165              global_options=options.global_options or [],
     166          )
     167          for req in build_successes:
     168              assert req.link and req.link.is_wheel
     169              assert req.local_file_path
     170              # copy from cache to target directory
     171              try:
     172                  shutil.copy(req.local_file_path, options.wheel_dir)
     173              except OSError as e:
     174                  logger.warning(
     175                      "Building wheel for %s failed: %s",
     176                      req.name,
     177                      e,
     178                  )
     179                  build_failures.append(req)
     180          if len(build_failures) != 0:
     181              raise CommandError("Failed to build one or more wheels")
     182  
     183          return SUCCESS