140 lines
4.7 KiB
Bash
Executable file
140 lines
4.7 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}"
|
|
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 "${RUSTC_BIN:-}" ]]; then
|
|
BUILD_ENV+=("RUSTC=${RUSTC_BIN}")
|
|
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
|
|
echo "Using Rust toolchain: ${RUSTUP_TOOLCHAIN:-system}"
|
|
echo "Using cargo: ${CARGO_BIN}"
|
|
if [[ -n "${RUSTC_BIN:-}" ]]; then
|
|
echo "Using rustc: ${RUSTC_BIN}"
|
|
fi
|
|
if [[ -n "${RUSTC_WRAPPER:-}" ]]; then
|
|
echo "Using rustc wrapper: ${RUSTC_WRAPPER}"
|
|
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"
|