mirror of https://github.com/rust-lang/rust
91 lines
3.8 KiB
Rust
91 lines
3.8 KiB
Rust
// This test exercises the `bundle` link argument, which can be turned on or off.
|
|
|
|
// When building a rlib or staticlib, +bundle means that all object files from the native static
|
|
// library will be added to the rlib or staticlib archive, and then used from it during linking of
|
|
// the final binary.
|
|
|
|
// When building a rlib -bundle means that the native static library is registered as a dependency
|
|
// of that rlib "by name", and object files from it are included only during linking of the final
|
|
// binary, the file search by that name is also performed during final linking.
|
|
// When building a staticlib -bundle means that the native static library is simply not included
|
|
// into the archive and some higher level build system will need to add it later during linking of
|
|
// the final binary.
|
|
|
|
// This modifier has no effect when building other targets like executables or dynamic libraries.
|
|
|
|
// The default for this modifier is +bundle.
|
|
// See https://github.com/rust-lang/rust/pull/95818
|
|
|
|
//@ ignore-cross-compile
|
|
// Reason: cross-compilation fails to export native symbols
|
|
|
|
use run_make_support::{
|
|
build_native_static_lib, dynamic_lib_name, is_msvc, llvm_nm, rust_lib_name, rustc,
|
|
static_lib_name,
|
|
};
|
|
|
|
fn main() {
|
|
build_native_static_lib("native-staticlib");
|
|
// Build a staticlib and a rlib, the `native_func` symbol will be bundled into them
|
|
rustc().input("bundled.rs").crate_type("staticlib").crate_type("rlib").run();
|
|
llvm_nm()
|
|
.input(static_lib_name("bundled"))
|
|
.run()
|
|
.assert_stdout_contains_regex("T _*native_func");
|
|
llvm_nm()
|
|
.input(static_lib_name("bundled"))
|
|
.run()
|
|
.assert_stdout_contains_regex("U _*native_func");
|
|
llvm_nm().input(rust_lib_name("bundled")).run().assert_stdout_contains_regex("T _*native_func");
|
|
llvm_nm().input(rust_lib_name("bundled")).run().assert_stdout_contains_regex("U _*native_func");
|
|
|
|
// Build a staticlib and a rlib, the `native_func` symbol will not be bundled into it
|
|
build_native_static_lib("native-staticlib");
|
|
rustc().input("non-bundled.rs").crate_type("staticlib").crate_type("rlib").run();
|
|
llvm_nm()
|
|
.input(static_lib_name("non_bundled"))
|
|
.run()
|
|
.assert_stdout_not_contains_regex("T _*native_func");
|
|
llvm_nm()
|
|
.input(static_lib_name("non_bundled"))
|
|
.run()
|
|
.assert_stdout_contains_regex("U _*native_func");
|
|
llvm_nm()
|
|
.input(rust_lib_name("non_bundled"))
|
|
.run()
|
|
.assert_stdout_not_contains_regex("T _*native_func");
|
|
llvm_nm()
|
|
.input(rust_lib_name("non_bundled"))
|
|
.run()
|
|
.assert_stdout_contains_regex("U _*native_func");
|
|
|
|
// This part of the test does not function on Windows MSVC - no symbols are printed.
|
|
if !is_msvc() {
|
|
// Build a cdylib, `native-staticlib` will not appear on the linker line because it was
|
|
// bundled previously. The cdylib will contain the `native_func` symbol in the end.
|
|
rustc()
|
|
.input("cdylib-bundled.rs")
|
|
.crate_type("cdylib")
|
|
.print("link-args")
|
|
.run()
|
|
.assert_stdout_not_contains(r#"-l[" ]*native-staticlib"#);
|
|
llvm_nm()
|
|
.input(dynamic_lib_name("cdylib_bundled"))
|
|
.run()
|
|
.assert_stdout_contains_regex("[Tt] _*native_func");
|
|
|
|
// Build a cdylib, `native-staticlib` will appear on the linker line because it was not
|
|
// bundled previously. The cdylib will contain the `native_func` symbol in the end
|
|
rustc()
|
|
.input("cdylib-non-bundled.rs")
|
|
.crate_type("cdylib")
|
|
.print("link-args")
|
|
.run()
|
|
.assert_stdout_contains_regex(r#"-l[" ]*native-staticlib"#);
|
|
llvm_nm()
|
|
.input(dynamic_lib_name("cdylib_non_bundled"))
|
|
.run()
|
|
.assert_stdout_contains_regex("[Tt] _*native_func");
|
|
}
|
|
}
|