# Copyright 2023 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Utilities related to C++ support."""

load(":common/cc/cc_info.bzl", "CcInfo")
load(":common/cc/cc_shared_library_hint_info.bzl", "CcSharedLibraryHintInfo")

cc_common_internal = _builtins.internal.cc_common
CcNativeLibraryInfo = _builtins.internal.CcNativeLibraryInfo

# buildifier: disable=name-conventions
_UnboundValueProviderDoNotUse = provider("This provider is used as an unique symbol to distinguish between bound and unbound Starlark values, to avoid using kwargs.", fields = [])
_UNBOUND = _UnboundValueProviderDoNotUse()

_OLD_STARLARK_API_ALLOWLISTED_PACKAGES = [("", "tools/build_defs/cc"), ("_builtins", "")]

_CREATE_COMPILE_ACTION_API_ALLOWLISTED_PACKAGES = [("", "devtools/rust/cc_interop"), ("", "third_party/crubit")]

_PRIVATE_STARLARKIFICATION_ALLOWLIST = [
    ("_builtins", ""),
    ("", "bazel_internal/test_rules/cc"),
    ("", "tools/build_defs/android"),
    ("", "third_party/bazel_rules/rules_android"),
    ("build_bazel_rules_android", ""),
    ("rules_android", ""),
    ("", "rust/private"),
    ("rules_rust", "rust/private"),
]

_BUILTINS = [("_builtins", "")]

def _check_all_sources_contain_tuples_or_none_of_them(files):
    no_tuple = False
    has_tuple = False
    for sequence in files:
        if len(sequence) != 0:
            if type(sequence[0]) == "tuple":
                has_tuple = True
            elif type(sequence[0]) == "File":
                no_tuple = True
            else:
                fail("srcs, private_hdrs and public_hdrs must all be Tuples<File, Label> or File")
        if has_tuple and no_tuple:
            fail("srcs, private_hdrs and public_hdrs must all be Tuples<File, Label> or File")
    return has_tuple

def _link(
        *,
        actions,
        feature_configuration,
        cc_toolchain,
        name,
        compilation_outputs = None,
        user_link_flags = [],
        linking_contexts = [],
        language = "c++",
        output_type = "executable",
        link_deps_statically = True,
        stamp = 0,
        additional_inputs = [],
        link_artifact_name_suffix = _UNBOUND,
        never_link = _UNBOUND,
        always_link = _UNBOUND,
        test_only_target = _UNBOUND,
        variables_extension = {},
        native_deps = _UNBOUND,
        whole_archive = _UNBOUND,
        additional_linkstamp_defines = _UNBOUND,
        only_for_dynamic_libs = _UNBOUND,
        main_output = _UNBOUND,
        additional_outputs = [],
        use_test_only_flags = _UNBOUND,
        pdb_file = _UNBOUND,
        win_def_file = _UNBOUND,
        use_shareable_artifact_factory = _UNBOUND,
        build_config = _UNBOUND):
    # TODO(b/205690414): Keep linkedArtifactNameSuffixObject protected. Use cases that are
    #  passing the suffix should be migrated to using mainOutput instead where the suffix is
    #  taken into account. Then this parameter should be removed.
    if link_artifact_name_suffix != _UNBOUND or \
       never_link != _UNBOUND or \
       always_link != _UNBOUND or \
       test_only_target != _UNBOUND or \
       native_deps != _UNBOUND or \
       whole_archive != _UNBOUND or \
       additional_linkstamp_defines != _UNBOUND or \
       only_for_dynamic_libs != _UNBOUND or \
       main_output != _UNBOUND or \
       use_test_only_flags != _UNBOUND or \
       pdb_file != _UNBOUND or \
       win_def_file != _UNBOUND or \
       use_shareable_artifact_factory != _UNBOUND or \
       build_config != _UNBOUND:
        cc_common_internal.check_private_api(allowlist = _PRIVATE_STARLARKIFICATION_ALLOWLIST)

    if output_type == "archive":
        cc_common_internal.check_private_api(allowlist = _PRIVATE_STARLARKIFICATION_ALLOWLIST)

    if link_artifact_name_suffix == _UNBOUND:
        link_artifact_name_suffix = ""
    if never_link == _UNBOUND:
        never_link = False
    if always_link == _UNBOUND:
        always_link = False
    if test_only_target == _UNBOUND:
        test_only_target = False
    if variables_extension == _UNBOUND:
        variables_extension = {}
    if native_deps == _UNBOUND:
        native_deps = False
    if whole_archive == _UNBOUND:
        whole_archive = False
    if additional_linkstamp_defines == _UNBOUND:
        additional_linkstamp_defines = []
    if only_for_dynamic_libs == _UNBOUND:
        only_for_dynamic_libs = False
    if main_output == _UNBOUND:
        main_output = None
    if additional_outputs == _UNBOUND:
        additional_outputs = []
    if use_test_only_flags == _UNBOUND:
        use_test_only_flags = False
    if pdb_file == _UNBOUND:
        pdb_file = None
    if win_def_file == _UNBOUND:
        win_def_file = None
    if use_shareable_artifact_factory == _UNBOUND:
        use_shareable_artifact_factory = False
    if build_config == _UNBOUND:
        build_config = None

    return cc_common_internal.link(
        actions = actions,
        feature_configuration = feature_configuration,
        cc_toolchain = cc_toolchain,
        compilation_outputs = compilation_outputs,
        name = name,
        user_link_flags = user_link_flags,
        linking_contexts = linking_contexts,
        language = language,
        output_type = output_type,
        link_deps_statically = link_deps_statically,
        stamp = stamp,
        additional_inputs = additional_inputs,
        link_artifact_name_suffix = link_artifact_name_suffix,
        never_link = never_link,
        always_link = always_link,
        test_only_target = test_only_target,
        variables_extension = variables_extension,
        native_deps = native_deps,
        whole_archive = whole_archive,
        additional_linkstamp_defines = additional_linkstamp_defines,
        only_for_dynamic_libs = only_for_dynamic_libs,
        main_output = main_output,
        additional_outputs = additional_outputs,
        use_test_only_flags = use_test_only_flags,
        pdb_file = pdb_file,
        win_def_file = win_def_file,
        use_shareable_artifact_factory = use_shareable_artifact_factory,
        build_config = build_config,
    )

