Bazel rules to build Swift on Apple and Linux platforms
This repository contains rules for Bazel that can be used to build Swift libraries, tests, and executables for macOS and Linux.
To build applications for all of Apple's platforms (macOS, iOS, tvOS, and watchOS), they can be combined with the Apple Rules.
If you run into any problems with these rules, please file an issue!
Click here for the reference documentation for the rules and other definitions in this repository.
Please refer to the release notes for a given release to see which version of Bazel it is compatible with.
Before getting started, make sure that you have a Swift toolchain installed.
Apple users: Install Xcode. If this is your first time installing it, make sure to open it once after installing so that the command line tools are correctly configured.
Linux users: Follow the instructions on the Swift download page to download and install the appropriate Swift toolchain for your platform. Take care to ensure that you have all of Swift's dependencies installed (such as ICU, Clang, and so forth), and also ensure that the Swift compiler is available on your system path.
Add the following to your
WORKSPACEfile to add the external repositories, replacing the
urlsand
sha256attributes with the values from the release you wish to depend on:
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")http_archive( name = "build_bazel_rules_swift", sha256 = "d0e5f888b2ccce42c92e6d4686b5507b4230462627f965f9d39862e11ae9fb35", url = "https://github.com/bazelbuild/rules_swift/releases/download/0.18.0/rules_swift.0.18.0.tar.gz", )
load( "@build_bazel_rules_swift//swift:repositories.bzl", "swift_rules_dependencies", )
swift_rules_dependencies()
load( "@build_bazel_rules_swift//swift:extras.bzl", "swift_rules_extra_dependencies", )
swift_rules_extra_dependencies()
The
swift_rules_dependenciesmacro creates a toolchain appropriate for your platform (either by locating an installation of Xcode on macOS, or looking for
swiftcon the system path on Linux).
The
swift_binaryand
swift_testrules expect to use
clangas the driver for linking, and they query the Bazel C++ API and CROSSTOOL to determine which arguments should be passed to the linker. By default, the C++ toolchain used by Bazel is
gcc, so Swift users on Linux need to override this by setting the environment variable
CC=clangwhen invoking Bazel.
This step is not necessary for macOS users because the Xcode toolchain always uses
clang.
macOS hosts: You can build with a custom toolchain installed in
/Library/Developer/Toolchainsinstead of Xcode's default. To do so, pass the following flag to Bazel:
--define=SWIFT_CUSTOM_TOOLCHAIN=toolchain.id
where
toolchain.idis the value of the
CFBundleIdentifierkey in the toolchain's Info.plist file.
To list the available toolchains and their bundle identifiers, you can run:
bazel run @build_bazel_rules_swift//tools/dump_toolchains
Linux hosts: At this time, Bazel uses whichever
swiftexecutable is encountered first on your
PATH.
.dylib/
.so) written in Swift.
We gratefully acknowledge the following external packages that rules_swift depends on: