| // `-Z packed_bundled_libs` is an unstable rustc flag that makes the compiler |
| // only require a native library and no supplementary object files to compile. |
| // #105601 made it possible to have this behaviour without an unstable flag by |
| // passing +bundle in modifiers, and this test checks that this feature successfully |
| // compiles and includes only the static libraries, with no object files. |
| // See https://github.com/rust-lang/rust/pull/105601 |
| |
| use run_make_support::{ |
| build_native_static_lib, llvm_ar, regex, rfs, rust_lib_name, rustc, static_lib_name, |
| }; |
| |
| //@ ignore-cross-compile |
| // Reason: Invalid library format (not ELF) causes compilation failure |
| // in the final `rustc` call. |
| |
| //@ only-linux |
| // Reason: differences in the native lib compilation process causes differences |
| // in the --print link-args output |
| |
| fn main() { |
| build_native_static_lib("native_dep_1"); |
| build_native_static_lib("native_dep_2"); |
| build_native_static_lib("native_dep_3"); |
| build_native_static_lib("native_dep_4"); |
| // Test cfg with packed bundle. |
| rustc().input("rust_dep_cfg.rs").crate_type("rlib").run(); |
| rustc() |
| .input("main.rs") |
| .extern_("rust_dep", rust_lib_name("rust_dep_cfg")) |
| .crate_type("staticlib") |
| .cfg("should_add") |
| .run(); |
| // Only static libraries should appear, no object files at all. |
| llvm_ar() |
| .arg("t") |
| .arg(rust_lib_name("rust_dep_cfg")) |
| .run() |
| .assert_stdout_contains(static_lib_name("native_dep_1")); |
| llvm_ar() |
| .arg("t") |
| .arg(rust_lib_name("rust_dep_cfg")) |
| .run() |
| .assert_stdout_contains(static_lib_name("native_dep_2")); |
| llvm_ar().arg("t").arg(static_lib_name("main")).run().assert_stdout_contains("native_dep_1.o"); |
| llvm_ar() |
| .arg("t") |
| .arg(static_lib_name("main")) |
| .run() |
| .assert_stdout_not_contains("native_dep_2.o"); |
| |
| // Test bundle with whole archive. |
| rustc().input("rust_dep.rs").crate_type("rlib").run(); |
| // Only deps with `+bundle` should appear. |
| llvm_ar().arg("t").arg(rust_lib_name("rust_dep")).run().assert_stdout_contains("native_dep_1"); |
| llvm_ar().arg("t").arg(rust_lib_name("rust_dep")).run().assert_stdout_contains("native_dep_3"); |
| llvm_ar() |
| .arg("t") |
| .arg(rust_lib_name("rust_dep")) |
| .run() |
| .assert_stdout_not_contains("native_dep_2"); |
| llvm_ar() |
| .arg("t") |
| .arg(rust_lib_name("rust_dep")) |
| .run() |
| .assert_stdout_not_contains("native_dep_4"); |
| |
| // The compiler shouldn't use files which it doesn't know about. |
| rfs::remove_file(static_lib_name("native_dep_1")); |
| rfs::remove_file(static_lib_name("native_dep_3")); |
| |
| let out = rustc() |
| .input("main.rs") |
| .extern_("rust_dep", rust_lib_name("rust_dep")) |
| .print("link-args") |
| .run() |
| .assert_stdout_not_contains("native_dep_3") |
| .stdout_utf8(); |
| |
| let re = regex::Regex::new( |
| "--whole-archive.*native_dep_1.*--whole-archive.*lnative_dep_2.*no-whole-archive.*lnative_dep_4" |
| ).unwrap(); |
| |
| assert!(re.is_match(&out)); |
| } |