summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scripts/crosstool-NG.sh.in8
-rw-r--r--scripts/override/install35
2 files changed, 41 insertions, 2 deletions
diff --git a/scripts/crosstool-NG.sh.in b/scripts/crosstool-NG.sh.in
index 41c3bcc..b39dee4 100644
--- a/scripts/crosstool-NG.sh.in
+++ b/scripts/crosstool-NG.sh.in
@@ -116,8 +116,12 @@ cat "${CT_LIB_DIR}/paths.sh" |while read trash line; do
tmpl="${CT_LIB_DIR}/scripts/override/__default"
fi
CT_DoLog DEBUG "Creating script-override for '${tool}' -> '${path}' using '${tmpl}' template"
- ${sed} -r -e "s#@CONFIG_SHELL@#${CT_CONFIG_SHELL}#g" \
- -e "s#@TOOL_PATH@#${path}#g" "${tmpl}" > "${CT_TOOLS_OVERRIDE_DIR}/bin/${tool}"
+ CT_DoExecLog ALL cp "${tmpl}" "${CT_TOOLS_OVERRIDE_DIR}/bin/${tool}"
+ CT_DoExecLog ALL ${sed} -i -r \
+ -e "s#@CONFIG_SHELL@#${CT_CONFIG_SHELL}#g" \
+ -e "s#@TOOL_PATH@#${path}#g" \
+ -e "s#@TOOLS_OVERRIDE_DIR@#${CT_TOOLS_OVERRIDE_DIR}#g" \
+ "${CT_TOOLS_OVERRIDE_DIR}/bin/${tool}"
CT_DoExecLog ALL chmod 700 "${CT_TOOLS_OVERRIDE_DIR}/bin/${tool}"
done
export PATH="${CT_TOOLS_OVERRIDE_DIR}/bin:${PATH}"
diff --git a/scripts/override/install b/scripts/override/install
new file mode 100644
index 0000000..e3954fb
--- /dev/null
+++ b/scripts/override/install
@@ -0,0 +1,35 @@
+#!@CONFIG_SHELL@
+
+# Do the most common case first
+if [ -z "${__PORTAGE_HELPER_PATH}" ]; then
+ exec @TOOL_PATH@ "$@"
+fi
+
+# Not so simple case: Gentoo uses *two* wrappers around install script
+# to deal with extended attributes:
+# - /usr/lib/portage/python*/ebuild-helpers/xattr/install
+# This sets __PORTAGE_HELPER_PATH (see the check above) and
+# invokes either C- or Python-based wrapper (they do the same
+# thing anyway). E.g., let it be /usr/bin/install-xattrs...
+# - /usr/bin/install-xattrs
+# This now analyzes $PATH and invokes 'install' in the first directory
+# in $PATH where it is found, but not the __PORTAGE_HELPER_PATH
+# This scheme breaks if we interject another install wrapper, resulting
+# in a fork bomb. Hence, if we detected a loop, we need to remove our
+# own directory from $PATH and try again. Ironically, the very code below
+# based on that portage helper.
+IFS=:
+set -f
+path=
+for x in ${PATH}; do
+ case "${x}" in
+ @TOOLS_OVERRIDE_DIR@/bin) continue;;
+ esac
+ if test -n "${path}"; then
+ path="${path}:${x}"
+ else
+ path="${x}"
+ fi
+done
+PATH="${path}"
+exec @TOOL_PATH@ "$@"