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-servicesrepo publishes two binary artifactsMozillaRustComponents.xcframework.zipandFocusRustComponents.xcframework.zipcontaining the Rust code and FFI definitions for all components, compiled together into a single library. - The
Package.swiftfile refrences the xcframeworks as Swift binary targets. - The
Package.swiftfile defines a library per target (one for all the components used byfirefox-iosand 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-iosfiles are in theswift-source/alldirectory. - Each library depends on wrapper which wraps the binary to provide the pre-compiled Rust code. For example,
FocusRustComponentWrapperwraps 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-rustcrate which is currently responsible for publishing the pre-builtMozillaRustComponents.xcframework.zipandFocusRustComponents.xcframework.zipbundles 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.Yis 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.Yis 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.