def _create_compilation_outputs(*, objects = None, pic_objects = None, lto_compilation_context = _UNBOUND):
    if lto_compilation_context != _UNBOUND:
        cc_common_internal.check_private_api(allowlist = _PRIVATE_STARLARKIFICATION_ALLOWLIST)
    if lto_compilation_context == _UNBOUND:
        lto_compilation_context = None
    return cc_common_internal.create_compilation_outputs(
        objects = objects,
        pic_objects = pic_objects,
        lto_compilation_context = lto_compilation_context,
    )

def _merge_compilation_outputs(*, compilation_outputs = []):
    return cc_common_internal.merge_compilation_outputs(compilation_outputs = compilation_outputs)

def _configure_features(*, cc_toolchain, ctx = None, language = None, requested_features = [], unsupported_features = []):
    return cc_common_internal.configure_features(
        ctx = ctx,
        cc_toolchain = cc_toolchain,
        language = language,
        requested_features = requested_features,
        unsupported_features = unsupported_features,
    )

def _get_tool_for_action(*, feature_configuration, action_name):
    return cc_common_internal.get_tool_for_action(feature_configuration = feature_configuration, action_name = action_name)

def _get_execution_requirements(*, feature_configuration, action_name):
    return cc_common_internal.get_execution_requirements(feature_configuration = feature_configuration, action_name = action_name)

def _is_enabled(*, feature_configuration, feature_name):
    return cc_common_internal.is_enabled(feature_configuration = feature_configuration, feature_name = feature_name)

def _action_is_enabled(*, feature_configuration, action_name):
    return cc_common_internal.action_is_enabled(feature_configuration = feature_configuration, action_name = action_name)

def _get_memory_inefficient_command_line(*, feature_configuration, action_name, variables):
    return cc_common_internal.get_memory_inefficient_command_line(feature_configuration = feature_configuration, action_name = action_name, variables = variables)

def _get_environment_variables(*, feature_configuration, action_name, variables):
    return cc_common_internal.get_environment_variables(feature_configuration = feature_configuration, action_name = action_name, variables = variables)

def _create_compile_variables(
        *,
        cc_toolchain,
        feature_configuration,
        source_file = None,
        output_file = None,
        user_compile_flags = None,
        include_directories = None,
        quote_include_directories = None,
        system_include_directories = None,
        framework_include_directories = None,
        preprocessor_defines = None,
        thinlto_index = None,
        thinlto_input_bitcode_file = None,
        thinlto_output_object_file = None,
        use_pic = False,
        add_legacy_cxx_options = False,
        variables_extension = {},
        strip_opts = _UNBOUND,
        input_file = _UNBOUND):
    if strip_opts != _UNBOUND or input_file != _UNBOUND:
        cc_common_internal.check_private_api(allowlist = _PRIVATE_STARLARKIFICATION_ALLOWLIST)
    if strip_opts == _UNBOUND:
        strip_opts = []
    if input_file == _UNBOUND:
        input_file = None
    return cc_common_internal.create_compile_variables(
        cc_toolchain = cc_toolchain,
        feature_configuration = feature_configuration,
        source_file = source_file,
        output_file = output_file,
        user_compile_flags = user_compile_flags,
        include_directories = include_directories,
        quote_include_directories = quote_include_directories,
        system_include_directories = system_include_directories,
        framework_include_directories = framework_include_directories,
        preprocessor_defines = preprocessor_defines,
        thinlto_index = thinlto_index,
        thinlto_input_bitcode_file = thinlto_input_bitcode_file,
        thinlto_output_object_file = thinlto_output_object_file,
        use_pic = use_pic,
        add_legacy_cxx_options = add_legacy_cxx_options,
        variables_extension = variables_extension,
        strip_opts = strip_opts,
        input_file = input_file,
    )

