#!/usr/bin/env bash # # **tools/build_wheels.sh** - Build a cache of Python wheels # # build_wheels.sh [package [...]] # # System package prerequisites listed in ``files/*/devlibs`` will be installed # # Builds wheels for all virtual env requirements listed in # ``venv-requirements.txt`` plus any supplied on the command line. # # Assumes: # - ``tools/install_pip.sh`` has been run and a suitable ``pip/setuptools`` is available. # If ``TOP_DIR`` is set we're being sourced rather than running stand-alone # or in a sub-shell if [[ -z "$TOP_DIR" ]]; then set -o errexit set -o nounset # Keep track of the DevStack directory TOP_DIR=$(cd $(dirname "$0")/.. && pwd) FILES=$TOP_DIR/files # Import common functions source $TOP_DIR/functions GetDistro source $TOP_DIR/stackrc trap err_trap ERR fi # Get additional packages to build MORE_PACKAGES="$@" # Exit on any errors so that errors don't compound function err_trap { local r=$? set +o xtrace rm -rf $TMP_VENV_PATH exit $r } # Get system prereqs install_package $(get_packages devlibs) # Get a modern ``virtualenv`` pip_install virtualenv # Prepare the workspace TMP_VENV_PATH=$(mktemp -d tmp-venv-XXXX) virtualenv $TMP_VENV_PATH # Install modern pip and wheel PIP_VIRTUAL_ENV=$TMP_VENV_PATH pip_install -U pip wheel # BUG: cffi has a lot of issues. It has no stable ABI, if installed # code is built with a different ABI than the one that's detected at # load time, it tries to compile on the fly for the new ABI in the # install location (which will probably be /usr and not # writable). Also cffi is often included via setup_requires by # packages, which have different install rules (allowing betas) than # pip has. # # Because of this we must pip install cffi into the venv to build # wheels. PIP_VIRTUAL_ENV=$TMP_VENV_PATH pip_install_gr cffi # ``VENV_PACKAGES`` is a list of packages we want to pre-install VENV_PACKAGE_FILE=$FILES/venv-requirements.txt if [[ -r $VENV_PACKAGE_FILE ]]; then VENV_PACKAGES=$(grep -v '^#' $VENV_PACKAGE_FILE) fi for pkg in ${VENV_PACKAGES,/ } ${MORE_PACKAGES}; do $TMP_VENV_PATH/bin/pip wheel $pkg done # Clean up wheel workspace rm -rf $TMP_VENV_PATH