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 case "$1" in 13 9.0.1) echo "x86_64-linux-gnu-ubuntu-16.04" ;; 14 *) echo "x86_64-linux-gnu-ubuntu-18.04" ;; 15 esac 16} 17 18function llvm_macos_target_triple() { 19 case "$1" in 20 9.0.1) echo "x86_64-apple-darwin" ;; 21 *) echo "arm64-apple-darwin22.0" ;; 22 esac 23} 24 25function llvm_version_triple() { 26 case "$1" in 27 9.0) echo "9.0.1" ;; 28 # By default, take the .0 patch release 29 *) echo "$1.0" ;; 30 esac 31} 32 33function llvm_base_url() { 34 local llvm_version_triple=$1 35 echo "https://github.com/llvm/llvm-project/releases/download/llvmorg-$llvm_version_triple" 36} 37 38function llvm_download() { 39 local base_url=$1 40 local arch=$2 41 42 export LLVM=clang+llvm-${LLVM_VERSION_TRIPLE}-$arch 43 export LLVM_DIRECTORY="$HOME/.llvm/${LLVM}" 44 45 if [ -d "${LLVM_DIRECTORY}" ]; then 46 echo "Using cached LLVM download for ${LLVM}..." 47 else 48 wget --no-verbose $base_url/${LLVM}.tar.xz 49 mkdir -p "${LLVM_DIRECTORY}" 50 tar xf ${LLVM}.tar.xz -C "${LLVM_DIRECTORY}" --strip-components=1 51 fi 52 53 export LIBCLANG_PATH="${LLVM_DIRECTORY}/lib" 54 export LLVM_CONFIG_PATH="${LLVM_DIRECTORY}/bin/llvm-config" 55} 56 57# Download and set up a sane LLVM version 58set_llvm_env() { 59 export LLVM_VERSION_TRIPLE=`llvm_version_triple ${LLVM_VERSION}` 60 local base_url=`llvm_base_url ${LLVM_VERSION_TRIPLE}` 61 62 if [ "$GITHUB_ACTIONS_OS" == "ubuntu-latest" ]; then 63 llvm_download $base_url `llvm_linux_target_triple ${LLVM_VERSION_TRIPLE}` 64 export LD_LIBRARY_PATH="${LLVM_DIRECTORY}/lib":${LD_LIBRARY_PATH:-} 65 else 66 llvm_download $base_url `llvm_macos_target_triple ${LLVM_VERSION_TRIPLE}` 67 export DYLD_LIBRARY_PATH="${LLVM_DIRECTORY}/lib":${DYLD_LIBRARY_PATH:-} 68 fi 69} 70 71assert_no_diff() { 72 git add -u 73 git diff @ 74 git diff-index --quiet HEAD 75} 76 77set_llvm_env 78 79get_cargo_args() { 80 local args="" 81 if [ ! -z "$RUST_TARGET" ]; then 82 args+=" --target $RUST_TARGET" 83 fi 84 if [ "$BINDGEN_RELEASE_BUILD" == "1" ]; then 85 args+=" --release" 86 fi 87 if [ "$BINDGEN_NO_DEFAULT_FEATURES" == "1" ]; then 88 args+=" --no-default-features" 89 fi 90 local features="" 91 if [ "$BINDGEN_FEATURE_RUNTIME" == "1" ]; then 92 features+="runtime" 93 fi 94 if [ "$BINDGEN_FEATURE_EXTRA_ASSERTS" == "1" ]; then 95 features+=" __testing_only_extra_assertions" 96 fi 97 if [ ! -z "$features" ]; then 98 args+=" --features $(echo $features | tr ' ' ',')" 99 fi 100 echo $args 101} 102 103if [ ! -z "$RUST_CROSS_COMPILER" ]; then 104 export RUSTFLAGS="-C linker=${RUST_CROSS_COMPILER}-gcc" 105fi 106 107CARGO_ARGS=`get_cargo_args` 108 109# Ensure we build without warnings 110RUSTFLAGS="-Dwarnings" cargo check $CARGO_ARGS 111 112if [ "$BINDGEN_MAIN_TESTS" == "1" ]; then 113 # Run the tests 114 (cd bindgen-tests && cargo test $CARGO_ARGS) 115fi 116 117assert_no_diff 118 119# Run the integration tests 120(cd bindgen-integration && cargo test $CARGO_ARGS) 121