apple_framework

Apple framework bundle.

Description#

Builds Swift, Objective-C, C, and C++ sources into a dynamic Apple framework with module metadata, framework resources, a generated Info.plist property-list file, and ad-hoc signing. Attributes whose names contain sdk configure the Apple software development kit (SDK) used for the build.

Attributes#

explicit_modules is a boolean, defaulting to false, that enables compiler-scanned, cacheable Swift and Clang module actions. dependency_check accepts "off" (the default) or "error"; checking requires explicit modules. See explicit modules for native propagation, dependency errors, and current limitations. The resolver-owned _declared_deps metadata preserves declarations before import inference and should not be authored manually.

AttributeTypeRequiredDefaultDescription
platformstringyesApple platform for the framework
minimum_osstringno13.0Minimum supported operating system version
target_sdk_versionstringnominimum_osSoftware development kit version used in the target triple
sdk_variantstringnosimulatorsimulator or device; ignored on macOS (not configurable)
xcode_developer_dirstringnoactive XcodeXcode developer directory used to resolve build tools
bundle_idstringnodev.once.<product_name>Framework bundle identifier
product_namestringnotarget nameFramework product name (not configurable)
module_namestringnoproduct_nameSwift module name
headerslist<string>no[]Headers packaged with the framework
exported_headerslist<string>no[]Headers exported to downstream consumers
exported_header_dirslist<string>no[]Header search directories exported to downstream consumers
private_header_dirslist<string>no[]Header search directories used only while compiling the framework
private_headerslist<string>no[]Private header files required while compiling the framework
resourceslist<string>no[]Resource glob patterns bundled into the framework
structured_resourceslist<string>no[]Resource directory roots whose own basename is preserved in the framework
asset_catalogslist<string>no[]Asset catalog paths compiled into the framework bundle
privacy_manifeststringnoPrivacy manifest placed in the framework bundle
sdk_frameworkslist<string>no[]Apple software development kit frameworks linked by name
weak_sdk_frameworkslist<string>no[]Apple software development kit frameworks linked weakly
sdk_dylibslist<string>no[]Apple software development kit dynamic libraries linked by name
linkoptslist<string>no[]Extra linker flags
swift_flagslist<string>no[]Extra Swift compiler flags
clang_flagslist<string>no[]Extra Clang compiler flags
per_source_clang_flagsmap<string,string>no{}JavaScript Object Notation-encoded Clang flags keyed by source path
defineslist<string>no[]Compatibility conditions passed to both Swift and Clang
swift_defineslist<string>no[]Swift conditional compilation conditions
clang_defineslist<string>no[]C-family preprocessor definitions
enable_testingbooleannofalseMakes internal Swift declarations available to dependent tests
swift_testingbooleannofalseCompiles sources that import the Swift Testing framework
xctest_supportbooleannofalseCompiles sources that import the XCTest framework
library_evolutionbooleannofalseEmits stable Swift module interfaces for binary compatibility
emit_dsymbooleannofalseEmits debug information for symbol bundles
archslist<string>nohost architectureTarget architectures (not configurable)
mac_catalystbooleannofalseBuilds the Mac Catalyst variant (not configurable)
alwayslinkbooleannofalseForce-loads the framework's own static compilation archive into its dynamic link
exported_depslist<string>no[]Dependency target identifiers whose module interfaces flow to consumers
bridging_headerstringnoObjective-C bridging header used by Swift sources
prefix_headerstringnoPrefix header included before every C-family source
prebuild_actionslist<string>no[]Ordered serialized source-generation actions. Records may opt into caching when they declare complete inputs and outputs; always-run records remain uncached (not configurable)
enable_modulesbooleannofalseEmits and consumes a Clang module map for exported headers
modulemapstringnoAuthored Clang module map retained in the framework
modulemap_headerslist<string>no[]Headers named by the authored module map, including private explicit submodules
auxiliary_modulemapslist<string>no[]Additional Clang module maps referenced by the framework's public Swift interface

The prepackage_actions attribute accepts an ordered list<string> of serialized script records, defaulting to []. These run after linking and before resource processing, so generated resources feed packaging.

