Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] Remove legacy objc_linker to support with rules_apple > 3.15.0 #933

Closed
wants to merge 1 commit into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion docs/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -14,7 +14,6 @@ _DOC_SRCS = [
"import_middleman",
"library",
"plists",
"force_load_direct_deps",
"precompiled_apple_resource_bundle",
"providers",
"substitute_build_settings",
48 changes: 0 additions & 48 deletions docs/force_load_direct_deps_doc.md

This file was deleted.

15 changes: 0 additions & 15 deletions rules/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -46,17 +46,6 @@ bzl_library(
visibility = ["//visibility:public"],
)

bzl_library(
name = "force_load_direct_deps",
srcs = ["force_load_direct_deps.bzl"],
visibility = ["//visibility:public"],
deps = [
":providers",
":transition_support",
"@bazel_skylib//lib:dicts",
],
)

bzl_library(
name = "xcconfig.doc",
srcs = ["xcconfig.doc.bzl"],
@@ -139,7 +128,6 @@ bzl_library(
visibility = ["//visibility:public"],
deps = [
":features",
":force_load_direct_deps",
":library",
":plists",
":providers",
@@ -159,7 +147,6 @@ bzl_library(
srcs = ["app_clip.bzl"],
visibility = ["//visibility:public"],
deps = [
":force_load_direct_deps",
":plists",
"//rules/internal:framework_middleman",
"@build_bazel_rules_apple//apple:ios",
@@ -171,7 +158,6 @@ bzl_library(
srcs = ["app.bzl"],
visibility = ["//visibility:public"],
deps = [
":force_load_direct_deps",
":library",
":plists",
"//rules/internal:framework_middleman",
@@ -184,7 +170,6 @@ bzl_library(
srcs = ["extension.bzl"],
visibility = ["//visibility:public"],
deps = [
":force_load_direct_deps",
":plists",
":transition_support",
"//rules/internal:framework_middleman",
12 changes: 0 additions & 12 deletions rules/app.bzl
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
load("@build_bazel_rules_apple//apple:ios.bzl", rules_apple_ios_application = "ios_application")
load("//rules:library.bzl", "apple_library")
load("//rules:plists.bzl", "process_infoplists")
load("//rules:force_load_direct_deps.bzl", "force_load_direct_deps")
load("//rules/internal:framework_middleman.bzl", "dep_middleman", "framework_middleman")

# We need to try and partition out arguments for obj_library / swift_library
@@ -93,17 +92,6 @@ def ios_application(

application_kwargs["launch_storyboard"] = application_kwargs.pop("launch_storyboard", library.launch_screen_storyboard_name)

# Setup force loading here - need to process deps and libs
force_load_name = name + ".force_load_direct_deps"
force_load_direct_deps(
name = force_load_name,
deps = kwargs.get("deps", []) + library.lib_names,
tags = ["manual"],
testonly = testonly,
platform_type = "ios",
minimum_os_version = application_kwargs.get("minimum_os_version"),
)

# Setup framework middlemen - need to process deps and libs
fw_name = name + ".framework_middleman"
framework_middleman(
10 changes: 0 additions & 10 deletions rules/app_clip.bzl
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
load("@build_bazel_rules_apple//apple:ios.bzl", rules_apple_ios_app_clip = "ios_app_clip")
load("//rules:plists.bzl", "process_infoplists")
load("//rules:force_load_direct_deps.bzl", "force_load_direct_deps")
load("//rules/internal:framework_middleman.bzl", "dep_middleman", "framework_middleman")

def ios_app_clip(
@@ -43,15 +42,6 @@ def ios_app_clip(
frameworks = kwargs.pop("frameworks", [])
testonly = kwargs.pop("testonly", False)

# Setup force loading here - need to process deps and libs
force_load_name = name + ".force_load_direct_deps"
force_load_direct_deps(
name = force_load_name,
deps = deps,
tags = ["manual"],
testonly = testonly,
)

# Setup framework middlemen - need to process deps and libs
fw_name = name + ".framework_middleman"
framework_middleman(
10 changes: 0 additions & 10 deletions rules/extension.bzl
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
load("@build_bazel_rules_apple//apple:ios.bzl", rules_apple_ios_extension = "ios_extension")
load("//rules:plists.bzl", "process_infoplists")
load("//rules:force_load_direct_deps.bzl", "force_load_direct_deps")
load("//rules/internal:framework_middleman.bzl", "dep_middleman", "framework_middleman")

def ios_extension(
@@ -45,15 +44,6 @@ def ios_extension(
frameworks = kwargs.pop("frameworks", [])
testonly = kwargs.pop("testonly", False)

# Setup force loading here - need to process deps and libs
force_load_name = name + ".force_load_direct_deps"
force_load_direct_deps(
name = force_load_name,
deps = deps,
tags = ["manual"],
testonly = testonly,
)

# Setup framework middlemen - need to process deps and libs
fw_name = name + ".framework_middleman"
framework_middleman(
141 changes: 1 addition & 140 deletions rules/force_load_direct_deps.bzl
Original file line number Diff line number Diff line change
@@ -34,143 +34,4 @@ def _cc_info_static_libraries(dep):
continue
static_cc_libraries.append(library_to_link.static_library)

return static_cc_libraries

# TODO: We should deprecate this rule for Bazel 7+ as `--incompatible_objc_alwayslink_by_default` effectively
# does the same thing.
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.
"""

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

force_load_libraries = []
force_load_cc_libraries = []
avoid_deps = []
avoid_libraries = {}
avoid_cc_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)

# Collect the libraries that should be avoided.
for dep in avoid_deps:
for lib in _objc_provider_static_libraries(dep):
avoid_libraries[lib] = True
for lib in _cc_info_static_libraries(dep):
avoid_cc_libraries[lib] = True

# Collect the libraries that should be force loaded.
for dep in ctx.attr.deps:
for lib in _objc_provider_static_libraries(dep):
if not lib in avoid_libraries:
force_load_libraries.append(lib)
for lib in _cc_info_static_libraries(dep):
if not lib in avoid_cc_libraries:
force_load_cc_libraries.append(lib)

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_cc_libraries
]),
),
]),
),
),
]

force_load_direct_deps = rule(
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,
mandatory = True,
doc =
"Deps",
),
"should_force_load": attr.bool(
default = True,
doc = "Allows parametrically enabling the functionality in this rule.",
),
"platform_type": attr.string(
mandatory = False,
doc =
"""Internal - currently rules_ios uses the dict `platforms`
""",
),
"minimum_os_version": attr.string(
mandatory = False,
doc =
"""Internal - currently rules_ios the dict `platforms`
""",
),
"_allowlist_function_transition": attr.label(
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`

ld has different behavior when loading members of a static library VS objects
as far as visibility. Under `-dynamic`
- linked _swift object files_ can have public visibility
- symbols from _swift static libraries_ are omitted unless used, and not
visible otherwise

By using `-force_load`, we can load static libraries in the attributes of an
application's direct depenencies. These args need go at the _front_ of the
linker invocation otherwise these arguments don't work with lds logic.

Why not put it into `rules_apple`? Ideally it could be, and perhaps consider a
PR to there .The underlying java rule, `AppleBinary.linkMultiArchBinary`
places `extraLinkopts` at the end of the linker invocation. At the time of
writing these args need to go into the current rule context where
`AppleBinary.linkMultiArchBinary` is called.

One use case of this is that iOS developers want to load above mentioned
symbols from applications. Another alternate could be to create an aspect,
that actually generates a different application and linker invocation instead
of force loading symbols. This could be more complicated from an integration
perspective so it isn't used.

""",
)
return static_cc_libraries
17 changes: 0 additions & 17 deletions rules/framework.bzl
Original file line number Diff line number Diff line change
@@ -30,7 +30,6 @@ load(
"@build_bazel_rules_apple//apple/internal/aspects:resource_aspect.bzl",
"apple_resource_aspect",
)
load("//rules:force_load_direct_deps.bzl", "force_load_direct_deps")

_APPLE_FRAMEWORK_PACKAGING_KWARGS = [
"visibility",
@@ -125,21 +124,6 @@ def apple_framework(
"//conditions:default": "",
})

# Setup force loading here - only for direct deps / direct libs and when `link_dynamic` is set.
should_force_load = framework_packaging_kwargs.get("link_dynamic", False)
if should_force_load:
force_load_name = name + ".force_load_direct_deps"
force_load_direct_deps(
name = force_load_name,
deps = kwargs.get("deps", []) + library.lib_names,
should_force_load = should_force_load,
testonly = testonly,
tags = ["manual"],
minimum_os_version = minimum_os_version,
platform_type = platform_type,
)
framework_deps.append(force_load_name)

framework_deps += library.lib_names
apple_framework_packaging(
name = name,
@@ -894,7 +878,6 @@ def _bundle_dynamic_framework(ctx, is_extension_safe, avoid_deps):
cc_features = cc_features,
cc_info = link_result.cc_info,
cc_toolchain = cc_toolchain,
objc_provider = link_result.objc,
rule_label = label,
),
)