From 1de6fe4ba77f507ff6e2110145efa6a3ff8acd24 Mon Sep 17 00:00:00 2001 From: Dmitriy Rabotyagov Date: Wed, 18 Mar 2020 18:29:32 +0200 Subject: [PATCH] Add python-stow-versions element This element is designed to install latest minor versions of different python releases, like py27, py35, py36, py37, py38 into stow directory, and later easily enable them with stow. Change-Id: Iab6d20e7643e549b53c629fb430e58b1c5e72991 --- .../elements/python-stow-versions/README.rst | 5 ++ .../python-stow-versions/element-deps | 2 + .../install.d/70-python-build | 38 ++++++++++++++ .../package-installs.yaml | 18 +++++++ .../elements/python-stow-versions/pkg-map | 51 +++++++++++++++++++ .../post-install.d/70-python-build | 15 ++++++ .../source-repository-pyenv | 1 + .../test-python-stow/element-deps | 4 ++ .../environment.d/70-test-python-stow.bash | 1 + .../install.d/69-test-python-stow | 13 +++++ .../install.d/71-test-python-stow | 27 ++++++++++ 11 files changed, 175 insertions(+) create mode 100644 diskimage_builder/elements/python-stow-versions/README.rst create mode 100644 diskimage_builder/elements/python-stow-versions/element-deps create mode 100755 diskimage_builder/elements/python-stow-versions/install.d/70-python-build create mode 100644 diskimage_builder/elements/python-stow-versions/package-installs.yaml create mode 100644 diskimage_builder/elements/python-stow-versions/pkg-map create mode 100755 diskimage_builder/elements/python-stow-versions/post-install.d/70-python-build create mode 100644 diskimage_builder/elements/python-stow-versions/source-repository-pyenv create mode 100644 diskimage_builder/elements/python-stow-versions/test-elements/test-python-stow/element-deps create mode 100644 diskimage_builder/elements/python-stow-versions/test-elements/test-python-stow/environment.d/70-test-python-stow.bash create mode 100755 diskimage_builder/elements/python-stow-versions/test-elements/test-python-stow/install.d/69-test-python-stow create mode 100755 diskimage_builder/elements/python-stow-versions/test-elements/test-python-stow/install.d/71-test-python-stow diff --git a/diskimage_builder/elements/python-stow-versions/README.rst b/diskimage_builder/elements/python-stow-versions/README.rst new file mode 100644 index 00000000..ae118614 --- /dev/null +++ b/diskimage_builder/elements/python-stow-versions/README.rst @@ -0,0 +1,5 @@ +==================== +python-stow-versions +==================== + +Element that installs latest minor releases of python diff --git a/diskimage_builder/elements/python-stow-versions/element-deps b/diskimage_builder/elements/python-stow-versions/element-deps new file mode 100644 index 00000000..73d637d4 --- /dev/null +++ b/diskimage_builder/elements/python-stow-versions/element-deps @@ -0,0 +1,2 @@ +package-installs +source-repositories diff --git a/diskimage_builder/elements/python-stow-versions/install.d/70-python-build b/diskimage_builder/elements/python-stow-versions/install.d/70-python-build new file mode 100755 index 00000000..f7124946 --- /dev/null +++ b/diskimage_builder/elements/python-stow-versions/install.d/70-python-build @@ -0,0 +1,38 @@ +#!/bin/bash + +if [ ${DIB_DEBUG_TRACE:-0} -gt 1 ]; then + set -x +fi +set -eu +set -o pipefail + +#Install python-build +/pyenv/plugins/python-build/install.sh + +DIB_PYTHON_VERSIONS=${DIB_PYTHON_VERSIONS:-"2.7,3.5,3.6,3.7,3.8,3.9"} +DIB_VERSIONS_TO_INSTALL=${1:-$DIB_PYTHON_VERSIONS} + +# Get pyenv versions +DIB_PYENV_VERSIONS=$(python-build --definitions \ + | egrep "^\s*[2,3]\.[0-9]{1,2}\.[0-9]{1,2}$") + +declare -A DIB_PYTHON_VERSIONS_ARRAY + +for version in ${DIB_PYENV_VERSIONS}; do + DIB_PYTHON_VERSIONS_ARRAY[${version%.*}]+="${version##*.} " +done + +if [ -n $DIB_VERSIONS_TO_INSTALL ]; then + readarray -t DIB_VERSIONS_ARRAY <<<\ + "$(echo "$DIB_VERSIONS_TO_INSTALL" | tr ',' '\n')" +fi + +for key in ${!DIB_PYTHON_VERSIONS_ARRAY[@]}; do + if ([ -n $DIB_VERSIONS_ARRAY ] && \ + [[ " ${DIB_VERSIONS_ARRAY[@]} " =~ " ${key} " ]]) || \ + [ -z ${DIB_VERSIONS_ARRAY} ]; then + DIB_LAST_VERSION=${key}.$(echo "${DIB_PYTHON_VERSIONS_ARRAY[${key}]}" \ + | sed "s/ /\n/g" | sort -nr | head -n1) + python-build ${DIB_LAST_VERSION} /usr/local/stow/python-${DIB_LAST_VERSION} + fi +done diff --git a/diskimage_builder/elements/python-stow-versions/package-installs.yaml b/diskimage_builder/elements/python-stow-versions/package-installs.yaml new file mode 100644 index 00000000..e8649491 --- /dev/null +++ b/diskimage_builder/elements/python-stow-versions/package-installs.yaml @@ -0,0 +1,18 @@ +bzip-dev: + build-only: True +curl: +gcc: + build-only: True +git: + build-only: True +make: + build-only: True +readline-dev: + build-only: True +ssl-dev: + build-only: True +stow: +sqlite-dev: + build-only: True +zlib-dev: + build-only: True diff --git a/diskimage_builder/elements/python-stow-versions/pkg-map b/diskimage_builder/elements/python-stow-versions/pkg-map new file mode 100644 index 00000000..9caf8e0f --- /dev/null +++ b/diskimage_builder/elements/python-stow-versions/pkg-map @@ -0,0 +1,51 @@ +{ + "family": { + "debian": { + "bzip-dev": "libbz2-dev", + "curl": "curl", + "gcc": "gcc", + "git": "git", + "make": "make", + "readline-dev": "libreadline-dev", + "ssl-dev": "libssl-dev", + "stow": "stow", + "sqlite-dev": "libsqlite3-dev", + "zlib-dev": "zlib1g-dev" + }, + "redhat": { + "bzip-dev": "bzip2-devel", + "curl": "curl", + "gcc": "gcc", + "git": "git", + "make": "make", + "readline-dev": "readline-devel", + "ssl-dev": "openssl-devel", + "stow": "stow", + "sqlite-dev": "sqlite-devel", + "zlib-dev": "zlib-devel" + }, + "suse": { + "bzip-dev": "libbz2-devel", + "curl": "curl", + "gcc": "gcc", + "git": "git", + "make": "make", + "readline-dev": "readline-devel", + "ssl-dev": "openssl-devel", + "stow": "stow", + "sqlite-dev": "sqlite3-devel", + "zlib-dev": "zlib-devel" + } + }, + "default": { + "bzip-dev": "", + "curl": "curl", + "gcc": "gcc", + "git": "git", + "make": "make", + "readline-dev": "", + "ssl-dev": "", + "sqlite-dev": "", + "zlib-dev": "" + } +} \ No newline at end of file diff --git a/diskimage_builder/elements/python-stow-versions/post-install.d/70-python-build b/diskimage_builder/elements/python-stow-versions/post-install.d/70-python-build new file mode 100755 index 00000000..fd05f7e0 --- /dev/null +++ b/diskimage_builder/elements/python-stow-versions/post-install.d/70-python-build @@ -0,0 +1,15 @@ +#!/bin/bash + +if [ ${DIB_DEBUG_TRACE:-0} -gt 1 ]; then + set -x +fi +set -eu +set -o pipefail + +DIB_PYTHON_FILES=('/usr/local/bin/pyenv-install', \ + '/usr/localbin/pyenv-uninstall', '/usr/local/bin/python-build', \ + '/usr/local/share/python-build', '/pyenv') + +for path in ${DIB_PYTHON_FILES}; do + rm -rf ${DIB_PYTHON_PREFIX}/${path} +done diff --git a/diskimage_builder/elements/python-stow-versions/source-repository-pyenv b/diskimage_builder/elements/python-stow-versions/source-repository-pyenv new file mode 100644 index 00000000..1defa8cf --- /dev/null +++ b/diskimage_builder/elements/python-stow-versions/source-repository-pyenv @@ -0,0 +1 @@ +pyenv git /pyenv/ https://github.com/pyenv/pyenv diff --git a/diskimage_builder/elements/python-stow-versions/test-elements/test-python-stow/element-deps b/diskimage_builder/elements/python-stow-versions/test-elements/test-python-stow/element-deps new file mode 100644 index 00000000..8e49bf9b --- /dev/null +++ b/diskimage_builder/elements/python-stow-versions/test-elements/test-python-stow/element-deps @@ -0,0 +1,4 @@ +package-installs +python-stow-versions +source-repositories +ubuntu-minimal diff --git a/diskimage_builder/elements/python-stow-versions/test-elements/test-python-stow/environment.d/70-test-python-stow.bash b/diskimage_builder/elements/python-stow-versions/test-elements/test-python-stow/environment.d/70-test-python-stow.bash new file mode 100644 index 00000000..3225bc92 --- /dev/null +++ b/diskimage_builder/elements/python-stow-versions/test-elements/test-python-stow/environment.d/70-test-python-stow.bash @@ -0,0 +1 @@ +export DIB_PYTHON_SUPPORTED_VERSIONS=3.8 \ No newline at end of file diff --git a/diskimage_builder/elements/python-stow-versions/test-elements/test-python-stow/install.d/69-test-python-stow b/diskimage_builder/elements/python-stow-versions/test-elements/test-python-stow/install.d/69-test-python-stow new file mode 100755 index 00000000..23ff5b6b --- /dev/null +++ b/diskimage_builder/elements/python-stow-versions/test-elements/test-python-stow/install.d/69-test-python-stow @@ -0,0 +1,13 @@ +#!/bin/bash + +if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then + set -x +fi +set -eux +set -o pipefail + +[ -f "/pyenv/plugins/python-build/install.sh" ] +[ -d "/usr/local/stow" ] + +# dib-lint: disable=which +which stow diff --git a/diskimage_builder/elements/python-stow-versions/test-elements/test-python-stow/install.d/71-test-python-stow b/diskimage_builder/elements/python-stow-versions/test-elements/test-python-stow/install.d/71-test-python-stow new file mode 100755 index 00000000..42e7c965 --- /dev/null +++ b/diskimage_builder/elements/python-stow-versions/test-elements/test-python-stow/install.d/71-test-python-stow @@ -0,0 +1,27 @@ +#!/bin/bash + +if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then + set -x +fi +set -eux +set -o pipefail + +DIB_STOW_PATH="/usr/local/stow" + +DIB_PY_BUILD_COUNTER=0 + +for pybuilds in $(ls -1 ${DIB_STOW_PATH} | grep "python-"); do + DIB_PY_BUILD_COUNTER=$((DIB_PY_BUILD_COUNTER+1)) + py_dir_version=$(echo ${pybuilds} | cut -d "-" -f 2) + py_real_version=$(\ + ${DIB_STOW_PATH}/${pybuilds}/bin/python --version | cut -d " " -f 2) + [[ ${py_real_version} == ${py_dir_version} ]] + pushd ${DIB_STOW_PATH} + stow ${pybuilds} + popd + py_stow_version=$(\ + /usr/local/bin/python${py_dir_version%.*} --version | cut -d " " -f 2) + [[ ${py_stow_version} == ${py_dir_version} ]] +done + +[ $DIB_PY_BUILD_COUNTER -eq 1 ]