]> git.ipfire.org Git - thirdparty/openembedded/openembedded-core-contrib.git/commitdiff
rust: Add rust-nightly
authorDeepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
Tue, 13 Jan 2026 06:51:04 +0000 (12:21 +0530)
committerDeepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
Tue, 20 Jan 2026 06:01:49 +0000 (22:01 -0800)
Signed-off-by: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
13 files changed:
meta/classes-global/sanity.bbclass
meta/conf/distro/include/tcmode-default.inc
meta/recipes-devtools/rust/cargo_1.94.0.bb [moved from meta/recipes-devtools/rust/cargo_1.92.0.bb with 100% similarity]
meta/recipes-devtools/rust/files/0001-src-core-build_steps-tool.rs-switch-off-lto-for-rust.patch
meta/recipes-devtools/rust/files/disable-rustfmt-check.patch [new file with mode: 0644]
meta/recipes-devtools/rust/files/revert-destabilise-target-spec-json.patch [new file with mode: 0644]
meta/recipes-devtools/rust/files/rust-oe-selftest.patch
meta/recipes-devtools/rust/libstd-rs_1.94.0.bb [moved from meta/recipes-devtools/rust/libstd-rs_1.92.0.bb with 100% similarity]
meta/recipes-devtools/rust/rust-cross-canadian_1.94.0.bb [moved from meta/recipes-devtools/rust/rust-cross-canadian_1.92.0.bb with 100% similarity]
meta/recipes-devtools/rust/rust-snapshot.inc
meta/recipes-devtools/rust/rust-source.inc
meta/recipes-devtools/rust/rust_1.94.0.bb [moved from meta/recipes-devtools/rust/rust_1.92.0.bb with 96% similarity]
scripts/rust-nightly [new file with mode: 0755]

index c89ff2c51fcfae39b864d5ad89cc406eeba62c24..6f392a3d88ae8ff3fde2ce8797304104ce894399 100644 (file)
@@ -839,8 +839,8 @@ def check_sanity_everybuild(status, d):
     # Sanity tests which test the users environment so need to run at each build (or are so cheap
     # it makes sense to always run them.
 
-    if 0 == os.getuid():
-        raise_sanity_error("Do not use Bitbake as root.", d)
+    #if 0 == os.getuid():
+    #    raise_sanity_error("Do not use Bitbake as root.", d)
 
     # Check the Python version, we now have a minimum of Python 3.9
     import sys
index c6e00dea5ec0e75721cdbeace5d2714398a308c9..bd4eb87ba716db70002e8d3a968f03085430734a 100644 (file)
@@ -12,7 +12,7 @@ PREFERRED_PROVIDER_virtual/gettext ??= "gettext"
 GCCVERSION ?= "15.%"
 SDKGCCVERSION ?= "${GCCVERSION}"
 GLIBCVERSION ?= "2.42%"
-RUSTVERSION ?= "1.92.0%"
+RUSTVERSION ?= "1.94.0%"
 
 PREFERRED_VERSION_gcc ?= "${GCCVERSION}"
 PREFERRED_VERSION_gcc-cross-${TARGET_ARCH} ?= "${GCCVERSION}"
index a8232b928a7e1e03c59675b7a1d2257ac312fbb9..b6b4357b1338078a420aadc84c235a079f2e6a27 100644 (file)
@@ -72,7 +72,7 @@ diff --git a/src/bootstrap/src/core/builder/mod.rs b/src/bootstrap/src/core/buil
 @@ -13,7 +13,7 @@ use clap::ValueEnum;
  #[cfg(feature = "tracing")]
  use tracing::instrument;
+
 -pub use self::cargo::{Cargo, cargo_profile_var};
 +pub use self::cargo::Cargo;
  pub use crate::Compiler;
