qa_source() {
local shopts=$(shopt) OLDIFS="$IFS"
- source "$@" || return 1
+ local retval
+ source "$@"
+ retval=$?
[[ $shopts != $(shopt) ]] &&
eqawarn "QA Notice: Global shell options changed and were not restored while sourcing '$*'"
[[ "$IFS" != "$OLDIFS" ]] &&
eqawarn "QA Notice: Global IFS changed and was not restored while sourcing '$*'"
- return 0
+ return $retval
}
qa_call() {
local shopts=$(shopt) OLDIFS="$IFS"
- "$@" || return 1
+ local retval
+ "$@"
+ retval=$?
[[ $shopts != $(shopt) ]] &&
eqawarn "QA Notice: Global shell options changed and were not restored while calling '$*'"
[[ "$IFS" != "$OLDIFS" ]] &&
eqawarn "QA Notice: Global IFS changed and was not restored while calling '$*'"
- return 0
+ return $retval
}
# subshell die support
[[ ${EMERGE_FROM} != binary ]] ; then
# TODO: Implement PORTAGE_IUSE for binary packages. Currently,
# it is only valid for build time phases.
- echo "${u}" | egrep -q "${PORTAGE_IUSE}" || \
+ [[ $u =~ $PORTAGE_IUSE ]] || \
eqawarn "QA Notice: USE Flag '${u}' not" \
"in IUSE for ${CATEGORY}/${PF}"
fi
sleep 1
fi
- # Save NEEDED information
- scanelf -qyRF '%p %n' "${D}" | sed -e 's:^:/:' > "${PORTAGE_BUILDDIR}"/build-info/NEEDED
+ # Save NEEDED information after removing self-contained providers
+ scanelf -qyRF '%p:%r %n' "${D}" | sed -e 's:^:/:' | { while read l; do
+ obj=${l%%:*}
+ rpath=${l##*:}; rpath=${rpath%% *}
+ needed=${l##* }
+ if [ -z "${rpath}" -o -n "${rpath//*ORIGIN*}" ]; then
+ # object doesn't contain $ORIGIN in its runpath attribute
+ echo "${obj} ${needed}" >> "${PORTAGE_BUILDDIR}"/build-info/NEEDED
+ else
+ dir=$(dirname ${obj})
+ # replace $ORIGIN with the dirname of the current object for the lookup
+ opath=$(echo :${rpath}: | sed -e "s#.*:\(.*\)\$ORIGIN\(.*\):.*#\1${dir}\2#")
+ sneeded=$(echo ${needed} | tr , ' ')
+ rneeded=""
+ for lib in ${sneeded}; do
+ [ -e "${D}/${dir}/${lib}" ] || rneeded="${rneeded},${lib}"
+ done
+ rneeded=${rneeded:1}
+ [ -n "${rneeded}" ] && echo "${obj} ${rneeded}" >> "${PORTAGE_BUILDDIR}"/build-info/NEEDED
+ fi
+ done }
if [[ ${insecure_rpath} -eq 1 ]] ; then
die "Aborting due to serious QA concerns with RUNPATH/RPATH"
if myaction in ("clean", "config", "depclean", "info", "prune", "unmerge", None):
root_config = trees[settings["ROOT"]]["root_config"]
setconfig = root_config.setconfig
+ # display errors that occured while loading the SetConfig instance
+ for e in setconfig.errors:
+ print colorize("BAD", "Error during set creation: %s" % e)
+
sets = setconfig.getSets()
# emerge relies on the existance of sets with names "world" and "system"
required_sets = ("world", "system")
# get the real paths for the libs
preserve_paths = [x for x in old_contents if os.path.basename(x) in preserve_libs]
del old_contents, old_libs, mylibs, preserve_libs
-
+
# inject files that should be preserved into our image dir
import shutil
+ missing_paths = []
for x in preserve_paths:
print "injecting %s into %s" % (x, srcroot)
+ if not os.path.exists(os.path.join(destroot, x.lstrip(os.sep))):
+ print "%s does not exist so can't be preserved"
+ missing_paths.append(x)
+ continue
mydir = os.path.join(srcroot, os.path.dirname(x).lstrip(os.sep))
if not os.path.exists(mydir):
os.makedirs(mydir)
shutil.copy2(os.path.join(destroot, x.lstrip(os.sep)),
os.path.join(srcroot, x.lstrip(os.sep)))
+ preserve_paths = [x for x in preserve_paths if x not in missing_paths]
+
+ del missing_paths
+
# keep track of the libs we preserved
self.vartree.dbapi.plib_registry.register(self.mycpv, self.settings["SLOT"], counter, preserve_paths)
os.path.join(real_dirname, last_pfile)) == newmd5:
return old_pfile
return new_pfile
+
+def getlibpaths():
+ """ Return a list of paths that are used for library lookups """
+
+ # PREFIX HIJACK: if this function is used (it seems to be just added
+ # nothing more, then let us know, because then we need to fix this...
+ raise "This is not prefix-proof, and certainly not x-platform proof!"
+
+ # the following is based on the information from ld.so(8)
+ rval = os.environ.get("LD_LIBRARY_PATH", "").split(":")
+ rval.extend(grabfile("/etc/ld.so.conf"))
+ rval.append("/usr/lib")
+ rval.append("/lib")
+
+ rval = [normalize_path(x) for x in rval if x != ""]
+
+ return rval
+