commit:     9aaa652c86b21b925bc56fafd57b561b86ace0f8
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Mon Mar 26 19:12:51 2018 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Wed Mar 28 05:09:15 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=9aaa652c

Add dostrip for EAPI 7

This patch includes the essential parts of the dostrip implementation
from portage-mgorny. All of the prepstrip code has moved to
bin/estrip, without any changes except the addition of argument
parsing for estrip --ignore, --queue, and --deque modes which are
equivalent to the corresponding ecompressdir modes.

Due to overlap, also ban the non-standard prepstrip and prepallstrip
helpers in EAPI 7, with a die message suggesting to use 'dostrip'
instead. Also ignore the non-standard STRIP_MASK variable for EAPI 7.

Bug: https://bugs.gentoo.org/203891

 bin/eapi.sh                     |  4 +++
 bin/ebuild-helpers/prepall      |  2 +-
 bin/ebuild-helpers/prepallstrip |  4 +++
 bin/ebuild-helpers/prepstrip    |  4 +++
 bin/ebuild.sh                   |  2 +-
 bin/estrip                      | 74 +++++++++++++++++++++++++++++++++++++++--
 bin/misc-functions.sh           |  6 ++++
 bin/phase-helpers.sh            | 29 ++++++++++++++++
 bin/save-ebuild-env.sh          |  4 +--
 9 files changed, 122 insertions(+), 7 deletions(-)

diff --git a/bin/eapi.sh b/bin/eapi.sh
index 326eb387e..f9a4744e9 100644
--- a/bin/eapi.sh
+++ b/bin/eapi.sh
@@ -76,6 +76,10 @@ ___eapi_has_docompress() {
        [[ ! ${1-${EAPI-0}} =~ ^(0|1|2|3)$ ]]
 }
 
+___eapi_has_dostrip() {
+       [[ ${1-${EAPI-0}} =~ 
^(0|1|2|3|4|4-python|4-slot-abi|5|5-hdepend|5-progress|6)$ ]]
+}
+
 ___eapi_has_nonfatal() {
        [[ ! ${1-${EAPI-0}} =~ ^(0|1|2|3)$ ]]
 }

diff --git a/bin/ebuild-helpers/prepall b/bin/ebuild-helpers/prepall
index 44643bb58..bc77af4a1 100755
--- a/bin/ebuild-helpers/prepall
+++ b/bin/ebuild-helpers/prepall
@@ -19,7 +19,7 @@ fi
 prepallman
 prepallinfo
 
-prepallstrip
+___eapi_has_dostrip || prepallstrip
 
 if has chflags $FEATURES ; then
        # Restore all the file flags that were saved at the beginning of 
prepall.

diff --git a/bin/ebuild-helpers/prepallstrip b/bin/ebuild-helpers/prepallstrip
index 59fa7cc61..4bde1f4b2 100755
--- a/bin/ebuild-helpers/prepallstrip
+++ b/bin/ebuild-helpers/prepallstrip
@@ -4,6 +4,10 @@
 
 source "${PORTAGE_BIN_PATH}"/isolated-functions.sh || exit 1
 
+if ___eapi_has_dostrip; then
+       die "${0##*/}: ${0##*/} has been banned for EAPI '$EAPI'; use 'dostrip' 
instead"
+fi
+
 if ! ___eapi_has_prefix_variables; then
        ED=${D}
 fi

diff --git a/bin/ebuild-helpers/prepstrip b/bin/ebuild-helpers/prepstrip
index 0ec4c16b3..9db06284d 100755
--- a/bin/ebuild-helpers/prepstrip
+++ b/bin/ebuild-helpers/prepstrip
@@ -4,4 +4,8 @@
 
 source "${PORTAGE_BIN_PATH}"/isolated-functions.sh || exit 1
 
+if ___eapi_has_dostrip; then
+       die "${0##*/}: ${0##*/} has been banned for EAPI '$EAPI'; use 'dostrip' 
instead"
+fi
+
 exec -a "${0}" "${PORTAGE_BIN_PATH}"/estrip "${@}"

diff --git a/bin/ebuild.sh b/bin/ebuild.sh
index 061b1aff4..11441bfb2 100755
--- a/bin/ebuild.sh
+++ b/bin/ebuild.sh
@@ -59,7 +59,7 @@ else
        # These dummy functions are for things that are likely to be called
        # in global scope, even though they are completely useless during
        # the "depend" phase.
