|
| 1 | +// This test exercises the `bundle` link argument, which can be turned on or off. |
| 2 | + |
| 3 | +// When building a rlib or staticlib, +bundle means that all object files from the native static |
| 4 | +// library will be added to the rlib or staticlib archive, and then used from it during linking of |
| 5 | +// the final binary. |
| 6 | + |
| 7 | +// When building a rlib -bundle means that the native static library is registered as a dependency |
| 8 | +// of that rlib "by name", and object files from it are included only during linking of the final |
| 9 | +// binary, the file search by that name is also performed during final linking. |
| 10 | +// When building a staticlib -bundle means that the native static library is simply not included |
| 11 | +// into the archive and some higher level build system will need to add it later during linking of |
| 12 | +// the final binary. |
| 13 | + |
| 14 | +// This modifier has no effect when building other targets like executables or dynamic libraries. |
| 15 | + |
| 16 | +// The default for this modifier is +bundle. |
| 17 | +// See https://github.com/rust-lang/rust/pull/95818 |
| 18 | + |
| 19 | +//@ ignore-cross-compile |
| 20 | +// Reason: cross-compilation fails to export native symbols |
| 21 | + |
| 22 | +// FIXME(Oneirical): MSVC |
| 23 | + |
| 24 | +use run_make_support::{ |
| 25 | + build_native_static_lib, dynamic_lib_name, llvm_nm, rust_lib_name, rustc, static_lib_name, |
| 26 | +}; |
| 27 | + |
| 28 | +fn main() { |
| 29 | + build_native_static_lib("native-staticlib"); |
| 30 | + // Build a staticlib and a rlib, the `native_func` symbol will be bundled into them |
| 31 | + rustc().input("bundled.rs").crate_type("staticlib").crate_type("rlib").run(); |
| 32 | + llvm_nm() |
| 33 | + .input(static_lib_name("bundled")) |
| 34 | + .run() |
| 35 | + .assert_stdout_contains_regex("T _*native_func"); |
| 36 | + llvm_nm() |
| 37 | + .input(static_lib_name("bundled")) |
| 38 | + .run() |
| 39 | + .assert_stdout_contains_regex("U _*native_func"); |
| 40 | + llvm_nm().input(rust_lib_name("bundled")).run().assert_stdout_contains_regex("T _*native_func"); |
| 41 | + llvm_nm().input(rust_lib_name("bundled")).run().assert_stdout_contains_regex("U _*native_func"); |
| 42 | + |
| 43 | + // Build a staticlib and a rlib, the `native_func` symbol will not be bundled into it |
| 44 | + build_native_static_lib("native-staticlib"); |
| 45 | + rustc().input("non-bundled.rs").crate_type("staticlib").crate_type("rlib").run(); |
| 46 | + llvm_nm() |
| 47 | + .input(static_lib_name("non_bundled")) |
| 48 | + .run() |
| 49 | + .assert_stdout_not_contains_regex("T _*native_func"); |
| 50 | + llvm_nm() |
| 51 | + .input(static_lib_name("non_bundled")) |
| 52 | + .run() |
| 53 | + .assert_stdout_contains_regex("U _*native_func"); |
| 54 | + llvm_nm() |
| 55 | + .input(rust_lib_name("non_bundled")) |
| 56 | + .run() |
| 57 | + .assert_stdout_not_contains_regex("T _*native_func"); |
| 58 | + llvm_nm() |
| 59 | + .input(rust_lib_name("non_bundled")) |
| 60 | + .run() |
| 61 | + .assert_stdout_contains_regex("U _*native_func"); |
| 62 | + |
| 63 | + // Build a cdylib, `native-staticlib` will not appear on the linker line because it was bundled |
| 64 | + // previously. The cdylib will contain the `native_func` symbol in the end. |
| 65 | + rustc() |
| 66 | + .input("cdylib-bundled.rs") |
| 67 | + .crate_type("cdylib") |
| 68 | + .print("link-args") |
| 69 | + .run() |
| 70 | + .assert_stdout_not_contains(r#"-l[" ]*native-staticlib"#); |
| 71 | + llvm_nm() |
| 72 | + .input(dynamic_lib_name("cdylib_bundled")) |
| 73 | + .run() |
| 74 | + .assert_stdout_contains_regex("[Tt] _*native_func"); |
| 75 | + |
| 76 | + // Build a cdylib, `native-staticlib` will appear on the linker line because it was not bundled |
| 77 | + // previously. The cdylib will contain the `native_func` symbol in the end |
| 78 | + rustc() |
| 79 | + .input("cdylib-non-bundled.rs") |
| 80 | + .crate_type("cdylib") |
| 81 | + .print("link-args") |
| 82 | + .run() |
| 83 | + .assert_stdout_contains_regex(r#"-l[" ]*native-staticlib"#); |
| 84 | + llvm_nm() |
| 85 | + .input(dynamic_lib_name("cdylib_non_bundled")) |
| 86 | + .run() |
| 87 | + .assert_stdout_contains_regex("[Tt] _*native_func"); |
| 88 | +} |
0 commit comments