Esempio n. 1
0
    def _build_one_legacy(self, req, tempd, python_tag=None):
        """Build one InstallRequirement using the "legacy" build process.

        Returns path to wheel if successfully built. Otherwise, returns None.
        """
        base_args = self._base_setup_args(req)

        spin_message = 'Building wheel for %s (setup.py)' % (req.name,)
        with open_spinner(spin_message) as spinner:
            logger.debug('Destination directory: %s', tempd)
            wheel_args = base_args + ['bdist_wheel', '-d', tempd] \
                + self.build_options

            if python_tag is not None:
                wheel_args += ["--python-tag", python_tag]

            try:
                output = call_subprocess(wheel_args, cwd=req.setup_py_dir,
                                         show_stdout=False, spinner=spinner)
            except Exception:
                spinner.finish("error")
                logger.error('Failed building wheel for %s', req.name)
                return None
            names = os.listdir(tempd)
            wheel_path = get_legacy_build_wheel_path(
                names=names,
                temp_dir=tempd,
                req=req,
                command_args=wheel_args,
                command_output=output,
            )
            return wheel_path
Esempio n. 2
0
 def install_requirements(self, finder, requirements, message):
     args = [
         sys.executable, '-m', 'pip', 'install', '--ignore-installed',
         '--no-user', '--prefix', self.path, '--no-warn-script-location',
     ]
     if logger.getEffectiveLevel() <= logging.DEBUG:
         args.append('-v')
     for format_control in ('no_binary', 'only_binary'):
         formats = getattr(finder.format_control, format_control)
         args.extend(('--' + format_control.replace('_', '-'),
                      ','.join(sorted(formats or {':none:'}))))
     if finder.index_urls:
         args.extend(['-i', finder.index_urls[0]])
         for extra_index in finder.index_urls[1:]:
             args.extend(['--extra-index-url', extra_index])
     else:
         args.append('--no-index')
     for link in finder.find_links:
         args.extend(['--find-links', link])
     for _, host, _ in finder.secure_origins:
         args.extend(['--trusted-host', host])
     if finder.allow_all_prereleases:
         args.append('--pre')
     if finder.process_dependency_links:
         args.append('--process-dependency-links')
     args.append('--')
     args.extend(requirements)
     with open_spinner(message) as spinner:
         call_subprocess(args, show_stdout=False, spinner=spinner)
Esempio n. 3
0
File: wheel.py Progetto: oz123/pip
    def __build_one(self, req, tempd, python_tag=None, isolate=False):
        base_args = self._base_setup_args(req, isolate=isolate)

        spin_message = 'Running setup.py bdist_wheel for %s' % (req.name,)
        with open_spinner(spin_message) as spinner:
            logger.debug('Destination directory: %s', tempd)
            wheel_args = base_args + ['bdist_wheel', '-d', tempd] \
                + self.build_options

            if python_tag is not None:
                wheel_args += ["--python-tag", python_tag]

            env = {}
            if isolate:
                env['PYTHONNOUSERSITE'] = '1'

            try:
                call_subprocess(wheel_args, cwd=req.setup_py_dir,
                                extra_environ=env,
                                show_stdout=False, spinner=spinner)
                return True
            except:
                spinner.finish("error")
                logger.error('Failed building wheel for %s', req.name)
                return False
Esempio n. 4
0
    def _build_one_legacy(self, req, tempd, python_tag=None):
        """Build one InstallRequirement using the "legacy" build process.

        Returns path to wheel if successfully built. Otherwise, returns None.
        """
        base_args = self._base_setup_args(req)

        spin_message = 'Building wheel for %s (setup.py)' % (req.name,)
        with open_spinner(spin_message) as spinner:
            logger.debug('Destination directory: %s', tempd)
            wheel_args = base_args + ['bdist_wheel', '-d', tempd] \
                + self.build_options

            if python_tag is not None:
                wheel_args += ["--python-tag", python_tag]

            try:
                call_subprocess(wheel_args, cwd=req.setup_py_dir,
                                show_stdout=False, spinner=spinner)
            except Exception:
                spinner.finish("error")
                logger.error('Failed building wheel for %s', req.name)
                return None
            # listdir's return value is sorted to be deterministic
            return os.path.join(tempd, sorted(os.listdir(tempd))[0])
