--- layout: documentation title: Platforms --- # Platforms - [Overview](#overview) - [Defining a platform](#defining-a-platform) - [Built-in constraints and platforms](#built-in-constraints-and-platforms) - [Specifying a platform for a build](#specifying-a-platform-for-a-build) ## Overview Bazel can build and test code on a variety of operating systems and hardware using many different build tools, such as linkers and compilers. These combinations of software and hardware are what Bazel considers *platforms*. One major use for specifying a platform for a build is automatic [toolchain](toolchains.html) selection. Bazel recognizes the following types of platforms: * **Host** - platforms on which Bazel runs. * **Execution** - platforms on which build tools execute build actions. * **Target** - platforms for which Bazel builds the output. Bazel supports the following build scenarios regarding platforms: * **Single-platform builds** (default) - host, execution, and target platforms are the same. For example, building a Linux executable on Ubuntu running on an Intel x64 CPU. * **Cross-compilation builds** - host and execution platforms are the same, but the target platform is different. For example, building an iOS app on macOS running on a MacBook Pro. * **Multi-platform builds** - host, execution, and target platforms are all different. ## Defining a platform A *Bazel platform* is a named collection of constraints that define a supported software and/or hardware configuration through name-value pairs. For example, a constraint can define the CPU architecture, GPU presence, or the specific version of a build tool, such as a linker or compiler. You define a platform in a `BUILD` file using the following Bazel rules: * [`constraint_setting`](be/platform.html#constraint_setting) - defines a constraint. * [`constraint_value`](be/platform.html#constraint_value) - defines an allowed value for a constraint. * [`platform`](be/platform.html#platform) - defines a platform by specifying a set of constraints and their values. The following example defines the `glibc_version` constraint and its two allowed values. It then defines a platform that uses the `glibc_version` constraint along with Bazel's [built-in constraints](#built-in-constraints-and-platforms) for operating systems and CPU architecture: ```python constraint_setting(name = 'glibc_version') constraint_value( name = 'glibc_2_25', constraint_setting = ':glibc_version') constraint_value( name = 'glibc_2_26', constraint_setting = ':glibc_version') platform( name = 'linux_x86', constraint_values = [ '@bazel_tools//platforms:linux', '@bazel_tools//platforms:x86_64', ':glibc_2_25', ]) ``` Keep the following in mind when defining constraints and platforms that use them: * You can define constraints in any Bazel package within the project. * Constraints follow the visibility settings of the package that contains them. * You can use constraint values from multiple packages in the same platform definition. However, using constraint values that share a constraint setting will result in an error. ## Built-in constraints and platforms Bazel ships with constraint definitions for the most popular CPU architectures and operating systems. * `@bazel_tools//platforms:cpu` defines the following CPU architectures: * `@bazel_tools//platforms:x86_32` * `@bazel_tools//platforms:x86_64` * `@bazel_tools//platforms:ppc` * `@bazel_tools//platforms:arm` * `@bazel_tools//platforms:s390x` * `@bazel_tools//platforms:os` defines the following operating systems: * `@bazel_tools//platforms:osx` * `@bazel_tools//platforms:freebsd` * `@bazel_tools//platforms:linux` * `@bazel_tools//platforms:windows` Bazel also ships with the following platform definitions: * `@bazel_tools//platforms:host_platform` - automatically detects the CPU architecture and operating system for the host platform. * `@bazel_tools//platforms:target_platform` - automatically detects the CPU architecture and operating system for the target platform. In these definitions, the CPU architecture constraint values are pulled from the `--host_cpu` and `--cpu` flags. ## Specifying a platform for a build To select a specific host and target platform for a build, use the following command-line flags: * `--host_platform` - defaults to `@bazel_tools//platforms:host_platform` * `--platforms` - defaults to `@bazel_tools//platforms:target_platform` Platforms can also be used with the `config_setting` rule to define configurable attributes. See [config_setting](be/general.html#config_setting) for more details.