Bazel rules to build Swift on Apple and Linux platforms
Switch branches/tags
Clone or download
kastiglione and allevato Don't add duplicate -emit-object flag
The `-emit-object` flag was being added twice to `compile_args`. Once directly, and another time via `_swiftc_command_line_and_inputs()`. This removes the one being added in `_swiftc_command_line_and_inputs()`.

Closes #77.

PiperOrigin-RevId: 217865584
Latest commit c13dca6 Oct 19, 2018

Swift Rules for Bazel

Build Status

⚠️ The rules in this repository are in the beta stage of development. There are many features that still need to be implemented and there may be bugs. If you run into any problems, please file an issue!

This repository contains rules for Bazel that can be used to build Swift libraries and executables for Apple platforms (iOS, macOS, tvOS, and watchOS) and Linux.

NOTE: The build rules in this repository are intended to replace the swift_library rule that is currently housed in bazelbuild/rules_apple.

Reference Documentation

Click here for the reference documentation for the rules and other definitions in this repository.


These rules have been verified to work with Bazel 0.16.0.

Quick Setup

1. Install Swift

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.

2. Configure your workspace

Add the following to your WORKSPACE file to add the external repositories, replacing the version number in the tag attribute with the version of the rules you wish to depend on:

    name = "build_bazel_rules_swift",
    remote = "",
    tag = "0.3.0",



The swift_rules_dependencies macro creates a toolchain appropriate for your platform (either by locating an installation of Xcode on macOS, or looking for swiftc on the system path on Linux).

3. Additional configuration (Linux only)

The swift_binary and swift_test rules expect to use clang as 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=clang when invoking Bazel.

This step is not necessary for macOS users because the Xcode toolchain always uses clang.

Future Work

  • Support for building and linking to shared libraries (.dylib/.so) written in Swift.
  • Interoperability with Swift Package Manager.
  • Improved C interoperability.
  • Migration to the Bazel platforms/toolchains APIs.
  • Support for multiple toolchains, and support for non-Xcode toolchains on macOS.
  • Automatically download a Linux toolchain from if one is not already installed.