#!/bin/sh # tools/post-install.sh — wire system PATH after `make install`, and # reverse it on `make uninstall`. Idempotent on both sides. # # Usage: tools/post-install.sh # # Behavior by host OS (uname -s): # # SunOS (illumos / Solaris) with prefix not in /usr or /usr/local: # Add or remove $prefix/bin to/from the PATH= line of /etc/default/login # (override with LOGIN_DEFAULTS=...). illumos man(1) derives the manpath # from PATH by replacing trailing /bin with /share/man, so wiring PATH # is enough for `man party` to work without -M. # # Linux / *BSD / macOS with prefix in {/usr, /usr/local}: # Already on default PATH and MANPATH. No-op. # # Anything else (custom PREFIX on Linux/BSD/macOS, or unknown OS): # Print the export lines the user needs to add to a shell rc. # Do not mutate any system file. # # DESTDIR-aware: the Makefile skips this script entirely when DESTDIR is set # (package staging context — mutating /etc on the build host is wrong). set -eu usage() { echo "usage: $0 " >&2 exit 2 } [ $# -eq 2 ] || usage action=$1 prefix=$2 case "$action" in install|uninstall) ;; *) usage ;; esac [ -n "$prefix" ] || usage bindir="$prefix/bin" mandir="$prefix/share/man" LOGIN_DEFAULTS=${LOGIN_DEFAULTS:-/etc/default/login} uname_s=$(uname -s) # Print install- or uninstall-side instructions for setting/clearing PATH and # MANPATH in a shell rc. Used when we don't (or won't) edit any system file. print_manual_instructions() { verb=$1 bd=$2 md=$3 osname=$4 if [ "$osname" = "Linux" ] || [ "$osname" = "FreeBSD" ] || [ "$osname" = "NetBSD" ] \ || [ "$osname" = "OpenBSD" ] || [ "$osname" = "DragonFly" ] || [ "$osname" = "Darwin" ]; then header="PREFIX is non-standard on $osname; not modifying system files." else header="Unrecognized OS '$osname'; not modifying system files." fi if [ "$verb" = "install" ]; then cat <&2 return 0 fi if [ ! -w "$file" ]; then echo "$file is not writable (run as root); skipping PATH wiring." >&2 return 0 fi tmpf="$file.party.tmp.$$" # awk exits 0 if it modified the file, 1 if no change was needed. if awk -v verb="$verb" -v needle="$needle" ' BEGIN { changed = 0; path_seen = 0 } /^PATH=/ && !path_seen { path_seen = 1 val = substr($0, 6) n = split(val, parts, ":") present = 0 for (i = 1; i <= n; i++) if (parts[i] == needle) present = 1 if (verb == "install") { if (present) { print; next } if (val == "") print "PATH=" needle else print $0 ":" needle changed = 1 next } if (verb == "uninstall") { if (!present) { print; next } out = "" for (i = 1; i <= n; i++) { if (parts[i] == needle) continue out = (out == "" ? parts[i] : out ":" parts[i]) } print "PATH=" out changed = 1 next } } { print } END { exit changed ? 0 : 1 } ' "$file" > "$tmpf"; then ts=$(date +%Y%m%d%H%M%S) cp -p "$file" "$file.before-party.$ts" mv "$tmpf" "$file" case "$verb" in install) echo "Added $needle to PATH in $file (backup: $file.before-party.$ts)" ;; uninstall) echo "Removed $needle from PATH in $file (backup: $file.before-party.$ts)" ;; esac else rm -f "$tmpf" case "$verb" in install) echo "$needle already in PATH in $file; nothing to do." ;; uninstall) echo "$needle not in PATH in $file; nothing to do." ;; esac fi return 0 } case "$uname_s" in SunOS) case "$prefix" in /usr|/usr/local) echo "$prefix is on the default illumos PATH; no system wiring needed." ;; *) edit_path_line "$action" "$LOGIN_DEFAULTS" "$bindir" ;; esac ;; Linux|FreeBSD|NetBSD|OpenBSD|DragonFly|Darwin) case "$prefix" in /usr|/usr/local) : # already on PATH and MANPATH on these platforms ;; *) print_manual_instructions "$action" "$bindir" "$mandir" "$uname_s" ;; esac ;; *) print_manual_instructions "$action" "$bindir" "$mandir" "$uname_s" ;; esac