├── .travis.yml ├── LICENSE ├── README.md └── bin ├── archive └── compile /.travis.yml: -------------------------------------------------------------------------------- 1 | language: shell 2 | sudo: required 3 | 4 | env: 5 | global: 6 | - VERSION=3.13-dev 7 | # - ALIAS=nightly 8 | 9 | defaults_linux: &defaults_linux 10 | install: 11 | - pushd /opt/pyenv/ 12 | - sudo git config --global --add safe.directory /opt/pyenv 13 | - sudo git checkout master 14 | - sudo git pull 15 | - popd 16 | - alias python=python3 17 | - | 18 | if [ "$RELEASE" = "xenial" ]; then 19 | sudo apt-get update 20 | sudo apt-get install -y build-essential checkinstall zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev libffi-dev libssl-dev wget 21 | python3 --version 22 | wget https://www.openssl.org/source/openssl-1.1.1u.tar.gz 23 | tar xzf openssl-1.1.1u.tar.gz 24 | cd openssl-1.1.1u 25 | 26 | case "$(uname -m)" in 27 | x86_64) 28 | OPENSSL_CONFIGURE_TARGET="linux-x86_64" 29 | ;; 30 | aarch64) 31 | OPENSSL_CONFIGURE_TARGET="linux-aarch64" 32 | ;; 33 | ppc64le) 34 | OPENSSL_CONFIGURE_TARGET="linux-ppc64le" 35 | ;; 36 | s390x) 37 | OPENSSL_CONFIGURE_TARGET="linux-s390x" 38 | ;; 39 | *) 40 | echo "Unsupported architecture: $(uname -m)" 41 | exit 1 42 | ;; 43 | esac 44 | 45 | sudo make clean 46 | export CC=gcc 47 | export CXX=g++ 48 | sudo ./Configure "$OPENSSL_CONFIGURE_TARGET" --prefix=/usr/local/openssl --openssldir=/usr/local/openssl shared zlib enable-ec_nistp_64_gcc_128 49 | sudo make depend 50 | sudo make -j"$(nproc)" 51 | sudo make install 52 | sudo mv /usr/bin/openssl /usr/bin/openssl.bak 53 | sudo ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl 54 | 55 | echo "/usr/local/openssl/lib" | sudo tee /etc/ld.so.conf.d/openssl.conf 56 | sudo ldconfig 57 | 58 | cd .. 59 | openssl version -a 60 | fi 61 | - python3 -m pip install --upgrade pip setuptools virtualenv 62 | 63 | before_script: 64 | - export INSTALL_DEST="${INSTALL_DEST:-/opt/python}" 65 | - export LSB_RELEASE="${LSB_RELEASE:-$(lsb_release -rs)}" 66 | - export OS_NAME="${OS_NAME:-$(lsb_release -is | tr 'A-Z' 'a-z')}" 67 | - export ARCH="${ARCH:-$(uname -m)}" 68 | - export PACKAGES="${PACKAGES:-pip nose pytest mock wheel pipenv dataclasses}" 69 | - | 70 | if [ "$RELEASE" = "xenial" ]; then 71 | export PYTHON_CONFIGURE_OPTS="--with-openssl=/usr/local/openssl --with-wide-unicode --enable-shared --enable-ipv6 --enable-loadable-sqlite-extensions --with-computed-gotos $CONFIGURE_OPTS" 72 | else 73 | export PYTHON_CONFIGURE_OPTS="--with-wide-unicode --enable-shared --enable-ipv6 --enable-loadable-sqlite-extensions --with-computed-gotos $CONFIGURE_OPTS" 74 | fi 75 | - sudo chown -R "$USER" "$HOME/.cache" 76 | - | 77 | if [[ $VERSION == pypy*-dev ]]; then 78 | if [ ! -f ~/virtualenv/pypy/bin/activate ]; then 79 | curl -O "https://s3.amazonaws.com/travis-python-archives/binaries/ubuntu/$(lsb_release -rs)/x86_64/pypy2.7-5.9.0.tar.bz2" 80 | sudo tar xf pypy*.tar.bz2 -C / 81 | fi 82 | source ~/virtualenv/pypy/bin/activate 83 | python --version 84 | fi 85 | 86 | script: 87 | - sudo apt-get update && sudo apt-get install -y build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev curl libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev python3-dev gfortran libblas-dev liblapack-dev 88 | - ./bin/compile 89 | 90 | after_success: ./bin/archive 91 | after_failure: cat /tmp/python-build.*.log 92 | 93 | addons: 94 | apt: 95 | packages: 96 | - openssl 97 | - libssl-dev 98 | - mercurial 99 | - python3-pip 100 | artifacts: 101 | paths: 102 | - "$LSB_RELEASE/" 103 | target_paths: 104 | - "/binaries/$OS_NAME/$LSB_RELEASE/$ARCH" 105 | branch: 106 | - default 107 | cache_control: public 108 | 109 | jobs: 110 | include: 111 | # - language: bash 112 | # name: freebsd 113 | # os: freebsd 114 | # group: dev 115 | # install: 116 | # - pushd /opt/pyenv/ 117 | # - sudo git config --global --add safe.directory /opt/pyenv 118 | # - sudo git checkout master 119 | # - sudo git pull 120 | # - popd 121 | # - python --version 122 | # - sudo python -m ensurepip 123 | # - sudo python -m pip install --upgrade pip 124 | # - sudo python -m pip install virtualenv==20.0.2 125 | 126 | - <<: *defaults_linux 127 | dist: noble 128 | env: 129 | - RELEASE=noble 130 | name: noble 131 | 132 | - <<: *defaults_linux 133 | dist: jammy 134 | env: 135 | - RELEASE=jammy 136 | name: jammy 137 | 138 | - <<: *defaults_linux 139 | dist: focal 140 | env: 141 | - RELEASE=focal 142 | name: focal 143 | 144 | - <<: *defaults_linux 145 | dist: bionic 146 | env: 147 | - RELEASE=bionic 148 | name: bionic 149 | 150 | # - <<: *defaults_linux 151 | # dist: xenial 152 | # env: 153 | # - RELEASE=xenial 154 | # name: xenial 155 | 156 | - <<: *defaults_linux 157 | arch: ppc64le 158 | dist: jammy 159 | env: 160 | - RELEASE=jammy 161 | name: jammy-ppc64le 162 | 163 | - <<: *defaults_linux 164 | arch: ppc64le 165 | dist: focal 166 | env: 167 | - RELEASE=focal 168 | name: focal-ppc64le 169 | 170 | - <<: *defaults_linux 171 | arch: ppc64le 172 | dist: bionic 173 | env: 174 | - RELEASE=bionic 175 | - NUMPY_VERSION=1.21.1 176 | name: bionic-ppc64le 177 | 178 | # - <<: *defaults_linux 179 | # arch: ppc64le 180 | # dist: xenial 181 | # env: 182 | # - RELEASE=xenial 183 | # - NUMPY_VERSION=1.21.6 184 | # name: xenial-ppc64le 185 | 186 | - <<: *defaults_linux 187 | arch: s390x 188 | dist: jammy 189 | env: 190 | - RELEASE=jammy 191 | name: jammy-s390x 192 | 193 | - <<: *defaults_linux 194 | arch: s390x 195 | dist: focal 196 | env: 197 | - RELEASE=focal 198 | name: focal-s390x 199 | 200 | - <<: *defaults_linux 201 | arch: s390x 202 | dist: bionic 203 | env: 204 | - RELEASE=bionic 205 | - NUMPY_VERSION=1.21.1 206 | name: bionic-s390x 207 | 208 | # - <<: *defaults_linux 209 | # arch: s390x 210 | # dist: xenial 211 | # env: 212 | # - RELEASE=xenial 213 | # - NUMPY_VERSION=1.21.6 214 | # name: xenial-s390x 215 | 216 | - <<: *defaults_linux 217 | arch: arm64 218 | dist: jammy 219 | env: 220 | - RELEASE=jammy 221 | name: jammy-arm64 222 | 223 | - <<: *defaults_linux 224 | arch: arm64 225 | dist: focal 226 | env: 227 | - RELEASE=focal 228 | name: focal-arm64 229 | 230 | - <<: *defaults_linux 231 | arch: arm64 232 | dist: bionic 233 | env: 234 | - RELEASE=bionic 235 | name: bionic-arm64 236 | 237 | # - <<: *defaults_linux 238 | # arch: arm64 239 | # dist: xenial 240 | # env: 241 | # - RELEASE=xenial 242 | # name: xenial-arm64 243 | 244 | allow_failures: 245 | - name: freebsd 246 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Travis CI GmbH 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # `cpython-builder` 2 | 3 | Clones and builds CPython using `python-build` 4 | 5 | 6 | Also for ppc64le 7 | -------------------------------------------------------------------------------- /bin/archive: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -o errexit 4 | 5 | if [[ ! $LSB_RELEASE ]] ; then 6 | echo 'Missing LSB_RELEASE' 7 | exit 1 8 | fi 9 | 10 | if [[ ! $INSTALL_DEST ]] ; then 11 | echo 'Missing INSTALL_DEST' 12 | exit 1 13 | fi 14 | 15 | if [[ ! $VERSION ]] ; then 16 | echo 'Missing VERSION' 17 | exit 1 18 | fi 19 | 20 | set -o xtrace 21 | 22 | : ${TAR_PATHS:=$INSTALL_DEST/$VERSION} 23 | : ${DESTS:=} 24 | 25 | if [[ $VERSION =~ ^python|pypy ]] ; then 26 | VERSION="${VERSION}" 27 | SHORT_VERSION="${VERSION}" 28 | else 29 | SHORT_VERSION="python${VERSION}" 30 | VERSION="python-${VERSION}" 31 | fi 32 | 33 | TAR_PATHS="$TAR_PATHS $INSTALL_DEST/$VERSION $HOME/virtualenv/${SHORT_VERSION}" 34 | DESTS="$TRAVIS_BUILD_DIR/$LSB_RELEASE/${VERSION}.tar.bz2" 35 | 36 | if [[ $ALIAS ]] ; then 37 | if [[ $ALIAS =~ ^python|pypy ]] ; then 38 | SHORT_ALIAS="${ALIAS}" 39 | LONG_ALIAS="${ALIAS}" 40 | else 41 | SHORT_ALIAS="python${ALIAS}" 42 | LONG_ALIAS="python-${ALIAS}" 43 | fi 44 | TAR_PATHS="$TAR_PATHS $INSTALL_DEST/$ALIAS $HOME/virtualenv/${SHORT_ALIAS}" 45 | DESTS="$DESTS $TRAVIS_BUILD_DIR/$LSB_RELEASE/${LONG_ALIAS}.tar.bz2" 46 | fi 47 | 48 | for DEST in $DESTS ; do 49 | mkdir -p $(dirname $DEST) 50 | sudo tar -cjvf $DEST $(ls -d $TAR_PATHS 2>/dev/null || true) > $(dirname $DEST)/${LONG_ALIAS:-$VERSION}-filelist.txt 51 | 52 | pushd $(dirname $DEST) &>/dev/null 53 | 54 | shopt -s nullglob 55 | for f in *.bz2; do 56 | if [[ $(uname -a) == *"FreeBSD"* ]]; 57 | then shasum -a 256 $f > ${f}.sha256sum.txt; 58 | else sha256sum $f > ${f}.sha256sum.txt; 59 | fi 60 | done 61 | 62 | popd &>/dev/null 63 | 64 | echo "---> $DEST" 65 | done 66 | -------------------------------------------------------------------------------- /bin/compile: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -o errexit 3 | set -o nounset 4 | set -o pipefail 5 | set -o verbose 6 | 7 | if [[ -z "${INSTALL_DEST:-}" ]]; then 8 | echo "Missing INSTALL_DEST" 9 | exit 1 10 | fi 11 | 12 | if [[ -z "${VERSION:-}" ]]; then 13 | VERSION=$(curl -s https://www.python.org/downloads/ | grep -oP 'Download Python \K[0-9]+\.[0-9]+\.[0-9]+' | head -1) 14 | echo "Automatically determined Python version: $VERSION" 15 | fi 16 | 17 | VENV_HOME="$HOME/virtualenv" 18 | mkdir -p "$VENV_HOME" 19 | 20 | install_numpy() { 21 | if [[ -n "${NUMPY_VERSION:-}" ]]; then 22 | "$VENV_HOME/$VIRTENV_VERSION/bin/pip" install --upgrade numpy=="${NUMPY_VERSION}" 23 | else 24 | "$VENV_HOME/$VIRTENV_VERSION/bin/pip" install --upgrade numpy 25 | fi 26 | } 27 | 28 | 29 | sudo env PYTHON_BUILD_ROOT=/opt/pyenv/plugins/python-build \ 30 | /opt/pyenv/plugins/python-build/bin/python-build --verbose "$VERSION" "$INSTALL_DEST/$VERSION" 31 | 32 | if [[ -n "${ALIAS:-}" ]]; then 33 | sudo rm -rf "$INSTALL_DEST/$ALIAS" 34 | sudo ln -sf "$INSTALL_DEST/$VERSION" "$INSTALL_DEST/$ALIAS" 35 | fi 36 | 37 | if [[ "$VERSION" == pypy3* ]]; then 38 | PYTHON_BIN="pypy3" 39 | VIRTENV_VERSION="$VERSION" 40 | elif [[ "$VERSION" == pypy* ]]; then 41 | PYTHON_BIN="pypy" 42 | VIRTENV_VERSION="$VERSION" 43 | else 44 | PYTHON_BIN="python" 45 | VIRTENV_VERSION="python$VERSION" 46 | fi 47 | 48 | BUILT_PYTHON="$INSTALL_DEST/$VERSION/bin/$PYTHON_BIN" 49 | if [[ ! -x "$BUILT_PYTHON" ]]; then 50 | echo "Built Python interpreter not found: $BUILT_PYTHON" 51 | exit 1 52 | fi 53 | echo "Using built Python interpreter: $BUILT_PYTHON" 54 | 55 | sudo -H "$BUILT_PYTHON" -m ensurepip --upgrade 56 | sudo -H "$BUILT_PYTHON" -m pip install --upgrade pip virtualenv 57 | 58 | "$BUILT_PYTHON" -m virtualenv --seeder=pip "$VENV_HOME/$VIRTENV_VERSION" 59 | 60 | if [[ -n "${ALIAS:-}" ]]; then 61 | if [[ "$ALIAS" == pypy* ]]; then 62 | VIRTENV_ALIAS="$ALIAS" 63 | else 64 | VIRTENV_ALIAS="python$ALIAS" 65 | fi 66 | rm -f "$VENV_HOME/$VIRTENV_ALIAS" 67 | ln -sf "$VENV_HOME/$VIRTENV_VERSION" "$VENV_HOME/$VIRTENV_ALIAS" 68 | fi 69 | 70 | "$VENV_HOME/$VIRTENV_VERSION/bin/python" -c "import sys; assert sys.maxunicode > 65535" 71 | 72 | if [[ -n "${PACKAGES:-}" ]]; then 73 | "$VENV_HOME/$VIRTENV_VERSION/bin/pip" install --upgrade $PACKAGES 74 | fi 75 | 76 | if ! [[ "${ALIAS:-}" == "nightly" || "$VERSION" =~ -dev$ ]]; then 77 | if [[ "$VERSION" == pypy* ]]; then 78 | "$VENV_HOME/$VIRTENV_VERSION/bin/$PYTHON_BIN" -m ensurepip 79 | fi 80 | install_numpy 81 | fi 82 | --------------------------------------------------------------------------------