become overhaul.
[profile.git] / .profile.d / PATH.bashrc
1 # Path information is stored on separate lines in XXXdirs.
2 # We check each directory exists and add it to the appropriate PATH.
3 # Prepend paths with XXXdirs.pre.  They are guaranteed to precede other paths.
4 # Append paths with XXXdirs.post.  They are not guaranteed to follow others.
5 # Set per-OS files in $SYSTEM[/$ARCHITECTURE] subdirectories of $DIR.
6 #
7
8 # Location of the XXXdirs files.
9 DIR=${PROFILE_HOME:-~}/.PATH
10
11 # Paths to set and the file to get them from @variable to copy from.
12 PATHS="
13 PATH:bindirs
14 C_INCLUDE_PATH:incdirs
15 CPLUS_INCLUDE_PATH:@C_INCLUDE_PATH
16 LD_LIBRARY_PATH:libdirs
17 LD_RUN_PATH:@PATH
18 MANPATH:mandirs
19 PKG_CONFIG_PATH:pkgdirs
20 "
21
22 function sanitisepath() {
23   local paths="${@//:/ }"
24   local sane
25
26   for path in $paths; do
27     paths="${paths## }"
28     paths="${paths%% }"
29     paths="${paths#$path} "
30     if [ "${sane/:$path:/}" = "$sane" ]; then
31       sane="$sane:$path:"
32     fi
33   done
34
35   sane="${sane//::/:}"
36   sane="${sane#:}"
37   sane="${sane%:}"
38
39   echo "$sane"
40 }
41
42 # Set one path to be the same as another.
43 function copypath() {
44   local newpath="$1"; shift
45   local oldpath="$1"; shift
46
47   # Sanitise and export.
48   local path="$(eval echo \$$oldpath)"
49   [ -z "$path" ] || eval "export $newpath='$path'"
50 }
51
52 # Helper.
53 function addpath() {
54   local path="$1"; shift
55   local dir="$1"; shift
56
57   dir=$(eval echo "$dir")
58   if [ -d "$dir" ]; then
59     echo "$path:$dir"
60   else
61     echo "$path"
62   fi
63 }
64
65 # Set a path from directories.
66 function makepath() {
67   local newpath="$1"; shift
68   local dirs="$1"; shift
69
70   # Set IFS to newline only so that we can read $(embedded shell commands).
71   local JGD=$IFS
72   IFS='
73 '
74   # Read them.
75   local path=
76   while read dir; do
77     path=$(addpath "$path" "$dir")
78     if [ -n "$PROFILE_HOME" -a ! "${dir#\$HOME}" = "$dir" ]; then
79       dir="$PROFILE_HOME${dir#\$HOME}"
80       path=$(addpath "$path" "$dir")
81     fi
82   done < "$dirs"
83
84   # Restore IFS.
85   IFS=$JGD
86
87   # Are we setting, prepending or appending?
88   local existing="$(eval echo \$$newpath)"
89   dirs="${dirs##*/}"
90   local where="${dirs##*.}"
91   case "$where" in
92     "$dirs") ;;
93     pre) path="$path:$existing";;
94     post) path="$existing:$path";;
95     *) return;;
96   esac
97
98   # Sanitise path.
99   path=$(sanitisepath "$path")
100   [ -z "$path" ] && return
101
102   # Export.
103   eval "export $newpath='$path'"
104 }
105
106 # Construct directory list, omitting nonexistent and undefined ones.
107 dirs=
108 for dir in "${SYSTEM:-@}/${ARCHITECTURE:-@}" "${SYSTEM:-@}" ""; do
109   [ "${dir/@/}" = "$dir" ] || continue
110   [ -d "$DIR/$dir" ] || continue
111   dirs="$dirs,$DIR/$dir"
112   dirs="${dirs%%/}"
113 done
114 dirs="${dirs##,}"
115 [ "${dirs/,/}" = "$dirs" ] || dirs="{$dirs}"
116
117 for path in $PATHS; do
118   var="${path%:*}"
119   source="${path#*:}"
120
121   if [ "${source#@}" = "$source" ]; then
122     for dir in $(eval echo $dirs/$source{,.pre,.post}); do
123       [ -e "$dir" ] || continue
124       makepath "$var" "$dir"
125     done
126   else
127     copypath "$var" "${source#@}"
128   fi
129 done
130
131
132 unset DIR PATHS dir dirs path var source sanitisepath copypath makepath newpath addpath