aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/_emerge/EbuildPhase.py')
-rw-r--r--lib/_emerge/EbuildPhase.py66
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)