This repository is a Swift Package for distributing releases of Mozilla's various Rust-based application components. It provides the Swift source code packaged in a format understood by the Swift package manager, and depends on a pre-compiled binary release of the underlying Rust code published from mozilla/application-services.
This repository is mostly updated by automation, all the logic is copied from mozilla/application-services
- The
application-services
repo publishes two binary artifactsMozillaRustComponents.xcframework.zip
andFocusRustComponents.xcframework.zip
containing the Rust code and FFI definitions for all components, compiled together into a single library. - The
Package.swift
file refrences the xcframeworks as Swift binary targets. - The
Package.swift
file defines a library per target (one for all the components used byfirefox-ios
and one forfocus-ios
)- Each library references its Swift source code directly as files in the repo. All components used by a target are copied into the same directory. For example, all the
firefox-ios
files are in theswift-source/all
directory. - Each library depends on wrapper which wraps the binary to provide the pre-compiled Rust code. For example,
FocusRustComponentWrapper
wraps the Focus xcframework.
- Each library references its Swift source code directly as files in the repo. All components used by a target are copied into the same directory. For example, all the
For more information, please consult:
- application-services ADR-0003, which describes the overall plan for distributing Rust-based components as Swift packages.
- The Swift Package Manager docs and GitHub repo, which explain the details of how Swift Packages work (and hence why this repo is set up the way it is).
- The
ios-rust
crate which is currently responsible for publishing the pre-builtMozillaRustComponents.xcframework.zip
andFocusRustComponents.xcframework.zip
bundles on which this repository depends.
Nightly releases are automated and run every night as a cron job that pushes directly to the main branch. Nightly releases are tagged with three components (i.e X.0.Y
) where the first component is the current Firefox release (i.e 117
, etc) and the last component is a timestamp.
Note that we need three components because that's a Swift Package manager requirement.
To cut a release of rust-components-swift
, you will need to do the following:
- Run
./automation/update-from-application-services.py <X.Y>
, whereX.Y
is the version of application services. - Open a pull request with the resulting changes
- Once landed on the main branch, cut a release using the GitHub UI and tag it
- IMPORTANT: The release tag must be in the form
X.0.Y
, whereX.Y
is the version of application services
- IMPORTANT: The release tag must be in the form
To enable local development of rust-component-swift
read the instructions documented in application services
Check out the instructions in the docs in application-services
for adding a new component and publishing it for iOS. The docs are also published for convenience in https://mozilla.github.io/application-services/book/index.html.
Please open a ticket in https://github.com/mozilla/application-services/issues for any rust-component-swift related issues.