From 9ba4335bccda6ad3ebb02c9178ec9a44ef1f76b8 Mon Sep 17 00:00:00 2001 From: Martin Winkler Date: Fri, 3 Feb 2023 10:25:05 +0100 Subject: [PATCH] python - install python version to custom prefix or altinstall --- seqs/python.cfg.example | 5 ++ seqs/python.sh | 123 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100644 seqs/python.cfg.example create mode 100755 seqs/python.sh diff --git a/seqs/python.cfg.example b/seqs/python.cfg.example new file mode 100644 index 0000000..64e1c83 --- /dev/null +++ b/seqs/python.cfg.example @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +readonly sc_pyVersion=3.10 +# If empty, configure (for altinstall) uses default value (/usr/local) +readonly sc_pyPrefix= #todo diff --git a/seqs/python.sh b/seqs/python.sh new file mode 100755 index 0000000..2ffb3ec --- /dev/null +++ b/seqs/python.sh @@ -0,0 +1,123 @@ +#!/usr/bin/env bash + +readonly toolName=python +readonly buildDeps=(build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget libbz2-dev) +readonly buildHome="/tmp/pythonbuild" +readonly buildTgz="${buildHome}/py.tgz" + +# Already defined by sequencer.sh, but may be overwritten +#readonly seq_configName="${sq_scriptName:?}.cfg" +#readonly seq_configTemplate="${seq_origin:?}/${sq_configName:?}.example" + +sq_aptOpt= +sq_config=0 +req_pyVersion= +sq_pyVersion= + +seq_config() { + ## or to use sequencer api with global config file: + if ! initSeqConfig "${seq_configName:?}" "${seq_configTemplate:?}" ; then + # End if no configuration file exists + dry || return 1 + fi + + ## Apt cmdline option to suppress user interaction + interactive || sq_aptOpt="-y" + + ## Disable error checks if external scripts are used + ## e.g. error on unbound variables + #disableErrorCheck + + ## Return of non zero value will abort the sequence + return 0 +} + +step_1_info() { echo 'Status'; } +step_1_alias() { echo 'status'; } +step_1() { + local pyPath= + if pyPath=$(which "python${sc_pyVersion}") ; then + info "$(python${sc_pyVersion} --version) installed" + info -a "at ($pyPath)" + else + info "${toolName} version ${sc_pyVersion} not installed" + fi +} + +step_10_info() { echo 'Setup build environment'; } +step_10_alias() { echo 'buildsetup'; } +step_10() { + exe apt update + exe apt install "${buildDeps[@]}" ${sq_aptOpt} +} + +step_11_info() { echo "(Alt)install given version"; } +step_11_options() { echo "[VERSION]"; } +step_11_alias() { echo "altinstall"; } +step_11() { + shift + local downUrl= + local version="${sc_pyVersion:?}" + [ -f "${buildTgz}" ] && return 0 + [ -n "${1:-}" ] && version="${1}" + if ! downUrl="$(getSourceUrl "${version}")" ; then + fatal "Could not determine download link for version ${1:-}" + fi + info "Downloading $sq_pyVersion from $downUrl" + exe mkdir -p "${buildHome}" + exe wget -O "${buildTgz}" "${downUrl}" +} + +step_12() { + local lPrefix= + [ -z "${sq_pyVersion}" ] && getSourceUrl "${sc_pyVersion}" >>/dev/null + exe cd "${buildHome}" + exe tar xf "${buildTgz}" + exe cd "Python-${sq_pyVersion}" + if [ -n "${sc_pyPrefix}" ] ; then + exe mkdir -p "${sc_pyPrefix}" + endReturn "Couldn't create prefix directory ${sc_pyPrefix}" + lPrefix="--prefix=${sc_pyPrefix}" + fi + + exe ./configure --enable-optimizations "${lPrefix}" +} + +step_13() { + [ -z "${sq_pyVersion}" ] && getSourceUrl "${sc_pyVersion}" >>/dev/null + exe cd "${buildHome}/Python-${sq_pyVersion}" + # Leave one processor for other tasks + exe make -j 3 +} + +step_14() { + local lInstall="altinstall" + [ -z "${sq_pyVersion}" ] && getSourceUrl "${sc_pyVersion}" >>/dev/null + exe cd "${buildHome}/Python-${sq_pyVersion}" + [ -n "${sc_pyPrefix}" ] && lInstall="install" + exe make "${lInstall}" +} + +# getSourceUrl +# : can be only the major version or more specific +# +# Get the download URL for the latest .tgz file for the given version. +# +# Examples (all valid): +# getSourceUrl 3 +# getSourceUrl 3.10 +# getSourceUrl 3.10.8 +getSourceUrl() { + [[ ${1:-} =~ ^[0-9\.]+$ ]] || return 1 + local downUrl= + downUrl="$(curl --silent -L "https://www.python.org/downloads/source/" | \ + grep --max-count 1 -Po "href=\"\K.*Python-${1//./\\.}.*?(?=\")")" + [[ -z "${downUrl}" ]] && return 1 + sq_pyVersion="$(grep -Po "python/\K.*?(?=/)" <<<"${downUrl}")" + echo "${downUrl}" +} + +# shellcheck disable=SC2034 # Appears unused +readonly sqr_minVersion=16 +# shellcheck disable=SC1091 # Don't follow this source +. /usr/local/bin/sequencer.sh