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 000000000..ae1186141 --- /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 000000000..73d637d49 --- /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 000000000..f71249468 --- /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 000000000..e86494912 --- /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 000000000..9caf8e0f3 --- /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 000000000..fd05f7e03 --- /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 000000000..1defa8cfa --- /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 000000000..8e49bf9be --- /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 000000000..3225bc923 --- /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 000000000..23ff5b6bb --- /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 000000000..42e7c9650 --- /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 ]