blob: 2cfa2764c043b2b94078d59f4b4e92d90f801fa8 [file] [log] [blame]
#!/bin/bash
# Copyright 2020 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
################################################################################
# This script builds binary wheels of Tink for Linux based on PEP 599. It
# should be run inside a manylinux2014 Docker container to have the correct
# environment setup.
set -euo pipefail
# The following assoicative array contains:
# ["<Python version>"]="<python tag>-<abi tag>"
# where:
# <Python version> = language version, e.g "3.7"
# <python tag-<abi tag> = tags as specified in in PEP 491, e.g. "cp37-37m"
declare -A PYTHON_VERSIONS
PYTHON_VERSIONS["3.7"]="cp37-cp37m"
PYTHON_VERSIONS["3.8"]="cp38-cp38"
PYTHON_VERSIONS["3.9"]="cp39-cp39"
readonly -A PYTHON_VERSIONS
readonly BAZEL_VERSION='3.7.2'
readonly PROTOC_VERSION='3.14.0'
# Get dependencies which are needed for building Tink.
# Install Bazel. Needed for building C++ extensions.
curl -OL "https://github.com/bazelbuild/bazel/releases/download/${BAZEL_VERSION}/bazel-${BAZEL_VERSION}-installer-linux-x86_64.sh"
chmod +x "bazel-${BAZEL_VERSION}-installer-linux-x86_64.sh"
./"bazel-${BAZEL_VERSION}-installer-linux-x86_64.sh"
# Install protoc. Needed for protocol buffer compilation.
PROTOC_ZIP="protoc-${PROTOC_VERSION}-linux-x86_64.zip"
curl -OL "https://github.com/protocolbuffers/protobuf/releases/download/v${PROTOC_VERSION}/${PROTOC_ZIP}"
unzip -o "${PROTOC_ZIP}" -d /usr/local bin/protoc
# Setup required for Tink.
export TINK_PYTHON_SETUPTOOLS_OVERRIDE_BASE_PATH="/tmp/tink"
# Workaround for grpc which expects a python2 installation, which is not present
# in the manylinux2014 container. Cannot be an empty string, otherwise Bazel
# will fail.
export PYTHON2_BIN_PATH="non_existent_file"
export PYTHON2_LIB_PATH="non_existent_file"
# Required to fix https://github.com/pypa/manylinux/issues/357.
export LD_LIBRARY_PATH="/usr/local/lib"
for v in "${!PYTHON_VERSIONS[@]}"; do
(
# Executing in a subshell to make the PATH modification temporary.
export PATH="${PATH}:/opt/python/${PYTHON_VERSIONS[$v]}/bin"
pip wheel .
)
# This is needed to ensure we get a clean build, otherwise parts of the
# compiled code from a previous build may be reused in a subsequent build.
bazel clean --expunge
done
# Repair wheels to convert them from linux to manylinux.
for wheel in ./tink*.whl; do
auditwheel repair "${wheel}" -w release
done