Esempio n. 5
0
 def runner(cmd, cwd=None, extra_environ=None):
     with open_spinner(self.spin_message) as spinner:
         call_subprocess(
             cmd,
             cwd=cwd,
             extra_environ=extra_environ,
             spinner=spinner
         )
     self.spin_message = ""
Esempio n. 6
0
 def runner(
     cmd,  # type: List[str]
     cwd=None,  # type: Optional[str]
     extra_environ=None  # type: Optional[Mapping[str, Any]]
 ):
     # type: (...) -> None
     with open_spinner(self.spin_message) as spinner:
         call_subprocess(
             cmd,
             cwd=cwd,
             extra_environ=extra_environ,
             spinner=spinner
         )
     self.spin_message = ""
Esempio n. 7
0
File: wheel.py Progetto: oz123/pip
    def _install_build_reqs(self, reqs, prefix):
        # Local import to avoid circular import (wheel <-> req_install)
        from pip._internal.req.req_install import InstallRequirement
        from pip._internal.index import FormatControl
        # Ignore the --no-binary option when installing the build system, so
        # we don't recurse trying to build a self-hosting build system.
        finder = copy.copy(self.finder)
        finder.format_control = FormatControl(set(), set())
        urls = [finder.find_requirement(InstallRequirement.from_line(r),
                                        upgrade=False).url
                for r in reqs]

        args = [sys.executable, '-m', 'pip', 'install', '--ignore-installed',
                '--prefix', prefix] + list(urls)
        with open_spinner("Installing build dependencies") as spinner:
            call_subprocess(args, show_stdout=False, spinner=spinner)
Esempio n. 8
0
def _install_build_reqs(finder, prefix, build_requirements):
    # NOTE: What follows is not a very good thing.
    #       Eventually, this should move into the BuildEnvironment class and
    #       that should handle all the isolation and sub-process invocation.
    finder = copy(finder)
    finder.format_control = FormatControl(set(), set([":all:"]))
    urls = [
        finder.find_requirement(
            InstallRequirement.from_line(r), upgrade=False).url
        for r in build_requirements
    ]
    args = [
        sys.executable, '-m', 'pip', 'install', '--ignore-installed',
        '--no-user', '--prefix', prefix,
    ] + list(urls)

    with open_spinner("Installing build dependencies") as spinner:
        call_subprocess(args, show_stdout=False, spinner=spinner)
Esempio n. 9
0
 def install_requirements(
     self,
     finder,  # type: PackageFinder
     requirements,  # type: Iterable[str]
     prefix_as_string,  # type: str
     message  # type: Optional[str]
 ):
     # type: (...) -> None
     prefix = self._prefixes[prefix_as_string]
     assert not prefix.setup
     prefix.setup = True
     if not requirements:
         return
     args = [
         sys.executable, os.path.dirname(pip_location), 'install',
         '--ignore-installed', '--no-user', '--prefix', prefix.path,
         '--no-warn-script-location',
     ]  # type: List[str]
     if logger.getEffectiveLevel() <= logging.DEBUG:
         args.append('-v')
     for format_control in ('no_binary', 'only_binary'):
         formats = getattr(finder.format_control, format_control)
         args.extend(('--' + format_control.replace('_', '-'),
                      ','.join(sorted(formats or {':none:'}))))
     if finder.index_urls:
         args.extend(['-i', finder.index_urls[0]])
         for extra_index in finder.index_urls[1:]:
             args.extend(['--extra-index-url', extra_index])
     else:
         args.append('--no-index')
     for link in finder.find_links:
         args.extend(['--find-links', link])
     for _, host, _ in finder.secure_origins:
         args.extend(['--trusted-host', host])
     if finder.allow_all_prereleases:
         args.append('--pre')
     if finder.process_dependency_links:
         args.append('--process-dependency-links')
     args.append('--')
     args.extend(requirements)
     with open_spinner(message) as spinner:
         call_subprocess(args, show_stdout=False, spinner=spinner)
