build-rust-based-toolchain.sh (4169B)
1 #!/bin/bash 2 set -x -e -v 3 4 artifact=$(basename "$TOOLCHAIN_ARTIFACT") 5 project=${artifact%.tar.*} 6 workspace=$HOME/workspace 7 8 TARGET=$1 9 shift 10 11 FEATURES="$@" 12 13 export CARGO_PROFILE_RELEASE_LTO=fat 14 rust_lto_flags="-C codegen-units=1" 15 16 case "$TARGET" in 17 x86_64-unknown-linux-gnu) 18 # Native Linux Build 19 export RUSTFLAGS="-Clinker=$MOZ_FETCHES_DIR/clang/bin/clang++ -C link-arg=--sysroot=$MOZ_FETCHES_DIR/sysroot-x86_64-linux-gnu -C link-arg=-fuse-ld=lld $rust_lto_flags" 20 export CC=$MOZ_FETCHES_DIR/clang/bin/clang 21 export CXX=$MOZ_FETCHES_DIR/clang/bin/clang++ 22 # Not using TARGET_C*FLAGS because that applies only on target compilations, 23 # while the linker flags passed through RUSTFLAGS apply to both host and target 24 # when not cross-compiling, leading to a sysroot discrepancy. 25 # Using C*FLAGS_x86_64_unknown_linux_gnu makes the flags apply to both host 26 # and target. 27 export CFLAGS_x86_64_unknown_linux_gnu="--sysroot=$MOZ_FETCHES_DIR/sysroot-x86_64-linux-gnu -fuse-ld=lld" 28 export CXXFLAGS_x86_64_unknown_linux_gnu="-D_GLIBCXX_USE_CXX11_ABI=0 --sysroot=$MOZ_FETCHES_DIR/sysroot-x86_64-linux-gnu -fuse-ld=lld" 29 ;; 30 aarch64-unknown-linux-gnu) 31 export RUSTFLAGS="-Clinker=$MOZ_FETCHES_DIR/clang/bin/clang++ -C link-arg=--sysroot=$MOZ_FETCHES_DIR/sysroot-aarch64-linux-gnu -C link-arg=-fuse-ld=lld -C link-arg=--target=$TARGET $rust_lto_flags" 32 export CC=$MOZ_FETCHES_DIR/clang/bin/clang 33 export CXX=$MOZ_FETCHES_DIR/clang/bin/clang++ 34 export TARGET_CFLAGS="--sysroot=$MOZ_FETCHES_DIR/sysroot-aarch64-linux-gnu -fuse-ld=lld" 35 export TARGET_CXXFLAGS="--sysroot=$MOZ_FETCHES_DIR/sysroot-aarch64-linux-gnu -fuse-ld=lld" 36 ;; 37 *-apple-darwin) 38 # Cross-compiling for Mac on Linux. 39 export PATH="$MOZ_FETCHES_DIR/clang/bin:$PATH" 40 if test "$TARGET" = "aarch64-apple-darwin"; then 41 export MACOSX_DEPLOYMENT_TARGET=11.0 42 else 43 export MACOSX_DEPLOYMENT_TARGET=10.15 44 fi 45 MACOS_SYSROOT=$MOZ_FETCHES_DIR/MacOSX26.2.sdk 46 export RUSTFLAGS="-Clinker=$MOZ_FETCHES_DIR/clang/bin/clang++ -C link-arg=-isysroot -C link-arg=$MACOS_SYSROOT -C link-arg=-fuse-ld=lld -C link-arg=--target=$TARGET $rust_lto_flags" 47 export CC="$MOZ_FETCHES_DIR/clang/bin/clang" 48 export CXX="$MOZ_FETCHES_DIR/clang/bin/clang++" 49 export TARGET_CFLAGS="-isysroot $MACOS_SYSROOT -fuse-ld=lld" 50 export TARGET_CXXFLAGS="-isysroot $MACOS_SYSROOT -fuse-ld=lld -stdlib=libc++" 51 ;; 52 *-pc-windows-msvc) 53 # Cross-compiling for Windows on Linux. 54 export CC=$MOZ_FETCHES_DIR/clang/bin/clang-cl 55 export CXX=$MOZ_FETCHES_DIR/clang/bin/clang-cl 56 export TARGET_AR=$MOZ_FETCHES_DIR/clang/bin/llvm-lib 57 58 . $GECKO_PATH/taskcluster/scripts/misc/vs-setup.sh 59 export CARGO_TARGET_I686_PC_WINDOWS_MSVC_LINKER=$MOZ_FETCHES_DIR/clang/bin/lld-link 60 export CARGO_TARGET_X86_64_PC_WINDOWS_MSVC_LINKER=$MOZ_FETCHES_DIR/clang/bin/lld-link 61 export CARGO_TARGET_AARCH64_PC_WINDOWS_MSVC_LINKER=$MOZ_FETCHES_DIR/clang/bin/lld-link 62 export TARGET_CFLAGS="-Xclang -ivfsoverlay -Xclang $MOZ_FETCHES_DIR/vs/overlay.yaml" 63 export TARGET_CXXFLAGS="-Xclang -ivfsoverlay -Xclang $MOZ_FETCHES_DIR/vs/overlay.yaml" 64 ;; 65 esac 66 67 PATH="$MOZ_FETCHES_DIR/rustc/bin:$MOZ_FETCHES_DIR/clang/bin:$PATH" 68 69 if [ -n "${CRATE_PATH}" ]; then 70 CRATE_PATH="${GECKO_PATH}/${CRATE_PATH}" 71 else 72 CRATE_PATH=$MOZ_FETCHES_DIR/${FETCH-$project} 73 fi 74 75 WORKSPACE_ROOT=$(cd $CRATE_PATH; cargo metadata --format-version 1 --no-deps --locked 2> /dev/null | jq -r .workspace_root) 76 77 if test ! -f $WORKSPACE_ROOT/Cargo.lock; then 78 CARGO_LOCK=taskcluster/scripts/misc/$project-Cargo.lock 79 if test -f $GECKO_PATH/$CARGO_LOCK; then 80 cp $GECKO_PATH/$CARGO_LOCK $WORKSPACE_ROOT/Cargo.lock 81 else 82 echo "Missing Cargo.lock for the crate. Please provide one in $CARGO_LOCK" >&2 83 exit 1 84 fi 85 fi 86 87 cargo install \ 88 --locked \ 89 --verbose \ 90 --path $CRATE_PATH \ 91 --target-dir $workspace/obj \ 92 --root $workspace/out \ 93 --target "$TARGET" \ 94 ${FEATURES:+--features "$FEATURES"} 95 96 mkdir $workspace/$project 97 mv $workspace/out/bin/* $workspace/$project 98 tar -C $workspace -acvf $project.tar.zst $project 99 mkdir -p $UPLOAD_DIR 100 mv $project.tar.zst $UPLOAD_DIR