Expose a new API that copying from an existing library with overrides, so that callers don't need to know all internal attributes to avoid silently dropping some.

PiperOrigin-RevId: 959148866
Change-Id: Iaf68dadbeb641764fd2e675454d2948deef788ae
diff --git a/cc/private/cc_common.bzl b/cc/private/cc_common.bzl
index f5cfd7d..a63bfea 100644
--- a/cc/private/cc_common.bzl
+++ b/cc/private/cc_common.bzl
@@ -28,7 +28,7 @@
 load("//cc/private/compile:linkstamp_compile.bzl", "register_linkstamp_compile_action")
 load("//cc/private/compile:lto_compilation_context.bzl", "create_lto_compilation_context")
 load("//cc/private/link:create_extra_link_time_library.bzl", "build_libraries", "create_extra_link_time_library")
-load("//cc/private/link:create_library_to_link.bzl", "create_library_to_link")
+load("//cc/private/link:create_library_to_link.bzl", "copy_library_to_link", "create_library_to_link")
 load("//cc/private/link:create_linker_input.bzl", "create_linker_input")
 load("//cc/private/link:create_linking_context_from_compilation_outputs.bzl", "create_linking_context_from_compilation_outputs")
 load("//cc/private/link:create_linkstamp.bzl", "create_linkstamp")
@@ -742,6 +742,7 @@
     create_link_variables = create_link_variables,
     empty_variables = _empty_variables,
     create_library_to_link = _create_library_to_link,
+    copy_library_to_link = copy_library_to_link,
     create_linker_input = create_linker_input,
     create_linking_context = _create_linking_context,
     merge_cc_infos = merge_cc_infos,
diff --git a/cc/private/link/create_library_to_link.bzl b/cc/private/link/create_library_to_link.bzl
index 3f61fb6..5e4f3c5 100644
--- a/cc/private/link/create_library_to_link.bzl
+++ b/cc/private/link/create_library_to_link.bzl
@@ -275,6 +275,48 @@
         _contains_objects = bool(objects) or bool(pic_objects),
     )
 
+# buildifier: disable=name-conventions
+_UnboundValueProviderDoNotUse = provider("This provider is used as default value for optional function parameters.", fields = [])
+_UNBOUND = _UnboundValueProviderDoNotUse()
+
+def copy_library_to_link(
+        library,
+        *,
+        static_library = _UNBOUND,
+        pic_static_library = _UNBOUND,
+        dynamic_library = _UNBOUND,
+        interface_library = _UNBOUND,
+        objects = _UNBOUND,
+        pic_objects = _UNBOUND,
+        alwayslink = _UNBOUND,
+        lto_compilation_context = _UNBOUND,
+        pic_lto_compilation_context = _UNBOUND,
+        must_keep_debug = _UNBOUND,
+        resolved_symlink_dynamic_library = _UNBOUND,
+        resolved_symlink_interface_library = _UNBOUND):
+    """Creates a copy of an existing `LibraryToLink` with optional overrides."""
+    new_objects = objects if objects != _UNBOUND else library.objects
+    new_pic_objects = pic_objects if pic_objects != _UNBOUND else library.pic_objects
+    return make_library_to_link(
+        static_library = static_library if static_library != _UNBOUND else library.static_library,
+        pic_static_library = pic_static_library if pic_static_library != _UNBOUND else library.pic_static_library,
+        dynamic_library = dynamic_library if dynamic_library != _UNBOUND else library.dynamic_library,
+        interface_library = interface_library if interface_library != _UNBOUND else library.interface_library,
+        resolved_symlink_dynamic_library = resolved_symlink_dynamic_library if resolved_symlink_dynamic_library != _UNBOUND else library.resolved_symlink_dynamic_library,
+        resolved_symlink_interface_library = resolved_symlink_interface_library if resolved_symlink_interface_library != _UNBOUND else library.resolved_symlink_interface_library,
+        objects = new_objects,
+        pic_objects = new_pic_objects,
+        alwayslink = alwayslink if alwayslink != _UNBOUND else library.alwayslink,
+        _library_identifier = library._library_identifier,
+        _contains_objects = bool(new_objects) or bool(new_pic_objects),
+        _disable_whole_archive = library._disable_whole_archive,
+        _must_keep_debug = must_keep_debug if must_keep_debug != _UNBOUND else library._must_keep_debug,
+        _lto_compilation_context = lto_compilation_context if lto_compilation_context != _UNBOUND else library._lto_compilation_context,
+        _pic_lto_compilation_context = pic_lto_compilation_context if pic_lto_compilation_context != _UNBOUND else library._pic_lto_compilation_context,
+        _shared_non_lto_backends = getattr(library, "_shared_non_lto_backends", {}),
+        _pic_shared_non_lto_backends = getattr(library, "_pic_shared_non_lto_backends", {}),
+    )
+
 def _validate_symlink_path(attr, path):
     if not path or paths.is_absolute(path) or path_contains_up_level_references(path):
         fail("%s must be a relative file path. Got '%s" % (attr, path))