Esempio n. 10
0
    def _build_one_legacy(self, req, tempd, python_tag=None):
        base_args = self._base_setup_args(req)

        spin_message = 'Building wheel for %s (setup.py)' % (req.name,)
        with open_spinner(spin_message) as spinner:
            logger.debug('Destination directory: %s', tempd)
            wheel_args = base_args + ['bdist_wheel', '-d', tempd] \
                + self.build_options

            if python_tag is not None:
                wheel_args += ["--python-tag", python_tag]

            try:
                call_subprocess(wheel_args, cwd=req.setup_py_dir,
                                show_stdout=False, spinner=spinner)
                return True
            except Exception:
                spinner.finish("error")
                logger.error('Failed building wheel for %s', req.name)
                return False
Esempio n. 11
0
    def __build_one(self, req, tempd, python_tag=None):
        base_args = self._base_setup_args(req)

        spin_message = 'Running setup.py bdist_wheel for %s' % (req.name, )
        with open_spinner(spin_message) as spinner:
            logger.debug('Destination directory: %s', tempd)
            wheel_args = base_args + ['bdist_wheel', '-d', tempd] \
                + self.build_options

            if python_tag is not None:
                wheel_args += ["--python-tag", python_tag]

            try:
                call_subprocess(wheel_args,
                                cwd=req.setup_py_dir,
                                show_stdout=False,
                                spinner=spinner)
                return True
            except:
                spinner.finish("error")
                logger.error('Failed building wheel for %s', req.name)
                return False
Esempio n. 12
0
 def install_requirements(self, finder, requirements, message):
     args = [
         sys.executable,
         "-m",
         "pip",
         "install",
         "--ignore-installed",
         "--no-user",
         "--prefix",
         self.path,
         "--no-warn-script-location",
     ]
     if logger.getEffectiveLevel() <= logging.DEBUG:
         args.append("-v")
     for format_control in ("no_binary", "only_binary"):
         formats = getattr(finder.format_control, format_control)
         args.extend((
             "--" + format_control.replace("_", "-"),
             ",".join(sorted(formats or {":none:"})),
         ))
     if finder.index_urls:
         args.extend(["-i", finder.index_urls[0]])
         for extra_index in finder.index_urls[1:]:
             args.extend(["--extra-index-url", extra_index])
     else:
         args.append("--no-index")
     for link in finder.find_links:
         args.extend(["--find-links", link])
     for _, host, _ in finder.secure_origins:
         args.extend(["--trusted-host", host])
     if finder.allow_all_prereleases:
         args.append("--pre")
     if finder.process_dependency_links:
         args.append("--process-dependency-links")
     args.append("--")
     args.extend(requirements)
     with open_spinner(message) as spinner:
         call_subprocess(args, show_stdout=False, spinner=spinner)
Esempio n. 13
0
def _install_build_reqs(finder, prefix, build_requirements):
    # NOTE: What follows is not a very good thing.
    #       Eventually, this should move into the BuildEnvironment class and
    #       that should handle all the isolation and sub-process invocation.
    finder = copy(finder)
    finder.format_control = FormatControl(set(), set([":all:"]))
    urls = [
        finder.find_requirement(InstallRequirement.from_line(r),
                                upgrade=False).url for r in build_requirements
    ]
    args = [
        sys.executable,
        '-m',
        'pip',
        'install',
        '--ignore-installed',
        '--no-user',
        '--prefix',
        prefix,
    ] + list(urls)

    with open_spinner("Installing build dependencies") as spinner:
        call_subprocess(args, show_stdout=False, spinner=spinner)
