Skip to content

Commit e66e3fa

Browse files
committed
Add build script to include target-libdir on rpath
1 parent 9e6e7c5 commit e66e3fa

File tree

5 files changed

+47
-1
lines changed

5 files changed

+47
-1
lines changed

crates/rustc_plugin/examples/print-all-items/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,6 @@ rustc_plugin = { path = "../.." }
1111
env_logger = { version = "0.10", default-features = false }
1212
clap = { version = "4.4", features = ["derive"] }
1313
serde = { version = "1", features = ["derive"] }
14+
15+
[build-dependencies]
16+
rustc_plugin = { path = "../.." }
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#![feature(rustc_private)]
2+
3+
fn main() {
4+
rustc_plugin::build_main();
5+
}

crates/rustc_plugin/src/build.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
use std::{
2+
path::{Path, PathBuf},
3+
process::Command,
4+
};
5+
6+
fn rustc_path() -> PathBuf {
7+
let output = Command::new("rustup")
8+
.args(["which", "--toolchain", crate::CHANNEL, "rustc"])
9+
.output()
10+
.expect("failed to run rustup which");
11+
let rustc_path = String::from_utf8(output.stdout).unwrap();
12+
PathBuf::from(rustc_path.trim())
13+
}
14+
15+
fn target_libdir(rustc: &Path) -> PathBuf {
16+
let output = Command::new(rustc)
17+
.args(["--print", "target-libdir"])
18+
.output()
19+
.expect("failed to run rustc --print target-libdir");
20+
let libdir = String::from_utf8(output.stdout).unwrap();
21+
PathBuf::from(libdir.trim())
22+
}
23+
24+
pub fn build_main() {
25+
let rustc_path = rustc_path();
26+
let target_libdir = target_libdir(&rustc_path);
27+
println!(
28+
"cargo::rustc-link-arg=-Wl,-rpath,{}",
29+
target_libdir.display()
30+
);
31+
}

crates/rustc_plugin/src/cli.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ pub fn cli_main<T: RustcPlugin>(plugin: T) {
2626
.other_options(["--all-features".to_string(), "--offline".to_string()])
2727
.exec()
2828
.unwrap();
29-
let plugin_subdir = format!("plugin-{}", env!("RUSTC_CHANNEL"));
29+
let plugin_subdir = format!("plugin-{}", crate::CHANNEL);
3030
let target_dir = metadata.target_directory.join(plugin_subdir);
3131

3232
let args = plugin.args(&target_dir);

crates/rustc_plugin/src/lib.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,19 @@ extern crate rustc_driver;
99
extern crate rustc_interface;
1010
extern crate rustc_session;
1111

12+
pub use build::build_main;
1213
#[doc(hidden)]
1314
pub use cargo_metadata::camino::Utf8Path;
1415
pub use cli::cli_main;
1516
pub use driver::driver_main;
1617
pub use plugin::{CrateFilter, RustcPlugin, RustcPluginArgs};
1718

19+
/// The toolchain channel that this version of rustc_plugin was built with.
20+
///
21+
/// For example, `nightly-2025-08-20`
22+
pub const CHANNEL: &str = env!("RUSTC_CHANNEL");
23+
24+
mod build;
1825
mod cli;
1926
mod driver;
2027
mod plugin;

0 commit comments

Comments
 (0)