def _create_link_variables(
        *,
        cc_toolchain,
        feature_configuration,
        library_search_directories = None,
        runtime_library_search_directories = None,
        user_link_flags = None,
        output_file = None,
        param_file = None,
        def_file = None,
        is_using_linker = True,
        is_linking_dynamic_library = False,
        must_keep_debug = True,
        use_test_only_flags = False,
        is_static_linking_mode = True):
    return cc_common_internal.create_link_variables(
        cc_toolchain = cc_toolchain,
        feature_configuration = feature_configuration,
        library_search_directories = library_search_directories,
        runtime_library_search_directories = runtime_library_search_directories,
        user_link_flags = user_link_flags,
        output_file = output_file,
        param_file = param_file,
        def_file = def_file,
        is_using_linker = is_using_linker,
        is_linking_dynamic_library = is_linking_dynamic_library,
        must_keep_debug = must_keep_debug,
        use_test_only_flags = use_test_only_flags,
        is_static_linking_mode = is_static_linking_mode,
    )

def _empty_variables():
    return cc_common_internal.empty_variables()

def _create_library_to_link(
        *,
        actions,
        feature_configuration = None,
        cc_toolchain = None,
        static_library = None,
        pic_static_library = None,
        dynamic_library = None,
        interface_library = None,
        pic_objects = _UNBOUND,
        objects = _UNBOUND,
        alwayslink = False,
        dynamic_library_symlink_path = "",
        interface_library_symlink_path = "",
        must_keep_debug = _UNBOUND):
    if must_keep_debug != _UNBOUND:
        cc_common_internal.check_private_api(allowlist = _PRIVATE_STARLARKIFICATION_ALLOWLIST)
    if must_keep_debug == _UNBOUND:
        must_keep_debug = False

    # We cannot check if experimental_starlark_cc_import is set or not here,
    # since there is not ctx. So for a native code to perform the check
    # pic_objects and objects need to be unbound.
    kwargs = {
        "actions": actions,
        "feature_configuration": feature_configuration,
        "cc_toolchain": cc_toolchain,
        "static_library": static_library,
        "pic_static_library": pic_static_library,
        "dynamic_library": dynamic_library,
        "interface_library": interface_library,
        "alwayslink": alwayslink,
        "dynamic_library_symlink_path": dynamic_library_symlink_path,
        "interface_library_symlink_path": interface_library_symlink_path,
        "must_keep_debug": must_keep_debug,
    }
    if pic_objects != _UNBOUND:
        kwargs["pic_objects"] = pic_objects
    if objects != _UNBOUND:
        kwargs["objects"] = objects
    return cc_common_internal.create_library_to_link(
        **kwargs
    )

def _create_linker_input(
        *,
        owner,
        libraries = None,
        user_link_flags = None,
        additional_inputs = None,
        linkstamps = None):
    return cc_common_internal.create_linker_input(
        owner = owner,
        libraries = libraries,
        user_link_flags = user_link_flags,
        additional_inputs = additional_inputs,
        linkstamps = linkstamps,
    )

def _create_linking_context(
        *,
        linker_inputs = None,
        libraries_to_link = _UNBOUND,
        user_link_flags = _UNBOUND,
        additional_inputs = _UNBOUND,
        extra_link_time_library = _UNBOUND):
    if extra_link_time_library != _UNBOUND:
        cc_common_internal.check_private_api(allowlist = _PRIVATE_STARLARKIFICATION_ALLOWLIST)
    if extra_link_time_library == _UNBOUND:
        extra_link_time_library = None

    # Usage of libraries_to_link, user_link_flags and additional_inputs are restricted by a flag.
    # Since we cannot do it here, we let the native code to do it.
    kwargs = {
        "linker_inputs": linker_inputs,
        "extra_link_time_library": extra_link_time_library,
    }
    if libraries_to_link != _UNBOUND:
        kwargs["libraries_to_link"] = libraries_to_link
    if user_link_flags != _UNBOUND:
        kwargs["user_link_flags"] = user_link_flags
    if additional_inputs != _UNBOUND:
        kwargs["additional_inputs"] = additional_inputs
    return cc_common_internal.create_linking_context(
        **kwargs
    )