Esempio n. 14
0
    def _build_one_legacy(self, req, tempd, python_tag=None):
        """Build one InstallRequirement using the "legacy" build process.

        Returns path to wheel if successfully built. Otherwise, returns None.
        """
        wheel_args = make_setuptools_bdist_wheel_args(
            req.setup_py_path,
            global_options=self.global_options,
            build_options=self.build_options,
            destination_dir=tempd,
            python_tag=python_tag,
        )

        spin_message = 'Building wheel for %s (setup.py)' % (req.name,)
        with open_spinner(spin_message) as spinner:
            logger.debug('Destination directory: %s', tempd)

            try:
                output = call_subprocess(
                    wheel_args,
                    cwd=req.unpacked_source_directory,
                    spinner=spinner,
                )
            except Exception:
                spinner.finish("error")
                logger.error('Failed building wheel for %s', req.name)
                return None

            names = os.listdir(tempd)
            wheel_path = get_legacy_build_wheel_path(
                names=names,
                temp_dir=tempd,
                req=req,
                command_args=wheel_args,
                command_output=output,
            )
            return wheel_path
Esempio n. 15
0
 def install_requirements(self, finder, requirements, message):
     args = [
         sys.executable,
         '-m',
         'pip',
         'install',
         '--ignore-installed',
         '--no-user',
         '--prefix',
         self.path,
         '--no-warn-script-location',
     ]
     if logger.getEffectiveLevel() <= logging.DEBUG:
         args.append('-v')
     for format_control in ('no_binary', 'only_binary'):
         formats = getattr(finder.format_control, format_control)
         args.extend(('--' + format_control.replace('_', '-'),
                      ','.join(sorted(formats or {':none:'}))))
     if finder.index_urls:
         args.extend(['-i', finder.index_urls[0]])
         for extra_index in finder.index_urls[1:]:
             args.extend(['--extra-index-url', extra_index])
     else:
         args.append('--no-index')
     for link in finder.find_links:
         args.extend(['--find-links', link])
     for _, host, _ in finder.secure_origins:
         args.extend(['--trusted-host', host])
     if finder.allow_all_prereleases:
         args.append('--pre')
     if finder.process_dependency_links:
         args.append('--process-dependency-links')
     args.append('--')
     args.extend(requirements)
     with open_spinner(message) as spinner:
         call_subprocess(args, show_stdout=False, spinner=spinner)
    def install(self, install_options, global_options=None, root=None,
                home=None, prefix=None, warn_script_location=True,
                use_user_site=False, pycompile=True):
        global_options = global_options if global_options is not None else []
        if self.editable:
            self.install_editable(
                install_options, global_options, prefix=prefix,
            )
            return
        if self.is_wheel:
            version = wheel.wheel_version(self.source_dir)
            wheel.check_compatibility(version, self.name)

            self.move_wheel_files(
                self.source_dir, root=root, prefix=prefix, home=home,
                warn_script_location=warn_script_location,
                use_user_site=use_user_site, pycompile=pycompile,
            )
            self.install_succeeded = True
            return

        # Extend the list of global and install options passed on to
        # the setup.py call with the ones from the requirements file.
        # Options specified in requirements file override those
        # specified on the command line, since the last option given
        # to setup.py is the one that is used.
        global_options = list(global_options) + \
                         self.options.get('global_options', [])
        install_options = list(install_options) + \
                          self.options.get('install_options', [])

        if self.isolated:
            global_options = global_options + ["--no-user-cfg"]

        with TempDirectory(kind="record") as temp_dir:
            record_filename = os.path.join(temp_dir.path, 'install-record.txt')
            install_args = self.get_install_args(
                global_options, record_filename, root, prefix, pycompile,
            )
            msg = 'Running setup.py install for %s' % (self.name,)
            with open_spinner(msg) as spinner:
                with indent_log():
                    with self.build_env:
                        call_subprocess(
                            install_args + install_options,
                            cwd=self.setup_py_dir,
                            show_stdout=False,
                            spinner=spinner,
                        )

            if not os.path.exists(record_filename):
                logger.debug('Record file %s not found', record_filename)
                return
            self.install_succeeded = True

            def prepend_root(path):
                if root is None or not os.path.isabs(path):
                    return path
                else:
                    return change_root(root, path)

            with open(record_filename) as f:
                for line in f:
                    directory = os.path.dirname(line)
                    if directory.endswith('.egg-info'):
                        egg_info_dir = prepend_root(directory)
                        break
                else:
                    logger.warning(
                        'Could not find .egg-info directory in install record'
                        ' for %s',
                        self,
                    )
                    # FIXME: put the record somewhere
                    # FIXME: should this be an error?
                    return
            new_lines = []
            with open(record_filename) as f:
                for line in f:
                    filename = line.strip()
                    if os.path.isdir(filename):
                        filename += os.path.sep
                    new_lines.append(
                        os.path.relpath(prepend_root(filename), egg_info_dir)
                    )
            new_lines.sort()
            ensure_dir(egg_info_dir)
            inst_files_path = os.path.join(egg_info_dir, 'installed-files.txt')
            with open(inst_files_path, 'w') as f:
                f.write('\n'.join(new_lines) + '\n')
