@@ -63,6 +63,14 @@ def _build_fully_linked_variable_extensions(*, archive, libs):
6363 extensions ["imported_library_exec_paths" ] = []
6464 return extensions
6565
66+ def _get_static_library_for_linking (library_to_link ):
67+ if library_to_link .static_library :
68+ return library_to_link .static_library
69+ elif library_to_link .pic_static_library :
70+ return library_to_link .pic_static_library
71+ else :
72+ return None
73+
6674def _get_library_for_linking (library_to_link ):
6775 if library_to_link .static_library :
6876 return library_to_link .static_library
@@ -73,6 +81,53 @@ def _get_library_for_linking(library_to_link):
7381 else :
7482 return library_to_link .dynamic_library
7583
84+ def _build_avoid_library_set (avoid_dep_linking_contexts ):
85+ avoid_library_set = dict ()
86+ for linking_context in avoid_dep_linking_contexts :
87+ for linker_input in linking_context .linker_inputs .to_list ():
88+ for library_to_link in linker_input .libraries :
89+ library_artifact = _get_static_library_for_linking (library_to_link )
90+ if library_artifact :
91+ avoid_library_set [library_artifact .short_path ] = True
92+ return avoid_library_set
93+
94+ def _subtract_linking_contexts (owner , linking_contexts , avoid_dep_linking_contexts ):
95+ """Subtracts the libraries in avoid_dep_linking_contexts from linking_contexts.
96+
97+ Args:
98+ owner: The label of the target currently being analyzed.
99+ linking_contexts: An iterable of CcLinkingContext objects.
100+ avoid_dep_linking_contexts: An iterable of CcLinkingContext objects.
101+
102+ Returns:
103+ A CcLinkingContext object.
104+ """
105+ libraries = []
106+ user_link_flags = []
107+ additional_inputs = []
108+ linkstamps = []
109+ avoid_library_set = _build_avoid_library_set (avoid_dep_linking_contexts )
110+ for linking_context in linking_contexts :
111+ for linker_input in linking_context .linker_inputs .to_list ():
112+ for library_to_link in linker_input .libraries :
113+ library_artifact = _get_library_for_linking (library_to_link )
114+ if library_artifact .short_path not in avoid_library_set :
115+ libraries .append (library_to_link )
116+ user_link_flags .extend (linker_input .user_link_flags )
117+ additional_inputs .extend (linker_input .additional_inputs )
118+ linkstamps .extend (linker_input .linkstamps )
119+ linker_input = cc_common .create_linker_input (
120+ owner = owner ,
121+ libraries = depset (libraries , order = "topological" ),
122+ user_link_flags = user_link_flags ,
123+ additional_inputs = depset (additional_inputs ),
124+ linkstamps = depset (linkstamps ),
125+ )
126+ return cc_common .create_linking_context (
127+ linker_inputs = depset ([linker_input ]),
128+ owner = owner ,
129+ )
130+
76131def _libraries_from_linking_context (linking_context ):
77132 libraries = []
78133 for linker_input in linking_context .linker_inputs .to_list ():
@@ -316,4 +371,5 @@ compilation_support = struct(
316371 # TODO(b/331163513): Move apple_common.compliation_support.build_common_variables here, too.
317372 register_fully_link_action = _register_fully_link_action ,
318373 register_configuration_specific_link_actions = _register_configuration_specific_link_actions ,
374+ subtract_linking_contexts = _subtract_linking_contexts ,
319375)
0 commit comments