def _merge_cc_infos(*, direct_cc_infos = [], cc_infos = []):
    direct_cc_compilation_contexts = []
    cc_compilation_contexts = []
    cc_linking_contexts = []
    cc_debug_info_contexts = []
    transitive_native_cc_libraries = []

    for cc_info in direct_cc_infos:
        direct_cc_compilation_contexts.append(cc_info.compilation_context)
        cc_linking_contexts.append(cc_info.linking_context)
        cc_debug_info_contexts.append(cc_info.debug_context())
        transitive_native_cc_libraries.append(cc_info.transitive_native_libraries())

    for cc_info in cc_infos:
        cc_compilation_contexts.append(cc_info.compilation_context)
        cc_linking_contexts.append(cc_info.linking_context)
        cc_debug_info_contexts.append(cc_info.debug_context())
        transitive_native_cc_libraries.append(cc_info.transitive_native_libraries())

    return CcInfo(
        compilation_context = cc_common_internal.merge_compilation_contexts(compilation_contexts = direct_cc_compilation_contexts, non_exported_compilation_contexts = cc_compilation_contexts),
        linking_context = cc_common_internal.merge_linking_contexts(linking_contexts = cc_linking_contexts),
        debug_context = cc_common_internal.merge_debug_context(cc_debug_info_contexts),
        cc_native_library_info = CcNativeLibraryInfo(libraries_to_link = depset(order = "topological", transitive = transitive_native_cc_libraries)),
    )

def _create_compilation_context(
        *,
        headers = None,
        system_includes = None,
        includes = None,
        quote_includes = None,
        framework_includes = None,
        defines = None,
        local_defines = None,
        direct_textual_headers = [],
        direct_public_headers = [],
        direct_private_headers = [],
        purpose = _UNBOUND,
        module_map = _UNBOUND,
        actions = _UNBOUND,
        label = _UNBOUND,
        external_includes = _UNBOUND,
        virtual_to_original_headers = _UNBOUND,
        dependent_cc_compilation_contexts = _UNBOUND,
        non_code_inputs = _UNBOUND,
        loose_hdrs_dirs = _UNBOUND,
        headers_checking_mode = _UNBOUND,
        propagate_module_map_to_compile_action = _UNBOUND,
        pic_header_module = _UNBOUND,
        header_module = _UNBOUND,
        separate_module_headers = _UNBOUND,
        separate_module = _UNBOUND,
        separate_pic_module = _UNBOUND,
        add_public_headers_to_modular_headers = _UNBOUND):
    if purpose != _UNBOUND or \
       module_map != _UNBOUND or \
       actions != _UNBOUND or \
       external_includes != _UNBOUND or \
       virtual_to_original_headers != _UNBOUND or \
       dependent_cc_compilation_contexts != _UNBOUND or \
       non_code_inputs != _UNBOUND or \
       loose_hdrs_dirs != _UNBOUND or \
       headers_checking_mode != _UNBOUND or \
       propagate_module_map_to_compile_action != _UNBOUND or \
       pic_header_module != _UNBOUND or \
       header_module != _UNBOUND or \
       separate_module_headers != _UNBOUND or \
       separate_module != _UNBOUND or \
       separate_pic_module != _UNBOUND or \
       add_public_headers_to_modular_headers != _UNBOUND or \
       label != _UNBOUND:
        cc_common_internal.check_private_api(allowlist = _PRIVATE_STARLARKIFICATION_ALLOWLIST)
    if purpose == _UNBOUND:
        purpose = None
    if module_map == _UNBOUND:
        module_map = None
    if actions == _UNBOUND:
        actions = None
    if label == _UNBOUND:
        label = None
    if external_includes == _UNBOUND:
        external_includes = depset()
    if virtual_to_original_headers == _UNBOUND:
        virtual_to_original_headers = depset()
    if dependent_cc_compilation_contexts == _UNBOUND:
        dependent_cc_compilation_contexts = []
    if non_code_inputs == _UNBOUND:
        non_code_inputs = []
    if loose_hdrs_dirs == _UNBOUND:
        loose_hdrs_dirs = []
    if headers_checking_mode == _UNBOUND:
        headers_checking_mode = "STRICT"
    if propagate_module_map_to_compile_action == _UNBOUND:
        propagate_module_map_to_compile_action = True
    if pic_header_module == _UNBOUND:
        pic_header_module = None
    if header_module == _UNBOUND:
        header_module = None
    if separate_module_headers == _UNBOUND:
        separate_module_headers = []
    if separate_module == _UNBOUND:
        separate_module = None
    if separate_pic_module == _UNBOUND:
        separate_pic_module = None
    if add_public_headers_to_modular_headers == _UNBOUND:
        add_public_headers_to_modular_headers = True
    return cc_common_internal.create_compilation_context(
        headers = headers,
        system_includes = system_includes,
        includes = includes,
        quote_includes = quote_includes,
        framework_includes = framework_includes,
        defines = defines,
        local_defines = local_defines,
        direct_textual_headers = direct_textual_headers,
        direct_public_headers = direct_public_headers,
        direct_private_headers = direct_private_headers,
        purpose = purpose,
        module_map = module_map,
        actions = actions,
        label = label,
        external_includes = external_includes,
        virtual_to_original_headers = virtual_to_original_headers,
        dependent_cc_compilation_contexts = dependent_cc_compilation_contexts,
        non_code_inputs = non_code_inputs,
        loose_hdrs_dirs = loose_hdrs_dirs,
        headers_checking_mode = headers_checking_mode,
        propagate_module_map_to_compile_action = propagate_module_map_to_compile_action,
        pic_header_module = pic_header_module,
        header_module = header_module,
        separate_module_headers = separate_module_headers,
        separate_module = separate_module,
        separate_pic_module = separate_pic_module,
        add_public_headers_to_modular_headers = add_public_headers_to_modular_headers,
    )

