rules_xcodeproj
This repository contains rules for Bazel that can be used to generate Xcode projects from targets in your workspace.
If you run into any problems with these rules, please check our FAQ, check if [another issue already exists][issues] and comment on it, or [file a new issue][file-an-issue]!
[issues]: https://github.com/MobileNativeFoundation/rules_xcodeproj/issues [file-an-issue]: https://github.com/MobileNativeFoundation/rules_xcodeproj/issues/new/choose
Features
- Full support for Xcode features:
- Focused Projects
- Comprehensive Bazel rules support
- Minimal configuration needed (see the usage section below)
- It “just works”
Projects using rules_xcodeproj
- amo
- BazelPods
- Cash App
- Envoy Mobile
- Ergatta
- Faire Wholesale
- Gojek
- Lyft
- Mercari
- Robinhood
- Slack
- Snap
- Spotify
- Square
- SwiftLint
- Ten Ten
- Tinder
- Tokopedia
Compatibility
| rules_xcodeproj | Bazel | [rules_apple][1] | [rules_swift][2] | Xcode | macOS | Supporting Branch |
| :-------------: | :---: | :--------------: | :--------------: | :---: | :---: | :---------------: |
| 2.13.0+ | 7.0-9.x | 4.0.0+ | 3.0.2+ | 13.3–16.x | 13–15.x | main |
| 2.10.0+ | 7.0-9.x | 3.16.1+ | 1.18.0+ | 13.3–16.x | 13–15.x | - |
| 1.17.0+ | 6.3-7.x | 1.0.1–2.x | 1.x | 13.3–15.x | 13–14.x | - |
| 1.16.0 | 6.3-7.x | 1.0.1–2.x | 1.x | 13.3–15.2 | 13–14.x | - |
| 1.14.0-1.15.0 | 6.1-7.x | 1.0.1–2.x | 1.x | 13.3–15.2 | 13–14.x | - |
| 1.7.0-1.13.0 | 5.3–6.x | 1.0.1–2.x | 1.x | 13.3–15.2 | 12–13.x | - |
| 1.4.0-1.6.0 | 5.3–6.x | 1.0.1–2.x | 1.x | 13.3–14.3 | 12–13.x | - |
| 1.0-1.3.3 | 5.3–6.x | 1.0.1–2.x | 1.x | 13.3–14.2 | 12–13.x | - |
More versions of these tools and rulesets might be supported, but these are the ones we’ve officially tested with.
[1]: https://github.com/bazelbuild/rules_apple [2]: https://github.com/bazelbuild/rules_swift
Installation
From the
release you wish to use,
copy the Bzlmod snippet into your repository.
If you want to manually build a release archive, you can use this command:
bazel build //distribution:release.
Usage
Please see the documentation in the docs directory and examples in the examples directory.
Simple iOS example
Given a root level BUILD file:
load(
"@build_bazel_rules_apple//apple:ios.bzl",
"ios_application",
"ios_unit_test",
)
load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library")
load(
"@rules_xcodeproj//xcodeproj:defs.bzl",
"top_level_target",
"xcodeproj",
)
xcodeproj(
name = "xcodeproj",
project_name = "App",
tags = ["manual"],
top_level_targets = [
top_level_target(":App", target_environments = ["device", "simulator"]),
":Tests",
],
)
ios_application(
name = "App",
bundle_id = "com.example.app",
families = ["iphone", "ipad"],
infoplists = [":Info.plist"],
minimum_os_version = "15.0",
visibility = ["//visibility:public"],
deps = [":Lib"],
)
swift_library(
name = "Lib",
srcs = glob(["src/*.swift"]),
)
ios_unit_test(
name = "Tests",
bundle_id = "com.example.tests",
minimum_os_version = "15.0",
test_host = ":App",
visibility = ["//visibility:public"],
deps = [":TestLib"],
)
swift_library(
name = "TestLib",
srcs = glob(["test/*.swift"]),
)
You can then create the Xcode project with:
bazel run //:xcodeproj
The generated project will be in the workspace next to the BUILD file at
App.xcodeproj.
Acknowledgements
- Inspired by [Tulsi][tulsi] and the custom project generators at Target and Lyft.
- Made possible by [XcodeProj][XcodeProj].
- Initial design and development by @brentleyjones.
- [Logo][logo] by @pennig.
- Donated to the Mobile Native Foundation by BuildBuddy.