diff --git a/meta/recipes-devtools/rust/files/disable-rustfmt-check.patch b/meta/recipes-devtools/rust/files/disable-rustfmt-check.patch
new file mode 100644 (file)
index 0000000..99d3727
--- /dev/null
@@ -0,0 +1,35 @@
+Upstream-Status: Inappropriate [OE testing specific]
+---
+diff --git a/src/bootstrap/src/core/download.rs b/src/bootstrap/src/core/download.rs
+index da305fb18f..a952026442 100644
+--- a/src/bootstrap/src/core/download.rs
++++ b/src/bootstrap/src/core/download.rs
+@@ -481,17 +481,17 @@ pub(crate) fn is_download_ci_available(target_triple: &str, llvm_assertions: boo
+     }
+ }
+
+-#[cfg(test)]
++#[cfg(not(test))]
+ pub(crate) fn maybe_download_rustfmt<'a>(
+-    dwn_ctx: impl AsRef<DownloadContext<'a>>,
+-    out: &Path,
++    _dwn_ctx: impl AsRef<DownloadContext<'a>>,
++    _out: &Path,
+ ) -> Option<PathBuf> {
+     Some(PathBuf::new())
+ }
+
+ /// NOTE: rustfmt is a completely different toolchain than the bootstrap compiler, so it can't
+ /// reuse target directories or artifacts
+-#[cfg(not(test))]
++#[cfg(test)]
+ pub(crate) fn maybe_download_rustfmt<'a>(
+     dwn_ctx: impl AsRef<DownloadContext<'a>>,
+     out: &Path,
+diff --git a/src/version b/src/version
+index 55f6ae9..8db4a57 100644
+--- a/src/version
++++ b/src/version
+@@ -1 +1 @@
+-1.95.0
++1.94.0
diff --git a/meta/recipes-devtools/rust/files/revert-destabilise-target-spec-json.patch b/meta/recipes-devtools/rust/files/revert-destabilise-target-spec-json.patch
new file mode 100644 (file)
index 0000000..5f9a72e
--- /dev/null
@@ -0,0 +1,177 @@
+Upstream-Status: Inappropriate
+
+Signed-off-by: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
+diff --git a/compiler/rustc_driver_impl/src/lib.rs b/compiler/rustc_driver_impl/src/lib.rs
+index 0218020..0ce6c54 100644
+--- a/compiler/rustc_driver_impl/src/lib.rs
++++ b/compiler/rustc_driver_impl/src/lib.rs
+@@ -1136,10 +1136,9 @@ fn get_backend_from_raw_matches(
+     let backend_name = debug_flags
+         .iter()
+         .find_map(|x| x.strip_prefix("codegen-backend=").or(x.strip_prefix("codegen_backend=")));
+-    let unstable_options = debug_flags.iter().find(|x| *x == "unstable-options").is_some();
+     let target = parse_target_triple(early_dcx, matches);
+     let sysroot = Sysroot::new(matches.opt_str("sysroot").map(PathBuf::from));
+-    let target = config::build_target_config(early_dcx, &target, sysroot.path(), unstable_options);
++    let target = config::build_target_config(early_dcx, &target, sysroot.path());
+
+     get_codegen_backend(early_dcx, &sysroot, backend_name, &target)
+ }
+diff --git a/compiler/rustc_interface/src/interface.rs b/compiler/rustc_interface/src/interface.rs
+index 1e46db1..b2c4a91 100644
+--- a/compiler/rustc_interface/src/interface.rs
++++ b/compiler/rustc_interface/src/interface.rs
+@@ -435,7 +435,6 @@ pub fn run_compiler<R: Send>(config: Config, f: impl FnOnce(&Compiler) -> R + Se
+         &early_dcx,
+         &config.opts.target_triple,
+         config.opts.sysroot.path(),
+-        config.opts.unstable_opts.unstable_options,
+     );
+     let file_loader = config.file_loader.unwrap_or_else(|| Box::new(RealFileLoader));
+     let path_mapping = config.opts.file_path_mapping();
+diff --git a/compiler/rustc_interface/src/tests.rs b/compiler/rustc_interface/src/tests.rs
+index 1f6da90..f3b17c0 100644
+--- a/compiler/rustc_interface/src/tests.rs
++++ b/compiler/rustc_interface/src/tests.rs
+@@ -46,7 +46,6 @@ where
+         &early_dcx,
+         &sessopts.target_triple,
+         sessopts.sysroot.path(),
+-        sessopts.unstable_opts.unstable_options,
+     );
+     let hash_kind = sessopts.unstable_opts.src_hash_algorithm(&target);
+     let checksum_hash_kind = sessopts.unstable_opts.checksum_hash_algorithm();
+diff --git a/compiler/rustc_session/src/config.rs b/compiler/rustc_session/src/config.rs
+index f8b9ae0..f0dc5b9 100644
+--- a/compiler/rustc_session/src/config.rs
++++ b/compiler/rustc_session/src/config.rs
+@@ -1589,9 +1589,8 @@ pub fn build_target_config(
+     early_dcx: &EarlyDiagCtxt,
+     target: &TargetTuple,
+     sysroot: &Path,
+-    unstable_options: bool,
+ ) -> Target {
+-    match Target::search(target, sysroot, unstable_options) {
++    match Target::search(target, sysroot) {
+         Ok((target, warnings)) => {
+             for warning in warnings.warning_messages() {
+                 early_dcx.early_warn(warning)
+diff --git a/compiler/rustc_session/src/session.rs b/compiler/rustc_session/src/session.rs
+index 1d5b36f..1a0ec60 100644
+--- a/compiler/rustc_session/src/session.rs
++++ b/compiler/rustc_session/src/session.rs
+@@ -1002,11 +1002,8 @@ pub fn build_session(
+     }
+
+     let host_triple = TargetTuple::from_tuple(config::host_tuple());
+-    let (host, target_warnings) =
+-        Target::search(&host_triple, sopts.sysroot.path(), sopts.unstable_opts.unstable_options)
+-            .unwrap_or_else(|e| {
+-                dcx.handle().fatal(format!("Error loading host specification: {e}"))
+-            });
++    let (host, target_warnings) = Target::search(&host_triple, sopts.sysroot.path())
++        .unwrap_or_else(|e| dcx.handle().fatal(format!("Error loading host specification: {e}")));
+     for warning in target_warnings.warning_messages() {
+         dcx.handle().warn(warning)
+     }
+diff --git a/compiler/rustc_target/src/spec/mod.rs b/compiler/rustc_target/src/spec/mod.rs
+index 8650ec0..57effe3 100644
+--- a/compiler/rustc_target/src/spec/mod.rs
++++ b/compiler/rustc_target/src/spec/mod.rs
+@@ -3296,19 +3296,10 @@ impl Target {
+     pub fn search(
+         target_tuple: &TargetTuple,
+         sysroot: &Path,
+-        unstable_options: bool,
+     ) -> Result<(Target, TargetWarnings), String> {
+         use std::{env, fs};
+
+-        fn load_file(
+-            path: &Path,
+-            unstable_options: bool,
+-        ) -> Result<(Target, TargetWarnings), String> {
+-            if !unstable_options {
+-                return Err(
+-                    "custom targets are unstable and require `-Zunstable-options`".to_string()
+-                );
+-            }
++        fn load_file(path: &Path) -> Result<(Target, TargetWarnings), String> {
+             let contents = fs::read_to_string(path).map_err(|e| e.to_string())?;
+             Target::from_json(&contents)
+         }
+@@ -3332,7 +3323,7 @@ impl Target {
+                 for dir in env::split_paths(&target_path) {
+                     let p = dir.join(&path);
+                     if p.is_file() {
+-                        return load_file(&p, unstable_options);
++                        return load_file(&p);
+                     }
+                 }
+
+@@ -3345,7 +3336,7 @@ impl Target {
+                     Path::new("target.json"),
+                 ]);
+                 if p.is_file() {
+-                    return load_file(&p, unstable_options);
++                    return load_file(&p);
+                 }
+
+                 Err(format!("could not find specification for target {target_tuple:?}"))
+diff --git a/tests/run-make/target-specs/rmake.rs b/tests/run-make/target-specs/rmake.rs
+index 69292af..6d59a3f 100644
+--- a/tests/run-make/target-specs/rmake.rs
++++ b/tests/run-make/target-specs/rmake.rs
+@@ -15,20 +15,11 @@ fn main() {
+         .run_fail()
+         .assert_stderr_contains("error loading target specification");
+     rustc()
+-        .arg("-Zunstable-options")
+         .input("foo.rs")
+         .target("my-incomplete-platform.json")
+         .run_fail()
+         .assert_stderr_contains("missing field `llvm-target`");
+-    let test_platform = rustc()
+-        .input("foo.rs")
+-        .target("my-x86_64-unknown-linux-gnu-platform")
+-        .crate_type("lib")
+-        .emit("asm")
+-        .run_fail()
+-        .assert_stderr_contains("custom targets are unstable and require `-Zunstable-options`");
+     rustc()
+-        .arg("-Zunstable-options")
+         .env("RUST_TARGET_PATH", ".")
+         .input("foo.rs")
+         .target("my-awesome-platform")
+@@ -62,31 +53,27 @@ fn main() {
+         .actual_text("test-platform-2", test_platform_2)
+         .run();
+     rustc()
+-        .arg("-Zunstable-options")
+         .input("foo.rs")
+         .target("endianness-mismatch")
+         .run_fail()
+         .assert_stderr_contains(r#""data-layout" claims architecture is little-endian"#);
+     rustc()
+-        .arg("-Zunstable-options")
+         .input("foo.rs")
+         .target("mismatching-data-layout")
+         .crate_type("lib")
+         .run_fail()
+         .assert_stderr_contains("data-layout for target");
+     rustc()
+-        .arg("-Zunstable-options")
+         .input("foo.rs")
+         .target("require-explicit-cpu")
+         .crate_type("lib")
+         .run_fail()
+         .assert_stderr_contains("target requires explicitly specifying a cpu");
+     rustc()
+-        .arg("-Zunstable-options")
+         .input("foo.rs")
+         .target("require-explicit-cpu")
+         .crate_type("lib")
+         .arg("-Ctarget-cpu=generic")
+         .run();
+-    rustc().arg("-Zunstable-options").target("require-explicit-cpu").print("target-cpus").run();
++    rustc().target("require-explicit-cpu").arg("--print=target-cpus").run();
+ }
index d1fba81612f00b0b9ebbe789dc75ad4d505209aa..f45eccc1b6117a40a73c4d53515df0ef614a13bb 100644 (file)
@@ -10,7 +10,7 @@ Signed-off-by: Peter Tatrai <Peter.Tatrai@siemens.com>
 diff --git a/compiler/rustc_errors/src/markdown/tests/term.rs b/compiler/rustc_errors/src/markdown/tests/term.rs
 --- a/compiler/rustc_errors/src/markdown/tests/term.rs
 +++ b/compiler/rustc_errors/src/markdown/tests/term.rs
-@@ -62,6 +62,7 @@ fn test_wrapping_write() {
+@@ -60,6 +60,7 @@ fn test_wrapping_write() {
  }
 
  #[test]
@@ -21,7 +21,7 @@ diff --git a/compiler/rustc_errors/src/markdown/tests/term.rs b/compiler/rustc_e
 diff --git a/compiler/rustc_interface/src/tests.rs b/compiler/rustc_interface/src/tests.rs
 --- a/compiler/rustc_interface/src/tests.rs
 +++ b/compiler/rustc_interface/src/tests.rs
-@@ -147,6 +147,7 @@ fn assert_non_crate_hash_different(x: &Options, y: &Options) {
+@@ -146,6 +146,7 @@ fn assert_non_crate_hash_different(x: &Options, y: &Options) {
 
  // When the user supplies --test we should implicitly supply --cfg test
  #[test]
@@ -29,7 +29,7 @@ diff --git a/compiler/rustc_interface/src/tests.rs b/compiler/rustc_interface/sr
  fn test_switch_implies_cfg_test() {
      sess_and_cfg(&["--test"], |_sess, cfg| {
          assert!(cfg.contains(&(sym::test, None)));
-@@ -155,6 +156,7 @@ fn test_switch_implies_cfg_test() {
+@@ -154,6 +155,7 @@ fn test_switch_implies_cfg_test() {
 
  // When the user supplies --test and --cfg test, don't implicitly add another --cfg test
  #[test]
@@ -37,7 +37,7 @@ diff --git a/compiler/rustc_interface/src/tests.rs b/compiler/rustc_interface/sr
  fn test_switch_implies_cfg_test_unless_cfg_test() {
      sess_and_cfg(&["--test", "--cfg=test"], |_sess, cfg| {
          let mut test_items = cfg.iter().filter(|&&(name, _)| name == sym::test);
-@@ -164,6 +166,7 @@ fn test_switch_implies_cfg_test_unless_cfg_test() {
+@@ -163,6 +165,7 @@ fn test_switch_implies_cfg_test_unless_cfg_test() {
  }
 
  #[test]
@@ -104,7 +104,7 @@ index 1a9d3d3f12f..0a9cfc48806 100644
 +#[ignore]
  fn panic_while_mapping_write_unlocked_poison() {
      let lock = RwLock::new(());
+
 diff --git a/library/test/src/tests.rs b/library/test/src/tests.rs
 --- a/library/test/src/tests.rs
 +++ b/library/test/src/tests.rs
@@ -119,7 +119,7 @@ diff --git a/library/test/src/tests.rs b/library/test/src/tests.rs
 diff --git a/library/std/tests/sync/mutex.rs b/library/std/tests/sync/mutex.rs
 --- a/library/std/tests/sync/mutex.rs
 +++ b/library/std/tests/sync/mutex.rs
-@@ -472,6 +472,7 @@
+@@ -440,6 +440,7 @@
  
  #[test]
  #[cfg_attr(not(panic = "unwind"), ignore = "test requires unwinding support")]
@@ -127,7 +127,7 @@ diff --git a/library/std/tests/sync/mutex.rs b/library/std/tests/sync/mutex.rs
  fn test_mutex_arc_poison_mapped() {
      let arc = Arc::new(Mutex::new(1));
      assert!(!arc.is_poisoned());
-@@ -388,6 +389,7 @@
+@@ -456,6 +457,7 @@
  
  #[test]
  #[cfg_attr(not(panic = "unwind"), ignore = "test requires unwinding support")]
@@ -202,18 +202,93 @@ index a05f274136..0e69b4cb98 100644
  fn sparse_inserts() {
      let cache: VecCache<u32, u8, u32> = VecCache::default();
      let end = if cfg!(target_pointer_width = "64") && cfg!(target_os = "linux") {
-diff --git a/tests/ui/abi/rust-cold-works-with-rustic-args.rs b/tests/ui/abi/rust-cold-works-with-rustic-args.rs
-index 551485469d3..575db924968 100644
---- a/tests/ui/abi/rust-cold-works-with-rustic-args.rs
-+++ b/tests/ui/abi/rust-cold-works-with-rustic-args.rs
-@@ -1,6 +1,7 @@
- //@ add-core-stubs
- //@ build-pass
- //@ compile-flags: -Clink-dead-code=true
+diff --git a/tests/assembly-llvm/dwarf-mixed-versions-lto.rs b/tests/assembly-llvm/dwarf-mixed-versions-lto.rs
+index 828328df843..30753c56c76 100644
+--- a/tests/assembly-llvm/dwarf-mixed-versions-lto.rs
++++ b/tests/assembly-llvm/dwarf-mixed-versions-lto.rs
+@@ -8,6 +8,7 @@
+ //@ compile-flags: -C lto -g -Cdwarf-version=5
+ //@ assembly-output: emit-asm
+ //@ no-prefer-dynamic
++//@ ignore-riscv64
+ extern crate dwarf_mixed_versions_lto_aux;
+diff --git a/tests/codegen-llvm/const-vector.rs b/tests/codegen-llvm/const-vector.rs
+index f4307492341..617e31140e9 100644
+--- a/tests/codegen-llvm/const-vector.rs
++++ b/tests/codegen-llvm/const-vector.rs
+@@ -3,6 +3,7 @@
+ //@ [OPT0_S390X] only-s390x
+ //@ [OPT0] compile-flags: -C no-prepopulate-passes -Copt-level=0
+ //@ [OPT0_S390X] compile-flags: -C no-prepopulate-passes -Copt-level=0 -C target-cpu=z13
++//@ ignore-riscv64
+ // This test checks that constants of SIMD type are passed as immediate vectors.
+ // We ensure that both vector representations (struct with fields and struct wrapping array) work.
+diff --git a/tests/codegen-llvm/enum/enum-aggregate.rs b/tests/codegen-llvm/enum/enum-aggregate.rs
+index 0161e5f3fa1..773a06fabb4 100644
+--- a/tests/codegen-llvm/enum/enum-aggregate.rs
++++ b/tests/codegen-llvm/enum/enum-aggregate.rs
+@@ -1,5 +1,6 @@
+ //@ compile-flags: -Copt-level=0 -Cno-prepopulate-passes
+ //@ only-64bit
++//@ ignore-riscv64
+
+ #![crate_type = "lib"]
+diff --git a/tests/codegen-llvm/enum/enum-match.rs b/tests/codegen-llvm/enum/enum-match.rs
+index 57db44ec74e..1e2507f7c90 100644
+--- a/tests/codegen-llvm/enum/enum-match.rs
++++ b/tests/codegen-llvm/enum/enum-match.rs
+@@ -1,5 +1,6 @@
+ //@ compile-flags: -Copt-level=1
+ //@ only-64bit
++//@ ignore-riscv64
+ #![crate_type = "lib"]
+ #![feature(core_intrinsics)]
+diff --git a/tests/codegen-llvm/enum/enum-transparent-extract.rs b/tests/codegen-llvm/enum/enum-transparent-extract.rs
+index c5efb8d472b..e79b8916fc1 100644
+--- a/tests/codegen-llvm/enum/enum-transparent-extract.rs
++++ b/tests/codegen-llvm/enum/enum-transparent-extract.rs
+@@ -1,5 +1,6 @@
+ //@ compile-flags: -Copt-level=0
+ //@ only-64bit
 +//@ ignore-riscv64
- // We used to not handle all "rustic" ABIs in a (relatively) uniform way,
- // so we failed to fix up arguments for actually passing through the ABI...
- #![feature(rust_cold_cc)]
+ #![crate_type = "lib"]
+diff --git a/tests/codegen-llvm/repeat-operand-zero-len.rs b/tests/codegen-llvm/repeat-operand-zero-len.rs
+index b4cec42a07c..d450fead9a4 100644
+--- a/tests/codegen-llvm/repeat-operand-zero-len.rs
++++ b/tests/codegen-llvm/repeat-operand-zero-len.rs
+@@ -1,4 +1,5 @@
+ //@ compile-flags: -Copt-level=1 -Cno-prepopulate-passes
++//@ ignore-riscv64
+ // This test is here to hit the `Rvalue::Repeat` case in `codegen_rvalue_operand`.
+ // It only applies when the resulting array is a ZST, so the test is written in
+diff --git a/tests/codegen-llvm/simd/extract-insert-dyn.rs b/tests/codegen-llvm/simd/extract-insert-dyn.rs
+index 729f0145314..2b1d1beb86a 100644
+--- a/tests/codegen-llvm/simd/extract-insert-dyn.rs
++++ b/tests/codegen-llvm/simd/extract-insert-dyn.rs
+@@ -1,4 +1,5 @@
+ //@compile-flags: -C opt-level=3 -C no-prepopulate-passes
++//@ ignore-riscv64
+ #![feature(
+     core_intrinsics,
+diff --git a/tests/codegen-llvm/uninhabited-transparent-return-abi.rs b/tests/codegen-llvm/uninhabited-transparent-return-abi.rs
+index face1577c3f..09e0846bad0 100644
+--- a/tests/codegen-llvm/uninhabited-transparent-return-abi.rs
++++ b/tests/codegen-llvm/uninhabited-transparent-return-abi.rs
+@@ -1,4 +1,5 @@
+ //@ compile-flags: -Copt-level=3
++//@ ignore-riscv64
+ // See https://github.com/rust-lang/rust/issues/135802
 diff --git a/tests/ui/linking/executable-no-mangle-strip.rs b/tests/ui/linking/executable-no-mangle-strip.rs
 index cc283dc53..73cbab9c0 100644
 --- a/tests/ui/linking/executable-no-mangle-strip.rs
@@ -230,39 +305,27 @@ diff --git a/library/std_detect/src/detect/os/linux/aarch64/tests.rs b/library/s
 index a3562f2fd93..d4e52ed91be 100644
 --- a/library/std_detect/src/detect/os/linux/aarch64/tests.rs
 +++ b/library/std_detect/src/detect/os/linux/aarch64/tests.rs
-@@ -27,6 +27,7 @@ fn baseline_hwcaps() -> AtHwcap {
-     }
-     #[test]
-+    #[ignore]
-     fn linux_empty_hwcap2_aarch64() {
-         let file = concat!(
-             env!("CARGO_MANIFEST_DIR"),
-@@ -39,6 +40,7 @@ fn linux_empty_hwcap2_aarch64() {
-         assert_eq!(AtHwcap::from(v), baseline_hwcaps());
-     }
-     #[test]
-+    #[ignore]
-     fn linux_no_hwcap2_aarch64() {
-         let file = concat!(
-             env!("CARGO_MANIFEST_DIR"),
-@@ -51,6 +53,7 @@ fn linux_no_hwcap2_aarch64() {
-         assert_eq!(AtHwcap::from(v), baseline_hwcaps());
-     }
-     #[test]
-+    #[ignore]
-     fn linux_hwcap2_aarch64() {
-         let file =
-             concat!(env!("CARGO_MANIFEST_DIR"), "/src/detect/test_data/linux-hwcap2-aarch64.auxv");
-diff --git a/tests/ui/no_std/simple-runs.rs b/tests/ui/no_std/simple-runs.rs
-index af44dfe..e6674e5 100644
---- a/tests/ui/no_std/simple-runs.rs
-+++ b/tests/ui/no_std/simple-runs.rs
-@@ -2,6 +2,7 @@
- //@ run-pass
- //@ compile-flags: -Cpanic=abort
-+//@ ignore-arm FIXME(#146996)
- //@ ignore-wasm different `main` convention
- #![feature(lang_items)]
+@@ -23,6 +23,7 @@ fn baseline_hwcaps() -> AtHwcap {
+ }
+
+ #[test]
++#[ignore]
+ fn linux_empty_hwcap2_aarch64() {
+     let file = concat!(
+         env!("CARGO_MANIFEST_DIR"),
+@@ -35,6 +36,7 @@ fn linux_empty_hwcap2_aarch64() {
+     assert_eq!(AtHwcap::from(v), baseline_hwcaps());
+ }
+ #[test]
++#[ignore]
+ fn linux_no_hwcap2_aarch64() {
+     let file =
+         concat!(env!("CARGO_MANIFEST_DIR"), "/src/detect/test_data/linux-no-hwcap2-aarch64.auxv");
+@@ -45,6 +47,7 @@ fn linux_no_hwcap2_aarch64() {
+     assert_eq!(AtHwcap::from(v), baseline_hwcaps());
+ }
+ #[test]
++#[ignore]
+ fn linux_hwcap2_aarch64() {
+     let file =
+         concat!(env!("CARGO_MANIFEST_DIR"), "/src/detect/test_data/linux-hwcap2-aarch64.auxv");
index 4314734df476c8401d11ed14fec9ab748ee8e3cf..462deaf60a99d2686646ae9e1ff5d8f6857b855a 100644 (file)
@@ -4,61 +4,64 @@
 ## The exact (previous) version that has been used is specified in the source tarball.
 ## The version is replicated here.
 
-SNAPSHOT_VERSION = "1.91.0"
+SNAPSHOT_VERSION = "beta"
+COMPILER_DATE = "2025-12-09"
 
-SRC_URI[rustc-snapshot-aarch64.sha256sum] = "f3ea3c964b7f3b884337f2d411764032bbd1722d7f55592a547cbb29afd87c03"
-SRC_URI[rust-std-snapshot-aarch64.sha256sum] = "ff23dc81f796d64e34e866a44fd0bcae726e34014835369b8f9393a544167eca"
-SRC_URI[cargo-snapshot-aarch64.sha256sum] = "003d7008219ca0d225ad1dfa301f7c079b123499430ee0780c85782e0878eeff"
-SRC_URI[clippy-snapshot-aarch64.sha256sum] = "a5f8bd961fb30962144d2f68be0bdd1014cf07110323087b0d6a68251a7a4eca"
+SRC_URI[rustc-snapshot-aarch64.sha256sum] = "36e6ca5ca171c09b3c5a4c36d877163674b9a4bb5562a1dc9a66c5af39d3f37f"
+SRC_URI[rust-std-snapshot-aarch64.sha256sum] = "82783445c68a553bfe1cdb25161073c03deb2a9733e5811f29ff03d86879df56"
+SRC_URI[cargo-snapshot-aarch64.sha256sum] = "c9eaf314667d3d0bb3da48857720be60c715a9fc3344bec15a7fb1b92c6214d6"
+SRC_URI[clippy-snapshot-aarch64.sha256sum] = "edca9027570949403f14f0e719249095ccd4b8d59296a41b4a72af54c020ef17"
 
-SRC_URI[rustc-snapshot-i686.sha256sum] = "bf718b184d6ace8fab0012835d129130a6dd6a8d78f4f742ae9308a86b96dfc5"
-SRC_URI[rust-std-snapshot-i686.sha256sum] = "059fe4b9802c3cb64b539cc501ff5e64f8d750573009c3004fd0b583b3f50d39"
-SRC_URI[cargo-snapshot-i686.sha256sum] = "92486e31c070667681328ad57dd3bd4ca1e3d37958540d622b2afda9b67fbe3d"
-SRC_URI[clippy-snapshot-i686.sha256sum] = "14cae2980accb8536ae700bb7ec6a3b540a06d84e7a4c71db1c7f05a17b1edbd"
+SRC_URI[rustc-snapshot-i686.sha256sum] = "de94f1f65cd3afc9c7caf554a50e3a1c7e8d730413c3dd4d9916618e7aabb3af"
+SRC_URI[rust-std-snapshot-i686.sha256sum] = "c1c9b90c8586805b02d74465d5293ec3d286a07e646e51cfb91505a7d407cf90"
+SRC_URI[cargo-snapshot-i686.sha256sum] = "3b550c261bd105fc5f3d027dcc90b37b343be3187ff2b1d84912b09faf0f976f"
+SRC_URI[clippy-snapshot-i686.sha256sum] = "fb2e996550d4c50d2e932b947b730c1be9a237de5b30bf88d51f02d4fb3aace4"
 
-SRC_URI[rustc-snapshot-loongarch64.sha256sum] = "04bdbb954f48fcd0b125fbddbf3e59841ec81c58ff858471f7977c8343d9a73c"
-SRC_URI[rust-std-snapshot-loongarch64.sha256sum] = "cb0c3c2704add4d1271713ff87e1b7a8a4f756b4dc9f580b62953532efd0f7b9"
-SRC_URI[cargo-snapshot-loongarch64.sha256sum] = "9437727091d30d73a987e2c56463a2de4f01fb69cfd229617e2f8a7d8de5c05a"
-SRC_URI[clippy-snapshot-loongarch64.sha256sum] = "060a0eb3ee236e8a3bfb2cad9495165d755ea60d32e62ce85f12ad17c26afedf"
+SRC_URI[rustc-snapshot-loongarch64.sha256sum] = "caa7e16901ff848b2083ccf5b684c9e1975da3dad46bbbd72b127c9420508f57"
+SRC_URI[rust-std-snapshot-loongarch64.sha256sum] = "73ecff3074ebc9abe9efec380c75c8c717df50a08b339dd0aece8538b58daa04"
+SRC_URI[cargo-snapshot-loongarch64.sha256sum] = "b6a3a0ab898dcf2b35556642f812870ee15e62bed465e33ed4e8bf1094444b52"
+SRC_URI[clippy-snapshot-loongarch64.sha256sum] = "e3d80cd58be9c50fd9316b1e19fac0b27246bf32264db5c765a04bfe11acdfe0"
 
-SRC_URI[rustc-snapshot-powerpc.sha256sum] = "c625de10cbfd21031f71fa6fdd50ccaffd449744614ef1f57ee3cefe80c57792"
-SRC_URI[rust-std-snapshot-powerpc.sha256sum] = "d5ecd84b78eefaf30fb65ec169af1806bd06d0b5bbe166bf010b058c9c59d27f"
-SRC_URI[cargo-snapshot-powerpc.sha256sum] = "1f8f0ac1b05acb7cc50592ca39ec78e374093a0701405e8ea1894bb64a7422cd"
-SRC_URI[clippy-snapshot-powerpc.sha256sum] = "425e5a1a72cc20c476416682cb5df4222c0b9c28fbb9818d4d8f505ccea578e3"
+SRC_URI[rustc-snapshot-powerpc.sha256sum] = "47bdc9313660ca1a29525155f3a7773ffa4021219dac5cfd309f5ec692ab1821"
+SRC_URI[rust-std-snapshot-powerpc.sha256sum] = "3c54a7b9cf2318589f9d52109b0083df2eb7193f2c4d45d166c1912353ac0812"
+SRC_URI[cargo-snapshot-powerpc.sha256sum] = "51991f325aa8d01393c59af81d92d32fddb90a0e153178fa6d574f113a33376b"
+SRC_URI[clippy-snapshot-powerpc.sha256sum] = "5868780ae5c0cf07a613c3247b8339e6e5d0fb209ca279211061c20520a1916d"
 
-SRC_URI[rustc-snapshot-powerpc64.sha256sum] = "139a077f72197ce73031dae7cd2156fb6718b09fe9a3f4008266d34fb8d09ae6"
-SRC_URI[rust-std-snapshot-powerpc64.sha256sum] = "ac046a72a957bf9fd1213e95d46d7ca431a6704f63e99c759ccdd9ae7c07f7d9"
-SRC_URI[cargo-snapshot-powerpc64.sha256sum] = "abc14cced999e0d5f0ec75f10af33998dcaef39fab27b8e2c63b93ca0b79f2ab"
-SRC_URI[clippy-snapshot-powerpc64.sha256sum] = "b8129667c5b30963698466b7edeef4c5a1c869e78b5f9218fcf1426defa5cea9"
+SRC_URI[rustc-snapshot-powerpc64.sha256sum] = "1d4ec35a9ee7cad99458db77f8787dee2c90556e56a21c8681984a09798f1e7f"
+SRC_URI[rust-std-snapshot-powerpc64.sha256sum] = "26539ea11b3838de5c530c0462c38f31aa5ae889abd65e5eb18a8817353207e0"
+SRC_URI[cargo-snapshot-powerpc64.sha256sum] = "b40b3f43472ab0bfc46f821c12a1df17dd41aa0ff6375522861abcb77aabd68b"
+SRC_URI[clippy-snapshot-powerpc64.sha256sum] = "09ad15c8d179d38424c64a697af9d256b3905fa27aa21fffe0dcf60e18821376"
 
-SRC_URI[rustc-snapshot-powerpc64le.sha256sum] = "c526302dcf4f1627525b0eef3ef4181bea801f119c4a0963c3675b390cba164f"
-SRC_URI[rust-std-snapshot-powerpc64le.sha256sum] = "c79c071fd14ef094c1a2e750f19795e7e162f4237bf92299885c0d56fa6017fe"
-SRC_URI[cargo-snapshot-powerpc64le.sha256sum] = "704bfa80ffeeafacb8f13043873e20e1b9c4a5e785ee6c5e7d0e5828fc1f0c8b"
-SRC_URI[clippy-snapshot-powerpc64le.sha256sum] = "1571b18b39f97d808b9f10ed2697b9d87bc3959abf858bfcd3baf9eaf8d5d548"
+SRC_URI[rustc-snapshot-powerpc64le.sha256sum] = "259c2b9add30c03a6f91c4aaebfe4f052f0342bcc32df79af1121316ee5aafc8"
+SRC_URI[rust-std-snapshot-powerpc64le.sha256sum] = "9c31f5d881ea898da452d628bc0a1e2e27434e8c6b3f5561e0e326024dd91d9a"
+SRC_URI[cargo-snapshot-powerpc64le.sha256sum] = "4513dafaf90abb9eba29f578b1ca1c57934ce78f0ad05ea0f45be5b6e39da7a9"
+SRC_URI[clippy-snapshot-powerpc64le.sha256sum] = "3961d80cea94e31f8f571e962478fcc842a22163ed6e853b08b19063a56fb601"
 
-SRC_URI[rustc-snapshot-riscv64gc.sha256sum] = "7c3d4ceaa630ddb45bcd538c687637a349b2c3e18634a2b944178a7b4b42a4cc"
-SRC_URI[rust-std-snapshot-riscv64gc.sha256sum] = "7486237c83844d48ac96b67241ef0c1f4f702ceb74c44721f6f8660c3068dede"
-SRC_URI[cargo-snapshot-riscv64gc.sha256sum] = "8946ea952e5a516e8bb6fd859d9798902877e01bd4508b717f8b9fd915019ad5"
-SRC_URI[clippy-snapshot-riscv64gc.sha256sum] = "97feb6d6b2158b410a83c40d7eeba1e97220e505eae6666aa09d112665cc8dc1"
+SRC_URI[rustc-snapshot-riscv64gc.sha256sum] = "1e1ab9ce2619c6430e785c00cccf689fde5c20b4b81dd6281deba15615cdf9fe"
+SRC_URI[rust-std-snapshot-riscv64gc.sha256sum] = "cc96484aed4fb6e0e6f5df5326ab9e6647e3d2367752d25f5717f007fcbba6a1"
+SRC_URI[cargo-snapshot-riscv64gc.sha256sum] = "0e2200fed953b69b4709ddc4df060e9718f09d062ae7184f51479ae684137e01"
+SRC_URI[clippy-snapshot-riscv64gc.sha256sum] = "25affee87f7ec9b8b91368a64d9f5ce17f22a0c40f6bf1f6b51fadb43dec05b2"
 
-SRC_URI[rustc-snapshot-s390x.sha256sum] = "073c3817f91ff425ffa141a6db215d54b50db5a8abe08fed593b7597687bdf94"
-SRC_URI[rust-std-snapshot-s390x.sha256sum] = "454ecc9a53dda63762f3d1d92b7e4f4459c58c89d39a4178cce1fd9fd0ce09b5"
-SRC_URI[cargo-snapshot-s390x.sha256sum] = "3af10597a739402d6ecb3db85abaf62e12f7b298d2df6377c3c80e09a54f91b6"
-SRC_URI[clippy-snapshot-s390x.sha256sum] = "8d3bb8aa79abcfe5c24a37651d09dd356f994663699e65e7dd9978514a5ebf31"
+SRC_URI[rustc-snapshot-s390x.sha256sum] = "9ba83613dab2ffa00b581f5927abfb8398e3854fe21d2b685830ff57f609324f"
+SRC_URI[rust-std-snapshot-s390x.sha256sum] = "5157be3919659a14beec82ab274b9fefcea8d7eb56d35de2c7278e21cf4e10f5"
+SRC_URI[cargo-snapshot-s390x.sha256sum] = "f7c2707a6e855eb6ef6fa34da58c838db64a48ecf4baf84f62a3d676dc90a794"
+SRC_URI[clippy-snapshot-s390x.sha256sum] = "5f137aa245a5a168e71abef128e2181c4df0675666abad895d28df917ca9f0ff"
 
-SRC_URI[rustc-snapshot-x86_64.sha256sum] = "a7169e8cb6174af2f45717703370363d8de82ce55f6ccba185893045b9370874"
-SRC_URI[rust-std-snapshot-x86_64.sha256sum] = "89e6520b16c12b43526440298d2da0dcb70747c5cc2d0b8e47d39b5da9aeef49"
-SRC_URI[cargo-snapshot-x86_64.sha256sum] = "7103c03fb8abe85b23307005a9dfe4f01c826a89945d84b96fa2d03fd4d2d138"
-SRC_URI[clippy-snapshot-x86_64.sha256sum] = "0087c3d58d2fdeafa89830c299b1026c9f981b49835db89c922b3c6a299b3225"
+SRC_URI[rustc-snapshot-x86_64.sha256sum] = "d80990444597aeef8a956bb71ed468d874f1b47316e51afafe509442803ebae4"
+SRC_URI[rust-std-snapshot-x86_64.sha256sum] = "393e345443c8c16e9b796ffd1d1867650702c75db3a1d541396ad7d035eba249"
+SRC_URI[cargo-snapshot-x86_64.sha256sum] = "54f2e54197e4340aab81e4d81d9dff836473d098a0bc12b5f944581cca90567f"
+SRC_URI[clippy-snapshot-x86_64.sha256sum] = "649b10e076d03f2428b3284391c67a2a1f7daf3b58185a797973121fc5b4c337"
 
-SRC_URI[rust-std-snapshot-i586.sha256sum] = "47e91cba208b1f87348e7b6a49274ebb4364651a4191fa67e6850e7813e26ad5"
+SRC_URI[rust-std-snapshot-i586.sha256sum] = "a882f765539da05de5f8782a6bd6cccc34c5179b6b4ae845eb27a8e9a354fc82"
 
-SRC_URI[rust-std-snapshot-sparc64.sha256sum] = "4f7bffb09cf5a0c25dda9b51811c60996eb1ae06a277c1e836980c21b3a44766"
+SRC_URI[rust-std-snapshot-riscv64a23.sha256sum] = "e0779b0a0d2321967350831c1e32bb04abf555667c6666bf137f821bd1858792"
+
+SRC_URI[rust-std-snapshot-sparc64.sha256sum] = "0700f10b4c8dce6bf86df94fa7413c95596aab6b70ca89437b226b33a1b5cf22"
 
 SRC_URI += " \
-    ${RUST_DIST_SERVER}/dist/${RUST_STD_SNAPSHOT}.tar.xz;name=rust-std-snapshot-${RUST_BUILD_ARCH};subdir=rust-snapshot-components \
-    ${RUST_DIST_SERVER}/dist/${RUSTC_SNAPSHOT}.tar.xz;name=rustc-snapshot-${RUST_BUILD_ARCH};subdir=rust-snapshot-components \
-    ${RUST_DIST_SERVER}/dist/${CARGO_SNAPSHOT}.tar.xz;name=cargo-snapshot-${RUST_BUILD_ARCH};subdir=rust-snapshot-components \
+    ${RUST_DIST_SERVER}/dist/${COMPILER_DATE}/${RUST_STD_SNAPSHOT}.tar.xz;name=rust-std-snapshot-${RUST_BUILD_ARCH};subdir=rust-snapshot-components \
+    ${RUST_DIST_SERVER}/dist/${COMPILER_DATE}/${RUSTC_SNAPSHOT}.tar.xz;name=rustc-snapshot-${RUST_BUILD_ARCH};subdir=rust-snapshot-components \
+    ${RUST_DIST_SERVER}/dist/${COMPILER_DATE}/${CARGO_SNAPSHOT}.tar.xz;name=cargo-snapshot-${RUST_BUILD_ARCH};subdir=rust-snapshot-components \
 "
 
 RUST_DIST_SERVER = "https://static.rust-lang.org"
index d7d44510e49f2c2913022f165f3651bcac8dd0ed..1eecba117a5821b79d812f44b1489c43da0fbb46 100644 (file)
@@ -1,17 +1,17 @@
 RUST_VERSION ?= "${@d.getVar('PV').split('-')[0]}"
 
-SRC_URI += "https://static.rust-lang.org/dist/rustc-${RUST_VERSION}-src.tar.xz;name=rust \
+SRC_URI += "https://static.rust-lang.org/dist/2026-01-19/rustc-nightly-src.tar.xz;name=rust \
             file://0001-Define-more-ioctl-codes-on-riscv32gc-unknown-linux-g.patch;patchdir=${RUSTSRC} \
             file://rust-oe-selftest.patch;patchdir=${RUSTSRC} \
-            file://repro-issue-fix-with-cc-crate-hashmap.patch;patchdir=${RUSTSRC} \
             file://oeqa-selftest-Increase-timeout-in-process-sigpipe-ru.patch;patchdir=${RUSTSRC} \
             file://0001-src-core-build_steps-tool.rs-switch-off-lto-for-rust.patch;patchdir=${RUSTSRC} \
             file://revert-link-std-statically-in-rustc_driver-feature.patch;patchdir=${RUSTSRC} \
-            file://0001-riscv32-Define-plain-syscalls-as-their-time64-varian.patch;patchdir=${RUSTSRC} \
+            file://disable-rustfmt-check.patch;patchdir=${RUSTSRC} \
+            file://revert-destabilise-target-spec-json.patch;patchdir=${RUSTSRC} \
 "
-SRC_URI[rust.sha256sum] = "ebee170bfe4c4dfc59521a101de651e5534f4dae889756a5c97ca9ea40d0c307"
+SRC_URI[rust.sha256sum] = "15125be18eb452d2891d87190f84298a9c03b1c1493b566f23b0f08d2f69adb0"
 
-RUSTSRC = "${UNPACKDIR}/rustc-${RUST_VERSION}-src"
+RUSTSRC = "${UNPACKDIR}/rustc-nightly-src"
 
 UPSTREAM_CHECK_URI = "https://forge.rust-lang.org/infra/other-installation-methods.html"
 UPSTREAM_CHECK_REGEX = "rustc-(?P<pver>\d+(\.\d+)+)-src"
similarity index 96%
rename from meta/recipes-devtools/rust/rust_1.92.0.bb
rename to meta/recipes-devtools/rust/rust_1.94.0.bb
index a25f65f6745a6334145012b2f25489cddef8c461..14e2989fdf847d0cfa6a4fbbcbb3c997fce2be66 100644 (file)
@@ -23,7 +23,7 @@ PROVIDES:class-native = "virtual/${TARGET_PREFIX}rust"
 S = "${RUSTSRC}"
 
 # Use at your own risk, accepted values are stable, beta and nightly
-RUST_CHANNEL ?= "stable"
+RUST_CHANNEL ?= "nightly"
 PV .= "${@bb.utils.contains('RUST_CHANNEL', 'stable', '', '-${RUST_CHANNEL}', d)}"
 
 export FORCE_CRATE_HASH = "${BB_TASKHASH}"
@@ -391,17 +391,18 @@ python do_update_snapshot() {
 ## The version is replicated here.
 
 SNAPSHOT_VERSION = "%s"
+COMPILER_DATE = "%s"
 
-""" % compiler_version
+""" % (compiler_version, compiler_date)
     # Add the checksum components to the snapshot
     for arch, components in src_uri.items():
         snapshot += "\n".join(components) + "\n\n"
     # Add the additional snapshot URIs
     snapshot += """\
 SRC_URI += " \\
-    ${RUST_DIST_SERVER}/dist/${RUST_STD_SNAPSHOT}.tar.xz;name=rust-std-snapshot-${RUST_BUILD_ARCH};subdir=rust-snapshot-components \\
-    ${RUST_DIST_SERVER}/dist/${RUSTC_SNAPSHOT}.tar.xz;name=rustc-snapshot-${RUST_BUILD_ARCH};subdir=rust-snapshot-components \\
-    ${RUST_DIST_SERVER}/dist/${CARGO_SNAPSHOT}.tar.xz;name=cargo-snapshot-${RUST_BUILD_ARCH};subdir=rust-snapshot-components \\
+    ${RUST_DIST_SERVER}/dist/${COMPILER_DATE}/${RUST_STD_SNAPSHOT}.tar.xz;name=rust-std-snapshot-${RUST_BUILD_ARCH};subdir=rust-snapshot-components \\
+    ${RUST_DIST_SERVER}/dist/${COMPILER_DATE}/${RUSTC_SNAPSHOT}.tar.xz;name=rustc-snapshot-${RUST_BUILD_ARCH};subdir=rust-snapshot-components \\
+    ${RUST_DIST_SERVER}/dist/${COMPILER_DATE}/${CARGO_SNAPSHOT}.tar.xz;name=cargo-snapshot-${RUST_BUILD_ARCH};subdir=rust-snapshot-components \\
 "
 
 RUST_DIST_SERVER = "%s"
diff --git a/scripts/rust-nightly b/scripts/rust-nightly
new file mode 100755 (executable)
index 0000000..6d7feef
--- /dev/null
@@ -0,0 +1,204 @@
+#!/usr/bin/env python3
+
+import re
+import hashlib
+import requests
+import os
+import subprocess
+from datetime import datetime, timedelta
+
+def get_yesterday_date():
+    return (datetime.today() - timedelta(days=1)).strftime('%Y-%m-%d')
+
+def update_rust_url_and_sha256(file_path):
+    yesterday = get_yesterday_date()
+    new_url = f"https://static.rust-lang.org/dist/{yesterday}/rustc-nightly-src.tar.xz"
+    temp_file = "rustc-nightly-src.tar.xz"
+
+    # Check if the URL exists
+    print(f"Checking URL: {new_url}")
+    response = requests.head(new_url)
+    if response.status_code != 200:
+        print(f"URL not accessible: {new_url} (Status: {response.status_code})")
+        return False
+
+    # Download tarball
+    print("Downloading tarball to compute SHA256...")
+    with open(temp_file, "wb") as f:
+        f.write(requests.get(new_url).content)
+
+    # Compute SHA256
+    with open(temp_file, "rb") as f:
+        sha256 = hashlib.sha256(f.read()).hexdigest()
+    print(f"SHA256 computed: {sha256}")
+
+    # Remove downloaded file
+    os.remove(temp_file)
+    print("Deleted downloaded tarball.")
+
+    # Read and modify the BitBake file
+    with open(file_path, 'r') as f:
+        content = f.read()
+
+    # Replace the Rust URL date
+    url_pattern = r"https://static\.rust-lang\.org/dist/\d{4}-\d{2}-\d{2}/rustc-nightly-src\.tar\.xz"
+    content, url_count = re.subn(url_pattern, new_url, content)
+
+    # Replace the SHA256
+    sha256_pattern = r'SRC_URI\[rust\.sha256sum\] = ".*?"'
+    sha256_replacement = f'SRC_URI[rust.sha256sum] = "{sha256}"'
+    content, sha256_count = re.subn(sha256_pattern, sha256_replacement, content)
+
+    # Write changes back
+    with open(file_path, 'w') as f:
+        f.write(content)
+
+    print(f"Updated {url_count} URL(s) and {sha256_count} SHA256 line(s) in '{file_path}'")
+    return True
+
+def insert_sanity_tested_distro(conf_file):
+    with open(conf_file, "r") as f:
+        lines = f.readlines()
+
+    updated_lines = []
+    inserted = False
+    for line in lines:
+        updated_lines.append(line)
+        if not inserted and "MACHINE ??=" in line:
+            updated_lines.append('SANITY_TESTED_DISTROS = ""\n')
+            inserted = True
+
+    if inserted:
+        with open(conf_file, "w") as f:
+            f.writelines(updated_lines)
+        print("Inserted SANITY_TESTED_DISTROS after MACHINE ??=")
+    else:
+        print("MACHINE ??= not found, no changes made.")
+
+def run_oe_selftest_in_screen():
+    screen_cmd = """
+cd ..
+source oe-init-build-env > /dev/null
+oe-selftest -r rust -K | tee 2>&1 oe-selftest.log
+if [ $? -eq 0 ]; then
+    echo "oe-selftest passed. Cleaning up..."
+    rm -rf ../*-st
+
+    echo "Running oe-selftest -r reproducible..."
+    oe-selftest -r reproducible | tee 2>&1 repro.log
+    if [ $? -eq 0 ]; then
+        echo "repro passed. Cleaning up..."
+        rm -rf ../*-st
+    else
+        echo "repro failed. Logs saved to repro.log"
+    fi
+
+else
+    echo "oe-selftest failed. Logs saved in oe-selftest.log"
+fi
+exit
+"""
+    print("Launching detached screen session 'rust-nightly' to run oe-selftest...")
+    subprocess.run(
+        ['screen', '-S', 'rust-nightly', '-dm', 'bash', '-c', screen_cmd]
+    )
+    print("Screen session 'rust-nightly' started.")
+
+def switch_machine_and_build(machine_name, local_conf_path="conf/local.conf"):
+    print(f"\nSwitching MACHINE to {machine_name}...")
+
+    with open(local_conf_path, "r") as f:
+        content = f.read()
+
+    new_line = f'MACHINE ??= "{machine_name}"'
+    old_machine_match = re.search(r'MACHINE \?\?= ".*?"', content)
+    if old_machine_match:
+        old_line = old_machine_match.group(0)
+        content = content.replace(old_line, new_line)
+        with open(local_conf_path, "w") as f:
+            f.write(content)
+        print(f"Replaced '{old_line}' with '{new_line}' in {local_conf_path}")
+    else:
+        print("MACHINE line not found in local.conf, skipping replacement.")
+        return
+
+    # Clean previous build
+    subprocess.run(["bitbake", "-c", "clean", "rust"])
+
+    # Build rust
+    log_file = f"rust_{machine_name}.log"
+    print(f"Running bitbake rust for MACHINE={machine_name}, logging to {log_file}...")
+    with open(log_file, "w") as f:
+        process = subprocess.Popen(
+            ["bitbake", "rust"],
+            stdout=subprocess.PIPE,
+            stderr=subprocess.STDOUT,
+            text=True,
+            bufsize=1,
+        )
+        for line in process.stdout:
+            print(line, end='')
+            f.write(line)
+        process.wait()
+
+    if process.returncode == 0:
+        print(f"Rust build succeeded for MACHINE={machine_name}")
+    else:
+        print(f"Rust build failed for MACHINE={machine_name}. Check {log_file} for details.")
+
+# --- MAIN EXECUTION FLOW ---
+
+print("Starting update_rust_url_and_sha256()...")
+if update_rust_url_and_sha256("../openembedded-core/meta/recipes-devtools/rust/rust-source.inc"):
+    print("Update successful, launching bitbake...")
+
+    with open("snapshot.log", "w") as log_file:
+        process = subprocess.Popen(
+            ["bitbake", "rust", "-c", "do_update_snapshot"],
+            stdout=subprocess.PIPE,
+            stderr=subprocess.STDOUT,
+            text=True,
+            bufsize=1,
+        )
+        for line in process.stdout:
+            print(line, end='')
+            log_file.write(line)
+        process.wait()
+
+    if process.returncode == 0:
+        print("do_update_snapshot task completed successfully.")
+        print("Running full bitbake rust task and saving output to rust.log ...")
+        with open("rust.log", "w") as rust_log:
+            process = subprocess.Popen(
+                ["bitbake", "rust"],
+                stdout=subprocess.PIPE,
+                stderr=subprocess.STDOUT,
+                text=True,
+                bufsize=1,
+            )
+            for line in process.stdout:
+                print(line, end='')
+                rust_log.write(line)
+            process.wait()
+
+        if process.returncode == 0:
+            print("Full bitbake rust task completed successfully.")
+
+            # Build for additional machines
+            switch_machine_and_build("qemuarm")
+            switch_machine_and_build("qemuriscv64")
+
+            # Restore original MACHINE
+            switch_machine_and_build("qemux86-64")
+
+            # Insert SANITY_TESTED_DISTROS
+            insert_sanity_tested_distro("conf/local.conf")
+
+            # Run selftest
+            run_oe_selftest_in_screen()
+        else:
+            print("Full bitbake rust task failed, check rust.log for details.")
+    else:
+        print("do_update_snapshot task failed, skipping full bitbake rust.")
+else:
+    print("Rust update failed or URL not accessible. Exiting.")