1#!not for running standalone, see .travis.yml
2
3cache_dir=$HOME/.cache
4install_dir=$cache_dir/py3-openssl11
5python_version="3.7.3"
6openssl_version="1.1.1f"
7cpucount=$(nproc --all)
8export PYTHONDONTWRITEBYTECODE=1
9
10#rm -rf $cache_dir/* # uncomment to rebuild
11
12if [[ $($install_dir/bin/python -V) != "Python $python_version" ]] ; then
13  (
14  mkdir -p /tmp/source
15  cd /tmp/source
16  # Compile OpenSSL
17  curl -fLOsS "https://www.openssl.org/source/openssl-$openssl_version.tar.gz"
18  echo "Extracting OpenSSL..."
19  tar xf openssl-$openssl_version.tar.gz
20  cd ./openssl-$openssl_version
21  echo "Compiling OpenSSL $openssl_version..."
22  ./config shared --prefix=$install_dir
23  echo "Running make for OpenSSL..."
24  make -j$cpucount -s
25  echo "Running make install for OpenSSL..."
26  make install_sw >/dev/null
27  export LD_LIBRARY_PATH=$install_dir/lib
28
29  cd /tmp/source
30  sudo apt install -qq --yes libffi-dev
31  # Compile latest Python
32  curl -fLOsS "https://www.python.org/ftp/python/$python_version/Python-$python_version.tar.xz"
33  echo "Extracting Python..."
34  tar xf Python-$python_version.tar.xz
35  cd ./Python-$python_version
36  echo "Compiling Python $python_version..."
37  # Note we are purposefully NOT using optimization flags as they increase compile time 10x
38  conf_flags="--with-openssl=$install_dir --prefix=$install_dir --with-ensurepip=upgrade"
39  CFLAGS=-O1 ./configure $conf_flags > /dev/null
40  make -j$cpucount -s
41  echo "Installing Python..."
42  make altinstall bininstall >/dev/null
43  ln -fs pip3.7 $install_dir/bin/pip3
44  ln -fs pip3 $install_dir/bin/pip
45  ln -fs python3 $install_dir/bin/python
46  # care for CI cache size
47  find $install_dir -type d -name __pycache__ -print0 |xargs -0 rm -rf
48  )
49fi
50
51export LD_LIBRARY_PATH=$install_dir/lib
52export PATH=$install_dir/bin:$PATH
53if [[ $(python -V) != "Python $python_version" ]] ; then
54  echo "Required Python version was not installed into PATH" >&2
55  exit 1
56fi
57if [[ $(python -c 'import ssl; print(ssl.OPENSSL_VERSION)') != OpenSSL\ ${openssl_version}* ]] ; then
58  echo "Required OpenSSL version was not installed into Python" >&2
59  exit 1
60fi
61