From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from pigeon.gentoo.org ([208.92.234.80] helo=lists.gentoo.org) by finch.gentoo.org with esmtp (Exim 4.60) (envelope-from ) id 1QchlU-0004D7-2L for garchives@archives.gentoo.org; Fri, 01 Jul 2011 17:44:28 +0000 Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id ABB5B1C02B; Fri, 1 Jul 2011 17:44:19 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) by pigeon.gentoo.org (Postfix) with ESMTP id 3F1241C02B for ; Fri, 1 Jul 2011 17:44:19 +0000 (UTC) Received: from pelican.gentoo.org (unknown [66.219.59.40]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id A9F0A1B4031 for ; Fri, 1 Jul 2011 17:44:18 +0000 (UTC) Received: from localhost.localdomain (localhost [127.0.0.1]) by pelican.gentoo.org (Postfix) with ESMTP id 15ACE8003D for ; Fri, 1 Jul 2011 17:44:18 +0000 (UTC) From: "Fabian Groffen" To: gentoo-commits@lists.gentoo.org Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Fabian Groffen" Message-ID: <1683b8f2933a2e23785ae2e7e3b23eec831f9d93.grobian@gentoo> Subject: [gentoo-commits] proj/portage:prefix commit in: / X-VCS-Repository: proj/portage X-VCS-Committer: grobian X-VCS-Committer-Name: Fabian Groffen X-VCS-Revision: 1683b8f2933a2e23785ae2e7e3b23eec831f9d93 Date: Fri, 1 Jul 2011 17:44:18 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: quoted-printable X-Archives-Salt: X-Archives-Hash: 5d0aff836f877b2aa546e9ae5fd0acec commit: 1683b8f2933a2e23785ae2e7e3b23eec831f9d93 Author: Fabian Groffen gentoo org> AuthorDate: Fri Jul 1 17:42:16 2011 +0000 Commit: Fabian Groffen gentoo org> CommitDate: Fri Jul 1 17:42:16 2011 +0000 URL: http://git.overlays.gentoo.org/gitweb/?p=3Dproj/portage.git;a= =3Dcommit;h=3D1683b8f2 Merge remote-tracking branch 'overlays-gentoo-org/master' into prefix Conflicts: pym/portage/package/ebuild/prepare_build_dirs.py pym/portage/util/__init__.py RELEASE-NOTES | 2 +- bin/ebuild | 23 +++- bin/ebuild-helpers/ecompress | 6 +- bin/emaint | 45 +++++- bin/misc-functions.sh | 11 ++ bin/portageq | 13 +- bin/repoman | 37 ++++- cnf/make.globals | 2 +- man/ebuild.5 | 5 +- man/env-update.1 | 3 +- man/make.conf.5 | 9 +- man/portage.5 | 7 + man/repoman.1 | 4 + pym/_emerge/EbuildPhase.py | 10 ++ pym/_emerge/Package.py | 33 ++++- pym/_emerge/UseFlagDisplay.py | 8 +- pym/_emerge/depgraph.py | 21 ++- pym/_emerge/resolver/circular_dependency.py | 24 ++- pym/_emerge/resolver/output.py | 13 +- pym/portage/checksum.py | 15 ++- pym/portage/const.py | 2 +- pym/portage/dbapi/vartree.py | 30 ++-- pym/portage/dep/__init__.py | 4 +- pym/portage/package/ebuild/_config/UseManager.py | 170 +++++++++++++-= ------ .../package/ebuild/_config/special_env_vars.py | 6 + pym/portage/package/ebuild/config.py | 57 +++++++- pym/portage/package/ebuild/doebuild.py | 141 ++++++++++++++= ++- pym/portage/package/ebuild/prepare_build_dirs.py | 14 ++- pym/portage/repository/config.py | 3 + pym/portage/tests/util/test_varExpand.py | 35 ++++- pym/portage/util/__init__.py | 52 +++---- pym/portage/util/_dyn_libs/LinkageMapELF.py | 30 +++- pym/portage/util/env_update.py | 14 +- 33 files changed, 668 insertions(+), 181 deletions(-) diff --cc bin/emaint index 6d68cb0,fdd01ed..c8a76d5 --- a/bin/emaint +++ b/bin/emaint @@@ -10,16 -12,18 +12,20 @@@ import textwra import time from optparse import OptionParser, OptionValueError =20 -try: - import portage -except ImportError: - from os import path as osp - sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__fil= e__))), "pym")) - import portage +# for an explanation on this logic, see pym/_emerge/__init__.py +import os +import sys +if os.environ.__contains__("PORTAGE_PYTHONPATH"): + sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) +else: + sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.pat= h.realpath(__file__))), "pym")) +import portage =20 from portage import os + from portage.util import writemsg +=20 + if sys.hexversion >=3D 0x3000000: + long =3D int =20 class WorldHandler(object): =20 diff --cc bin/misc-functions.sh index dce730a,d708c1d..bfb6b03 mode 100644,100755..100644 --- a/bin/misc-functions.sh +++ b/bin/misc-functions.sh @@@ -758,490 -715,18 +759,500 @@@ install_qa_check_misc()=20 done [[ ${abort} =3D=3D yes ]] && die "multilib-strict check failed!" fi +=20 + # ensure packages don't install systemd units automagically + if ! hasq systemd ${INHERITED} && \ + [[ -d "${D}"/lib/systemd/system ]] + then + eqawarn "QA Notice: package installs systemd unit files (/lib/systemd= /system)" + eqawarn " but does not inherit systemd.eclass." + hasq stricter ${FEATURES} \ + && die "install aborted due to missing inherit of systemd.eclass" + fi } =20 +install_qa_check_prefix() { + if [[ -d ${ED}/${D} ]] ; then + find "${ED}/${D}" | \ + while read i ; do + eqawarn "QA Notice: /${i##${ED}/${D}} installed in \${ED}/\${D}" + done + die "Aborting due to QA concerns: files installed in ${ED}/${D}" + fi + + if [[ -d ${ED}/${EPREFIX} ]] ; then + find "${ED}/${EPREFIX}/" | \ + while read i ; do + eqawarn "QA Notice: ${i#${D}} double prefix" + done + die "Aborting due to QA concerns: double prefix files installed" + fi + + if [[ -d ${D} ]] ; then + INSTALLTOD=3D$(find ${D%/} | egrep -v "^${ED}" | sed -e "s|^${D%/}||"= | awk '{if (length($0) <=3D length("'"${EPREFIX}"'")) { if (substr("'"${= EPREFIX}"'", 1, length($0)) !=3D $0) {print $0;} } else if (substr($0, 1,= length("'"${EPREFIX}"'")) !=3D "'"${EPREFIX}"'") {print $0;} }')=20 + if [[ -n ${INSTALLTOD} ]] ; then + eqawarn "QA Notice: the following files are outside of the prefix:" + eqawarn "${INSTALLTOD}" + die "Aborting due to QA concerns: there are files installed outside = the prefix" + fi + fi + + # all further checks rely on ${ED} existing + [[ -d ${ED} ]] || return + + # this does not really belong here, but it's closely tied to + # the code below; many runscripts generate positives here, and we + # know they don't work (bug #196294) so as long as that one + # remains an issue, simply remove them as they won't work + # anyway, avoid etc/init.d/functions.sh from being thrown away + if [[ ( -d "${ED}"/etc/conf.d || -d "${ED}"/etc/init.d ) && ! -f "${ED= }"/etc/init.d/functions.sh ]] ; then + ewarn "removed /etc/init.d and /etc/conf.d directories until bug #196= 294 has been resolved" + rm -Rf "${ED}"/etc/{conf,init}.d + fi + + # check shebangs, bug #282539 + rm -f "${T}"/non-prefix-shebangs-errs + local WHITELIST=3D" /usr/bin/env " + # this is hell expensive, but how else? + find "${ED}" -executable \! -type d -print0 \ + | xargs -0 grep -H -n -m1 "^#!" \ + | while read f ; + do + local fn=3D${f%%:*} + local pos=3D${f#*:} ; pos=3D${pos%:*} + local line=3D${f##*:} + # shebang always appears on the first line ;) + [[ ${pos} !=3D 1 ]] && continue + local oldIFS=3D${IFS} + IFS=3D$'\r'$'\n'$'\t'" " + line=3D( ${line#"#!"} ) + IFS=3D${oldIFS} + [[ ${WHITELIST} =3D=3D *" ${line[0]} "* ]] && continue + local fp=3D${fn#${D}} ; fp=3D/${fp%/*} + # line[0] can be an absolutised path, bug #342929 + local eprefix=3D$(canonicalize ${EPREFIX}) + local rf=3D${fn} + # in case we deal with a symlink, make sure we don't replace it + # with a real file (sed -i does that) + if [[ -L ${fn} ]] ; then + rf=3D$(readlink ${fn}) + [[ ${rf} !=3D /* ]] && rf=3D${fn%/*}/${rf} + # ignore symlinks pointing to outside prefix + # as seen in sys-devel/native-cctools + [[ ${rf} !=3D ${EPREFIX}/* && $(canonicalize "${rf}") !=3D ${eprefix= }/* ]] && continue + fi + # does the shebang start with ${EPREFIX}, and does it exist? + if [[ ${line[0]} =3D=3D ${EPREFIX}/* || ${line[0]} =3D=3D ${eprefix}/= * ]] ; then + if [[ ! -e ${ROOT%/}${line[0]} && ! -e ${D%/}${line[0]} ]] ; then + # hmm, refers explicitly to $EPREFIX, but doesn't exist, + # if it's in PATH that's wrong in any case + if [[ ":${PATH}:" =3D=3D *":${fp}:"* ]] ; then + echo "${fn#${D}}:${line[0]} (explicit EPREFIX but target not found= )" \ + >> "${T}"/non-prefix-shebangs-errs + else + eqawarn "${fn#${D}} has explicit EPREFIX in shebang but target not= found (${line[0]})" + fi + fi + continue + fi + # unprefixed shebang, is the script directly in $PATH? + if [[ ":${PATH}:" =3D=3D *":${fp}:"* ]] ; then + if [[ -e ${EROOT}${line[0]} || -e ${ED}${line[0]} ]] ; then + # is it unprefixed, but we can just fix it because a + # prefixed variant exists + eqawarn "prefixing shebang of ${fn#${D}}" + # statement is made idempotent on purpose, because + # symlinks may point to the same target, and hence the + # same real file may be sedded multiple times since we + # read the shebangs in one go upfront for performance + # reasons + sed -i -e '1s:^#! \?'"${line[0]}"':#!'"${EPREFIX}"${line[0]}':' "${= rf}" + continue + else + # this is definitely wrong: script in $PATH and invalid shebang + echo "${fn#${D}}:${line[0]} (script ${fn##*/} installed in PATH but= interpreter ${line[0]} not found)" \ + >> "${T}"/non-prefix-shebangs-errs + fi + else + # unprefixed/invalid shebang, but outside $PATH, this may be + # intended (e.g. config.guess) so remain silent by default + hasq stricter ${FEATURES} && \ + eqawarn "invalid shebang in ${fn#${D}}: ${line[0]}" + fi + done + if [[ -e "${T}"/non-prefix-shebangs-errs ]] ; then + eqawarn "QA Notice: the following files use invalid (possible non-pre= fixed) shebangs:" + while read line ; do + eqawarn " ${line}" + done < "${T}"/non-prefix-shebangs-errs + rm -f "${T}"/non-prefix-shebangs-errs + die "Aborting due to QA concerns: invalid shebangs found" + fi +} + +install_qa_check_macho() { + if ! hasq binchecks ${RESTRICT} ; then + # on Darwin, dynamic libraries are called .dylibs instead of + # .sos. In addition the version component is before the + # extension, not after it. Check for this, and *only* warn + # about it. Some packages do ship .so files on Darwin and make + # it work (ugly!). + rm -f "${T}/mach-o.check" + find ${ED%/} -name "*.so" -or -name "*.so.*" | \ + while read i ; do + [[ $(file $i) =3D=3D *"Mach-O"* ]] && \ + echo "${i#${D}}" >> "${T}/mach-o.check" + done + if [[ -f ${T}/mach-o.check ]] ; then + f=3D$(< "${T}/mach-o.check") + vecho -ne '\a\n' + eqawarn "QA Notice: Found .so dynamic libraries on Darwin:" + eqawarn " ${f//$'\n'/\n }" + fi + rm -f "${T}/mach-o.check" + + # The naming for dynamic libraries is different on Darwin; the + # version component is before the extention, instead of after + # it, as with .sos. Again, make this a warning only. + rm -f "${T}/mach-o.check" + find ${ED%/} -name "*.dylib.*" | \ + while read i ; do + echo "${i#${D}}" >> "${T}/mach-o.check" + done + if [[ -f "${T}/mach-o.check" ]] ; then + f=3D$(< "${T}/mach-o.check") + vecho -ne '\a\n' + eqawarn "QA Notice: Found wrongly named dynamic libraries on Darwin:= " + eqawarn " ${f// /\n }" + fi + rm -f "${T}/mach-o.check" + fi + + # While we generate the NEEDED files, check that we don't get kernel + # traps at runtime because of broken install_names on Darwin. + rm -f "${T}"/.install_name_check_failed + scanmacho -qyRF '%a;%p;%S;%n' "${D}" | { while IFS=3D read l ; do + arch=3D${l%%;*}; l=3D${l#*;} + obj=3D"/${l%%;*}"; l=3D${l#*;} + install_name=3D${l%%;*}; l=3D${l#*;} + needed=3D${l%%;*}; l=3D${l#*;} + + # See if the self-reference install_name points to an existing + # and to be installed file. This usually is a symlink for the + # major version. + if [[ ! -e ${D}${install_name} ]] ; then + eqawarn "QA Notice: invalid self-reference install_name ${install_na= me} in ${obj}" + # remember we are in an implicit subshell, that's + # why we touch a file here ... ideally we should be + # able to die correctly/nicely here + touch "${T}"/.install_name_check_failed + fi + + # this is ugly, paths with spaces won't work + reevaluate=3D0 + for lib in ${needed//,/ } ; do + if [[ ${lib} =3D=3D ${D}* ]] ; then + eqawarn "QA Notice: install_name references \${D}: ${lib} in ${obj}= " + touch "${T}"/.install_name_check_failed + elif [[ ${lib} =3D=3D ${S}* ]] ; then + eqawarn "QA Notice: install_name references \${S}: ${lib} in ${obj}= " + touch "${T}"/.install_name_check_failed + elif [[ ! -e ${lib} && ! -e ${D}${lib} && ${lib} !=3D "@executable_p= ath/"* && ${lib} !=3D "@loader_path/"* ]] ; then + # try to "repair" this if possible, happens because of + # gen_usr_ldscript tactics + s=3D${lib%usr/*}${lib##*/usr/} + if [[ -e ${D}${s} ]] ; then + ewarn "correcting install_name from ${lib} to ${s} in ${obj}" + install_name_tool -change \ + "${lib}" "${s}" "${D}${obj}" + reevaluate=3D1 + else + eqawarn "QA Notice: invalid reference to ${lib} in ${obj}" + # remember we are in an implicit subshell, that's + # why we touch a file here ... ideally we should be + # able to die correctly/nicely here + touch "${T}"/.install_name_check_failed + fi + fi + done + if [[ ${reevaluate} =3D=3D 1 ]]; then + # install_name(s) have been changed, refresh data so we + # store the correct meta data + l=3D$(scanmacho -qyF '%a;%p;%S;%n' ${D}${obj}) + arch=3D${l%%;*}; l=3D${l#*;} + obj=3D"/${l%%;*}"; l=3D${l#*;} + install_name=3D${l%%;*}; l=3D${l#*;} + needed=3D${l%%;*}; l=3D${l#*;} + fi + + # backwards compatability + echo "${obj} ${needed}" >> "${PORTAGE_BUILDDIR}"/build-info/NEEDED + # what we use + echo "${arch};${obj};${install_name};${needed}" >> "${PORTAGE_BUILDDI= R}"/build-info/NEEDED.MACHO.3 + done } + if [[ -f ${T}/.install_name_check_failed ]] ; then + # secret switch "allow_broken_install_names" to get + # around this and install broken crap (not a good idea) + hasq allow_broken_install_names ${FEATURES} || \ + die "invalid install_name found, your application or library will cr= ash at runtime" + fi +} + +install_qa_check_pecoff() { + local _pfx_scan=3D"readpecoff ${CHOST}" + + # this one uses readpecoff, which supports multiple prefix platforms! + # this is absolutely _not_ optimized for speed, and there may be plent= y + # of possibilities by introducing one or the other cache! + if ! hasq binchecks ${RESTRICT}; then + # copied and adapted from the above scanelf code. + local qa_var insecure_rpath=3D0 tmp_quiet=3D${PORTAGE_QUIET} + local f x + + # display warnings when using stricter because we die afterwards + if has stricter ${FEATURES} ; then + unset PORTAGE_QUIET + fi + + local _exec_find_opt=3D"-executable" + [[ ${CHOST} =3D=3D *-winnt* ]] && _exec_find_opt=3D'-name *.dll -o -n= ame *.exe' + + # Make sure we disallow insecure RUNPATH/RPATH's + # Don't want paths that point to the tree where the package was built + # (older, broken libtools would do this). Also check for null paths + # because the loader will search $PWD when it finds null paths. + + f=3D$( + find "${ED}" -type f '(' ${_exec_find_opt} ')' -print0 | xargs -0 ${= _pfx_scan} | \ + while IFS=3D";" read arch obj soname rpath needed ; do \ + echo "${rpath}" | grep -E "(${PORTAGE_BUILDDIR}|: |::|^:|^ )" > /dev= /null 2>&1 \ + && echo "${obj}"; done; + ) + # Reject set*id binaries with $ORIGIN in RPATH #260331 + x=3D$( + find "${ED}" -type f '(' -perm -u+s -o -perm -g+s ')' -print0 | \ + xargs -0 ${_pfx_scan} | while IFS=3D";" read arch obj soname rpath n= eeded; do \ + echo "${rpath}" | grep '$ORIGIN' > /dev/null 2>&1 && echo "${obj}"; = done; + ) + if [[ -n ${f}${x} ]] ; then + vecho -ne '\a\n' + eqawarn "QA Notice: The following files contain insecure RUNPATH's" + eqawarn " Please file a bug about this at http://bugs.gentoo.org/" + eqawarn " with the maintaining herd of the package." + eqawarn "${f}${f:+${x:+\n}}${x}" + vecho -ne '\a\n' + if [[ -n ${x} ]] || has stricter ${FEATURES} ; then + insecure_rpath=3D1 + else + eqawarn "cannot automatically fix runpaths on interix platforms!" + fi + fi + + rm -f "${PORTAGE_BUILDDIR}"/build-info/NEEDED + rm -f "${PORTAGE_BUILDDIR}"/build-info/NEEDED.PECOFF.1 + + # Save NEEDED information after removing self-contained providers + find "${ED}" -type f '(' ${_exec_find_opt} ')' -print0 | xargs -0 ${_= pfx_scan} | { while IFS=3D';' read arch obj soname rpath needed; do + # need to strip image dir from object name. + obj=3D"/${obj#${D}}" + 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 + echo "${arch};${obj};${soname};${rpath};${needed}" >> "${PORTAGE_BU= ILDDIR}"/build-info/NEEDED.PECOFF.1 + else + dir=3D${obj%/*} + # replace $ORIGIN with the dirname of the current object for the lo= okup + opath=3D$(echo :${rpath}: | sed -e "s#.*:\(.*\)\$ORIGIN\(.*\):.*#\1= ${dir}\2#") + sneeded=3D$(echo ${needed} | tr , ' ') + rneeded=3D"" + for lib in ${sneeded}; do + found=3D0 + for path in ${opath//:/ }; do + [ -e "${ED}/${path}/${lib}" ] && found=3D1 && break + done + [ "${found}" -eq 0 ] && rneeded=3D"${rneeded},${lib}" + done + rneeded=3D${rneeded:1} + if [ -n "${rneeded}" ]; then + echo "${obj} ${rneeded}" >> "${PORTAGE_BUILDDIR}"/build-info/NEEDE= D + echo "${arch};${obj};${soname};${rpath};${rneeded}" >> "${PORTAGE_= BUILDDIR}"/build-info/NEEDED.PECOFF.1 + fi + fi + done } + =09 + if [[ ${insecure_rpath} -eq 1 ]] ; then + die "Aborting due to serious QA concerns with RUNPATH/RPATH" + elif [[ -n ${die_msg} ]] && has stricter ${FEATURES} ; then + die "Aborting due to QA concerns: ${die_msg}" + fi + + local _so_ext=3D'.so*' + + case "${CHOST}" in + *-winnt*) _so_ext=3D".dll" ;; # no "*" intentionally! + esac + + # Run some sanity checks on shared libraries + for d in "${ED}"lib* "${ED}"usr/lib* ; do + [[ -d "${d}" ]] || continue + f=3D$(find "${d}" -name "lib*${_so_ext}" -print0 | \ + xargs -0 ${_pfx_scan} | while IFS=3D";" read arch obj soname rpath = needed; \ + do [[ -z "${soname}" ]] && echo "${obj}"; done) + if [[ -n ${f} ]] ; then + vecho -ne '\a\n' + eqawarn "QA Notice: The following shared libraries lack a SONAME" + eqawarn "${f}" + vecho -ne '\a\n' + sleep 1 + fi + + f=3D$(find "${d}" -name "lib*${_so_ext}" -print0 | \ + xargs -0 ${_pfx_scan} | while IFS=3D";" read arch obj soname rpath = needed; \ + do [[ -z "${needed}" ]] && echo "${obj}"; done) + if [[ -n ${f} ]] ; then + vecho -ne '\a\n' + eqawarn "QA Notice: The following shared libraries lack NEEDED entr= ies" + eqawarn "${f}" + vecho -ne '\a\n' + sleep 1 + fi + done + + PORTAGE_QUIET=3D${tmp_quiet} + fi +} + +install_qa_check_xcoff() { + if ! hasq binchecks ${RESTRICT}; then + local tmp_quiet=3D${PORTAGE_QUIET} + local queryline deplib + local insecure_rpath_list=3D undefined_symbols_list=3D + + # display warnings when using stricter because we die afterwards + if has stricter ${FEATURES} ; then + unset PORTAGE_QUIET + fi + + rm -f "${PORTAGE_BUILDDIR}"/build-info/NEEDED.XCOFF.1 + + local neededfd + for neededfd in {3..1024} none; do ( : <&${neededfd} ) 2>/dev/null ||= break; done + [[ ${neededfd} !=3D none ]] || die "cannot find free file descriptor = handle" + + eval "exec ${neededfd}>\"${PORTAGE_BUILDDIR}\"/build-info/NEEDED.XCOF= F.1" || die "cannot open ${PORTAGE_BUILDDIR}/build-info/NEEDED.XCOFF.1" + + ( # work around a problem in /usr/bin/dump (used by aixdll-query) + # dumping core when path names get too long. + cd "${ED}" >/dev/null && + find . -not -type d -exec \ + aixdll-query '{}' FILE MEMBER FLAGS FORMAT RUNPATH DEPLIBS ';' + ) > "${T}"/needed 2>/dev/null + + # Symlinking shared archive libraries is not a good idea on aix, + # as there is nothing like "soname" on pure filesystem level. + # So we create a copy instead of the symlink. + local prev_FILE=3D + local FILE MEMBER FLAGS FORMAT RUNPATH DEPLIBS + while read queryline + do + FILE=3D MEMBER=3D FLAGS=3D FORMAT=3D RUNPATH=3D DEPLIBS=3D + eval ${queryline} + FILE=3D${FILE#./} + + if [[ ${prev_FILE} !=3D ${FILE} ]]; then + if [[ " ${FLAGS} " =3D=3D *" SHROBJ "* && -h ${ED}${FILE} ]]; then + prev_FILE=3D${FILE} + local target=3D$(readlink "${ED}${FILE}") + if [[ ${target} =3D=3D /* ]]; then + target=3D${D}${target} + else + target=3D${FILE%/*}/${target} + fi + rm -f "${ED}${FILE}" || die "cannot prune ${FILE}" + cp -f "${ED}${target}" "${ED}${FILE}" || die "cannot copy ${target= } to ${FILE}" + fi + fi + done <"${T}"/needed + + prev_FILE=3D + while read queryline + do + FILE=3D MEMBER=3D FLAGS=3D FORMAT=3D RUNPATH=3D DEPLIBS=3D + eval ${queryline} + FILE=3D${FILE#./} + + if [[ -n ${MEMBER} && ${prev_FILE} !=3D ${FILE} ]]; then + # Save NEEDED information for each archive library stub + # even if it is static only: the already installed archive + # may contain shared objects to be preserved. + echo "${FORMAT##* }${FORMAT%%-*};${EPREFIX}/${FILE};${FILE##*/};;" = >&${neededfd} + fi + prev_FILE=3D${FILE} + + [[ " ${FLAGS} " =3D=3D *" SHROBJ "* ]] || continue + + # Make sure we disallow insecure RUNPATH's + # Don't want paths that point to the tree where the package was buil= t + # (older, broken libtools would do this). Also check for null paths + # because the loader will search $PWD when it finds null paths. + # And we really want absolute paths only. + if [[ -n $(echo ":${RUNPATH}:" | grep -E "(${PORTAGE_BUILDDIR}|::|:[= ^/])") ]]; then + insecure_rpath_list=3D"${insecure_rpath_list}\n${FILE}${MEMBER:+[${= MEMBER}]}" + fi + + local needed=3D + [[ -n ${MEMBER} ]] && needed=3D${FILE##*/} + for deplib in ${DEPLIBS}; do + eval deplib=3D${deplib} + if [[ ${deplib} =3D=3D '.' || ${deplib} =3D=3D '..' ]]; then + # Although we do have runtime linking, we don't want undefined sym= bols. + # AIX does indicate this by needing either '.' or '..' + undefined_symbols_list=3D"${undefined_symbols_list}\n${FILE}" + else + needed=3D"${needed}${needed:+,}${deplib}" + fi + done + + FILE=3D${EPREFIX}/${FILE} + + [[ -n ${MEMBER} ]] && MEMBER=3D"[${MEMBER}]" + # Save NEEDED information + echo "${FORMAT##* }${FORMAT%%-*};${FILE}${MEMBER};${FILE##*/}${MEMBE= R};${RUNPATH};${needed}" >&${neededfd} + done <"${T}"/needed + + eval "exec ${neededfd}>&-" || die "cannot close handle to ${PORTAGE_B= UILDDIR}/build-info/NEEDED.XCOFF.1" + + if [[ -n ${undefined_symbols_list} ]]; then + vecho -ne '\a\n' + eqawarn "QA Notice: The following files contain undefined symbols." + eqawarn " Please file a bug about this at http://bugs.gentoo.org/" + eqawarn " with 'prefix' as the maintaining herd of the package." + eqawarn "${undefined_symbols_list}" + vecho -ne '\a\n' + fi + + if [[ -n ${insecure_rpath_list} ]] ; then + vecho -ne '\a\n' + eqawarn "QA Notice: The following files contain insecure RUNPATH's" + eqawarn " Please file a bug about this at http://bugs.gentoo.org/" + eqawarn " with 'prefix' as the maintaining herd of the package." + eqawarn "${insecure_rpath_list}" + vecho -ne '\a\n' + if has stricter ${FEATURES} ; then + insecure_rpath=3D1 + fi + fi + + if [[ ${insecure_rpath} -eq 1 ]] ; then + die "Aborting due to serious QA concerns with RUNPATH/RPATH" + elif [[ -n ${die_msg} ]] && has stricter ${FEATURES} ; then + die "Aborting due to QA concerns: ${die_msg}" + fi + + PORTAGE_QUIET=3D${tmp_quiet} + fi +} + =20 install_mask() { local root=3D"$1" diff --cc bin/repoman index 25a03f0,0e3820f..74b4f45 --- a/bin/repoman +++ b/bin/repoman @@@ -378,9 -376,9 +379,10 @@@ qacats =3D list(qahelp qacats.sort() =20 qawarnings =3D set(( +"changelog.ebuildadded", "changelog.missing", "changelog.notadded", + "dependency.unknown", "digest.assumed", "digest.unused", "ebuild.notadded", diff --cc cnf/make.globals index de05b3b,2892d50..ae98d16 --- a/cnf/make.globals +++ b/cnf/make.globals @@@ -108,21 -106,11 +108,21 @@@ CONFIG_PROTECT=3D"/etc CONFIG_PROTECT_MASK=3D"/etc/env.d" =20 # Disable auto-use - USE_ORDER=3D"env:pkg:conf:defaults:pkginternal:env.d" + USE_ORDER=3D"env:pkg:conf:defaults:pkginternal:repo:env.d" =20 +# Default portage user/group +PORTAGE_USER=3D'@portageuser@' +PORTAGE_GROUP=3D'@portagegroup@' +PORTAGE_ROOT_USER=3D'@rootuser@' + # Default ownership of installed files. -PORTAGE_INST_UID=3D"0" -PORTAGE_INST_GID=3D"0" +PORTAGE_INST_UID=3D"@rootuid@" +PORTAGE_INST_GID=3D"@rootgid@" + +# Default PATH for ebuild env +DEFAULT_PATH=3D"@DEFAULT_PATH@" +# Any extra PATHs to add to the ebuild environment's PATH (if any) +EXTRA_PATH=3D"@EXTRA_PATH@" =20 # Mode bits for ${WORKDIR} (see ebuild.5). PORTAGE_WORKDIR_MODE=3D"0700" diff --cc pym/portage/package/ebuild/prepare_build_dirs.py index a1086fd,259bedf..053ebcc --- a/pym/portage/package/ebuild/prepare_build_dirs.py +++ b/pym/portage/package/ebuild/prepare_build_dirs.py @@@ -143,14 -142,22 +143,22 @@@ def _adjust_perms_msg(settings, msg) =20 def _prepare_features_dirs(mysettings): =20 + # Use default ABI libdir in accordance with bug #355283. + libdir =3D None + default_abi =3D mysettings.get("DEFAULT_ABI") + if default_abi: + libdir =3D mysettings.get("LIBDIR_" + default_abi) + if not libdir: + libdir =3D "lib" +=20 features_dirs =3D { "ccache":{ - "path_dir": EPREFIX+"/usr/lib/ccache/bin", - "path_dir": "/usr/%s/ccache/bin" % (libdir,), ++ "path_dir": EPREFIX+"/usr/%s/ccache/bin" % (libdir,), "basedir_var":"CCACHE_DIR", "default_dir":os.path.join(mysettings["PORTAGE_TMPDIR"], "ccache"), "always_recurse":False}, "distcc":{ - "path_dir": EPREFIX+"/usr/lib/distcc/bin", - "path_dir": "/usr/%s/distcc/bin" % (libdir,), ++ "path_dir": EPREFIX+"/usr/%s/distcc/bin" % (libdir,), "basedir_var":"DISTCC_DIR", "default_dir":os.path.join(mysettings["BUILD_PREFIX"], ".distcc"), "subdirs":("lock", "state"), diff --cc pym/portage/util/__init__.py index 0182c76,5468e28..3f202eb --- a/pym/portage/util/__init__.py +++ b/pym/portage/util/__init__.py @@@ -1581,24 -1570,14 +1571,26 @@@ def find_updated_config_files(target_r= o else: yield (x, None) =20 - def getlibpaths(root): + def getlibpaths(root, env=3DNone): """ Return a list of paths that are used for library lookups """ + if env is None: + env =3D os.environ + + # PREFIX HACK: LD_LIBRARY_PATH isn't portable, and considered + # harmfull, so better not use it. We don't need any host OS lib + # paths either, so do Prefix case. + if EPREFIX !=3D '': + rval =3D [] + rval.append(EPREFIX + "/usr/lib") + rval.append(EPREFIX + "/lib") + # we don't know the CHOST here, so it's a bit hard to guess + # where GCC's and ld's libs are. Though, GCC's libs should be + # in lib and usr/lib, binutils' libs rarely used + else: - # the following is based on the information from ld.so(8) - rval =3D os.environ.get("LD_LIBRARY_PATH", "").split(":") + # the following is based on the information from ld.so(8) - rval =3D env.get("LD_LIBRARY_PATH", "").split(":") - rval.extend(grabfile(os.path.join(root, "etc", "ld.so.conf"))) - rval.append("/usr/lib") - rval.append("/lib") ++ rval =3D env.get("LD_LIBRARY_PATH", "").split(":") + rval.extend(grabfile(os.path.join(root, "etc", "ld.so.conf"))) + rval.append("/usr/lib") + rval.append("/lib") =20 return [normalize_path(x) for x in rval if x]