| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284 |
- # Part of the Carbon Language project, under the Apache License v2.0 with LLVM
- # Exceptions. See /LICENSE for license information.
- # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- """Definitions of linking related features used in a `cc_toolchain_config`."""
- load("@rules_cc//cc:action_names.bzl", "ACTION_NAMES", "ACTION_NAME_GROUPS")
- load(
- "@rules_cc//cc:cc_toolchain_config_lib.bzl",
- "feature",
- "flag_group",
- "flag_set",
- "variable_with_value",
- "with_feature_set",
- )
- link_libraries_feature = feature(
- name = "link_libraries",
- enabled = True,
- flag_sets = [
- flag_set(
- actions = ACTION_NAME_GROUPS.all_cc_link_actions,
- flag_groups = [
- flag_group(
- expand_if_available = "linkstamp_paths",
- flags = ["%{linkstamp_paths}"],
- iterate_over = "linkstamp_paths",
- ),
- flag_group(
- expand_if_available = "libraries_to_link",
- flag_groups = [
- flag_group(
- expand_if_equal = variable_with_value(
- name = "libraries_to_link.type",
- value = "object_file_group",
- ),
- flags = ["-Wl,--start-lib"],
- ),
- flag_group(
- expand_if_true = "libraries_to_link.is_whole_archive",
- flags = ["-Wl,-whole-archive"],
- ),
- flag_group(
- expand_if_equal = variable_with_value(
- name = "libraries_to_link.type",
- value = "object_file_group",
- ),
- flags = ["%{libraries_to_link.object_files}"],
- iterate_over = "libraries_to_link.object_files",
- ),
- flag_group(
- expand_if_equal = variable_with_value(
- name = "libraries_to_link.type",
- value = "object_file",
- ),
- flags = ["%{libraries_to_link.name}"],
- ),
- flag_group(
- expand_if_equal = variable_with_value(
- name = "libraries_to_link.type",
- value = "interface_library",
- ),
- flags = ["%{libraries_to_link.name}"],
- ),
- flag_group(
- expand_if_equal = variable_with_value(
- name = "libraries_to_link.type",
- value = "static_library",
- ),
- flags = ["%{libraries_to_link.name}"],
- ),
- flag_group(
- expand_if_equal = variable_with_value(
- name = "libraries_to_link.type",
- value = "dynamic_library",
- ),
- flags = ["-l%{libraries_to_link.name}"],
- ),
- flag_group(
- expand_if_equal = variable_with_value(
- name = "libraries_to_link.type",
- value = "versioned_dynamic_library",
- ),
- flags = ["-l:%{libraries_to_link.name}"],
- ),
- flag_group(
- expand_if_true = "libraries_to_link.is_whole_archive",
- flags = ["-Wl,-no-whole-archive"],
- ),
- flag_group(
- expand_if_equal = variable_with_value(
- name = "libraries_to_link.type",
- value = "object_file_group",
- ),
- flags = ["-Wl,--end-lib"],
- ),
- ],
- iterate_over = "libraries_to_link",
- ),
- # Note that the params file comes at the end, after the
- # libraries to link above.
- flag_group(
- expand_if_available = "linker_param_file",
- flags = ["@%{linker_param_file}"],
- ),
- ],
- with_features = [with_feature_set(not_features = ["macos_target"])],
- ),
- flag_set(
- actions = ACTION_NAME_GROUPS.all_cc_link_actions,
- flag_groups = [
- flag_group(
- expand_if_available = "linkstamp_paths",
- flags = ["%{linkstamp_paths}"],
- iterate_over = "linkstamp_paths",
- ),
- flag_group(
- expand_if_available = "libraries_to_link",
- flag_groups = [
- flag_group(
- expand_if_equal = variable_with_value(
- name = "libraries_to_link.type",
- value = "object_file_group",
- ),
- flags = ["-Wl,--start-lib"],
- ),
- flag_group(
- expand_if_equal = variable_with_value(
- name = "libraries_to_link.type",
- value = "object_file_group",
- ),
- flag_groups = [
- flag_group(
- expand_if_false = "libraries_to_link.is_whole_archive",
- flags = ["%{libraries_to_link.object_files}"],
- ),
- flag_group(
- expand_if_true = "libraries_to_link.is_whole_archive",
- flags = ["-Wl,-force_load,%{libraries_to_link.object_files}"],
- ),
- ],
- iterate_over = "libraries_to_link.object_files",
- ),
- flag_group(
- expand_if_equal = variable_with_value(
- name = "libraries_to_link.type",
- value = "object_file",
- ),
- flag_groups = [
- flag_group(
- expand_if_false = "libraries_to_link.is_whole_archive",
- flags = ["%{libraries_to_link.name}"],
- ),
- flag_group(
- expand_if_true = "libraries_to_link.is_whole_archive",
- flags = ["-Wl,-force_load,%{libraries_to_link.name}"],
- ),
- ],
- ),
- flag_group(
- expand_if_equal = variable_with_value(
- name = "libraries_to_link.type",
- value = "interface_library",
- ),
- flag_groups = [
- flag_group(
- expand_if_false = "libraries_to_link.is_whole_archive",
- flags = ["%{libraries_to_link.name}"],
- ),
- flag_group(
- expand_if_true = "libraries_to_link.is_whole_archive",
- flags = ["-Wl,-force_load,%{libraries_to_link.name}"],
- ),
- ],
- ),
- flag_group(
- expand_if_equal = variable_with_value(
- name = "libraries_to_link.type",
- value = "static_library",
- ),
- flag_groups = [
- flag_group(
- expand_if_false = "libraries_to_link.is_whole_archive",
- flags = ["%{libraries_to_link.name}"],
- ),
- flag_group(
- expand_if_true = "libraries_to_link.is_whole_archive",
- flags = ["-Wl,-force_load,%{libraries_to_link.name}"],
- ),
- ],
- ),
- flag_group(
- expand_if_equal = variable_with_value(
- name = "libraries_to_link.type",
- value = "dynamic_library",
- ),
- flags = ["-l%{libraries_to_link.name}"],
- ),
- flag_group(
- expand_if_equal = variable_with_value(
- name = "libraries_to_link.type",
- value = "versioned_dynamic_library",
- ),
- flags = ["-l:%{libraries_to_link.name}"],
- ),
- flag_group(
- expand_if_true = "libraries_to_link.is_whole_archive",
- flag_groups = [
- flag_group(
- expand_if_false = "macos_flags",
- flags = ["-Wl,-no-whole-archive"],
- ),
- ],
- ),
- flag_group(
- expand_if_equal = variable_with_value(
- name = "libraries_to_link.type",
- value = "object_file_group",
- ),
- flags = ["-Wl,--end-lib"],
- ),
- ],
- iterate_over = "libraries_to_link",
- ),
- # Note that the params file comes at the end, after the
- # libraries to link above.
- flag_group(
- expand_if_available = "linker_param_file",
- flags = ["@%{linker_param_file}"],
- ),
- ],
- with_features = [with_feature_set(["macos_target"])],
- ),
- ],
- )
- # Archive actions have an entirely independent set of flags and don't
- # interact with either compiler or link actions.
- archiving_feature = feature(
- name = "archiving",
- enabled = True,
- flag_sets = [flag_set(
- actions = [ACTION_NAMES.cpp_link_static_library],
- flag_groups = [
- flag_group(flags = ["rcsD"]),
- flag_group(
- expand_if_available = "output_execpath",
- flags = ["%{output_execpath}"],
- ),
- flag_group(
- expand_if_available = "libraries_to_link",
- flag_groups = [
- flag_group(
- expand_if_equal = variable_with_value(
- name = "libraries_to_link.type",
- value = "object_file",
- ),
- flags = ["%{libraries_to_link.name}"],
- ),
- flag_group(
- expand_if_equal = variable_with_value(
- name = "libraries_to_link.type",
- value = "object_file_group",
- ),
- flags = ["%{libraries_to_link.object_files}"],
- iterate_over = "libraries_to_link.object_files",
- ),
- ],
- iterate_over = "libraries_to_link",
- ),
- flag_group(
- expand_if_available = "linker_param_file",
- flags = ["@%{linker_param_file}"],
- ),
- ],
- )],
- )
- # Note that the order of features is significant in this list and determines the
- # relative order of flags from the features listed.
- linking_features = [
- link_libraries_feature,
- archiving_feature,
- ]
|