| #!/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 |