cmd/shellenv: improve for newer macOS using /usr/libexec/path_helper
				
					
				
			On macOS 14 and newer, `/usr/libexec/path_helper` supports setting a `PATH_HELPER_ROOT` environment variable. With this set, `path_helper` checks `$PATH_HELPER_ROOT/etc/paths` and `$PATH_HELPER_ROOT/etc/paths.d` in the same way it checks `/etc/paths` and `/etc/paths.d`. We can use this to simplify management of the user's `PATH` variable when they do `brew shellenv`. In particular, if their system supports it, we delegate setting the `PATH` environment variable to `path_helper` instead of our own code. We also write a default `etc/paths` file if one is not already present. This is nicer because it simplifies management of the user's `PATH` variable. For example, if a user wants a keg-only formula to be in their `PATH`, they can simply add the necessary path to `/etc/paths` or `/etc/paths.d` without having to do something like `brew link --force` or adding to `PATH` themselves. When `/usr/libexec/path_helper` is not available, we just fall back to the existing code.
This commit is contained in:
		
							parent
							
								
									06fc2247c7
								
							
						
					
					
						commit
						6dc90cbf83
					
				@ -54,6 +54,13 @@ then
 | 
			
		||||
  HOMEBREW_DEFAULT_CACHE="${HOME}/Library/Caches/Homebrew"
 | 
			
		||||
  HOMEBREW_DEFAULT_LOGS="${HOME}/Library/Logs/Homebrew"
 | 
			
		||||
  HOMEBREW_DEFAULT_TEMP="/private/tmp"
 | 
			
		||||
 | 
			
		||||
  HOMEBREW_MACOS_VERSION="$(/usr/bin/sw_vers -productVersion)"
 | 
			
		||||
 | 
			
		||||
  IFS=. read -r -a MACOS_VERSION_ARRAY <<<"${HOMEBREW_MACOS_VERSION}"
 | 
			
		||||
  printf -v HOMEBREW_MACOS_VERSION_NUMERIC "%02d%02d%02d" "${MACOS_VERSION_ARRAY[@]}"
 | 
			
		||||
 | 
			
		||||
  unset MACOS_VERSION_ARRAY
 | 
			
		||||
else
 | 
			
		||||
  CACHE_HOME="${HOMEBREW_XDG_CACHE_HOME:-${HOME}/.cache}"
 | 
			
		||||
  HOMEBREW_DEFAULT_CACHE="${CACHE_HOME}/Homebrew"
 | 
			
		||||
@ -534,7 +541,6 @@ then
 | 
			
		||||
  HOMEBREW_PRODUCT="Homebrew"
 | 
			
		||||
  HOMEBREW_SYSTEM="Macintosh"
 | 
			
		||||
  [[ "${HOMEBREW_PROCESSOR}" == "x86_64" ]] && HOMEBREW_PROCESSOR="Intel"
 | 
			
		||||
  HOMEBREW_MACOS_VERSION="$(/usr/bin/sw_vers -productVersion)"
 | 
			
		||||
  # Don't change this from Mac OS X to match what macOS itself does in Safari on 10.12
 | 
			
		||||
  HOMEBREW_OS_USER_AGENT_VERSION="Mac OS X ${HOMEBREW_MACOS_VERSION}"
 | 
			
		||||
 | 
			
		||||