def _legacy_cc_flags_make_variable_do_not_use(*, cc_toolchain):
    return cc_common_internal.legacy_cc_flags_make_variable_do_not_use(cc_toolchain = cc_toolchain)

def _is_cc_toolchain_resolution_enabled_do_not_use(*, ctx):
    return cc_common_internal.is_cc_toolchain_resolution_enabled_do_not_use(ctx = ctx)

def _create_cc_toolchain_config_info(
        *,
        ctx,
        toolchain_identifier,
        target_system_name,
        target_cpu,
        target_libc,
        compiler,
        features = [],
        action_configs = [],
        artifact_name_patterns = [],
        cxx_builtin_include_directories = [],
        host_system_name = None,
        abi_version = None,
        abi_libc_version = None,
        tool_paths = [],
        make_variables = [],
        builtin_sysroot = None,
        cc_target_os = None):
    return cc_common_internal.create_cc_toolchain_config_info(
        ctx = ctx,
        toolchain_identifier = toolchain_identifier,
        target_system_name = target_system_name,
        target_cpu = target_cpu,
        target_libc = target_libc,
        compiler = compiler,
        features = features,
        action_configs = action_configs,
        artifact_name_patterns = artifact_name_patterns,
        cxx_builtin_include_directories = cxx_builtin_include_directories,
        host_system_name = host_system_name,
        abi_version = abi_version,
        abi_libc_version = abi_libc_version,
        tool_paths = tool_paths,
        make_variables = make_variables,
        builtin_sysroot = builtin_sysroot,
        cc_target_os = cc_target_os,
    )

def _create_linking_context_from_compilation_outputs(
        *,
        actions,
        feature_configuration,
        cc_toolchain,
        compilation_outputs,
        name,
        user_link_flags = [],
        linking_contexts = [],
        language = "c++",
        alwayslink = False,
        additional_inputs = [],
        disallow_static_libraries = False,
        disallow_dynamic_library = False,
        variables_extension = {},
        stamp = _UNBOUND,
        linked_dll_name_suffix = _UNBOUND,
        win_def_file = _UNBOUND,
        test_only_target = _UNBOUND):
    if stamp != _UNBOUND or \
       linked_dll_name_suffix != _UNBOUND or \
       win_def_file != _UNBOUND or \
       test_only_target != _UNBOUND:
        cc_common_internal.check_private_api(allowlist = _PRIVATE_STARLARKIFICATION_ALLOWLIST)

    if stamp == _UNBOUND:
        stamp = 0
    if linked_dll_name_suffix == _UNBOUND:
        linked_dll_name_suffix = ""
    if win_def_file == _UNBOUND:
        win_def_file = None
    if test_only_target == _UNBOUND:
        test_only_target = False

    return cc_common_internal.create_linking_context_from_compilation_outputs(
        actions = actions,
        feature_configuration = feature_configuration,
        cc_toolchain = cc_toolchain,
        compilation_outputs = compilation_outputs,
        name = name,
        user_link_flags = user_link_flags,
        linking_contexts = linking_contexts,
        language = language,
        alwayslink = alwayslink,
        additional_inputs = additional_inputs,
        disallow_static_libraries = disallow_static_libraries,
        disallow_dynamic_library = disallow_dynamic_library,
        variables_extension = variables_extension,
        stamp = stamp,
        linked_dll_name_suffix = linked_dll_name_suffix,
        win_def_file = win_def_file,
        test_only_target = test_only_target,
    )

def _merge_compilation_contexts(*, compilation_contexts = []):
    return cc_common_internal.merge_compilation_contexts(compilation_contexts = compilation_contexts)

