diff options
Diffstat (limited to 'lib/_emerge/EbuildPhase.py')
-rw-r--r-- | lib/_emerge/EbuildPhase.py | 66 |
1 files changed, 55 insertions, 11 deletions
diff --git a/lib/_emerge/EbuildPhase.py b/lib/_emerge/EbuildPhase.py index 50e3dd1f4..477e0ba97 100644 --- a/lib/_emerge/EbuildPhase.py +++ b/lib/_emerge/EbuildPhase.py @@ -1,6 +1,8 @@ -# Copyright 1999-2018 Gentoo Foundation +# Copyright 1999-2020 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 +from __future__ import unicode_literals + import functools import gzip import io @@ -14,10 +16,17 @@ from _emerge.EbuildProcess import EbuildProcess from _emerge.CompositeTask import CompositeTask from _emerge.PackagePhase import PackagePhase from _emerge.TaskSequence import TaskSequence +from portage.package.ebuild._ipc.QueryCommand import QueryCommand +from portage.util._dyn_libs.soname_deps_qa import ( + _get_all_provides, + _get_unresolved_soname_deps, +) from portage.package.ebuild.prepare_build_dirs import (_prepare_workdir, _prepare_fake_distdir, _prepare_fake_filesdir) +from portage.util.futures.compat_coroutine import coroutine from portage.util import writemsg from portage.util._async.AsyncTaskFuture import AsyncTaskFuture +from portage.util.futures.executor.fork import ForkExecutor try: from portage.xml.metadata import MetaDataXML @@ -281,7 +290,7 @@ class EbuildPhase(CompositeTask): fd, logfile = tempfile.mkstemp() os.close(fd) post_phase = _PostPhaseCommands(background=self.background, - commands=post_phase_cmds, fd_pipes=self.fd_pipes, + commands=post_phase_cmds, elog=self._elog, fd_pipes=self.fd_pipes, logfile=logfile, phase=self.phase, scheduler=self.scheduler, settings=settings) self._start_task(post_phase, self._post_phase_exit) @@ -315,13 +324,6 @@ class EbuildPhase(CompositeTask): self._die_hooks() return - if self.phase == "install": - out = io.StringIO() - _post_src_install_soname_symlinks(self.settings, out) - msg = out.getvalue() - if msg: - self.scheduler.output(msg, log_path=log_path) - self._current_task = None self.wait() return @@ -414,7 +416,7 @@ class EbuildPhase(CompositeTask): class _PostPhaseCommands(CompositeTask): - __slots__ = ("commands", "fd_pipes", "logfile", "phase", "settings") + __slots__ = ("commands", "elog", "fd_pipes", "logfile", "phase", "settings") def _start(self): if isinstance(self.commands, list): @@ -436,4 +438,46 @@ class _PostPhaseCommands(CompositeTask): logfile=self.logfile, phase=self.phase, scheduler=self.scheduler, settings=self.settings, **kwargs)) - self._start_task(tasks, self._default_final_exit) + self._start_task(tasks, self._commands_exit) + + def _commands_exit(self, task): + + if self._default_exit(task) != os.EX_OK: + self._async_wait() + return + + if self.phase == 'install': + out = io.StringIO() + _post_src_install_soname_symlinks(self.settings, out) + msg = out.getvalue() + if msg: + self.scheduler.output(msg, log_path=self.settings.get("PORTAGE_LOG_FILE")) + + if 'qa-unresolved-soname-deps' in self.settings.features: + # This operates on REQUIRES metadata generated by the above function call. + future = self._soname_deps_qa() + # If an unexpected exception occurs, then this will raise it. + future.add_done_callback(lambda future: future.cancelled() or future.result()) + self._start_task(AsyncTaskFuture(future=future), self._default_final_exit) + else: + self._default_final_exit(task) + else: + self._default_final_exit(task) + + @coroutine + def _soname_deps_qa(self): + + vardb = QueryCommand.get_db()[self.settings['EROOT']]['vartree'].dbapi + + all_provides = (yield self.scheduler.run_in_executor(ForkExecutor(loop=self.scheduler), _get_all_provides, vardb)) + + unresolved = _get_unresolved_soname_deps(os.path.join(self.settings['PORTAGE_BUILDDIR'], 'build-info'), all_provides) + + if unresolved: + unresolved.sort() + qa_msg = ["QA Notice: Unresolved soname dependencies:"] + qa_msg.append("") + qa_msg.extend("\t%s: %s" % (filename, " ".join(sorted(soname_deps))) + for filename, soname_deps in unresolved) + qa_msg.append("") + self.elog("eqawarn", qa_msg) |