@ -545,9 +551,6 @@ then
 | 
			
		||||
    HOMEBREW_PHYSICAL_PROCESSOR="arm64"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  IFS=. read -r -a MACOS_VERSION_ARRAY <<<"${HOMEBREW_MACOS_VERSION}"
 | 
			
		||||
  printf -v HOMEBREW_MACOS_VERSION_NUMERIC "%02d%02d%02d" "${MACOS_VERSION_ARRAY[@]}"
 | 
			
		||||
 | 
			
		||||
  IFS=. read -r -a MACOS_VERSION_ARRAY <<<"${HOMEBREW_MACOS_OLDEST_ALLOWED}"
 | 
			
		||||
  printf -v HOMEBREW_MACOS_OLDEST_ALLOWED_NUMERIC "%02d%02d%02d" "${MACOS_VERSION_ARRAY[@]}"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -18,6 +18,21 @@ homebrew-shellenv() {
 | 
			
		||||
    HOMEBREW_SHELL_NAME="$(/bin/ps -p "${PPID}" -c -o comm=)"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if [[ -n "${HOMEBREW_MACOS}" ]] &&
 | 
			
		||||
     [[ "${HOMEBREW_MACOS_VERSION_NUMERIC}" -ge "140000" ]] &&
 | 
			
		||||
     [[ -x /usr/libexec/path_helper ]]
 | 
			
		||||
  then
 | 
			
		||||
    if [[ ! -f "${HOMEBREW_PREFIX}/etc/paths" ]]
 | 
			
		||||
    then
 | 
			
		||||
      printf '%s/bin\n%s/sbin\n' "${HOMEBREW_PREFIX}" "${HOMEBREW_PREFIX}" >"${HOMEBREW_PREFIX}/etc/paths"
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    if [[ -r "${HOMEBREW_PREFIX}/etc/paths" ]]
 | 
			
		||||
    then
 | 
			
		||||
      PATH_HELPER_ROOT="${HOMEBREW_PREFIX}"
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  case "${HOMEBREW_SHELL_NAME}" in
 | 
			
		||||
    fish | -fish)
 | 
			
		||||
      echo "set -gx HOMEBREW_PREFIX \"${HOMEBREW_PREFIX}\";"
 | 
			
		||||
@ -31,7 +46,12 @@ homebrew-shellenv() {
 | 
			
		||||
      echo "setenv HOMEBREW_PREFIX ${HOMEBREW_PREFIX};"
 | 
			
		||||
      echo "setenv HOMEBREW_CELLAR ${HOMEBREW_CELLAR};"
 | 
			
		||||
      echo "setenv HOMEBREW_REPOSITORY ${HOMEBREW_REPOSITORY};"
 | 
			
		||||
      if [[ -n "${PATH_HELPER_ROOT}" ]]
 | 
			
		||||
      then
 | 
			
		||||
        echo "eval \`/usr/bin/env PATH_HELPER_ROOT=\"${PATH_HELPER_ROOT}\" /usr/libexec/path_helper -c\`;"
 | 
			
		||||
      else
 | 
			
		||||
        echo "setenv PATH ${HOMEBREW_PREFIX}/bin:${HOMEBREW_PREFIX}/sbin:\$PATH;"
 | 
			
		||||
      fi
 | 
			
		||||
      echo "test \${?MANPATH} -eq 1 && setenv MANPATH :\${MANPATH};"
 | 
			
		||||
      echo "setenv INFOPATH ${HOMEBREW_PREFIX}/share/info\`test \${?INFOPATH} -eq 1 && echo :\${INFOPATH}\`;"
 | 
			
		||||
      ;;
 | 
			
		||||
@ -47,7 +67,12 @@ homebrew-shellenv() {
 | 
			
		||||
      echo "export HOMEBREW_PREFIX=\"${HOMEBREW_PREFIX}\";"
 | 
			
		||||
      echo "export HOMEBREW_CELLAR=\"${HOMEBREW_CELLAR}\";"
 | 
			
		||||
      echo "export HOMEBREW_REPOSITORY=\"${HOMEBREW_REPOSITORY}\";"
 | 
			
		||||
      if [[ -n "${PATH_HELPER_ROOT}" ]]
 | 
			
		||||
      then
 | 
			
		||||
        echo "eval \"\$(PATH_HELPER_ROOT=\"${PATH_HELPER_ROOT}\" /usr/libexec/path_helper -s)\""
 | 
			
		||||
      else
 | 
			
		||||
        echo "export PATH=\"${HOMEBREW_PREFIX}/bin:${HOMEBREW_PREFIX}/sbin\${PATH+:\$PATH}\";"
 | 
			
		||||
      fi
 | 
			
		||||
      echo "[ -z \"\${MANPATH-}\" ] || export MANPATH=\":\${MANPATH#:}\";"
 | 
			
		||||
      echo "export INFOPATH=\"${HOMEBREW_PREFIX}/share/info:\${INFOPATH:-}\";"
 | 
			
		||||
      ;;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user