Skip to main content

Configurations

For rule authors see also: Configurations

When building a target, buck always builds it in a particular "configuration." The configuration typically includes information like the target os, target arch, sanitizers, opt level, etc. One way to understand the effect that a configuration has is via the cquery and uquery commands. The cquery command will compute the appropriate configuration for a target and display a version of that target's attributes with the configuration applied. The uquery command will not apply a configuration.

Here is a heavily trimmed version of the outputs of invoking uquery and cquery on //buck2/app/buck2_core:buck2_core.

> buck2 uquery -A '"//buck2/app/buck2_core:buck2_core"'
{
  "fbcode//buck2/app/buck2_core:buck2_core": {
    "buck.type": "rust_library",
    "buck.package": "fbcode//buck2/app/buck2_core:TARGETS",
    "name": "buck2_core",
    "visibility": [
      "PUBLIC"
    ],
    "deps": {
      "fbsource//third-party/rust:anyhow",
      "fbsource//third-party/rust:arc-swap",
      "fbsource//third-party/rust:blake3",
      "fbsource//third-party/rust:compact_str",
      "fbsource//third-party/rust:dashmap",
      {
        "__type": "selector",
        "entries": {
          "DEFAULT": [],
          "ovr_config//os:windows": [
            "fbsource//third-party/rust:common-path"
          ]
        }
      },
      {
        "__type": "selector",
        "entries": {
          "DEFAULT": [],
          "ovr_config//os:linux": [
            "fbsource//third-party/rust:nix"
          ]
        }
      },
    },
  }
}
> buck2 cquery -A '"//buck2/app/buck2_core:buck2_core"'
{
  "fbcode//buck2/app/buck2_core:buck2_core (ovr_config//platform/linux:<OMITTED>)": {
    "buck.type": "rust_library",
    "buck.package": "fbcode//buck2/app/buck2_core:TARGETS",
    "buck.target_configuration": "ovr_config//platform/linux:<OMITTED>",
    "buck.execution_platform": "fbcode//buck2/platform/<OMITTED>",
    "name": "buck2_core",
    "visibility": [
      "PUBLIC"
    ],
    "deps": [
      "fbsource//third-party/rust:anyhow (ovr_config//platform/linux:<OMITTED>)",
      "fbsource//third-party/rust:arc-swap (ovr_config//platform/linux:<OMITTED>)",
      "fbsource//third-party/rust:blake3 (ovr_config//platform/linux:<OMITTED>)",
      "fbsource//third-party/rust:compact_str (ovr_config//platform/linux:<OMITTED>)",
      "fbsource//third-party/rust:dashmap (ovr_config//platform/linux:<OMITTED>)",
      "fbsource//third-party/rust:nix (ovr_config//platform/linux:<OMITTED>)"
    ]
}

The cquery output has additional buck.target_configuration and buck.execution_platform attributes which tell you what the target is being built for and what it's being built on, respectively. uquery doesn't have those.

The deps in uquery also have a number of selects; these indicate that the common-path dependency should only be included when building for Windows, while the nix dependency is needed only for Linux. In cquery that distinction has been resolved; because the target has been configured for Linux, the nix dependency is present and indistinguishable from any other, while the common-path dependency is gone.