This can be used to create copies of Python scripts for various
implementation when build system doesn't do that.
---
gx86/eclass/python-r1.eclass | 126 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 126 insertions(+)
diff --git a/gx86/eclass/python-r1.eclass b/gx86/eclass/python-r1.eclass
index d7cdfa8..6178969 100644
--- a/gx86/eclass/python-r1.eclass
+++ b/gx86/eclass/python-r1.eclass
@@ -412,3 +412,129 @@ python_export_best() {
debug-print "${FUNCNAME}: Best implementation is: ${impl}"
python_export "${impl}" "${@}"
}
+
+# @FUNCTION: _python_rewrite_shebang
+# @INTERNAL
+# @USAGE: [<EPYTHON>] <path>...
+# @DESCRIPTION:
+# Replaces 'python' executable in the shebang with the executable name
+# of the specified interpreter. If no EPYTHON value (implementation) is
+# used, the current ${EPYTHON} will be used.
+#
+# All specified files must start with a 'python' shebang. A file not
+# having a matching shebang will be refused. The exact shebang style
+# will be preserved in order not to break anything.
+#
+# Example conversions:
+# @CODE
+# From: #!/usr/bin/python -R
+# To: #!/usr/bin/python2.7 -R
+#
+# From: #!/usr/bin/env FOO=bar python
+# To: #!/usr/bin/env FOO=bar python2.7
+# @CODE
+_python_rewrite_shebang() {
+ debug-print-function ${FUNCNAME} "${@}"
+
+ local impl
+ case "${1}" in
+ python*|jython*|pypy-c*)
+ impl=${1}
+ shift
+ ;;
+ *)
+ impl=${EPYTHON}
+ [[ ${impl} ]] || die "${FUNCNAME}: no impl nor EPYTHON"
+ ;;
+ esac
+ debug-print "${FUNCNAME}: implementation: ${impl}"
+
+ local f
+ for f; do
+ local shebang=$(head -n 1 "${f}")
+ debug-print "${FUNCNAME}: path = ${f}"
+ debug-print "${FUNCNAME}: shebang = ${shebang}"
+
+ if [[ ${shebang} != *python* ]]; then
+ eerror "A file does not seem to have a supported
shebang:"
+ eerror " file: ${f}"
+ eerror " shebang: ${shebang}"
+ die "${FUNCNAME}: ${f} does not seem to have a valid
shebang"
+ fi
+
+ sed -i -e "s:python:${impl}:" "${f}" || die
+ done
+}
+
+# @FUNCTION: _python_ln_rel
+# @USAGE: <from> <to>
+# @DESCRIPTION:
+# Create a relative symlink.
+_python_ln_rel() {
+ debug-print-function ${FUNCNAME} "${@}"
+
+ local from=${1}
+ local to=${2}
+
+ local frpath=${from%/*}/
+ local topath=${to%/*}/
+ local rel_path=
+
+ # remove double slashes
+ frpath=${frpath/\/\///}
+ topath=${topath/\/\///}
+
+ while [[ ${topath} ]]; do
+ local frseg=${frpath%%/*}
+ local toseg=${topath%%/*}
+
+ if [[ ${frseg} != ${toseg} ]]; then
+ rel_path=../${rel_path}${frseg:+${frseg}/}
+ fi
+
+ frpath=${frpath#${frseg}/}
+ topath=${topath#${toseg}/}
+ done
+ rel_path+=${frpath}${1##*/}
+
+ debug-print "${FUNCNAME}: ${from} -> ${to}"
+ debug-print "${FUNCNAME}: rel_path = ${rel_path}"
+
+ ln -fs "${rel_path}" "${to}"
+}
+
+# @FUNCTION: python_replicate_scripts
+# @USAGE: <path>...
+# @DESCRIPTION:
+# Copy the given script to variants for all enabled Python
+# implementations, then replace it with a symlink to the wrapper.
+#
+# All specified files must start with a 'python' shebang. A file not
+# having a matching shebang will be refused.
+python_replicate_scripts() {
+ debug-print-function ${FUNCNAME} "${@}"
+
+ local suffixes=()
+
+ _add_suffix() {
+ suffixes+=( "${EPYTHON}" )
+ }
+ python_foreach_impl _add_suffix
+ debug-print "${FUNCNAME}: suffixes = ( ${suffixes[@]} )"
+
+ local f suffix
+ for suffix in "${suffixes[@]}"; do
+ for f; do
+ local newf=${f}-${suffix}
+
+ debug-print "${FUNCNAME}: ${f} -> ${newf}"
+ cp "${f}" "${newf}" || die
+ done
+
+ _python_rewrite_shebang "${suffix}" "${@/%/-${suffix}}"
+ done
+
+ for f; do
+ _python_ln_rel "${ED}"/usr/bin/python-exec "${f}" || die
+ done
+}
--
1.7.12.4