Skip to content

Commit

Permalink
Add force load libs to CcInfo linking context in Bazel 7 (#2)
Browse files Browse the repository at this point in the history
Rebased and fixed merge commit for bazel-ios#811
  • Loading branch information
vakhidbetrakhmadov authored Apr 1, 2024
1 parent 6d6e051 commit fb395f9
Show file tree
Hide file tree
Showing 5 changed files with 135 additions and 25 deletions.
1 change: 1 addition & 0 deletions rules/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ bzl_library(
":providers",
":transition_support",
"@bazel_skylib//lib:dicts",
"@bazel_skylib//rules:common_settings",
],
)

Expand Down
78 changes: 61 additions & 17 deletions rules/force_load_direct_deps.bzl
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
load("//rules:providers.bzl", "AvoidDepsInfo")
load("//rules:transition_support.bzl", "transition_support")

def _impl(ctx):
def _force_load_direct_deps_impl(ctx):
if not ctx.attr.should_force_load:
return apple_common.new_objc_provider()
return [apple_common.new_objc_provider(), CcInfo()]

force_load = []

Expand All @@ -13,24 +13,68 @@ def _impl(ctx):
avoid_deps.extend(dep[AvoidDepsInfo].libraries)

avoid_libraries = {}
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

force_load = []
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),
)
_is_bazel_7 = not hasattr(apple_common, "apple_crosstool_transition")
if _is_bazel_7:
for dep in avoid_deps:
if CcInfo in dep:
for linker_input in dep[CcInfo].linking_context.linker_inputs.to_list():
for lib in linker_input.libraries:
avoid_libraries[lib] = True

force_load = []
for dep in ctx.attr.deps:
if CcInfo in dep:
for linker_input in dep[CcInfo].linking_context.linker_inputs.to_list():
for lib in linker_input.libraries:
if not lib in avoid_libraries:
force_load.append(lib)

static_libraries = [lib.static_library for lib in force_load if lib.static_library != None]
return [
apple_common.new_objc_provider(
force_load_library = depset(static_libraries),
link_inputs = depset(static_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,
static_library = lib,
alwayslink = True,
)
for lib in static_libraries
]),
additional_inputs = depset(static_libraries),
),
]),
),
),
]
else:
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
force_load = []

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_direct_deps = rule(
implementation = _impl,
implementation = _force_load_direct_deps_impl,
attrs = {
"deps": attr.label_list(
cfg = transition_support.apple_platform_split_transition,
Expand Down
22 changes: 17 additions & 5 deletions rules/framework.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -1029,11 +1029,23 @@ 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
),
)
_is_bazel_7 = not hasattr(apple_common, "apple_crosstool_transition")
if _is_bazel_7:
cc_info_provider = CcInfo(
compilation_context = cc_common.create_compilation_context(
**compilation_context_fields
),
linking_context = cc_common.merge_cc_infos(
direct_cc_infos = [],
cc_infos = [dep[CcInfo] for dep in deps],
).linking_context,
)
else:
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])
Expand Down
52 changes: 50 additions & 2 deletions rules/internal/framework_middleman.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ load(
"new_applebundleinfo",
"new_iosframeworkbundleinfo",
)
load("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain")
load("@bazel_skylib//lib:dicts.bzl", "dicts")
load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo")
load(
"@build_bazel_rules_apple//apple/internal:partials.bzl",
"partials",
Expand All @@ -31,7 +34,10 @@ load(
"//rules/internal:objc_provider_utils.bzl",
"objc_provider_utils",
)
load("//rules:transition_support.bzl", "transition_support")
load(
"//rules:transition_support.bzl",
"transition_support",
)

def _framework_middleman(ctx):
resource_providers = []
Expand Down Expand Up @@ -73,12 +79,48 @@ def _framework_middleman(ctx):
])

# Add the frameworks to the linker command
dynamic_framework_provider = objc_provider_utils.merge_dynamic_framework_providers(dynamic_framework_providers)
_is_bazel_7 = not hasattr(apple_common, "apple_crosstool_transition")
dynamic_framework_provider = objc_provider_utils.merge_dynamic_framework_providers(
dynamic_framework_providers,
supports_cc_info_in_dynamic_framework_provider = _is_bazel_7,
)
objc_provider_fields["dynamic_framework_file"] = depset(
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)
if _is_bazel_7:
cc_toolchain = find_cpp_toolchain(ctx)
cc_features = cc_common.configure_features(
ctx = ctx,
cc_toolchain = cc_toolchain,
language = "objc",
requested_features = ctx.features,
unsupported_features = ctx.disabled_features,
)
dynamic_framework_libraries_to_link = [
cc_common.create_library_to_link(
actions = ctx.actions,
feature_configuration = cc_features,
cc_toolchain = cc_toolchain,
dynamic_library = dynamic_library,
)
for dynamic_library in objc_provider_fields["dynamic_framework_file"].to_list()
]
cc_info_provider = cc_common.merge_cc_infos(
direct_cc_infos = [
CcInfo(
linking_context = cc_common.create_linking_context(
linker_inputs = depset([cc_common.create_linker_input(
owner = ctx.label,
libraries = depset(dynamic_framework_libraries_to_link),
)]),
),
),
] + cc_providers,
)

providers = [
dynamic_framework_provider,
cc_info_provider,
Expand Down Expand Up @@ -120,6 +162,8 @@ def _framework_middleman(ctx):

framework_middleman = rule(
implementation = _framework_middleman,
fragments = ["cpp"],
toolchains = ["@bazel_tools//tools/cpp:toolchain_type"],
attrs = {
"framework_deps": attr.label_list(
cfg = transition_support.apple_platform_split_transition,
Expand Down Expand Up @@ -191,9 +235,13 @@ def _dep_middleman(ctx):
cc_providers = []
avoid_libraries = {}

_is_bazel_7 = not hasattr(apple_common, "apple_crosstool_transition")

def _collect_providers(lib_dep):
if apple_common.Objc in lib_dep:
objc_providers.append(lib_dep[apple_common.Objc])
if _is_bazel_7 and CcInfo in lib_dep:
cc_providers.append(lib_dep[CcInfo])

def _process_avoid_deps(avoid_dep_libs):
for dep in avoid_dep_libs:
Expand Down
7 changes: 6 additions & 1 deletion rules/internal/objc_provider_utils.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ def _merge_objc_providers(providers, transitive = []):
)
return apple_common.new_objc_provider(**objc_provider_fields)

def _merge_dynamic_framework_providers(dynamic_framework_providers):
def _merge_dynamic_framework_providers(dynamic_framework_providers, supports_cc_info_in_dynamic_framework_provider):
fields = {}
merge_keys = [
"framework_dirs",
Expand All @@ -53,6 +53,11 @@ def _merge_dynamic_framework_providers(dynamic_framework_providers):

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

if not supports_cc_info_in_dynamic_framework_provider:
fields.pop("cc_info", None)
elif "cc_info" not in fields:
fields["cc_info"] = CcInfo()

return apple_common.new_dynamic_framework_provider(**fields)

objc_provider_utils = struct(
Expand Down

0 comments on commit fb395f9

Please sign in to comment.