summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--NEWS2
-rwxr-xr-xbin/ebuild.sh29
-rw-r--r--pym/portage.py33
3 files changed, 61 insertions, 3 deletions
diff --git a/NEWS b/NEWS
index ca85bd313..7503e007b 100644
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,8 @@ News (mainly features/major bug fixes)
portage-2.1 (ongoing via pre releases)
------------
+* FEATURES="confcache" integration; global caching to speed up configure calls,
+ requires dev-util/confcache
* elog framework and accompanying modules for logging ebuild warnings, errors
and general notices. Collects eerror/ewarn/elog/einfo messages.
* New elog function (should replace einfo in many cases)
diff --git a/bin/ebuild.sh b/bin/ebuild.sh
index 1d5c6f90c..a89b530c9 100755
--- a/bin/ebuild.sh
+++ b/bin/ebuild.sh
@@ -493,7 +493,32 @@ econf() {
LOCAL_EXTRA_ECONF="--libdir=${CONF_LIBDIR_RESULT} ${LOCAL_EXTRA_ECONF}"
fi
- echo "${ECONF_SOURCE}/configure" \
+ local TMP_CONFCACHE_DIR CONFCACHE_ARG
+ if hasq confcache $FEATURES && ! hasq confcache $RESTRICT; then
+ CONFCACHE="$(type -p confcache)"
+ if [ -z "${CONFCACHE}" ]; then
+ ewarn "disabling confcache, binary cannot be found"
+ else
+ CONFCACHE="${CONFCACHE/ /\ }"
+ TMP_CONFCACHE_DIR="${CONFCACHE:+${CONFCACHE_DIR:-${PORTAGE_TMPDIR}/confcache}}"
+ TMP_CONFCACHE_DIR="${TMP_CONFCACHE_DIR/ /\ }"
+ CONFCACHE_ARG="--confcache-dir"
+ local s
+ if [ -n "$CCACHE_DIR" ]; then
+ s="$CCACHE_DIR"
+ fi
+ if [ -n "$DISTCC_DIR" ]; then
+ s="${s:+${s}:}$DISTCC_DIR"
+ fi
+ if [ -n "$s" ]; then
+ CONFCACHE_ARG="--confcache-ignore $s $CONFCACHE_ARG"
+ fi
+ fi
+ else
+ CONFCACHE=
+ fi
+
+ echo ${CONFCACHE} ${CONFCACHE_ARG} ${TMP_CONFCACHE_DIR} "${ECONF_SOURCE}/configure" \
--prefix=/usr \
--host=${CHOST} \
--mandir=/usr/share/man \
@@ -504,7 +529,7 @@ econf() {
"$@" \
${LOCAL_EXTRA_ECONF}
- if ! "${ECONF_SOURCE}/configure" \
+ if ! ${CONFCACHE} ${CONFCACHE_ARG} ${TMP_CONFCACHE_DIR} "${ECONF_SOURCE}/configure" \
--prefix=/usr \
--host=${CHOST} \
--mandir=/usr/share/man \
diff --git a/pym/portage.py b/pym/portage.py
index b717fe009..49fc4413c 100644
--- a/pym/portage.py
+++ b/pym/portage.py
@@ -2666,7 +2666,38 @@ def doebuild(myebuild,mydo,myroot,mysettings,debug=0,listonly=0,fetchonly=0,clea
print "!!! Perhaps: rm -Rf",mysettings["BUILD_PREFIX"]
print "!!!",str(e)
return 1
-
+ try:
+ if "confcache" in features:
+ if not mysettings.has_key("CONFCACHE_DIR"):
+ mysettings["CONFCACHE_DIR"] = os.path.join(mysettings["PORTAGE_TMPDIR"], "confcache")
+ if not os.path.exists(mysettings["CONFCACHE_DIR"]):
+ if not os.getuid() == 0:
+ # we're boned.
+ features.remove("confcache")
+ mysettings["FEATURES"] = " ".join(features)
+ else:
+ os.makedirs(mysettings["CONFCACHE_DIR"], mode=0775)
+ os.chown(mysettings["CONFCACHE_DIR"], -1, portage_gid)
+ else:
+ st = os.stat(mysettings["CONFCACHE_DIR"])
+ if not (st.st_mode & 07777) == 0775:
+ os.chmod(mysettings["CONFCACHE_DIR"], 0775)
+ if not st.st_gid == portage_gid:
+ os.chown(mysettings["CONFCACHE_DIR"], -1, portage_gid)
+
+ # check again, since it may have been disabled.
+ if "confcache" in features:
+ for x in listdir(mysettings["CONFCACHE_DIR"]):
+ p = os.path.join(mysettings["CONFCACHE_DIR"], x)
+ st = os.stat(p)
+ if not (st.st_mode & 07777) & 07600 == 0600:
+ os.chmod(p, (st.st_mode & 0777) | 0600)
+ if not st.st_gid == portage_gid:
+ os.chown(p, -1, portage_gid)
+
+ except OSError, e:
+ print "!!! Failed resetting perms on confcachedir %s" % mysettings["CONFCACHE_DIR"]
+ return 1
#try:
# mystat=os.stat(mysettings["CCACHE_DIR"])
# if (mystat[stat.ST_GID]!=portage_gid) or ((mystat[stat.ST_MODE]&02070)!=02070):