diff --git a/crates/rustc_plugin/examples/print-all-items/Cargo.toml b/crates/rustc_plugin/examples/print-all-items/Cargo.toml index 2434c4a40..00027328f 100644 --- a/crates/rustc_plugin/examples/print-all-items/Cargo.toml +++ b/crates/rustc_plugin/examples/print-all-items/Cargo.toml @@ -11,3 +11,6 @@ rustc_plugin = { path = "../.." } env_logger = { version = "0.10", default-features = false } clap = { version = "4.4", features = ["derive"] } serde = { version = "1", features = ["derive"] } + +[build-dependencies] +rustc_plugin = { path = "../.." } \ No newline at end of file diff --git a/crates/rustc_plugin/examples/print-all-items/build.rs b/crates/rustc_plugin/examples/print-all-items/build.rs new file mode 100644 index 000000000..d7f6622ba --- /dev/null +++ b/crates/rustc_plugin/examples/print-all-items/build.rs @@ -0,0 +1,5 @@ +#![feature(rustc_private)] + +fn main() { + rustc_plugin::build_main(); +} diff --git a/crates/rustc_plugin/src/build.rs b/crates/rustc_plugin/src/build.rs new file mode 100644 index 000000000..4caa1e1ce --- /dev/null +++ b/crates/rustc_plugin/src/build.rs @@ -0,0 +1,31 @@ +use std::{ + path::{Path, PathBuf}, + process::Command, +}; + +fn rustc_path() -> PathBuf { + let output = Command::new("rustup") + .args(["which", "--toolchain", crate::CHANNEL, "rustc"]) + .output() + .expect("failed to run rustup which"); + let rustc_path = String::from_utf8(output.stdout).unwrap(); + PathBuf::from(rustc_path.trim()) +} + +fn target_libdir(rustc: &Path) -> PathBuf { + let output = Command::new(rustc) + .args(["--print", "target-libdir"]) + .output() + .expect("failed to run rustc --print target-libdir"); + let libdir = String::from_utf8(output.stdout).unwrap(); + PathBuf::from(libdir.trim()) +} + +pub fn build_main() { + let rustc_path = rustc_path(); + let target_libdir = target_libdir(&rustc_path); + println!( + "cargo::rustc-link-arg=-Wl,-rpath,{}", + target_libdir.display() + ); +} diff --git a/crates/rustc_plugin/src/cli.rs b/crates/rustc_plugin/src/cli.rs index afd48fa9b..6299e3602 100644 --- a/crates/rustc_plugin/src/cli.rs +++ b/crates/rustc_plugin/src/cli.rs @@ -26,7 +26,7 @@ pub fn cli_main(plugin: T) { .other_options(["--all-features".to_string(), "--offline".to_string()]) .exec() .unwrap(); - let plugin_subdir = format!("plugin-{}", env!("RUSTC_CHANNEL")); + let plugin_subdir = format!("plugin-{}", crate::CHANNEL); let target_dir = metadata.target_directory.join(plugin_subdir); let args = plugin.args(&target_dir); diff --git a/crates/rustc_plugin/src/lib.rs b/crates/rustc_plugin/src/lib.rs index 702238e66..7b7c5ecc7 100644 --- a/crates/rustc_plugin/src/lib.rs +++ b/crates/rustc_plugin/src/lib.rs @@ -9,12 +9,19 @@ extern crate rustc_driver; extern crate rustc_interface; extern crate rustc_session; +pub use build::build_main; #[doc(hidden)] pub use cargo_metadata::camino::Utf8Path; pub use cli::cli_main; pub use driver::driver_main; pub use plugin::{CrateFilter, RustcPlugin, RustcPluginArgs}; +/// The toolchain channel that this version of rustc_plugin was built with. +/// +/// For example, `nightly-2025-08-20` +pub const CHANNEL: &str = env!("RUSTC_CHANNEL"); + +mod build; mod cli; mod driver; mod plugin;