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 \