def _merge_linking_contexts(*, linking_contexts = []):
    return cc_common_internal.merge_linking_contexts(linking_contexts = linking_contexts)

def _check_experimental_cc_shared_library():
    cc_common_internal.check_private_api(allowlist = _PRIVATE_STARLARKIFICATION_ALLOWLIST)
    return cc_common_internal.check_experimental_cc_shared_library()

def _incompatible_disable_objc_library_transition():
    cc_common_internal.check_private_api(allowlist = _PRIVATE_STARLARKIFICATION_ALLOWLIST)
    return cc_common_internal.incompatible_disable_objc_library_transition()

def _create_module_map(*, file, name, umbrella_header = None):
    cc_common_internal.check_private_api(allowlist = _PRIVATE_STARLARKIFICATION_ALLOWLIST)
    return cc_common_internal.create_module_map(
        file = file,
        name = name,
        umbrella_header = umbrella_header,
    )

def _create_debug_context(compilation_outputs = []):
    cc_common_internal.check_private_api(allowlist = _PRIVATE_STARLARKIFICATION_ALLOWLIST)
    return cc_common_internal.create_debug_context(compilation_outputs)

def _merge_debug_context(debug_contexts = []):
    cc_common_internal.check_private_api(allowlist = _PRIVATE_STARLARKIFICATION_ALLOWLIST)
    return cc_common_internal.merge_debug_context(debug_contexts)

def _get_tool_requirement_for_action(*, feature_configuration, action_name):
    cc_common_internal.check_private_api(allowlist = _PRIVATE_STARLARKIFICATION_ALLOWLIST)
    return cc_common_internal.get_tool_requirement_for_action(feature_configuration = feature_configuration, action_name = action_name)

def _get_build_info(ctx):
    cc_common_internal.check_private_api(allowlist = _PRIVATE_STARLARKIFICATION_ALLOWLIST)
    return cc_common_internal.get_build_info(ctx)

def _create_extra_link_time_library(*, build_library_func, **kwargs):
    cc_common_internal.check_private_api(allowlist = _BUILTINS)
    return cc_common_internal.create_extra_link_time_library(build_library_func = build_library_func, **kwargs)

def _register_linkstamp_compile_action(
        *,
        actions,
        cc_toolchain,
        feature_configuration,
        source_file,
        output_file,
        compilation_inputs,
        inputs_for_validation,
        label_replacement,
        output_replacement):
    cc_common_internal.check_private_api(allowlist = _PRIVATE_STARLARKIFICATION_ALLOWLIST)
    return cc_common_internal.register_linkstamp_compile_action(
        actions = actions,
        cc_toolchain = cc_toolchain,
        feature_configuration = feature_configuration,
        source_file = source_file,
        output_file = output_file,
        compilation_inputs = compilation_inputs,
        inputs_for_validation = inputs_for_validation,
        label_replacement = label_replacement,
        output_replacement = output_replacement,
    )

