#!/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