• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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