The postbuild_actions attribute accepts an ordered list<string> of serialized script records, defaulting to []. These actions run after product assembly and before final signing. Complete declarations may be cached; untracked scripts rerun and publish changes to known product files. See native script phases for mapped build settings and file-list variables.

Dependency Edges#

EdgeAcceptsDescription
depsapple_linkable, apple_resource, apple_swift_plugin, native_linkableLibraries, resources, native linkables, and Swift compiler plugins linked or embedded by the framework

Providers#

The target emits apple_linkable, apple_framework, and apple_bundle.

Swift modules use the architecture and platform-qualified framework layout produced by Xcode. Downstream Swift compilation discovers the binary module through the framework search path.

Static framework imports keep their framework search path and module metadata for compilation, but their binary is linked once as a static archive. They are not also passed as a named framework or placed in the runtime framework closure.

The provider separates link-time and runtime framework closures. A downstream link action links this framework, while the final application or test bundle receives every framework needed at runtime. The framework's own archive is fully loaded. Dependency archives use normal demand loading unless their provider marks them as always linked, then stop at the dynamic link boundary and are not linked into the final binary again.

Each dynamic framework, application, and test bundle resolves its own static dependency closure. Once de-duplicates archive paths inside one link action, but does not prune an archive merely because another dynamic framework also contains it. That other framework does not necessarily re-export the archive's Swift symbols.

FieldTypeMeaning
framework_pathstringBuilt framework directory
framework_module_namestringModule name used by direct consumers
framework_fileslist<string>Framework outputs tracked by the action graph
transitive_swiftmodule_dirslist<string>Dependency Swift module search directories required by consumers; the framework's own module is found through its framework search path
transitive_swiftmodule_inputslist<string>Exact module artifacts available to downstream compiler actions
transitive_exported_header_dirslist<string>Dependency header search directories required to import this framework's module
transitive_modulemapslist<string>Dependency Clang module maps required to import this framework's module
transitive_hmapslist<string>Dependency header maps required to import this framework's module
transitive_framework_search_dirslist<string>Additional framework search directories required by consumers
transitive_framework_fileslist<string>Framework metadata inputs required by consumer compile actions
transitive_vfs_overlayslist<string>Virtual file-system overlays required by consumer compile actions
transitive_archiveslist<string>Empty after the dynamic link boundary
absorbed_static_archiveslist<string>Static archives already linked into this framework
transitive_plugin_dylibslist<string>Host-loaded Swift compiler plugins required by downstream source
transitive_plugin_executableslist<string>Host executable and declaring-module descriptors required by downstream source
transitive_link_framework_bundleslist<record>Framework bundles a downstream link action must link directly
transitive_framework_bundleslist<record>De-duplicated runtime framework closure with paths, module names, files, and owning targets
transitive_frameworkslist<string>Compatibility view of runtime framework paths

Capabilities#

CapabilityOutput groups
builddefault, framework, dsyms, swiftmodule

Outputs#

OutputLocation
Framework bundle.once/out/<target>/<product_name>.framework
Dynamic library.once/out/<target>/<product_name>.framework/<product_name>
Swift module.once/out/<target>/<product_name>.framework/Modules/<module_name>.swiftmodule/<target-triple>.swiftmodule
Swift documentation.once/out/<target>/<product_name>.framework/Modules/<module_name>.swiftmodule/<target-triple>.swiftdoc
Module map.once/out/<target>/<product_name>.framework/Modules/module.modulemap
Property list.once/out/<target>/<product_name>.framework/Info.plist
Code signature.once/out/<target>/<product_name>.framework/_CodeSignature/CodeResources

An application or test only needs to depend on the framework it uses directly. Once carries nested dynamic framework dependencies to the final bundle, de-duplicates them by framework path, embeds each bundle once, and signs the result.

Example#

toml
[[target]]
name = "UI"
kind = "apple_framework"
srcs = ["UI/Sources/*.swift"]
[target.attrs]
platform = "ios"
minimum_os = "17.0"
sdk_variant = "simulator"
bundle_id = "dev.once.UI"