blob: 4bd133138996ad10b5fd9a645c4ddfc9c6a1f4f8 [file] [log] [blame]
load("//cc/toolchains:args.bzl", "cc_args")
load("//cc/toolchains:nested_args.bzl", "cc_nested_args")
load("//cc/toolchains/args/libraries_to_link/private:library_link_args.bzl", "library_link_args")
package(default_visibility = ["//visibility:private"])
cc_args(
name = "libraries_to_link",
actions = [
"//cc/toolchains/actions:cpp_link_executable",
"//cc/toolchains/actions:cpp_link_dynamic_library",
"//cc/toolchains/actions:cpp_link_nodeps_dynamic_library",
"//cc/toolchains/actions:lto_index_for_executable",
"//cc/toolchains/actions:lto_index_for_dynamic_library",
"//cc/toolchains/actions:lto_index_for_nodeps_dynamic_library",
],
nested = [
":thinlto_param_file",
":libraries_to_link_args",
],
visibility = ["//visibility:public"],
)
cc_nested_args(
name = "thinlto_param_file",
args = ["-Wl,@{param_file}"],
format = {
"param_file": "//cc/toolchains/variables:thinlto_param_file",
},
requires_not_none = "//cc/toolchains/variables:thinlto_param_file",
)
cc_nested_args(
name = "libraries_to_link_args",
nested = [":iterate_over_libraries_to_link"],
requires_not_none = "//cc/toolchains/variables:libraries_to_link",
)
cc_nested_args(
name = "iterate_over_libraries_to_link",
iterate_over = "//cc/toolchains/variables:libraries_to_link",
nested = [
":optional_object_file_group_start",
":single_library_args",
":optional_object_file_group_end",
],
)
cc_nested_args(
name = "optional_object_file_group_start",
nested = [":start_lib_arg"],
requires_equal = "//cc/toolchains/variables:libraries_to_link.type",
requires_equal_value = "object_file_group",
)
cc_nested_args(
name = "start_lib_arg",
args = ["-Wl,--start-lib"],
requires_false = "//cc/toolchains/variables:libraries_to_link.is_whole_archive",
)
cc_nested_args(
name = "optional_object_file_group_end",
nested = [":end_lib_arg"],
requires_equal = "//cc/toolchains/variables:libraries_to_link.type",
requires_equal_value = "object_file_group",
)
cc_nested_args(
name = "end_lib_arg",
args = ["-Wl,--end-lib"],
requires_false = "//cc/toolchains/variables:libraries_to_link.is_whole_archive",
)
cc_nested_args(
name = "single_library_args",
nested = select({
"@platforms//os:macos": [],
"//conditions:default": [":optional_whole_archive_start"],
}) + [
":optional_object_file_group",
":optional_object_file",
":optional_interface_library",
":optional_static_library",
":optional_dynamic_library",
] + select({
# maOS has a minor nuance where it uses the path to the library instead of `-l:{library_name}`.
"@platforms//os:macos": [":macos_optional_versioned_dynamic_library"],
"//conditions:default": [":generic_optional_versioned_dynamic_library"],
}) + select({
"@platforms//os:macos": [],
"//conditions:default": [":optional_whole_archive_end"],
}),
)
cc_nested_args(
name = "optional_whole_archive_start",
nested = [":whole_archive_start_arg"],
requires_true = "//cc/toolchains/variables:libraries_to_link.is_whole_archive",
)
cc_nested_args(
name = "whole_archive_start_arg",
args = ["-Wl,-whole-archive"],
requires_equal = "//cc/toolchains/variables:libraries_to_link.type",
requires_equal_value = "static_library",
)
cc_nested_args(
name = "optional_whole_archive_end",
nested = [":whole_archive_end_arg"],
requires_true = "//cc/toolchains/variables:libraries_to_link.is_whole_archive",
)
cc_nested_args(
name = "whole_archive_end_arg",
args = ["-Wl,-no-whole-archive"],
requires_equal = "//cc/toolchains/variables:libraries_to_link.type",
requires_equal_value = "static_library",
)
library_link_args(
name = "optional_object_file_group",
from_variable = "//cc/toolchains/variables:libraries_to_link.object_files",
iterate_over_variable = True,
library_type = "object_file_group",
)
library_link_args(
name = "optional_object_file",
from_variable = "//cc/toolchains/variables:libraries_to_link.name",
library_type = "object_file",
)
library_link_args(
name = "optional_interface_library",
from_variable = "//cc/toolchains/variables:libraries_to_link.name",
library_type = "interface_library",
)
library_link_args(
name = "optional_static_library",
from_variable = "//cc/toolchains/variables:libraries_to_link.name",
library_type = "static_library",
)
cc_nested_args(
name = "optional_dynamic_library",
args = ["-l{library}"],
format = {
"library": "//cc/toolchains/variables:libraries_to_link.name",
},
requires_equal = "//cc/toolchains/variables:libraries_to_link.type",
requires_equal_value = "dynamic_library",
)
cc_nested_args(
name = "generic_optional_versioned_dynamic_library",
args = ["-l:{library_name}"],
format = {
"library_name": "//cc/toolchains/variables:libraries_to_link.name",
},
requires_equal = "//cc/toolchains/variables:libraries_to_link.type",
requires_equal_value = "versioned_dynamic_library",
)
cc_nested_args(
name = "macos_optional_versioned_dynamic_library",
args = ["{library_path}"],
format = {
"library_path": "//cc/toolchains/variables:libraries_to_link.path",
},
requires_equal = "//cc/toolchains/variables:libraries_to_link.type",
requires_equal_value = "versioned_dynamic_library",
)