summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Neyman <stilor@att.net>2017-01-28 08:11:08 (GMT)
committerAlexey Neyman <stilor@att.net>2017-01-30 20:10:47 (GMT)
commit7d1b203d06408f9dcc360095b46b8e73e870ee3c (patch)
treeb77bf69afd45b11849d0d542928cad20d3c057cb
parenta08a4c4b88fa2b2d770bda1fb1590ca80904fca7 (diff)
Add install wrapper
... to work around Gentoo's wrapper idiosyncrasy. Signed-off-by: Alexey Neyman <stilor@att.net>
-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@ "$@"