burrow/Apple/NetworkExtension/libburrow/build-rust.sh
Conrad Kramer 9fcaf137ac
Some checks failed
Build Rust / Cargo Test (push) Waiting to run
Build Site / Next.js Build (push) Waiting to run
Build Apple / Build App (iOS Simulator) (push) Failing after 57s
Build Apple / Build App (macOS) (push) Failing after 1m55s
Use active rustup toolchain in Apple build
2026-03-19 03:27:14 -07:00

130 lines
4.4 KiB
Bash
Executable file

#!/bin/bash
# This is a build script. It is run by Xcode as a build step.
# The type of build is described in various environment variables set by Xcode.
export PATH="${PATH}:${HOME}/.cargo/bin:/opt/homebrew/bin:/usr/local/bin:/etc/profiles/per-user/${USER}/bin"
if ! [[ -x "$(command -v cargo)" ]]; then
echo 'error: Unable to find cargo'
exit 127
fi
set -e
# Change directories relative to the location of this script
cd -- "$(dirname -- "${BASH_SOURCE[0]}")"/../../../burrow
RUST_TARGETS=()
# Match the PLATFORM_NAME (iphoneos) and ARCHS (arm64) to a set of RUST_TARGETS (aarch64-apple-ios)
IFS=' ' read -a BURROW_ARCHS <<< "${ARCHS[@]}"
for ARCH in "${BURROW_ARCHS[@]}"; do
case $PLATFORM_NAME in
iphonesimulator)
case $ARCH in
arm64) RUST_TARGETS+=("aarch64-apple-ios-sim") ;;
x86_64) RUST_TARGETS+=("x86_64-apple-ios") ;;
*) echo "error: Unknown $PLATFORM_NAME arch, $ARCH"; exit 1 ;;
esac
;;
iphoneos)
case $ARCH in
arm64) RUST_TARGETS+=("aarch64-apple-ios") ;;
*) echo "error: Unknown $PLATFORM_NAME arch, $ARCH"; exit 1 ;;
esac
;;
macos*)
case $ARCH in
arm64) RUST_TARGETS+=("aarch64-apple-darwin") ;;
x86_64) RUST_TARGETS+=("x86_64-apple-darwin") ;;
*) echo "error: Unknown $PLATFORM_NAME arch, $ARCH"; exit 1 ;;
esac
;;
*) echo "error: Unsupported platform $PLATFORM_NAME"; exit 1 ;;
esac
done
# Pass all RUST_TARGETS in a single invocation
CARGO_ARGS=()
for TARGET in "${RUST_TARGETS[@]}"; do
CARGO_ARGS+=("--target")
CARGO_ARGS+=("$TARGET")
done
CARGO_ARGS+=("--lib")
# Pass the configuration (Debug or Release) through to cargo
if [[ $SWIFT_ACTIVE_COMPILATION_CONDITIONS == *DEBUG* ]]; then
CARGO_TARGET_SUBDIR="debug"
else
CARGO_ARGS+=("--release")
CARGO_TARGET_SUBDIR="release"
fi
RUSTUP_TOOLCHAIN=""
if [[ -x "$(command -v rustup)" ]]; then
RUSTUP_TOOLCHAIN="$(rustup show active-toolchain | awk '{print $1}')"
if [[ -z "${RUSTUP_TOOLCHAIN}" ]]; then
echo 'error: Unable to determine active rustup toolchain'
exit 1
fi
CARGO_BIN="$(rustup which --toolchain "${RUSTUP_TOOLCHAIN}" cargo)"
RUSTC_BIN="$(rustup which --toolchain "${RUSTUP_TOOLCHAIN}" rustc)"
CARGO_PATH="$(dirname "${CARGO_BIN}"):$(dirname "${RUSTC_BIN}"):/usr/bin"
else
CARGO_BIN="$(command -v cargo)"
CARGO_PATH="$(dirname "${CARGO_BIN}"):/usr/bin"
fi
PROTOC=$(readlink -f $(which protoc))
CARGO_PATH="$(dirname $PROTOC):$CARGO_PATH"
if [[ -n "${RUSTC_WRAPPER:-}" && "${RUSTC_WRAPPER}" != /* ]]; then
WRAPPER_PATH="$(command -v "${RUSTC_WRAPPER}" || true)"
if [[ -n "${WRAPPER_PATH}" ]]; then
RUSTC_WRAPPER="${WRAPPER_PATH}"
CARGO_PATH="$(dirname "${WRAPPER_PATH}"):$CARGO_PATH"
fi
fi
if [[ -x "$(command -v rustup)" ]]; then
for TARGET in "${RUST_TARGETS[@]}"; do
if ! rustup target list --installed | grep -qx "${TARGET}"; then
rustup target add --toolchain "${RUSTUP_TOOLCHAIN}" "${TARGET}"
fi
done
fi
# Run cargo without the various environment variables set by Xcode.
# Those variables can confuse cargo and the build scripts it runs.
EXTRA_ENV=()
for VAR_NAME in HOME CARGO_HOME CARGO_TARGET_DIR RUSTUP_HOME RUSTC_WRAPPER SCCACHE_DIR CARGO_INCREMENTAL; do
if [[ -n "${!VAR_NAME:-}" ]]; then
EXTRA_ENV+=("${VAR_NAME}=${!VAR_NAME}")
fi
done
EFFECTIVE_CARGO_TARGET_DIR="${CARGO_TARGET_DIR:-${CONFIGURATION_TEMP_DIR}/target}"
BUILD_ENV=(
"PATH=$CARGO_PATH"
"PROTOC=$PROTOC"
"CARGO_TARGET_DIR=${EFFECTIVE_CARGO_TARGET_DIR}"
"${EXTRA_ENV[@]}"
)
if [[ -n "${RUSTUP_TOOLCHAIN}" ]]; then
BUILD_ENV+=("RUSTUP_TOOLCHAIN=${RUSTUP_TOOLCHAIN}")
fi
if [[ -n "${IPHONEOS_DEPLOYMENT_TARGET:-}" ]]; then
BUILD_ENV+=("IPHONEOS_DEPLOYMENT_TARGET=${IPHONEOS_DEPLOYMENT_TARGET}")
fi
if [[ -n "${MACOSX_DEPLOYMENT_TARGET:-}" ]]; then
BUILD_ENV+=("MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET}")
fi
env -i "${BUILD_ENV[@]}" "${CARGO_BIN}" build "${CARGO_ARGS[@]}"
mkdir -p "${BUILT_PRODUCTS_DIR}"
# Use `lipo` to merge the architectures together into BUILT_PRODUCTS_DIR
/usr/bin/xcrun --sdk $PLATFORM_NAME lipo \
-create $(printf "${EFFECTIVE_CARGO_TARGET_DIR}/%q/${CARGO_TARGET_SUBDIR}/libburrow.a " "${RUST_TARGETS[@]}") \
-output "${BUILT_PRODUCTS_DIR}/libburrow.a"