webpki/mk/cargo.sh

164 lines
6.6 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# Copyright 2020 Brian Smith.
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
# SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
# OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
set -eux -o pipefail
IFS=$'\n\t'
rustflags_self_contained="-Clink-self-contained=yes -Clinker=rust-lld"
qemu_aarch64="qemu-aarch64 -L /usr/aarch64-linux-gnu"
qemu_arm="qemu-arm -L /usr/arm-linux-gnueabihf"
qemu_mipsel="qemu-mipsel -L /usr/mipsel-linux-gnu"
# Avoid putting the Android tools in `$PATH` because there are tools in this
# directory like `clang` that would conflict with the same-named tools that may
# be needed to compile the build script, or to compile for other targets.
if [ -n "${ANDROID_HOME-}" ]; then
# Keep the next line in sync with the corresponding line in install-build-tools.sh.
ndk_version=25.2.9519653
ANDROID_NDK_ROOT=${ANDROID_NDK_ROOT:-${ANDROID_HOME}/ndk/$ndk_version}
fi
if [ -n "${ANDROID_NDK_ROOT-}" ]; then
android_tools=${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin
fi
for arg in $*; do
case $arg in
--target=*)
target=${arg#*=}
;;
*)
;;
esac
done
# See comments in install-build-tools.sh.
llvm_version=15
case $target in
aarch64-linux-android)
export CC_aarch64_linux_android=$android_tools/aarch64-linux-android21-clang
export AR_aarch64_linux_android=$android_tools/llvm-ar
export CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER=$android_tools/aarch64-linux-android21-clang
;;
aarch64-unknown-linux-gnu)
export CC_aarch64_unknown_linux_gnu=clang-$llvm_version
export AR_aarch64_unknown_linux_gnu=llvm-ar-$llvm_version
export CFLAGS_aarch64_unknown_linux_gnu="--sysroot=/usr/aarch64-linux-gnu"
export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc
export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_RUNNER="$qemu_aarch64"
;;
aarch64-unknown-linux-musl)
export CC_aarch64_unknown_linux_musl=clang-$llvm_version
export AR_aarch64_unknown_linux_musl=llvm-ar-$llvm_version
export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_RUSTFLAGS="$rustflags_self_contained"
export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_RUNNER="$qemu_aarch64"
;;
arm-unknown-linux-gnueabihf)
export CC_arm_unknown_linux_gnueabihf=arm-linux-gnueabihf-gcc
export AR_arm_unknown_linux_gnueabihf=arm-linux-gnueabihf-gcc-ar
export CARGO_TARGET_ARM_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc
export CARGO_TARGET_ARM_UNKNOWN_LINUX_GNUEABIHF_RUNNER="$qemu_arm"
;;
armv7-linux-androideabi)
export CC_armv7_linux_androideabi=$android_tools/armv7a-linux-androideabi19-clang
export AR_armv7_linux_androideabi=$android_tools/llvm-ar
export CARGO_TARGET_ARMV7_LINUX_ANDROIDEABI_LINKER=$android_tools/armv7a-linux-androideabi19-clang
;;
armv7-unknown-linux-musleabihf)
export CC_armv7_unknown_linux_musleabihf=clang-$llvm_version
export AR_armv7_unknown_linux_musleabihf=llvm-ar-$llvm_version
export CARGO_TARGET_ARMV7_UNKNOWN_LINUX_MUSLEABIHF_RUSTFLAGS="$rustflags_self_contained"
export CARGO_TARGET_ARMV7_UNKNOWN_LINUX_MUSLEABIHF_RUNNER="$qemu_arm"
;;
i686-unknown-linux-gnu)
export CC_i686_unknown_linux_gnu=clang-$llvm_version
export AR_i686_unknown_linux_gnu=llvm-ar-$llvm_version
export CARGO_TARGET_I686_UNKNOWN_LINUX_GNU_LINKER=clang-$llvm_version
;;
i686-unknown-linux-musl)
export CC_i686_unknown_linux_musl=clang-$llvm_version
export AR_i686_unknown_linux_musl=llvm-ar-$llvm_version
export CARGO_TARGET_I686_UNKNOWN_LINUX_MUSL_RUSTFLAGS="$rustflags_self_contained"
;;
mipsel-unknown-linux-gnu)
export CC_mipsel_unknown_linux_gnu=mipsel-linux-gnu-gcc
export AR_mipsel_unknown_linux_gnu=mipsel-linux-gnu-gcc-ar
export CARGO_TARGET_MIPSEL_UNKNOWN_LINUX_GNU_LINKER=mipsel-linux-gnu-gcc
export CARGO_TARGET_MIPSEL_UNKNOWN_LINUX_GNU_RUNNER="$qemu_mipsel"
;;
x86_64-unknown-linux-musl)
export CC_x86_64_unknown_linux_musl=clang-$llvm_version
export AR_x86_64_unknown_linux_musl=llvm-ar-$llvm_version
# XXX: Work around https://github.com/rust-lang/rust/issues/79555.
if [ -n "${RING_COVERAGE-}" ]; then
export CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_LINKER=clang-$llvm_version
else
export CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_RUSTFLAGS="$rustflags_self_contained"
fi
;;
wasm32-unknown-unknown)
# The first two are only needed for when the "wasm_c" feature is enabled.
export CC_wasm32_unknown_unknown=clang-$llvm_version
export AR_wasm32_unknown_unknown=llvm-ar-$llvm_version
export CARGO_TARGET_WASM32_UNKNOWN_UNKNOWN_RUNNER=wasm-bindgen-test-runner
export WASM_BINDGEN_TEST_TIMEOUT=60
;;
*)
;;
esac
if [ -n "${RING_COVERAGE-}" ]; then
# XXX: Collides between release and debug.
coverage_dir=$PWD/target/$target/debug/coverage
mkdir -p "$coverage_dir"
rm -f "$coverage_dir/*.profraw"
export RING_BUILD_EXECUTABLE_LIST="$coverage_dir/executables"
truncate --size=0 "$RING_BUILD_EXECUTABLE_LIST"
# This doesn't work when profiling under QEMU. Instead mk/runner does
# something similar but different.
# export LLVM_PROFILE_FILE="$coverage_dir/%m.profraw"
# ${target} with hyphens replaced by underscores, lowercase and uppercase.
target_lower=${target//-/_}
target_upper=${target_lower^^}
cflags_var=CFLAGS_${target_lower}
declare -x "${cflags_var}=-fprofile-instr-generate -fcoverage-mapping ${!cflags_var-}"
runner_var=CARGO_TARGET_${target_upper}_RUNNER
declare -x "${runner_var}=mk/runner ${!runner_var-}"
rustflags_var=CARGO_TARGET_${target_upper}_RUSTFLAGS
declare -x "${rustflags_var}=-Cinstrument-coverage ${!rustflags_var-}"
fi
cargo "$@"
if [ -n "${RING_COVERAGE-}" ]; then
while read executable; do
basename=$(basename "$executable")
llvm-profdata-$llvm_version merge -sparse ""$coverage_dir"/$basename.profraw" -o "$coverage_dir"/$basename.profdata
mkdir -p "$coverage_dir"/reports
llvm-cov-$llvm_version export \
--instr-profile "$coverage_dir"/$basename.profdata \
--format lcov \
"$executable" \
> "$coverage_dir"/reports/coverage-$basename.txt
done < "$RING_BUILD_EXECUTABLE_LIST"
fi