Description
As most of the Linux distribution install the kernel with their package (.deb, .rpm, ...). I also tried to do the same thing to test Linux kernel with Rust support. However, when I build some out-of-tree Rust kernel module, it failed to compile with the following message:
error[E0461]: couldn't find crate `core` with expected target triple target-13637732820183936185
|
= note: the following crate versions were found:
crate `core`, target triple target-4719486650351723570: /usr/src/linux-headers-5.18.0-rc2-2-rust/rust/libcore.rmeta
error[E0461]: couldn't find crate `compiler_builtins` with expected target triple target-13637732820183936185
|
= note: the following crate versions were found:
crate `compiler_builtins`, target triple target-4719486650351723570: /usr/src/linux-headers-5.18.0-rc2-2-rust/rust/libcompiler_builtins
.rmeta
error[E0461]: couldn't find crate `kernel` with expected target triple target-13637732820183936185
--> /home/leo/rust-kernel-modules/rust-random/rust_random.rs:11:5
|
11 | use kernel::{
| ^^^^^^
|
= note: the following crate versions were found:
crate `kernel`, target triple target-4719486650351723570: /usr/src/linux-headers-5.18.0-rc2-2-rust/rust/libkernel.rmeta
After digging some codes, I found that rustc record the target triple as the path of target.json file.
https://doc.rust-lang.org/stable/nightly-rustc/rustc_target/spec/enum.TargetTriple.html
And the target triple appears in the error messages can be calculated with the following codes:
use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};
use std::path::PathBuf;
#[allow(unused_variables)]
fn main() {
let mut hasher = DefaultHasher::new();
// target-4719486650351723570
let path = PathBuf::from("/home/leo/linux-rust/src/build/rust/target.json");
// target-13637732820183936185
let path = PathBuf::from("/usr/src/linux-headers-5.18.0-rc2-2-rust/rust/target.json");
path.hash(&mut hasher);
let hash = hasher.finish();
println!("target-{}", hash)
}
The above codes is reference from rust-lang/rust/compiler/rustc_target/src/spec/mod.rs:2445
P.s. I think that this is the problem of the compiler, however, this issue must be resolved if we want to support out-of-tree Rust kernel module in the future.