| """Unittests for propagation of linker inputs through Rust libraries""" |
| |
| load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts") |
| |
| def _shared_lib_is_propagated_test_impl(ctx): |
| env = analysistest.begin(ctx) |
| tut = analysistest.target_under_test(env) |
| link_action = [action for action in tut.actions if action.mnemonic == "CppLink"][0] |
| |
| lib_name = _get_lib_name(ctx, name = "foo_shared") |
| asserts.true(env, _contains_input(link_action.inputs, lib_name)) |
| |
| return analysistest.end(env) |
| |
| def _static_lib_is_not_propagated_test_impl(ctx): |
| env = analysistest.begin(ctx) |
| tut = analysistest.target_under_test(env) |
| link_action = [action for action in tut.actions if action.mnemonic == "CppLink"][0] |
| |
| lib_name = _get_lib_name(ctx, name = "foo") |
| asserts.false(env, _contains_input(link_action.inputs, lib_name)) |
| |
| return analysistest.end(env) |
| |
| def _contains_input(inputs, name): |
| for input in inputs.to_list(): |
| # We cannot check for name equality because rlib outputs contain |
| # a hash in their name. |
| if input.basename.startswith(name): |
| return True |
| return False |
| |
| def _get_lib_name(ctx, name): |
| if ctx.target_platform_has_constraint(ctx.attr._windows_constraint[platform_common.ConstraintValueInfo]): |
| return name |
| else: |
| return "lib{}".format(name) |
| |
| static_lib_is_not_propagated_test = analysistest.make( |
| _static_lib_is_not_propagated_test_impl, |
| attrs = { |
| "_windows_constraint": attr.label(default = Label("@platforms//os:windows")), |
| }, |
| ) |
| |
| shared_lib_is_propagated_test = analysistest.make( |
| _shared_lib_is_propagated_test_impl, |
| attrs = { |
| "_macos_constraint": attr.label(default = Label("@platforms//os:macos")), |
| "_windows_constraint": attr.label(default = Label("@platforms//os:windows")), |
| }, |
| ) |
| |
| def _linker_inputs_propagation_test(): |
| static_lib_is_not_propagated_test( |
| name = "depends_on_foo_via_staticlib", |
| target_under_test = "//test/linker_inputs_propagation:depends_on_foo_via_staticlib", |
| ) |
| |
| shared_lib_is_propagated_test( |
| name = "depends_on_shared_foo_via_staticlib", |
| target_under_test = "//test/linker_inputs_propagation:depends_on_shared_foo_via_staticlib", |
| ) |
| |
| static_lib_is_not_propagated_test( |
| name = "depends_on_foo_via_sharedlib", |
| target_under_test = "//test/linker_inputs_propagation:depends_on_foo_via_sharedlib", |
| ) |
| |
| shared_lib_is_propagated_test( |
| name = "depends_on_shared_foo_via_sharedlib", |
| target_under_test = "//test/linker_inputs_propagation:depends_on_shared_foo_via_sharedlib", |
| ) |
| |
| def linker_inputs_propagation_test_suite(name): |
| """Entry-point macro called from the BUILD file. |
| |
| Args: |
| name: Name of the macro. |
| """ |
| _linker_inputs_propagation_test() |
| |
| native.test_suite( |
| name = name, |
| tests = [ |
| ":depends_on_foo_via_staticlib", |
| ":depends_on_shared_foo_via_staticlib", |
| ":depends_on_foo_via_sharedlib", |
| ":depends_on_shared_foo_via_sharedlib", |
| ], |
| ) |