set -f
local f x
IFS=$' \t\n\r'
- for f in ASFLAGS CATEGORY CBUILD CC CFLAGS CHOST CTARGET CXX \
- CXXFLAGS DEFINED_PHASES DEPEND EXTRA_ECONF EXTRA_EINSTALL EXTRA_MAKE \
- FEATURES INHERITED IUSE LDFLAGS LIBCFLAGS LIBCXXFLAGS \
- LICENSE PDEPEND PF PKGUSE PROPERTIES PROVIDE RDEPEND RESTRICT SLOT \
- KEYWORDS HOMEPAGE SRC_URI DESCRIPTION; do
+ for f in CATEGORY DEFINED_PHASES FEATURES INHERITED IUSE \
+ PF PKGUSE SLOT KEYWORDS HOMEPAGE DESCRIPTION ; do
x=$(echo -n ${!f})
[[ -n $x ]] && echo "$x" > $f
done
- echo "${EPREFIX}" > EPREFIX
+ if [[ $CATEGORY != virtual ]] ; then
+ for f in ASFLAGS CBUILD CC CFLAGS CHOST CTARGET CXX \
+ CXXFLAGS EXTRA_ECONF EXTRA_EINSTALL EXTRA_MAKE \
+ LDFLAGS LIBCFLAGS LIBCXXFLAGS ; do
+ x=$(echo -n ${!f})
+ [[ -n $x ]] && echo "$x" > $f
+ done
+ fi
echo "${USE}" > USE
echo "${EAPI:-0}" > EAPI
+ echo "${EPREFIX}" > EPREFIX
set +f
# local variables can leak into the saved environment.
else:
sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym"))
import portage
+import logging
from portage.output import colorize
from portage.const import EPREFIX
extractor = BinpkgExtractorAsync(background=self.background,
image_dir=pkgloc,
- pkg=self.pkg, pkg_path=self._pkg_path, scheduler=self.scheduler)
+ pkg=self.pkg, pkg_path=self._pkg_path,
+ logfile=self.settings.get("PORTAGE_LOG_FILE"),
+ scheduler=self.scheduler)
self._writemsg_level(">>> Extracting %s\n" % self.pkg.cpv)
self._start_task(extractor, self._extractor_exit)
def _extractor_exit(self, extractor):
if self._final_exit(extractor) != os.EX_OK:
self._unlock_builddir()
- writemsg("!!! Error Extracting '%s'\n" % self._pkg_path,
- noiselevel=-1)
+ self._writemsg_level("!!! Error Extracting '%s'\n" % \
+ self._pkg_path, noiselevel=-1, level=logging.ERROR)
self.wait()
return
else:
sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym"))
import portage
+
class BinpkgExtractorAsync(SpawnProcess):
__slots__ = ("image_dir", "pkg", "pkg_path")
def _start(self):
self.args = [self._shell_binary, "-c",
- "bzip2 -dqc -- %s | tar -xp -C %s -f -" % \
+ ("bzip2 -dqc -- %s | tar -xp -C %s -f - ; " + \
+ "p=(${PIPESTATUS[@]}) ; " + \
+ "if [ ${p[0]} != 0 ] ; then " + \
+ "echo bzip2 failed with status ${p[0]} ; exit ${p[0]} ; fi ; " + \
+ "if [ ${p[1]} != 0 ] ; then " + \
+ "echo tar failed with status ${p[1]} ; exit ${p[1]} ; fi ; " + \
+ "exit 0 ;") % \
(portage._shell_quote(self.pkg_path),
portage._shell_quote(self.image_dir))]
- self.env = self.pkg.root_config.settings.environ()
+ self.env = os.environ.copy()
SpawnProcess._start(self)
-
virtuals ...etc you look in here.
"""
- # Don't include anything that could be extremely long here (like SRC_URI)
- # since that could cause execve() calls to fail with E2BIG errors. For
- # example, see bug #262647.
- _setcpv_aux_keys = ('SLOT', 'RESTRICT', 'LICENSE',
- 'KEYWORDS', 'INHERITED', 'IUSE', 'PROVIDE', 'EAPI',
- 'PROPERTIES', 'DEFINED_PHASES', 'repository')
+ _setcpv_aux_keys = ('DEFINED_PHASES', 'DEPEND', 'EAPI',
+ 'INHERITED', 'IUSE', 'KEYWORDS', 'LICENSE', 'PDEPEND',
+ 'PROPERTIES', 'PROVIDE', 'RDEPEND', 'SLOT',
+ 'repository', 'RESTRICT', 'LICENSE',)
_env_blacklist = [
"A", "AA", "CATEGORY", "DEPEND", "DESCRIPTION", "EAPI",
# they don't needlessly propagate down into the ebuild environment.
_environ_filter = []
+ # Exclude anything that could be extremely long here (like SRC_URI)
+ # since that could cause execve() calls to fail with E2BIG errors. For
+ # example, see bug #262647.
+ _environ_filter += [
+ 'DEPEND', 'RDEPEND', 'PDEPEND', 'SRC_URI',
+ ]
+
# misc variables inherited from the calling environment
_environ_filter += [
"INFOPATH", "MANPATH", "USER",
write_atomic(os.path.join(settings['PORTAGE_BUILDDIR'],
'build-info', 'CHOST'), chost + '\n')
+_vdb_use_conditional_keys = ('DEPEND', 'LICENSE', 'PDEPEND',
+ 'PROPERTIES', 'PROVIDE', 'RDEPEND', 'RESTRICT',)
+
def _post_src_install_uid_fix(mysettings, out=None):
"""
Files in $D with user and group bits that match the "portage"
for l in _merge_unicode_error(unicode_errors):
eerror(l, phase='install', key=mysettings.mycpv, out=out)
- open(_unicode_encode(os.path.join(mysettings['PORTAGE_BUILDDIR'],
- 'build-info', 'SIZE')), 'w').write(str(size) + '\n')
+ build_info_dir = os.path.join(mysettings['PORTAGE_BUILDDIR'],
+ 'build-info')
+
+ codecs.open(_unicode_encode(os.path.join(build_info_dir,
+ 'SIZE'), encoding=_encodings['fs'], errors='strict'),
+ 'w', encoding=_encodings['repo.content'],
+ errors='strict').write(str(size) + '\n')
+
+ use = frozenset(mysettings['PORTAGE_USE'].split())
+ for k in _vdb_use_conditional_keys:
+ v = mysettings.configdict['pkg'].get(k)
+ if v is None:
+ continue
+ v = dep.paren_reduce(v)
+ v = dep.use_reduce(v, uselist=use)
+ v = dep.paren_normalize(v)
+ v = dep.paren_enclose(v)
+ if not v:
+ continue
+ codecs.open(_unicode_encode(os.path.join(build_info_dir,
+ k), encoding=_encodings['fs'], errors='strict'),
+ mode='w', encoding=_encodings['repo.content'],
+ errors='strict').write(v + '\n')
if bsd_chflags:
# Restore all of the flags saved above.
# When ROOT != "/" we only want overrides from the calling
# environment to apply to the config that's associated
- # with ROOT != "/", so pass an empty dict for the env parameter.
- settings = config(config_root=None, target_root="/", env={})
+ # with ROOT != "/", so pass a nearly empty dict for the env parameter.
+ clean_env = {}
+ for k in ('PATH', 'TERM'):
+ v = settings.get(k)
+ if v is not None:
+ clean_env[k] = v
+ settings = config(config_root=None, target_root="/", env=clean_env)
settings.lock()
myroots.append((settings["ROOT"], settings))