1414
1515"""Utility methods used for creating objc_* rules actions"""
1616
17+ load ("@bazel_features//:features.bzl" , "bazel_features" )
1718load (
1819 "@bazel_skylib//lib:paths.bzl" ,
1920 "paths" ,
@@ -39,24 +40,10 @@ visibility([
3940 "//apple/..." ,
4041])
4142
42- def _build_feature_configuration (common_variables ):
43- ctx = common_variables .ctx
44-
45- enabled_features = []
46- enabled_features .extend (ctx .features )
47- enabled_features .extend (common_variables .extra_enabled_features )
48-
49- disabled_features = []
50- disabled_features .extend (ctx .disabled_features )
51- disabled_features .extend (common_variables .extra_disabled_features )
52- disabled_features .append ("parse_headers" )
53-
54- return cc_common .configure_features (
55- ctx = common_variables .ctx ,
56- cc_toolchain = common_variables .toolchain ,
43+ def _build_feature_configuration (* , cc_configured_features , cc_toolchain ):
44+ return cc_configured_features .configure_features (
45+ cc_toolchain = cc_toolchain ,
5746 language = "objc" ,
58- requested_features = enabled_features ,
59- unsupported_features = disabled_features ,
6047 )
6148
6249def _build_fully_linked_variable_extensions (* , archive , libs ):
@@ -85,6 +72,52 @@ def _get_library_for_linking(library_to_link):
8572 else :
8673 return library_to_link .dynamic_library
8774
75+ def _build_avoid_library_set (avoid_dep_linking_contexts ):
76+ avoid_library_set = dict ()
77+ for linking_context in avoid_dep_linking_contexts :
78+ for linker_input in linking_context .linker_inputs .to_list ():
79+ for library_to_link in linker_input .libraries :
80+ library_artifact = _get_static_library_for_linking (library_to_link )
81+ if library_artifact :
82+ avoid_library_set [library_artifact .short_path ] = True
83+ return avoid_library_set
84+
85+ def _subtract_linking_contexts (owner , linking_contexts , avoid_dep_linking_contexts ):
86+ """Subtracts the libraries in avoid_dep_linking_contexts from linking_contexts.
87+
88+ Args:
89+ owner: The label of the target currently being analyzed.
90+ linking_contexts: An iterable of CcLinkingContext objects.
91+ avoid_dep_linking_contexts: An iterable of CcLinkingContext objects.
92+
93+ Returns:
94+ A CcLinkingContext object.
95+ """
96+ libraries = []
97+ user_link_flags = []
98+ additional_inputs = []
99+ linkstamps = []
100+ avoid_library_set = _build_avoid_library_set (avoid_dep_linking_contexts )
101+ for linking_context in linking_contexts :
102+ for linker_input in linking_context .linker_inputs .to_list ():
103+ for library_to_link in linker_input .libraries :
104+ library_artifact = _get_library_for_linking (library_to_link )
105+ if library_artifact .short_path not in avoid_library_set :
106+ libraries .append (library_to_link )
107+ user_link_flags .extend (linker_input .user_link_flags )
108+ additional_inputs .extend (linker_input .additional_inputs )
109+ linkstamps .extend (linker_input .linkstamps )
110+ linker_input = cc_common .create_linker_input (
111+ owner = owner ,
112+ libraries = depset (libraries , order = "topological" ),
113+ user_link_flags = user_link_flags ,
114+ additional_inputs = depset (additional_inputs ),
115+ linkstamps = depset (linkstamps ),
116+ )
117+ return cc_common .create_linking_context (
118+ linker_inputs = depset ([linker_input ]),
119+ )
120+
88121def _libraries_from_linking_context (linking_context ):
89122 libraries = []
90123 for linker_input in linking_context .linker_inputs .to_list ():
@@ -97,13 +130,21 @@ def _get_libraries_for_linking(libraries_to_link):
97130 libraries .append (_get_library_for_linking (library_to_link ))
98131 return libraries
99132
100- def _register_fully_link_action (* , cc_linking_context , common_variables , name ):
101- ctx = common_variables .ctx
102- feature_configuration = _build_feature_configuration (common_variables )
133+ def _register_fully_link_action (
134+ * ,
135+ cc_configured_features ,
136+ cc_linking_context ,
137+ common_variables ,
138+ name ):
139+ feature_configuration = _build_feature_configuration (
140+ cc_configured_features = cc_configured_features ,
141+ cc_toolchain = common_variables .toolchain ,
142+ )
103143
104144 libraries_to_link = _libraries_from_linking_context (cc_linking_context ).to_list ()
105145 libraries = _get_libraries_for_linking (libraries_to_link )
106146
147+ ctx = common_variables .ctx
107148 output_archive = ctx .actions .declare_file (name + ".a" )
108149 extensions = _build_fully_linked_variable_extensions (
109150 archive = output_archive ,
@@ -149,6 +190,8 @@ def _register_binary_strip_action(
149190 ctx ,
150191 apple_platform_info ,
151192 binary ,
193+ bundle_name ,
194+ cc_toolchain ,
152195 extra_link_args ,
153196 feature_configuration ,
154197 name ):
@@ -173,7 +216,8 @@ def _register_binary_strip_action(
173216
174217 stripped_binary = outputs .main_binary (
175218 actions = ctx .actions ,
176- apple_platform_info = apple_platform_info ,
219+ bundle_name = bundle_name ,
220+ cc_toolchain = cc_toolchain ,
177221 cpp_fragment = ctx .fragments .cpp ,
178222 label = ctx .label ,
179223 unstripped = False ,
@@ -255,7 +299,9 @@ def _register_configuration_specific_link_actions(
255299 additional_outputs ,
256300 apple_platform_info ,
257301 attr_linkopts ,
302+ bundle_name ,
258303 common_variables ,
304+ cc_configured_features ,
259305 cc_linking_context ,
260306 extra_link_args ,
261307 extra_link_inputs ,
@@ -272,8 +318,12 @@ def _register_configuration_specific_link_actions(
272318 Returns:
273319 (File) the linked binary
274320 """
321+ feature_configuration = _build_feature_configuration (
322+ cc_configured_features = cc_configured_features ,
323+ cc_toolchain = common_variables .toolchain ,
324+ )
325+
275326 ctx = common_variables .ctx
276- feature_configuration = _build_feature_configuration (common_variables )
277327
278328 # TODO: Remove when we drop Bazel 8
279329 if bazel_features .cc .objc_fragment_has_builtin_objc_strip_action :
@@ -283,7 +333,8 @@ def _register_configuration_specific_link_actions(
283333
284334 binary = outputs .main_binary (
285335 actions = ctx .actions ,
286- apple_platform_info = apple_platform_info ,
336+ bundle_name = bundle_name ,
337+ cc_toolchain = common_variables .toolchain ,
287338 cpp_fragment = ctx .fragments .cpp ,
288339 label = ctx .label ,
289340 unstripped = unstripped ,
@@ -299,6 +350,7 @@ def _register_configuration_specific_link_actions(
299350 apple_platform_info = apple_platform_info ,
300351 attr_linkopts = attr_linkopts ,
301352 binary = binary ,
353+ bundle_name = bundle_name ,
302354 cc_linking_context = cc_linking_context ,
303355 common_variables = common_variables ,
304356 extra_link_args = extra_link_args ,
@@ -331,6 +383,7 @@ def _register_configuration_specific_link_actions_with_cpp_variables(
331383 apple_platform_info ,
332384 attr_linkopts ,
333385 binary ,
386+ bundle_name ,
334387 cc_linking_context ,
335388 common_variables ,
336389 extra_link_args ,
@@ -387,6 +440,8 @@ def _register_configuration_specific_link_actions_with_cpp_variables(
387440 ctx = ctx ,
388441 apple_platform_info = apple_platform_info ,
389442 binary = binary ,
443+ bundle_name = bundle_name ,
444+ cc_toolchain = common_variables .toolchain ,
390445 extra_link_args = extra_link_args ,
391446 feature_configuration = feature_configuration ,
392447 name = name ,
@@ -448,14 +503,9 @@ def _create_deduped_linkopts_linking_context(*, cc_linking_context, owner, seen_
448503 libraries = depset (linker_input .libraries ),
449504 owner = linker_input .owner ,
450505 user_link_flags = new_flags ,
506+ linkstamps = depset (linker_input .linkstamps ),
451507 ))
452508
453- # Why does linker_input not expose linkstamp? This needs to be fixed.
454- linker_inputs .append (cc_common .create_linker_input (
455- linkstamps = cc_linking_context .linkstamps (),
456- owner = owner ,
457- ))
458-
459509 return cc_common .create_linking_context (linker_inputs = depset (linker_inputs ))
460510
461511# TODO: Delete when we drop Bazel 8 support (see f4a3fa40)
@@ -565,9 +615,9 @@ def _register_configuration_specific_link_actions_with_objc_variables(
565615 return binary
566616
567617compilation_support = struct (
568- # TODO(b/331163513): Move apple_common.compliation_support.build_common_variables here, too.
569618 get_library_for_linking = _get_library_for_linking ,
570619 get_static_library_for_linking = _get_static_library_for_linking ,
571620 register_fully_link_action = _register_fully_link_action ,
572621 register_configuration_specific_link_actions = _register_configuration_specific_link_actions ,
622+ subtract_linking_contexts = _subtract_linking_contexts ,
573623)
0 commit comments