| #!/bin/bash | 
 |  | 
 | set -euo pipefail | 
 |  | 
 | LINUX_VERSION=v6.17-rc5 | 
 |  | 
 | # Build rustc, rustdoc, cargo, clippy-driver and rustfmt | 
 | ../x.py build --stage 2 library rustdoc clippy rustfmt | 
 | ../x.py build --stage 1 cargo | 
 |  | 
 | BUILD_DIR=$(realpath ./build/x86_64-unknown-linux-gnu) | 
 |  | 
 | # Provide path to rustc, rustdoc, clippy-driver and rustfmt to RfL | 
 | export PATH=${PATH}:${BUILD_DIR}/stage2/bin | 
 |  | 
 | mkdir -p rfl | 
 | cd rfl | 
 |  | 
 | # Remove existing directory to make local builds easier | 
 | rm -rf linux || true | 
 |  | 
 | # Download Linux at a specific commit | 
 | mkdir -p linux | 
 | git -C linux init | 
 | git -C linux remote add origin https://github.com/Rust-for-Linux/linux.git | 
 | git -C linux fetch --depth 1 origin ${LINUX_VERSION} | 
 | git -C linux checkout FETCH_HEAD | 
 |  | 
 | # Install bindgen | 
 | "${BUILD_DIR}"/stage0/bin/cargo install \ | 
 |   --version $(linux/scripts/min-tool-version.sh bindgen) \ | 
 |   --root ${BUILD_DIR}/bindgen \ | 
 |   bindgen-cli | 
 |  | 
 | # Provide path to bindgen to RfL | 
 | export PATH=${PATH}:${BUILD_DIR}/bindgen/bin | 
 |  | 
 | # Configure Rust for Linux | 
 | cat <<EOF > linux/kernel/configs/rfl-for-rust-ci.config | 
 | # CONFIG_WERROR is not set | 
 |  | 
 | CONFIG_RUST=y | 
 |  | 
 | CONFIG_SAMPLES=y | 
 | CONFIG_SAMPLES_RUST=y | 
 |  | 
 | CONFIG_SAMPLE_RUST_MINIMAL=m | 
 | CONFIG_SAMPLE_RUST_PRINT=y | 
 |  | 
 | CONFIG_RUST_PHYLIB_ABSTRACTIONS=y | 
 | CONFIG_AX88796B_PHY=y | 
 | CONFIG_AX88796B_RUST_PHY=y | 
 |  | 
 | CONFIG_KUNIT=y | 
 | CONFIG_RUST_KERNEL_DOCTESTS=y | 
 | EOF | 
 |  | 
 | make -C linux LLVM=1 -j$(($(nproc) + 1)) \ | 
 |     rustavailable \ | 
 |     defconfig \ | 
 |     rfl-for-rust-ci.config | 
 |  | 
 | BUILD_TARGETS=" | 
 |     samples/rust/rust_minimal.o | 
 |     samples/rust/rust_print_main.o | 
 |     drivers/net/phy/ax88796b_rust.o | 
 |     rust/doctests_kernel_generated.o | 
 | " | 
 |  | 
 | # Build a few Rust targets | 
 | # | 
 | # This does not include building the C side of the kernel nor linking, | 
 | # which can find other issues, but it is much faster. | 
 | # | 
 | # This includes transforming `rustdoc` tests into KUnit ones thanks to | 
 | # `CONFIG_RUST_KERNEL_DOCTESTS=y` above (which, for the moment, uses the | 
 | # unstable `--test-builder` and `--no-run`). | 
 | make -C linux LLVM=1 -j$(($(nproc) + 1)) \ | 
 |     $BUILD_TARGETS | 
 |  | 
 | # Generate documentation | 
 | make -C linux LLVM=1 -j$(($(nproc) + 1)) \ | 
 |     rustdoc | 
 |  | 
 | # Build macro expanded source (`-Zunpretty=expanded`) | 
 | # | 
 | # This target also formats the macro expanded code, thus it is also | 
 | # intended to catch ICEs with formatting `-Zunpretty=expanded` output | 
 | # like https://github.com/rust-lang/rustfmt/issues/6105. | 
 | make -C linux LLVM=1 -j$(($(nproc) + 1)) \ | 
 |     samples/rust/rust_minimal.rsi | 
 |  | 
 | # Re-build with Clippy enabled | 
 | # | 
 | # This should not introduce Clippy errors, since `CONFIG_WERROR` is not | 
 | # set (thus no `-Dwarnings`) and the kernel uses `-W` for all Clippy | 
 | # lints, including `clippy::all`. However, it could catch ICEs. | 
 | make -C linux LLVM=1 -j$(($(nproc) + 1)) CLIPPY=1 \ | 
 |     $BUILD_TARGETS | 
 |  | 
 | # Format the code | 
 | # | 
 | # This returns successfully even if there were changes, i.e. it is not | 
 | # a check. | 
 | make -C linux LLVM=1 -j$(($(nproc) + 1)) \ | 
 |     rustfmt |