Esempio n. 17
0
    def install(
        self,
        install_options,  # type: List[str]
        global_options=None,  # type: Optional[Sequence[str]]
        root=None,  # type: Optional[str]
        home=None,  # type: Optional[str]
        prefix=None,  # type: Optional[str]
        warn_script_location=True,  # type: bool
        use_user_site=False,  # type: bool
        pycompile=True  # type: bool
    ):
        # type: (...) -> None
        global_options = global_options if global_options is not None else []
        if self.editable:
            self.install_editable(
                install_options, global_options, prefix=prefix,
            )
            return
        if self.is_wheel:
            version = wheel.wheel_version(self.source_dir)
            wheel.check_compatibility(version, self.name)

            self.move_wheel_files(
                self.source_dir, root=root, prefix=prefix, home=home,
                warn_script_location=warn_script_location,
                use_user_site=use_user_site, pycompile=pycompile,
            )
            self.install_succeeded = True
            return

        # Extend the list of global and install options passed on to
        # the setup.py call with the ones from the requirements file.
        # Options specified in requirements file override those
        # specified on the command line, since the last option given
        # to setup.py is the one that is used.
        global_options = list(global_options) + \
            self.options.get('global_options', [])
        install_options = list(install_options) + \
            self.options.get('install_options', [])

        if self.isolated:
            # https://github.com/python/mypy/issues/1174
            global_options = global_options + ["--no-user-cfg"]  # type: ignore

        with TempDirectory(kind="record") as temp_dir:
            record_filename = os.path.join(temp_dir.path, 'install-record.txt')
            install_args = self.get_install_args(
                global_options, record_filename, root, prefix, pycompile,
            )
            msg = 'Running setup.py install for %s' % (self.name,)
            with open_spinner(msg) as spinner:
                with indent_log():
                    with self.build_env:
                        call_subprocess(
                            install_args + install_options,
                            cwd=self.setup_py_dir,
                            spinner=spinner,
                        )

            if not os.path.exists(record_filename):
                logger.debug('Record file %s not found', record_filename)
                return
            self.install_succeeded = True

            def prepend_root(path):
                if root is None or not os.path.isabs(path):
                    return path
                else:
                    return change_root(root, path)

            with open(record_filename) as f:
                for line in f:
                    directory = os.path.dirname(line)
                    if directory.endswith('.egg-info'):
                        egg_info_dir = prepend_root(directory)
                        break
                else:
                    logger.warning(
                        'Could not find .egg-info directory in install record'
                        ' for %s',
                        self,
                    )
                    # FIXME: put the record somewhere
                    # FIXME: should this be an error?
                    return
            new_lines = []
            with open(record_filename) as f:
                for line in f:
                    filename = line.strip()
                    if os.path.isdir(filename):
                        filename += os.path.sep
                    new_lines.append(
                        os.path.relpath(prepend_root(filename), egg_info_dir)
                    )
            new_lines.sort()
            ensure_dir(egg_info_dir)
            inst_files_path = os.path.join(egg_info_dir, 'installed-files.txt')
            with open(inst_files_path, 'w') as f:
                f.write('\n'.join(new_lines) + '\n')
