From bbb2f93cee60f21224b16fce2f777f5fe9e21095 Mon Sep 17 00:00:00 2001 From: Bruce Toll <4109762+tollb@users.noreply.github.com> Date: Mon, 28 Jan 2019 16:40:31 -0500 Subject: wrap-gapps-hook.sh: only wrap links when required Unless dontWrapGapps is set, the wrap-gapps-hook.sh will currently wrap all executables (and symbolic links to executables) found under the target directories: bin and libexec. As a result, if a symbolic link in a target directory points to an executable in a target directory, both will get wrapped. This causes an extra shell/exec when following the symbolic link, as well as increasing the size of the final executable's environment. To avoid wrapping a link to an already wrapped executable, this commit splits the determination of what gets wrapped into two phases: 1. All binaries under the target directories are wrapped and logged with "Wrapping program ..." 2. All links to executables under the target directories are identified and checked to see if they reference an executable under one of the target directories. If yes, the required wrapping has already been performed on the associated binary (in phase 1), so no wrapping is done and "Not wrapping link: ... (already wrapped)" is logged. If no, the link points at an executable that hasn't been wrapped, so the link is wrapped and "Wrapping link: ..." is logged. As an example, the yelp package has a bin directory that contains an executable "yelp" and a symbolic link "gnome-help" -> "yelp". Prior to this commit, the bin directory would contain these files after wrapping: gnome-help -- wrapper to exec .gnome-help-wrapped .gnome-help-wrapped -- a symbolic link to yelp yelp -- wrapper to exec .yelp-wrapped .yelp-wrapped -- the original yelp binary After this commit, the bin directory will instead contain: gnome-help -- a symbolic link to yelp yelp -- wrapper to exec .yelp-wrapped .yelp-wrapped -- the original yelp binary NOTE: The primary motivation for this commit is to avoid obscuring the fact that two or more paths are simple aliases and expected to behave identically. It also reduces the likelihood of hitting limits related to environment variable size. LIMITATION: The method used above is intended to be conservative and will still wrap symbolic links to other symbolic links when the ultimate target is outside of bin or libexec. --- pkgs/build-support/setup-hooks/wrap-gapps-hook.sh | 28 +++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) (limited to 'pkgs') diff --git a/pkgs/build-support/setup-hooks/wrap-gapps-hook.sh b/pkgs/build-support/setup-hooks/wrap-gapps-hook.sh index 25ac12996cc..b5ceb4a13d8 100644 --- a/pkgs/build-support/setup-hooks/wrap-gapps-hook.sh +++ b/pkgs/build-support/setup-hooks/wrap-gapps-hook.sh @@ -36,16 +36,40 @@ wrapGAppsHook() { done if [[ -z "$dontWrapGApps" ]]; then + targetDirsThatExist=() + targetDirsRealPath=() + + # wrap binaries targetDirs=( "${prefix}/bin" "${prefix}/libexec" ) for targetDir in "${targetDirs[@]}"; do if [[ -d "${targetDir}" ]]; then - find -L "${targetDir}" -type f -executable -print0 \ + targetDirsThatExist+=("${targetDir}") + targetDirsRealPath+=("$(realpath "${targetDir}")/") + find "${targetDir}" -type f -executable -print0 \ | while IFS= read -r -d '' file; do - echo "Wrapping program ${file}" + echo "Wrapping program '${file}'" wrapProgram "${file}" "${gappsWrapperArgs[@]}" done fi done + + # wrap links to binaries that point outside targetDirs + # Note: links to binaries within targetDirs do not need + # to be wrapped as the binaries have already been wrapped + if [[ ${#targetDirsThatExist[@]} -ne 0 ]]; then + find "${targetDirsThatExist[@]}" -type l -xtype f -executable -print0 \ + | while IFS= read -r -d '' linkPath; do + linkPathReal=$(realpath "${linkPath}") + for targetPath in "${targetDirsRealPath[@]}"; do + if [[ "$linkPathReal" == "$targetPath"* ]]; then + echo "Not wrapping link: '$linkPath' (already wrapped)" + continue 2 + fi + done + echo "Wrapping link: '$linkPath'" + wrapProgram "${linkPath}" "${gappsWrapperArgs[@]}" + done + fi fi } -- cgit 1.4.1