1 //! Tests for rustc plugins.
3 use cargo_test_support
::rustc_host
;
4 use cargo_test_support
::{basic_manifest, project}
;
6 #[cargo_test(nightly, reason = "plugins are unstable")]
7 fn plugin_to_the_max() {
31 fn main() { foo_lib::foo(); }
65 #![feature(rustc_private)]
68 extern crate rustc_driver;
70 use rustc_driver::plugin::Registry;
73 pub fn __rustc_plugin_registrar(_reg: &mut Registry) {
74 println!("{}", baz::baz());
91 crate_type = ["dylib"]
94 .file("src/lib.rs", "pub fn baz() -> i32 { 1 }")
97 foo
.cargo("build").run();
98 foo
.cargo("doc").run();
101 #[cargo_test(nightly, reason = "plugins are unstable")]
102 fn plugin_with_dynamic_native_dependency() {
103 let build
= project()
115 crate-type = ["dylib"]
118 .file("src/lib.rs", "#[no_mangle] pub extern fn foo() {}")
162 use std::path::PathBuf;
165 let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap());
166 let root = PathBuf::from(env::var("BUILDER_ROOT").unwrap());
167 let file = format!("{}builder{}",
168 env::consts::DLL_PREFIX,
169 env::consts::DLL_SUFFIX);
170 let src = root.join(&file);
171 let dst = out_dir.join(&file);
172 fs::copy(src, dst).unwrap();
173 if cfg!(target_env = "msvc") {
174 fs::copy(root.join("builder.dll.lib"),
175 out_dir.join("builder.dll.lib")).unwrap();
177 println!("cargo:rustc-flags=-L {}", out_dir.display());
184 #![feature(rustc_private)]
186 extern crate rustc_driver;
187 use rustc_driver::plugin::Registry;
189 #[cfg_attr(not(target_env = "msvc"), link(name = "builder"))]
190 #[cfg_attr(target_env = "msvc", link(name = "builder.dll"))]
194 pub fn __rustc_plugin_registrar(_reg: &mut Registry) {
201 build
.cargo("build").run();
203 let root
= build
.root().join("target").join("debug");
204 foo
.cargo("build -v").env("BUILDER_ROOT", root
).run();
208 fn plugin_integration() {
225 .file("build.rs", "fn main() {}")
226 .file("src/lib.rs", "")
227 .file("tests/it_works.rs", "")
230 p
.cargo("test -v").run();
234 fn doctest_a_plugin() {
245 bar = { path = "bar" }
248 .file("src/lib.rs", "#[macro_use] extern crate bar;")
262 .file("bar/src/lib.rs", "pub fn bar() {}")
265 p
.cargo("test -v").run();
270 fn native_plugin_dependency_with_custom_linker() {
271 let target
= rustc_host();
286 .file("src/lib.rs", "")
303 .file("src/lib.rs", "")
309 linker = "nonexistent-linker"
316 bar
.cargo("build --verbose")
318 .with_stderr_contains(
320 [COMPILING] foo v0.0.1 ([..])
321 [RUNNING] `rustc [..] -C linker=nonexistent-linker [..]`
322 [ERROR] [..]linker[..]
328 #[cargo_test(nightly, reason = "requires rustc_private")]
329 fn panic_abort_plugins() {
343 bar = { path = "bar" }
346 .file("src/lib.rs", "")
362 #![feature(rustc_private)]
363 extern crate rustc_ast;
368 p
.cargo("build").run();
371 #[cargo_test(nightly, reason = "requires rustc_private")]
372 fn shared_panic_abort_plugins() {
386 bar = { path = "bar" }
387 baz = { path = "baz" }
390 .file("src/lib.rs", "extern crate baz;")
403 baz = { path = "../baz" }
409 #![feature(rustc_private)]
410 extern crate rustc_ast;
414 .file("baz/Cargo.toml", &basic_manifest("baz", "0.0.1"))
415 .file("baz/src/lib.rs", "")
418 p
.cargo("build -v").run();