def _compile(
        *,
        actions,
        feature_configuration,
        cc_toolchain,
        name,
        srcs = [],
        public_hdrs = [],
        private_hdrs = [],
        textual_hdrs = [],
        additional_exported_hdrs = _UNBOUND,
        includes = [],
        loose_includes = _UNBOUND,
        quote_includes = [],
        system_includes = [],
        framework_includes = [],
        defines = [],
        local_defines = [],
        include_prefix = "",
        strip_include_prefix = "",
        user_compile_flags = [],
        compilation_contexts = [],
        implementation_compilation_contexts = _UNBOUND,
        disallow_pic_outputs = False,
        disallow_nopic_outputs = False,
        additional_include_scanning_roots = [],
        additional_inputs = [],
        module_map = _UNBOUND,
        additional_module_maps = _UNBOUND,
        propagate_module_map_to_compile_action = _UNBOUND,
        do_not_generate_module_map = _UNBOUND,
        code_coverage_enabled = _UNBOUND,
        hdrs_checking_mode = _UNBOUND,
        variables_extension = {},
        language = None,
        purpose = _UNBOUND,
        copts_filter = _UNBOUND,
        separate_module_headers = _UNBOUND,
        non_compilation_additional_inputs = _UNBOUND):
    if module_map != _UNBOUND or \
       additional_module_maps != _UNBOUND or \
       additional_exported_hdrs != _UNBOUND or \
       propagate_module_map_to_compile_action != _UNBOUND or \
       do_not_generate_module_map != _UNBOUND or \
       code_coverage_enabled != _UNBOUND or \
       purpose != _UNBOUND or \
       hdrs_checking_mode != _UNBOUND or \
       implementation_compilation_contexts != _UNBOUND or \
       copts_filter != _UNBOUND or \
       loose_includes != _UNBOUND or \
       separate_module_headers != _UNBOUND or \
       non_compilation_additional_inputs != _UNBOUND:
        cc_common_internal.check_private_api(allowlist = _PRIVATE_STARLARKIFICATION_ALLOWLIST)

    if module_map == _UNBOUND:
        module_map = None
    if additional_module_maps == _UNBOUND:
        additional_module_maps = []
    if additional_exported_hdrs == _UNBOUND:
        additional_exported_hdrs = []
    if propagate_module_map_to_compile_action == _UNBOUND:
        propagate_module_map_to_compile_action = True
    if do_not_generate_module_map == _UNBOUND:
        do_not_generate_module_map = False
    if code_coverage_enabled == _UNBOUND:
        code_coverage_enabled = False
    if purpose == _UNBOUND:
        purpose = None
    if hdrs_checking_mode == _UNBOUND:
        hdrs_checking_mode = None
    if implementation_compilation_contexts == _UNBOUND:
        implementation_compilation_contexts = []
    if copts_filter == _UNBOUND:
        copts_filter = None
    if loose_includes == _UNBOUND:
        loose_includes = []
    if separate_module_headers == _UNBOUND:
        separate_module_headers = []
    if non_compilation_additional_inputs == _UNBOUND:
        non_compilation_additional_inputs = []

    has_tuple = _check_all_sources_contain_tuples_or_none_of_them([srcs, private_hdrs, public_hdrs])
    if has_tuple:
        cc_common_internal.check_private_api(allowlist = _PRIVATE_STARLARKIFICATION_ALLOWLIST)

    return cc_common_internal.compile(
        actions = actions,
        feature_configuration = feature_configuration,
        cc_toolchain = cc_toolchain,
        name = name,
        srcs = srcs,
        public_hdrs = public_hdrs,
        private_hdrs = private_hdrs,
        textual_hdrs = textual_hdrs,
        additional_exported_hdrs = additional_exported_hdrs,
        includes = includes,
        loose_includes = loose_includes,
        quote_includes = quote_includes,
        system_includes = system_includes,
        framework_includes = framework_includes,
        defines = defines,
        local_defines = local_defines,
        include_prefix = include_prefix,
        strip_include_prefix = strip_include_prefix,
        user_compile_flags = user_compile_flags,
        compilation_contexts = compilation_contexts,
        implementation_compilation_contexts = implementation_compilation_contexts,
        disallow_pic_outputs = disallow_pic_outputs,
        disallow_nopic_outputs = disallow_nopic_outputs,
        additional_include_scanning_roots = additional_include_scanning_roots,
        additional_inputs = additional_inputs,
        module_map = module_map,
        additional_module_maps = additional_module_maps,
        propagate_module_map_to_compile_action = propagate_module_map_to_compile_action,
        do_not_generate_module_map = do_not_generate_module_map,
        code_coverage_enabled = code_coverage_enabled,
        hdrs_checking_mode = hdrs_checking_mode,
        variables_extension = variables_extension,
        language = language,
        purpose = purpose,
        copts_filter = copts_filter,
        separate_module_headers = separate_module_headers,
        non_compilation_additional_inputs = non_compilation_additional_inputs,
    )

def _create_lto_backend_artifacts(
        *,
        ctx,
        lto_output_root_prefix,
        lto_obj_root_prefix,
        bitcode_file,
        feature_configuration,
        cc_toolchain,
        fdo_context,
        use_pic,
        should_create_per_object_debug_info,
        argv):
    cc_common_internal.check_private_api(allowlist = _PRIVATE_STARLARKIFICATION_ALLOWLIST)
    return cc_common_internal.create_lto_backend_artifacts(
        ctx = ctx,
        bitcode_file = bitcode_file,
        lto_output_root_prefix = lto_output_root_prefix,
        lto_obj_root_prefix = lto_obj_root_prefix,
        feature_configuration = feature_configuration,
        cc_toolchain = cc_toolchain,
        fdo_context = fdo_context,
        use_pic = use_pic,
        should_create_per_object_debug_info = should_create_per_object_debug_info,
        argv = argv,
    )

def _create_cc_launcher_info(*, cc_info, compilation_outputs):
    return cc_common_internal.create_cc_launcher_info(cc_info = cc_info, compilation_outputs = compilation_outputs)

def _objcopy(*, ctx, cc_toolchain):
    cc_common_internal.check_private_api(allowlist = _OLD_STARLARK_API_ALLOWLISTED_PACKAGES)
    return cc_common_internal.objcopy(ctx = ctx, cc_toolchain = cc_toolchain)

def _objcopy_tool_path(*, ctx, cc_toolchain):
    cc_common_internal.check_private_api(allowlist = _OLD_STARLARK_API_ALLOWLISTED_PACKAGES)
    return cc_common_internal.objcopy_tool_path(ctx = ctx, cc_toolchain = cc_toolchain)