-       funcs="diropts docompress exeopts get_KV insopts
+       funcs="diropts docompress dostrip exeopts get_KV insopts
                KV_major KV_micro KV_minor KV_to_int
                libopts register_die_hook register_success_hook
                __strip_duplicate_slashes

diff --git a/bin/estrip b/bin/estrip
index 2136e0d4d..fbd5882fa 100755
--- a/bin/estrip
+++ b/bin/estrip
@@ -30,6 +30,64 @@ if ${RESTRICT_strip} || ${FEATURES_nostrip} ; then
        ${FEATURES_installsources} || exit 0
 fi
 
+[[ ${0##*/} == prepstrip ]] && prepstrip=true || prepstrip=false
+
+if ! ${prepstrip}; then
+while [[ $# -gt 0 ]] ; do
+       case $1 in
+       --ignore)
+               shift
+
+               skip_dirs=()
+               for skip; do
+                       if [[ -d ${ED%/}/${skip#/} ]]; then
+                               skip_dirs+=( "${ED%/}/${skip#/}" )
+                       else
+                               rm -f "${ED%/}/${skip#/}.estrip" || die
+                       fi
+               done
+
+               if [[ ${skip_dirs[@]} ]]; then
+                       find "${skip_dirs[@]}" -name '*.estrip' -delete || die
+               fi
+
+               exit 0
+               ;;
+       --queue)
+               shift
+
+               find_paths=()
+               for path; do
+                       if [[ -e ${ED%/}/${path#/} ]]; then
+                               find_paths+=( "${ED%/}/${path#/}" )
+                       fi
+               done
+
+               if [[ ${find_paths[@]} ]]; then
+                       while IFS= read -r path; do
+                               >> "${path}.estrip" || die
+                       done < <(
+                               scanelf -yqRBF '#k%F' -k '.symtab' 
"${find_paths[@]}"
+                               find "${find_paths[@]}" -type f ! -type l -name 
'*.a'
+                       )
+               fi
+
+               exit 0
+               ;;
+       --dequeue)
+               [[ -n ${2} ]] && die "${0##*/}: --dequeue takes no additional 
arguments"
+               break
+               ;;
+       *)
+               die "${0##*/}: unknown arguments '$*'"
+               exit 1
+               ;;
+       esac
+       shift
+done
+set -- "${ED}"
+fi
+
 PRESERVE_XATTR=false
 if [[ ${KERNEL} == linux ]] && ${FEATURES_xattr} ; then
        PRESERVE_XATTR=true
@@ -292,6 +350,7 @@ else
        get_inode_number() { stat -c '%i' "$1"; }
 fi
 cd "${tmpdir}/inodes" || die "cd failed unexpectedly"
+if ${prepstrip}; then
 while read -r x ; do
        inode_link=$(get_inode_number "${x}") || die "stat failed unexpectedly"
        echo "${x}" >> "${inode_link}" || die "echo failed unexpectedly"
@@ -302,6 +361,13 @@ done < <(
                find "$@" -type f ! -type l -name '*.a'
        ) | LC_ALL=C sort -u
 )
+else
+while IFS= read -d '' -r x ; do
+       rm -f "${x}" || die
+       inode_link=$(get_inode_number "${x%.estrip}") || die "stat failed 
unexpectedly"
+       echo "${x%.estrip}" >> "${inode_link}" || die "echo failed unexpectedly"
+done < <(find "${ED}" -name '*.estrip' -print0)
+fi
 
 # Now we look for unstripped binaries.
 for inode_link in $(shopt -s nullglob; echo *) ; do
@@ -318,7 +384,11 @@ do
        f=$(file "${x}") || exit 0
        [[ -z ${f} ]] && exit 0
 
-       if ! ${SKIP_STRIP} ; then
+       if ${SKIP_STRIP} ; then
+               strip_this=false
+       elif ! ${prepstrip}; then
+               strip_this=true
+       else
                # The noglob funk is to support STRIP_MASK="/*/booga" and to 
keep
                #  the for loop from expanding the globs.
                # The eval echo is to support STRIP_MASK="/*/{booga,bar}" sex.
@@ -328,8 +398,6 @@ do
                        [[ /${x#${ED%/}} == ${m} ]] && strip_this=false && break
                done
                set +o noglob
-       else
-               strip_this=false
        fi
 
        # In Prefix we are usually an unprivileged user, so we can't strip

diff --git a/bin/misc-functions.sh b/bin/misc-functions.sh
index 7643af7b5..df8361036 100755
--- a/bin/misc-functions.sh
+++ b/bin/misc-functions.sh
@@ -224,6 +224,12 @@ install_qa_check() {
        ecompressdir --dequeue
        ecompress --dequeue
 
+       if ___eapi_has_dostrip; then
+               "${PORTAGE_BIN_PATH}"/estrip --queue "${PORTAGE_DOSTRIP[@]}"
+               "${PORTAGE_BIN_PATH}"/estrip --ignore 
"${PORTAGE_DOSTRIP_SKIP[@]}"
+               "${PORTAGE_BIN_PATH}"/estrip --dequeue
+       fi
+
        # Create NEEDED.ELF.2 regardless of RESTRICT=binchecks, since this info 
is
        # too useful not to have (it's required for things like preserve-libs), 
and
        # it's tempting for ebuild authors to set RESTRICT=binchecks for 
packages

diff --git a/bin/phase-helpers.sh b/bin/phase-helpers.sh
index 5eeecfef7..556d089b5 100644
--- a/bin/phase-helpers.sh
+++ b/bin/phase-helpers.sh
@@ -20,6 +20,9 @@ export MOPREFIX=${PN}
 export PORTAGE_DOCOMPRESS_SIZE_LIMIT="128"
 declare -a PORTAGE_DOCOMPRESS=( /usr/share/{doc,info,man} )
 declare -a PORTAGE_DOCOMPRESS_SKIP=( /usr/share/doc/${PF}/html )
+declare -a PORTAGE_DOSTRIP=( / )
+has strip ${RESTRICT} && PORTAGE_DOSTRIP=()
+declare -a PORTAGE_DOSTRIP_SKIP=()
 
 into() {
        if [ "$1" == "/" ]; then
@@ -160,6 +163,32 @@ docompress() {
        fi
 }
 
+dostrip() {
+       ___eapi_has_dostrip || die "'${FUNCNAME}' not supported in this EAPI"
+
+       local f g
+       if [[ $1 = "-x" ]]; then
+               shift
+               for f; do
+                       f=$(__strip_duplicate_slashes "${f}"); f=${f%/}
+                       [[ ${f:0:1} = / ]] || f="/${f}"
+                       for g in "${PORTAGE_DOSTRIP_SKIP[@]}"; do
+                               [[ ${f} = "${g}" ]] && continue 2
+                       done
+                       PORTAGE_DOSTRIP_SKIP+=( "${f}" )
+               done
+       else
+               for f; do
+                       f=$(__strip_duplicate_slashes "${f}"); f=${f%/}
+                       [[ ${f:0:1} = / ]] || f="/${f}"
+                       for g in "${PORTAGE_DOSTRIP[@]}"; do
+                               [[ ${f} = "${g}" ]] && continue 2
+                       done
+                       PORTAGE_DOSTRIP+=( "${f}" )
+               done
+       fi
+}
+
 useq() {
        has $EBUILD_PHASE prerm postrm || eqawarn \
                "QA Notice: The 'useq' function is deprecated (replaced by 
'use')"

diff --git a/bin/save-ebuild-env.sh b/bin/save-ebuild-env.sh
index e5ae8af88..947ac79d5 100644
--- a/bin/save-ebuild-env.sh
+++ b/bin/save-ebuild-env.sh
@@ -15,7 +15,7 @@ __save_ebuild_env() {
        if has --exclude-init-phases $* ; then
                unset S _E_DESTTREE _E_INSDESTTREE _E_DOCDESTTREE_ 
_E_EXEDESTTREE_ \
                        PORTAGE_DOCOMPRESS_SIZE_LIMIT PORTAGE_DOCOMPRESS \
-                       PORTAGE_DOCOMPRESS_SKIP
+                       PORTAGE_DOCOMPRESS_SKIP PORTAGE_DOSTRIP 
PORTAGE_DOSTRIP_SKIP
                if [[ -n $PYTHONPATH &&
                        ${PYTHONPATH%%:*} -ef $PORTAGE_PYM_PATH ]] ; then
                        if [[ $PYTHONPATH == *:* ]] ; then
@@ -60,7 +60,7 @@ __save_ebuild_env() {
                unpack __strip_duplicate_slashes econf einstall \
                __dyn_setup __dyn_unpack __dyn_clean \
                into insinto exeinto docinto \
-               insopts diropts exeopts libopts docompress \
+               insopts diropts exeopts libopts docompress dostrip \
                __abort_handler __abort_prepare __abort_configure 
__abort_compile \
                __abort_test __abort_install __dyn_prepare __dyn_configure \
                __dyn_compile __dyn_test __dyn_install \

Reply via email to