| # Copyright 1999-2011 Gentoo Foundation |
| # Distributed under the terms of the GNU General Public License v2 |
| |
| from _emerge.EbuildPhase import EbuildPhase |
| from _emerge.TaskSequence import TaskSequence |
| from _emerge.CompositeTask import CompositeTask |
| import portage |
| from portage import os |
| from portage.eapi import eapi_has_src_prepare_and_src_configure, \ |
| eapi_exports_replace_vars |
| from portage.package.ebuild.doebuild import _prepare_fake_distdir |
| |
| class EbuildExecuter(CompositeTask): |
| |
| __slots__ = ("pkg", "settings") |
| |
| _phases = ("prepare", "configure", "compile", "test", "install") |
| |
| _live_eclasses = portage.const.LIVE_ECLASSES |
| |
| def _start(self): |
| pkg = self.pkg |
| scheduler = self.scheduler |
| settings = self.settings |
| cleanup = 0 |
| portage.prepare_build_dirs(pkg.root, settings, cleanup) |
| |
| alist = settings.configdict["pkg"].get("A", "").split() |
| _prepare_fake_distdir(settings, alist) |
| |
| if eapi_exports_replace_vars(settings['EAPI']): |
| vardb = pkg.root_config.trees['vartree'].dbapi |
| settings["REPLACING_VERSIONS"] = " ".join( |
| set(portage.versions.cpv_getversion(match) \ |
| for match in vardb.match(pkg.slot_atom) + \ |
| vardb.match('='+pkg.cpv))) |
| |
| setup_phase = EbuildPhase(background=self.background, |
| phase="setup", scheduler=scheduler, |
| settings=settings) |
| |
| setup_phase.addExitListener(self._setup_exit) |
| self._task_queued(setup_phase) |
| self.scheduler.scheduleSetup(setup_phase) |
| |
| def _setup_exit(self, setup_phase): |
| |
| if self._default_exit(setup_phase) != os.EX_OK: |
| self.wait() |
| return |
| |
| unpack_phase = EbuildPhase(background=self.background, |
| phase="unpack", scheduler=self.scheduler, |
| settings=self.settings) |
| |
| if self._live_eclasses.intersection(self.pkg.inherited): |
| # Serialize $DISTDIR access for live ebuilds since |
| # otherwise they can interfere with eachother. |
| |
| unpack_phase.addExitListener(self._unpack_exit) |
| self._task_queued(unpack_phase) |
| self.scheduler.scheduleUnpack(unpack_phase) |
| |
| else: |
| self._start_task(unpack_phase, self._unpack_exit) |
| |
| def _unpack_exit(self, unpack_phase): |
| |
| if self._default_exit(unpack_phase) != os.EX_OK: |
| self.wait() |
| return |
| |
| ebuild_phases = TaskSequence(scheduler=self.scheduler) |
| |
| pkg = self.pkg |
| phases = self._phases |
| eapi = pkg.eapi |
| if not eapi_has_src_prepare_and_src_configure(eapi): |
| # skip src_prepare and src_configure |
| phases = phases[2:] |
| |
| for phase in phases: |
| ebuild_phases.add(EbuildPhase(background=self.background, |
| phase=phase, scheduler=self.scheduler, |
| settings=self.settings)) |
| |
| self._start_task(ebuild_phases, self._default_final_exit) |
| |