Esempio n. 18
0
    def install(
            self,
            install_options,  # type: List[str]
            global_options=None,  # type: Optional[Sequence[str]]
            root=None,  # type: Optional[str]
            home=None,  # type: Optional[str]
            prefix=None,  # type: Optional[str]
            warn_script_location=True,  # type: bool
            use_user_site=False,  # type: bool
            pycompile=True,  # type: bool
    ):
        # type: (...) -> None
        global_options = global_options if global_options is not None else []
        if self.editable:
            self.install_editable(
                install_options,
                global_options,
                prefix=prefix,
            )
            return
        if self.is_wheel:
            version = wheel.wheel_version(self.source_dir)
            wheel.check_compatibility(version, self.name)

            self.move_wheel_files(
                self.source_dir,
                root=root,
                prefix=prefix,
                home=home,
                warn_script_location=warn_script_location,
                use_user_site=use_user_site,
                pycompile=pycompile,
            )
            self.install_succeeded = True
            return

        # Extend the list of global and install options passed on to
        # the setup.py call with the ones from the requirements file.
        # Options specified in requirements file override those
        # specified on the command line, since the last option given
        # to setup.py is the one that is used.
        global_options = list(global_options) + self.options.get(
            "global_options", [])
        install_options = list(install_options) + self.options.get(
            "install_options", [])

        if self.isolated:
            # https://github.com/python/mypy/issues/1174
            global_options = global_options + ["--no-user-cfg"]  # type: ignore

        with TempDirectory(kind="record") as temp_dir:
            record_filename = os.path.join(temp_dir.path, "install-record.txt")
            install_args = self.get_install_args(
                global_options,
                record_filename,
                root,
                prefix,
                pycompile,
            )
            msg = "Running setup.py install for %s" % (self.name, )
            with open_spinner(msg) as spinner:
                with indent_log():
                    with self.build_env:
                        call_subprocess(
                            install_args + install_options,
                            cwd=self.setup_py_dir,
                            spinner=spinner,
                        )

            if not os.path.exists(record_filename):
                logger.debug("Record file %s not found", record_filename)
                return
            self.install_succeeded = True

            def prepend_root(path):
                # type: (str) -> str
                if root is None or not os.path.isabs(path):
                    return path
                else:
                    return change_root(root, path)

            with open(record_filename) as f:
                for line in f:
                    directory = os.path.dirname(line)
                    if directory.endswith(".egg-info"):
                        egg_info_dir = prepend_root(directory)
                        break
                else:
                    logger.warning(
                        "Could not find .egg-info directory in install record"
                        " for %s",
                        self,
                    )
                    # FIXME: put the record somewhere
                    # FIXME: should this be an error?
                    return
            new_lines = []
            with open(record_filename) as f:
                for line in f:
                    filename = line.strip()
                    if os.path.isdir(filename):
                        filename += os.path.sep
                    new_lines.append(
                        os.path.relpath(prepend_root(filename), egg_info_dir))
            new_lines.sort()
            ensure_dir(egg_info_dir)
            inst_files_path = os.path.join(egg_info_dir, "installed-files.txt")
            with open(inst_files_path, "w") as f:
                f.write("\n".join(new_lines) + "\n")