Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions crates/rustc_plugin/examples/print-all-items/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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 = "../.." }
5 changes: 5 additions & 0 deletions crates/rustc_plugin/examples/print-all-items/build.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#![feature(rustc_private)]

fn main() {
rustc_plugin::build_main();
}
31 changes: 31 additions & 0 deletions crates/rustc_plugin/src/build.rs
Original file line number Diff line number Diff line change
@@ -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()
);
}
2 changes: 1 addition & 1 deletion crates/rustc_plugin/src/cli.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ pub fn cli_main<T: RustcPlugin>(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);
Expand Down
7 changes: 7 additions & 0 deletions crates/rustc_plugin/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;