Skip to content

Commit

Permalink
Support implicit discovery of prebuilt Swift frameworks
Browse files Browse the repository at this point in the history
Summary:
Propagate implicit search paths for prebuilt_apple_frameworks up the graph.
This is required for Swift framework consumption for cases with Explicit Modules are disabled.

Reviewed By: milend

Differential Revision: D64043393

fbshipit-source-id: 52a342ad4e66f8b369fa3aace5691c77edd5078d
  • Loading branch information
maxovtsin authored and facebook-github-bot committed Oct 15, 2024
1 parent 6df9e28 commit 03b66ea
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 1 deletion.
11 changes: 11 additions & 0 deletions apple/prebuilt_apple_framework.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ load(
"SwiftPCMUncompiledInfo",
)
load("@prelude//apple/swift:swift_swiftinterface_compilation.bzl", "compile_swiftinterface_common")
load("@prelude//apple/swift:swift_types.bzl", "FrameworkImplicitSearchPathInfo", "get_implicit_framework_search_path_providers")
load("@prelude//cxx:cxx_context.bzl", "get_cxx_toolchain_info")
load(
"@prelude//cxx:cxx_library_utility.bzl",
Expand Down Expand Up @@ -165,6 +166,16 @@ def prebuilt_apple_framework_impl(ctx: AnalysisContext) -> [list[Provider], Prom
)
providers.append(swift_dependency_info)

implicit_search_path_tset = get_implicit_framework_search_path_providers(
ctx,
cmd_args("-F", cmd_args(framework_directory_artifact, parent = 1)),
ctx.attrs.deps,
)

providers.append(
FrameworkImplicitSearchPathInfo(tset = implicit_search_path_tset),
)

return providers

# We cannot determine whether Swift Explicit modules are enabled at this point.
Expand Down
9 changes: 8 additions & 1 deletion apple/swift/swift_compilation.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ load("@prelude//apple:apple_error_handler.bzl", "apple_build_error_handler")
load("@prelude//apple:apple_toolchain_types.bzl", "AppleToolchainInfo")
load("@prelude//apple:apple_utility.bzl", "get_disable_pch_validation_flags", "get_module_name")
load("@prelude//apple:modulemap.bzl", "preprocessor_info_for_modulemap")
load("@prelude//apple/swift:swift_types.bzl", "SWIFTMODULE_EXTENSION", "SWIFT_EXTENSION")
load("@prelude//apple/swift:swift_types.bzl", "SWIFTMODULE_EXTENSION", "SWIFT_EXTENSION", "get_implicit_framework_search_path_providers")
load("@prelude//cxx:argsfiles.bzl", "CompileArgsfile", "CompileArgsfiles")
load("@prelude//cxx:cxx_context.bzl", "get_cxx_toolchain_info")
load("@prelude//cxx:cxx_library_utility.bzl", "cxx_use_shlib_intfs_mode")
Expand Down Expand Up @@ -806,6 +806,13 @@ def _add_swift_deps_flags(
depset = ctx.actions.tset(SwiftCompiledModuleTset, children = _get_swift_paths_tsets(ctx.attrs.deps + ctx.attrs.exported_deps))
cmd.add(depset.project_as_args("module_search_path"))

implicit_search_path_tset = get_implicit_framework_search_path_providers(
ctx,
None,
ctx.attrs.deps,
)
cmd.add(implicit_search_path_tset.project_as_args("swift_framework_implicit_search_paths_args"))

def _add_clang_deps_flags(
ctx: AnalysisContext,
pcm_deps_tset: SwiftCompiledModuleTset,
Expand Down
24 changes: 24 additions & 0 deletions apple/swift/swift_types.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,27 @@ SWIFT_EXTENSION = ".swift"
SWIFTMODULE_EXTENSION = ".swiftmodule"

SwiftCompilationModes = ["wmo", "incremental", "auto"]

def _swift_framework_implicit_search_paths_args(args: cmd_args):
return args

FrameworkImplicitSearchPathInfoTSet = transitive_set(
args_projections = {
"swift_framework_implicit_search_paths_args": _swift_framework_implicit_search_paths_args,
},
)

FrameworkImplicitSearchPathInfo = provider(fields = {
"tset": provider_field(typing.Any, default = None), # A tset of FrameworkImplicitSearchPathInfoTSet
})

def get_implicit_framework_search_path_providers(ctx: AnalysisContext, value: [cmd_args, None], deps: list[Dependency]) -> FrameworkImplicitSearchPathInfoTSet:
deps_infos = [
d[FrameworkImplicitSearchPathInfo].tset
for d in deps
if FrameworkImplicitSearchPathInfo in d and d[FrameworkImplicitSearchPathInfo].tset != None
]
if value:
return ctx.actions.tset(FrameworkImplicitSearchPathInfoTSet, value = value, children = deps_infos)
else:
return ctx.actions.tset(FrameworkImplicitSearchPathInfoTSet, children = deps_infos)

0 comments on commit 03b66ea

Please sign in to comment.