Skip to content

Commit

Permalink
Update rules for ObjcProvider deprecation
Browse files Browse the repository at this point in the history
  • Loading branch information
luispadron committed Mar 12, 2024
1 parent 044972f commit 89d3b46
Show file tree
Hide file tree
Showing 19 changed files with 903 additions and 837 deletions.
10 changes: 8 additions & 2 deletions rules/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ bzl_library(
visibility = ["//visibility:public"],
deps = [
":transition_support",
":utils.bzl",
":utils",
"@bazel_skylib//lib:partial",
"@bazel_skylib//lib:paths",
"@build_bazel_apple_support//lib:apple_support",
Expand All @@ -117,7 +117,7 @@ bzl_library(
":hmap",
":import_middleman",
":precompiled_apple_resource_bundle",
":utils.bzl",
":utils",
"//rules/framework:vfs_overlay",
"//rules/library:resources",
"//rules/library:xcconfig",
Expand Down Expand Up @@ -203,3 +203,9 @@ bzl_library(
"@build_bazel_rules_apple//apple:ios",
],
)

bzl_library(
name = "utils",
srcs = ["utils.bzl"],
visibility = ["//visibility:public"],
)
83 changes: 71 additions & 12 deletions rules/force_load_direct_deps.bzl
Original file line number Diff line number Diff line change
@@ -1,36 +1,87 @@
load("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain", "use_cpp_toolchain")
load("//rules:providers.bzl", "AvoidDepsInfo")
load("//rules:transition_support.bzl", "transition_support")

def _impl(ctx):
if not ctx.attr.should_force_load:
return apple_common.new_objc_provider()
def _force_load_direct_deps_impl(ctx):
"""This rule will traverse the direct deps of the target and force load the static libraries of the objc deps.
"""

force_load = []
if not ctx.attr.should_force_load:
return [
apple_common.new_objc_provider(),
CcInfo(),
]

force_load_libraries = []
avoid_deps = []
avoid_libraries = {}
cc_toolchain = find_cpp_toolchain(ctx)
cc_features = cc_common.configure_features(
ctx = ctx,
cc_toolchain = cc_toolchain,
language = "objc",
)

# Set the deps that should be avoided and not linked.
for dep in ctx.attr.deps:
if AvoidDepsInfo in dep:
avoid_deps.extend(dep[AvoidDepsInfo].libraries)

avoid_libraries = {}
# Collect the libraries that should be avoided.
for dep in avoid_deps:
if apple_common.Objc in dep:
for lib in dep[apple_common.Objc].library.to_list():
avoid_libraries[lib] = True
if CcInfo in dep:
for link_input in dep[CcInfo].linking_context.linker_inputs.to_list():
for library_to_link in link_input.libraries:
static_library = library_to_link.static_library
if static_library:
avoid_libraries[static_library] = True

force_load = []
# Collect the libraries that should be force loaded.
for dep in ctx.attr.deps:
if apple_common.Objc in dep:
for lib in dep[apple_common.Objc].library.to_list():
if not lib in avoid_libraries:
force_load.append(lib)
return apple_common.new_objc_provider(
force_load_library = depset(force_load),
link_inputs = depset(force_load),
)
force_load_libraries.append(lib)
if CcInfo in dep:
for link_input in dep[CcInfo].linking_context.linker_inputs.to_list():
for library_to_link in link_input.libraries:
static_library = library_to_link.static_library
if static_library and not static_library in avoid_libraries:
force_load_libraries.append(static_library)

return [
apple_common.new_objc_provider(
force_load_library = depset(force_load_libraries),
link_inputs = depset(force_load_libraries),
),
CcInfo(
linking_context = cc_common.create_linking_context(
linker_inputs = depset([
cc_common.create_linker_input(
owner = ctx.label,
libraries = depset([
cc_common.create_library_to_link(
actions = ctx.actions,
cc_toolchain = cc_toolchain,
feature_configuration = cc_features,
static_library = library,
alwayslink = True,
)
for library in force_load_libraries
]),
),
]),
),
),
]

force_load_direct_deps = rule(
implementation = _impl,
implementation = _force_load_direct_deps_impl,
toolchains = use_cpp_toolchain(),
fragments = ["apple", "cpp", "objc"],
attrs = {
"deps": attr.label_list(
cfg = transition_support.apple_platform_split_transition,
Expand Down Expand Up @@ -58,6 +109,14 @@ force_load_direct_deps = rule(
default = "@bazel_tools//tools/allowlists/function_transition_allowlist",
doc = "Needed to allow this rule to have an incoming edge configuration transition.",
),
"_cc_toolchain": attr.label(
providers = [cc_common.CcToolchainInfo],
default = Label("@bazel_tools//tools/cpp:current_cc_toolchain"),
doc = """\
The C++ toolchain from which linking flags and other tools needed by the Swift
toolchain (such as `clang`) will be retrieved.
""",
),
},
doc = """
A rule to link with `-force_load` for direct`deps`
Expand Down
30 changes: 15 additions & 15 deletions rules/framework.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -984,6 +984,7 @@ def _apple_framework_packaging_impl(ctx):

split_slice_key = "{}_{}{}".format(platform, split_slice_varint, arch)
deps = _attrs_for_split_slice(ctx.split_attr.deps, split_slice_key)
dep_cc_infos = [dep[CcInfo] for dep in deps if CcInfo in dep]
transitive_deps = _attrs_for_split_slice(ctx.split_attr.transitive_deps, split_slice_key)
vfs = _attrs_for_split_slice(ctx.split_attr.vfs, split_slice_key)

Expand All @@ -1002,15 +1003,15 @@ def _apple_framework_packaging_impl(ctx):
))
objc_provider_utils.add_to_dict_if_present(compilation_context_fields, "defines", depset(
direct = [],
transitive = [getattr(dep[CcInfo].compilation_context, "defines") for dep in deps if CcInfo in dep],
transitive = [getattr(cc_info.compilation_context, "defines") for cc_info in dep_cc_infos],
))
objc_provider_utils.add_to_dict_if_present(compilation_context_fields, "includes", depset(
direct = [],
transitive = [getattr(dep[CcInfo].compilation_context, "includes") for dep in deps if CcInfo in dep],
transitive = [getattr(cc_info.compilation_context, "includes") for cc_info in dep_cc_infos],
))
objc_provider_utils.add_to_dict_if_present(compilation_context_fields, "framework_includes", depset(
direct = [],
transitive = [getattr(dep[CcInfo].compilation_context, "framework_includes") for dep in deps if CcInfo in dep],
transitive = [getattr(cc_info.compilation_context, "framework_includes") for cc_info in dep_cc_infos],
))

# Compute cc_info and swift_info
Expand All @@ -1029,18 +1030,6 @@ def _apple_framework_packaging_impl(ctx):
# If not virtualizing the framework - then it runs a "clean"
_get_symlinked_framework_clean_action(ctx, framework_files, compilation_context_fields)

cc_info_provider = CcInfo(
compilation_context = cc_common.create_compilation_context(
**compilation_context_fields
),
)

if virtualize_frameworks:
cc_info = cc_common.merge_cc_infos(direct_cc_infos = [cc_info_provider])
else:
dep_cc_infos = [dep[CcInfo] for dep in transitive_deps if CcInfo in dep]
cc_info = cc_common.merge_cc_infos(direct_cc_infos = [cc_info_provider], cc_infos = dep_cc_infos)

# Propagate the avoid deps information upwards
avoid_deps = []
for dep in ctx.attr.transitive_deps:
Expand All @@ -1056,7 +1045,17 @@ def _apple_framework_packaging_impl(ctx):
else:
bundle_outs = _bundle_static_framework(ctx, is_extension_safe = is_extension_safe, current_apple_platform = current_apple_platform, outputs = outputs)
avoid_deps_info = AvoidDepsInfo(libraries = depset(avoid_deps).to_list(), link_dynamic = False)

# Create the `CcInfo` provider which contains the compilation and linking information for the framework.
cc_info_provider = CcInfo(
compilation_context = cc_common.create_compilation_context(
**compilation_context_fields
),
)

swift_info = _get_merged_swift_info(ctx, framework_files, transitive_deps)
transitive_dep_cc_infos = [] if virtualize_frameworks else [dep[CcInfo] for dep in transitive_deps if CcInfo in dep]
cc_info = cc_common.merge_cc_infos(direct_cc_infos = [cc_info_provider], cc_infos = transitive_dep_cc_infos)

# Build out the default info provider
out_files = _compact([outputs.binary, outputs.swiftmodule, outputs.infoplist])
Expand All @@ -1070,6 +1069,7 @@ def _apple_framework_packaging_impl(ctx):
providers = [dep[apple_common.Objc] for dep in deps],
transitive = [dep[apple_common.Objc] for dep in transitive_deps],
)

return [
avoid_deps_info,
framework_info,
Expand Down
7 changes: 3 additions & 4 deletions rules/import_middleman.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -260,15 +260,14 @@ def _file_collector_rule_impl(ctx):
**objc_provider_fields
)

additional_providers = []
dep_cc_infos = [dep[CcInfo] for dep in ctx.attr.deps if CcInfo in dep]
cc_info = cc_common.merge_cc_infos(direct_cc_infos = [], cc_infos = dep_cc_infos)
additional_providers.append(cc_info)
cc_info = cc_common.merge_cc_infos(cc_infos = dep_cc_infos)

return [
DefaultInfo(files = depset(dynamic_framework_dirs + replaced_frameworks)),
objc,
] + _make_imports(dynamic_framework_dirs) + additional_providers
cc_info,
] + _make_imports(dynamic_framework_dirs)

import_middleman = rule(
implementation = _file_collector_rule_impl,
Expand Down
5 changes: 3 additions & 2 deletions rules/internal/framework_middleman.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,8 @@ def _framework_middleman(ctx):
transitive = [dynamic_framework_provider.framework_files, objc_provider_fields.get("dynamic_framework_file", depset([]))],
)
objc_provider = apple_common.new_objc_provider(**objc_provider_fields)
cc_info_provider = cc_common.merge_cc_infos(direct_cc_infos = [], cc_infos = cc_providers)
cc_info_provider = cc_common.merge_cc_infos(cc_infos = cc_providers)

providers = [
dynamic_framework_provider,
cc_info_provider,
Expand Down Expand Up @@ -249,7 +250,7 @@ def _dep_middleman(ctx):
)

objc_provider = apple_common.new_objc_provider(**objc_provider_fields)
cc_info_provider = cc_common.merge_cc_infos(direct_cc_infos = [], cc_infos = cc_providers)
cc_info_provider = cc_common.merge_cc_infos(cc_infos = cc_providers)
providers = [
cc_info_provider,
objc_provider,
Expand Down
1 change: 1 addition & 0 deletions rules/internal/objc_provider_utils.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ def _merge_dynamic_framework_providers(dynamic_framework_providers):
_add_to_dict_if_present(fields, key, set)

fields["objc"] = apple_common.new_objc_provider()
fields["cc_info"] = CcInfo()

return apple_common.new_dynamic_framework_provider(**fields)

Expand Down
Loading

0 comments on commit 89d3b46

Please sign in to comment.