summaryrefslogtreecommitdiff
blob: f17d1bb39363a226581a301ea609f4609c18c38f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
diff -ru baselayout-1.12.5.orig/etc/profile baselayout-1.12.5/etc/profile
--- baselayout-1.12.5.orig/etc/profile	2009-03-24 08:18:37.000000000 +0100
+++ baselayout-1.12.5/etc/profile	2009-03-24 11:50:57.000000000 +0100
@@ -4,6 +4,40 @@
 # environment for login shells.
 #
 
+#
+# for prefix-chaining, the very first thing to do is to load
+# the profiles for all chained instances above.
+#
+# TODO: is it safe in any case to shell source make.conf?
+# don't do any recursive expansion here. if the parent can
+# use READONLY_EPREFIX's, it has to have the same profile as
+# we have here, and thus it will source parents before
+# evaluating anything from itself.
+#
+_ro_root=$(. "@GENTOO_PORTAGE_EPREFIX@"/etc/make.conf && echo $READONLY_EPREFIX)
+_ro_deps=${_ro_root#*:}
+_ro_root=${_ro_root%:*}
+if [ -n "${_ro_root}" -a -f "${_ro_root}"/etc/profile ]; then
+	. "${_ro_root}"/etc/profile
+fi
+
+#
+# With prefix-chaining we want another set of variables that
+# should be retained for all prefixes. for example it is ok
+# to retain PKG_CONFIG_PATH if the parent of the chain can
+# be used to resolve RDEPEND...
+#
+if [[ -n "${_ro_root}" ]]; then
+	_ro_chained_path_vars="PATH MANPATH"
+
+	[[ ${_ro_deps} == *RDEPEND* ]] && 
+		_ro_chained_path_vars="${_ro_chained_path_vars} PKG_CONFIG_PATH"
+
+	for var in ${_ro_chained_path_vars}; do
+		eval "_ro_backupenv_paths_${var}=\${${var}}"
+	done
+fi
+
 # Load environment settings from profile.env, which is created by
 # env-update from the files in /etc/env.d
 if [ -e "@GENTOO_PORTAGE_EPREFIX@"/etc/profile.env ] ; then
@@ -21,10 +55,17 @@
 # It is intentional in the following line to use || instead of -o.
 # This way the evaluation can be short-circuited and calling whoami is
 # avoided.
+#
+# system directories are only appended if this prefix is the last
+# one in a chain of prefixes (or the only prefix in the chain), so
+# that they don't end up in the middle of multiple different prefix
+# paths (profile is recursive now, see above!)
 if [ "$EUID" = "0" ] || [ "$USER" = "root" ] ; then
-	PATH="@GENTOO_PORTAGE_EPREFIX@/usr/sbin:@GENTOO_PORTAGE_EPREFIX@/usr/bin:@GENTOO_PORTAGE_EPREFIX@/sbin:@GENTOO_PORTAGE_EPREFIX@/bin:${ROOTPATH}:/usr/sbin:/usr/bin:/sbin:/bin"
+	PATH="@GENTOO_PORTAGE_EPREFIX@/usr/sbin:@GENTOO_PORTAGE_EPREFIX@/usr/bin:@GENTOO_PORTAGE_EPREFIX@/sbin:@GENTOO_PORTAGE_EPREFIX@/bin:${ROOTPATH}"
+	[[ -z "${_ro_root}" ]] && PATH="$PATH:/usr/sbin:/usr/bin:/sbin:/bin"
 else
-	PATH="@GENTOO_PORTAGE_EPREFIX@/usr/bin:@GENTOO_PORTAGE_EPREFIX@/bin:${PATH}:/usr/bin:/bin"
+	PATH="@GENTOO_PORTAGE_EPREFIX@/usr/bin:@GENTOO_PORTAGE_EPREFIX@/bin:${PATH}"
+	[[ -z "${_ro_root}" ]] && PATH="$PATH:/usr/bin:/bin"
 fi
 export PATH
 unset ROOTPATH
@@ -63,3 +104,18 @@
 	fi
 done
 unset sh
+
+#
+# finally chain the save variables for previous prefixes in the chain.
+#
+if [[ -n "${_ro_chained_path_vars}" ]]; then
+	for var in ${_ro_chained_path_vars}; do
+		eval "export ${var}=\${${var}}:\${_ro_backupenv_paths_${var}}"
+		eval "unset _ro_backupenv_paths_${var}"
+	done
+fi
+
+unset _ro_root
+unset _ro_deps
+unset _ro_chained_path_vars
+