Skip to content
Merged
Show file tree
Hide file tree
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
3 changes: 2 additions & 1 deletion swift/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -161,10 +161,11 @@ bzl_library(
srcs = ["swift_import.bzl"],
deps = [
":providers",
":swift_clang_module_aspect",
"//swift/internal:attrs",
"//swift/internal:compiling",
"//swift/internal:features",
"//swift/internal:linking",
"//swift/internal:providers",
"//swift/internal:toolchain_utils",
"//swift/internal:utils",
"@bazel_skylib//lib:dicts",
Expand Down
1 change: 1 addition & 0 deletions swift/internal/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,7 @@ bzl_library(
":developer_dirs",
":feature_names",
":features",
":utils",
"//swift:providers",
],
)
Expand Down
31 changes: 19 additions & 12 deletions swift/internal/compiling.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ load(
":utils.bzl",
"compact",
"compilation_context_for_explicit_module_compilation",
"get_clang_implicit_deps",
"get_swift_implicit_deps",
"merge_compilation_contexts",
"owner_relative_path",
"struct_fields",
Expand Down Expand Up @@ -182,16 +184,18 @@ def compile_module_interface(
"""
swiftmodule_file = actions.declare_file("{}.swiftmodule".format(module_name))

implicit_swift_infos, implicit_cc_infos = get_swift_implicit_deps(
feature_configuration = feature_configuration,
swift_toolchain = swift_toolchain,
)
merged_compilation_context = merge_compilation_contexts(
transitive_compilation_contexts = compilation_contexts + [
cc_info.compilation_context
for cc_info in swift_toolchain.implicit_deps_providers.cc_infos
for cc_info in implicit_cc_infos
],
)
merged_swift_info = SwiftInfo(
swift_infos = (
swift_infos + swift_toolchain.implicit_deps_providers.swift_infos
),
swift_infos = swift_infos + implicit_swift_infos,
)

# Flattening this `depset` is necessary because we need to extract the
Expand Down Expand Up @@ -461,10 +465,12 @@ def compile(
user_swift_infos = swift_infos + private_swift_infos,
)

implicit_swift_infos, implicit_cc_infos = get_swift_implicit_deps(
feature_configuration = feature_configuration,
swift_toolchain = swift_toolchain,
)
all_swift_infos = (
swift_infos_to_propagate +
private_swift_infos +
swift_toolchain.implicit_deps_providers.swift_infos
swift_infos_to_propagate + private_swift_infos + implicit_swift_infos
)
merged_swift_info = SwiftInfo(swift_infos = all_swift_infos)

Expand Down Expand Up @@ -542,7 +548,7 @@ def compile(
]
merged_cc_info = cc_common.merge_cc_infos(
cc_infos = cc_infos + private_cc_infos +
swift_toolchain.implicit_deps_providers.cc_infos,
implicit_cc_infos,
)

transitive_swiftmodules = []
Expand Down Expand Up @@ -932,18 +938,19 @@ def _precompile_clang_module(
)

if not is_swift_generated_header:
implicit_swift_infos = (
swift_toolchain.clang_implicit_deps_providers.swift_infos
implicit_swift_infos, implicit_cc_infos = get_clang_implicit_deps(
feature_configuration = feature_configuration,
swift_toolchain = swift_toolchain,
)
cc_compilation_context = merge_compilation_contexts(
direct_compilation_contexts = [cc_compilation_context],
transitive_compilation_contexts = [
cc_info.compilation_context
for cc_info in swift_toolchain.clang_implicit_deps_providers.cc_infos
for cc_info in implicit_cc_infos
],
)
else:
implicit_swift_infos = []
implicit_swift_infos, _ = [], []

if not is_swift_generated_header and implicit_swift_infos:
swift_infos = list(swift_infos)
Expand Down
5 changes: 5 additions & 0 deletions swift/internal/feature_names.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,11 @@ SWIFT_FEATURE_OPT = "swift.opt"
# Swift 6 features even before switching to a Swift 6 compiler.
SWIFT_FEATURE_ENABLE_V6 = "swift.enable_v6"

# If enabled, the toolchain's implicit dependencies will not be used when
# compiling Swift or Clang modules. This should only be used when building the
# toolchain itself.
SWIFT_FEATURE_NO_IMPLICIT_DEPS = "swift.no_implicit_deps"

# If True, transitive C headers will be always be passed as inputs to Swift
# compilation actions, even when building with explicit modules.
SWIFT_FEATURE_HEADERS_ALWAYS_ACTION_INPUTS = "swift.headers_always_action_inputs"
Expand Down
13 changes: 11 additions & 2 deletions swift/internal/linking.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ load(
"get_cc_feature_configuration",
"is_feature_enabled",
)
load(":utils.bzl", "get_swift_implicit_deps")

def configure_features_for_binary(
*,
Expand Down Expand Up @@ -244,9 +245,13 @@ def create_linking_context_from_compilation_outputs(
context to be propagated by the caller's `CcInfo` provider and the
artifact representing the library that was linked, respectively.
"""
_, implicit_cc_infos = get_swift_implicit_deps(
feature_configuration = feature_configuration,
swift_toolchain = swift_toolchain,
)
extra_linking_contexts = [
cc_info.linking_context
for cc_info in swift_toolchain.implicit_deps_providers.cc_infos
for cc_info in implicit_cc_infos
]

debugging_linking_context = _create_embedded_debugging_linking_context(
Expand Down Expand Up @@ -481,9 +486,13 @@ def register_link_binary_action(

# Collect linking contexts from any of the toolchain's implicit
# dependencies.
_, implicit_cc_infos = get_swift_implicit_deps(
feature_configuration = feature_configuration,
swift_toolchain = swift_toolchain,
)
linking_contexts.extend([
cc_info.linking_context
for cc_info in swift_toolchain.implicit_deps_providers.cc_infos
for cc_info in implicit_cc_infos
])

return cc_common.link(
Expand Down
50 changes: 50 additions & 0 deletions swift/internal/utils.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

load("@bazel_skylib//lib:paths.bzl", "paths")
load("//swift:providers.bzl", "SwiftInfo")
load(":feature_names.bzl", "SWIFT_FEATURE_NO_IMPLICIT_DEPS")
load(":features.bzl", "is_feature_enabled")

def collect_implicit_deps_providers(targets, additional_cc_infos = []):
"""Returns a struct with important providers from a list of implicit deps.
Expand Down Expand Up @@ -393,3 +395,51 @@ def include_developer_search_paths(attr):
"always_include_developer_search_paths",
False,
)

def get_swift_implicit_deps(*, feature_configuration, swift_toolchain):
"""Returns the Swift and C++ providers for implicit Swift dependencies.

Args:
feature_configuration: A feature configuration obtained from
`swift_common.configure_features`. If this feature configuration is
such that implicit dependencies should be ignored, this function
returns an empty list for both providers.
swift_toolchain: The `SwiftToolchainInfo` provider of the toolchain.

Returns:
A tuple `(list[SwiftInfo], list[CcInfo])`.
"""
if is_feature_enabled(
feature_configuration = feature_configuration,
feature_name = SWIFT_FEATURE_NO_IMPLICIT_DEPS,
):
return [], []
else:
return (
swift_toolchain.implicit_deps_providers.swift_infos,
swift_toolchain.implicit_deps_providers.cc_infos,
)

def get_clang_implicit_deps(*, feature_configuration, swift_toolchain):
"""Returns the Swift and C++ providers for implicit Clang dependencies.

Args:
feature_configuration: A feature configuration obtained from
`swift_common.configure_features`. If this feature configuration is
such that implicit dependencies should be ignored, this function
returns an empty list for both providers.
swift_toolchain: The `SwiftToolchainInfo` provider of the toolchain.

Returns:
A tuple `(list[SwiftInfo], list[CcInfo])`.
"""
if is_feature_enabled(
feature_configuration = feature_configuration,
feature_name = SWIFT_FEATURE_NO_IMPLICIT_DEPS,
):
return [], []
else:
return (
swift_toolchain.clang_implicit_deps_providers.swift_infos,
swift_toolchain.clang_implicit_deps_providers.cc_infos,
)