diff options
-rwxr-xr-x | bin/misc-functions.sh | 55 | ||||
-rw-r--r-- | man/ebuild.5 | 10 |
2 files changed, 60 insertions, 5 deletions
diff --git a/bin/misc-functions.sh b/bin/misc-functions.sh index 473bde00f..69c0ff1ce 100755 --- a/bin/misc-functions.sh +++ b/bin/misc-functions.sh @@ -243,26 +243,71 @@ install_qa_check() { die "Aborting due to QA concerns: ${die_msg}" fi - # Run some sanity checks on shared libraries - for d in "${D}"lib* "${D}"usr/lib* ; do - f=$(scanelf -ByF '%S %p' "${d}"/lib*.so* | gawk '$2 == "" { print }') + # Check for shared libraries lacking SONAMEs + qa_var="QA_SONAME_${ARCH/-/_}" + eval "[[ -n \${!qa_var} ]] && QA_SONAME=(\"\${${qa_var}[@]}\")" + f=$(scanelf -ByF '%S %p' "${D}"{,usr/}lib*/lib*.so* | gawk '$2 == "" { print }' | sed -e "s:^[[:space:]]${D}:/:") + if [[ -n ${f} ]] ; then + echo "${f}" > "${T}"/scanelf-missing-SONAME.log + if [[ "${QA_STRICT_SONAME-unset}" == unset ]] ; then + if [[ ${#QA_SONAME[@]} -gt 1 ]] ; then + for x in "${QA_SONAME[@]}" ; do + sed -e "s#^/${x#/}\$##" -i "${T}"/scanelf-missing-SONAME.log + done + else + local shopts=$- + set -o noglob + for x in ${QA_SONAME} ; do + sed -e "s#^/${x#/}\$##" -i "${T}"/scanelf-missing-SONAME.log + done + set +o noglob + set -${shopts} + fi + fi + f=$(<"${T}"/scanelf-missing-SONAME.log) 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 + else + rm -f "${T}"/scanelf-missing-SONAME.log fi + fi - f=$(scanelf -ByF '%n %p' "${d}"/lib*.so* | gawk '$2 == "" { print }') + # Check for shared libraries lacking NEEDED entries + qa_var="QA_NEEDED_${ARCH/-/_}" + eval "[[ -n \${!qa_var} ]] && QA_NEEDED=(\"\${${qa_var}[@]}\")" + f=$(scanelf -ByF '%n %p' "${D}"{,usr/}lib*.so* | gawk '$2 == "" { print }' | sed -e "s:^[[:space:]]${D}:/:") + if [[ -n ${f} ]] ; then + echo "${f}" > "${T}"/scanelf-missing-NEEDED.log + if [[ "${QA_STRICT_NEEDED-unset}" == unset ]] ; then + if [[ ${#QA_NEEDED[@]} -gt 1 ]] ; then + for x in "${QA_NEEDED[@]}" ; do + sed -e "s#^/${x#/}\$##" -i "${T}"/scanelf-missing-NEEDED.log + done + else + local shopts=$- + set -o noglob + for x in ${QA_NEEDED} ; do + sed -e "s#^/${x#/}\$##" -i "${T}"/scanelf-missing-NEEDED.log + done + set +o noglob + set -${shopts} + fi + fi + f=$(<"${T}"/scanelf-missing-NEEDED.log) if [[ -n ${f} ]] ; then vecho -ne '\a\n' eqawarn "QA Notice: The following shared libraries lack NEEDED entries" eqawarn "${f}" vecho -ne '\a\n' sleep 1 + else + rm -f "${T}"/scanelf-missing-NEEDED.log fi - done + fi PORTAGE_QUIET=${tmp_quiet} fi diff --git a/man/ebuild.5 b/man/ebuild.5 index fba66f57a..4a2d29601 100644 --- a/man/ebuild.5 +++ b/man/ebuild.5 @@ -494,6 +494,16 @@ LDFLAGS variable. This should contain a list of file paths, relative to the image directory, of files that contain pre-stripped binaries. The paths may contain regular expressions with escape\-quoted special characters. +.TP +\fBQA_SONAME\fR +This should contain a list of file paths, relative to the image directory, of +shared libraries that lack SONAMEs. The paths may contain regular expressions +with escape\-quoted special characters. +.TP +\fBQA_NEEDED\fR +This should contain a list of file paths, relative to the image directory, of +shared libraries that lack NEEDED entries. The paths may contain regular +expressions with escape\-quoted special characters. .SH "PORTAGE DECLARATIONS" .TP .B inherit |