1#!/usr/bin/env bash 2# Bail on first error 3set -e 4# Bail if an unset variable is encountered 5set -u 6# Enable debugging output 7set -x 8# Give a pipeline a non-zero exit code if one of its constituents fails 9set -o pipefail 10 11function llvm_linux_target_triple() { 12 echo "x86_64-linux-gnu-ubuntu-16.04" 13} 14 15function llvm_macos_target_triple() { 16 case "$1" in 17 [0-8].* | 9.0.0) echo "x86_64-darwin-apple" ;; 18 # Starting with 9.0.1, triple swapped ordering 19 *) echo "x86_64-apple-darwin" ;; 20 esac 21} 22 23function llvm_version_triple() { 24 case "$1" in 25 5.0) echo "5.0.1" ;; 26 # By default, take the .0 patch release 27 *) echo "$1.0" ;; 28 esac 29} 30 31function llvm_base_url() { 32 local llvm_version_triple=$1 33 34 case "$llvm_version_triple" in 35 [0-8].* | 9.0.0) 36 echo "http://releases.llvm.org/$llvm_version_triple" 37 ;; 38 # Starting with 9.0.1, releases are hosted on github 39 *) 40 echo "https://github.com/llvm/llvm-project/releases/download/llvmorg-$llvm_version_triple" 41 ;; 42 esac 43} 44 45function llvm_download() { 46 local base_url=$1 47 local arch=$2 48 49 export LLVM=clang+llvm-${LLVM_VERSION_TRIPLE}-$arch 50 export LLVM_DIRECTORY="$HOME/.llvm/${LLVM}" 51 52 if [ -d "${LLVM_DIRECTORY}" ]; then 53 echo "Using cached LLVM download for ${LLVM}..." 54 else 55 wget --no-verbose $base_url/${LLVM}.tar.xz 56 mkdir -p "${LLVM_DIRECTORY}" 57 tar xf ${LLVM}.tar.xz -C "${LLVM_DIRECTORY}" --strip-components=1 58 fi 59 60 export LIBCLANG_PATH="${LLVM_DIRECTORY}/lib" 61 export LLVM_CONFIG_PATH="${LLVM_DIRECTORY}/bin/llvm-config" 62} 63 64# Download and set up a sane LLVM version 65set_llvm_env() { 66 export LLVM_VERSION_TRIPLE=`llvm_version_triple ${LLVM_VERSION}` 67 local base_url=`llvm_base_url ${LLVM_VERSION_TRIPLE}` 68 69 if [ "$GITHUB_ACTIONS_OS" == "ubuntu-latest" ]; then 70 llvm_download $base_url `llvm_linux_target_triple ${LLVM_VERSION_TRIPLE}` 71 export LD_LIBRARY_PATH="${LLVM_DIRECTORY}/lib":${LD_LIBRARY_PATH:-} 72 else 73 llvm_download $base_url `llvm_macos_target_triple ${LLVM_VERSION_TRIPLE}` 74 export DYLD_LIBRARY_PATH="${LLVM_DIRECTORY}/lib":${DYLD_LIBRARY_PATH:-} 75 fi 76} 77 78# Need rustfmt to compare the test expectations. 79set_rustfmt_env() { 80 local toolchain="nightly-$(curl https://rust-lang.github.io/rustup-components-history/$(rustup target list --installed | tail -1)/rustfmt)" 81 rustup update "$toolchain" 82 rustup component add rustfmt --toolchain "$toolchain" 83 export RUSTFMT="$(rustup which --toolchain "$toolchain" rustfmt)" 84} 85 86assert_no_diff() { 87 git add -u 88 git diff @ 89 git diff-index --quiet HEAD 90} 91 92set_llvm_env 93set_rustfmt_env 94 95get_cargo_args() { 96 local args="" 97 if [ ! -z "$RUST_TARGET" ]; then 98 args+=" --target $RUST_TARGET" 99 fi 100 if [ "$BINDGEN_RELEASE_BUILD" == "1" ]; then 101 args+=" --release" 102 fi 103 if [ "$BINDGEN_NO_DEFAULT_FEATURES" == "1" ]; then 104 args+=" --no-default-features" 105 fi 106 local features="" 107 if [ "$BINDGEN_FEATURE_RUNTIME" == "1" ]; then 108 features+="runtime" 109 fi 110 if [ "$BINDGEN_FEATURE_EXTRA_ASSERTS" == "1" ]; then 111 features+=" testing_only_extra_assertions" 112 fi 113 if [ "$BINDGEN_FEATURE_TESTING_ONLY_DOCS" == "1" ]; then 114 features+=" testing_only_docs" 115 fi 116 if [ ! -z "$features" ]; then 117 args+=" --features $(echo $features | tr ' ' ',')" 118 fi 119 echo $args 120} 121 122if [ ! -z "$RUST_CROSS_COMPILER" ]; then 123 export RUSTFLAGS="-C linker=${RUST_CROSS_COMPILER}-gcc" 124fi 125 126CARGO_ARGS=`get_cargo_args` 127 128# Ensure we build without warnings 129RUSTFLAGS="-Dwarnings" cargo check $CARGO_ARGS 130 131if [ "$BINDGEN_MAIN_TESTS" == "1" ]; then 132 # Run the tests 133 (cd bindgen-tests && cargo test $CARGO_ARGS) 134fi 135 136assert_no_diff 137 138# Run the integration tests 139(cd bindgen-integration && cargo test $CARGO_ARGS) 140