def _ld_tool_path(*, ctx, cc_toolchain):
    cc_common_internal.check_private_api(allowlist = _OLD_STARLARK_API_ALLOWLISTED_PACKAGES)
    return cc_common_internal.ld_tool_path(ctx = ctx, cc_toolchain = cc_toolchain)

def _cc_target_os_do_not_use(toolchain):
    return cc_common_internal.cc_target_os_do_not_use(toolchain)

def _create_compile_action(
        *,
        actions,
        cc_toolchain,
        feature_configuration,
        source_file,
        output_file,
        variables,
        action_name,
        compilation_context,
        additional_inputs = None,
        additional_outputs = []):
    cc_common_internal.check_private_api(allowlist = _CREATE_COMPILE_ACTION_API_ALLOWLISTED_PACKAGES)
    return cc_common_internal.create_compile_action(
        actions = actions,
        cc_toolchain = cc_toolchain,
        feature_configuration = feature_configuration,
        source_file = source_file,
        output_file = output_file,
        variables = variables,
        action_name = action_name,
        compilation_context = compilation_context,
        additional_inputs = additional_inputs,
        additional_outputs = additional_outputs,
    )

def _loose_hdrs_check_forbidden_by_allowlist(*, ctx):
    cc_common_internal.check_private_api(allowlist = _BUILTINS)
    return cc_common_internal.loose_hdrs_check_forbidden_by_allowlist(ctx = ctx)

def _implementation_deps_allowed_by_allowlist(*, ctx):
    cc_common_internal.check_private_api(allowlist = _BUILTINS)
    return cc_common_internal.implementation_deps_allowed_by_allowlist(ctx = ctx)

cc_common = struct(
    link = _link,
    create_compilation_outputs = _create_compilation_outputs,
    merge_compilation_outputs = _merge_compilation_outputs,
    CcToolchainInfo = cc_common_internal.CcToolchainInfo,
    do_not_use_tools_cpp_compiler_present = cc_common_internal.do_not_use_tools_cpp_compiler_present,
    configure_features = _configure_features,
    get_tool_for_action = _get_tool_for_action,
    get_execution_requirements = _get_execution_requirements,
    is_enabled = _is_enabled,
    action_is_enabled = _action_is_enabled,
    get_memory_inefficient_command_line = _get_memory_inefficient_command_line,
    get_environment_variables = _get_environment_variables,
    create_compile_variables = _create_compile_variables,
    create_link_variables = _create_link_variables,
    empty_variables = _empty_variables,
    create_library_to_link = _create_library_to_link,
    create_linker_input = _create_linker_input,
    create_linking_context = _create_linking_context,
    merge_cc_infos = _merge_cc_infos,
    create_compilation_context = _create_compilation_context,
    legacy_cc_flags_make_variable_do_not_use = _legacy_cc_flags_make_variable_do_not_use,
    incompatible_disable_objc_library_transition = _incompatible_disable_objc_library_transition,
    is_cc_toolchain_resolution_enabled_do_not_use = _is_cc_toolchain_resolution_enabled_do_not_use,
    create_cc_toolchain_config_info = _create_cc_toolchain_config_info,
    create_linking_context_from_compilation_outputs = _create_linking_context_from_compilation_outputs,
    merge_compilation_contexts = _merge_compilation_contexts,
    merge_linking_contexts = _merge_linking_contexts,
    check_experimental_cc_shared_library = _check_experimental_cc_shared_library,
    create_module_map = _create_module_map,
    create_debug_context = _create_debug_context,
    merge_debug_context = _merge_debug_context,
    get_tool_requirement_for_action = _get_tool_requirement_for_action,
    get_build_info = _get_build_info,
    create_extra_link_time_library = _create_extra_link_time_library,
    register_linkstamp_compile_action = _register_linkstamp_compile_action,
    compile = _compile,
    create_lto_backend_artifacts = _create_lto_backend_artifacts,
    # Google internal methods.
    create_cc_launcher_info = _create_cc_launcher_info,
    # TODO: b/295221112 - Remove after migrating launchers to Starlark flags
    launcher_provider = _builtins.internal.cc_internal.launcher_provider,
    objcopy = _objcopy,
    objcopy_tool_path = _objcopy_tool_path,
    ld_tool_path = _ld_tool_path,
    cc_target_os_do_not_use = _cc_target_os_do_not_use,
    create_compile_action = _create_compile_action,
    loose_hdrs_check_forbidden_by_allowlist = _loose_hdrs_check_forbidden_by_allowlist,
    implementation_deps_allowed_by_allowlist = _implementation_deps_allowed_by_allowlist,
    CcSharedLibraryHintInfo = CcSharedLibraryHintInfo,
)
