Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add basic incompatible target skipping #10945

Closed

Commits on Oct 24, 2020

  1. Add basic incompatible target skipping support

    This patch aims to implement a basic version of incompatible target
    skipping outlined here:
    https://docs.google.com/document/d/12n5QNHmFSkuh5yAbdEex64ot4hRgR-moL1zRimU7wHQ/edit?usp=sharing
    
    The implementation in this patch supports target skipping based
    on the target platform. In a `BUILD` file you can now add constraints
    that the target platform must satisfy in order for the target to be
    built and/or tested. For example, use the following snippet to declare
    a target to be compatible with Windows platforms only:
    
      cc_binary(
          name = "bin",
          srcs = ["bin.cc"],
          target_compatible_with = [
              "@platforms//os:windows",
          ],
      )
    
    Builds triggered with `:all` or `...` on a non-Windows platform will
    simply skip the incompatible target. An appropriate note is shown on
    the command line if the `--show_result` threshold is high enough.
    Targets that transitively depend on incompatible targets are
    themselves considered incompatible and will also be skipped.
    
    Explicitly requesting an incompatible target on the command line is an
    error and will cause the build to fail. Bazel will print out an
    appropriate error message and inform the user what constraint could
    not be satisfied.
    
    See the new documentation in this patch for more information. In
    particular, https://docs.bazel.build/versions/master/platforms.html
    should be a good bit more informative.
    
    This implementation does not make any effort to support expressing
    compatibility with toolchains. It is possible that using `select()`
    (commented on below) already makes this possible, but it's not
    validated or explicitly supported in this patch.
    
    During implementation we noticed that `select()` can be quite powerful
    in combination with `target_compatible_with`. A basic summary of this
    is also documented on the Platforms page.
    
    It may be useful to create helper functions in, say, skylib to help
    make complex `select()` statements more readable. For example, we
    could replace the following:
    
      target_compatible_with = select({
          "@platforms//os:linux": [],
          "@platforms//os:macos": [],
          "//conditions:default": [":not_compatible"],
      })
    
    with something like:
    
      target_compatible_with = constraints.any_of([
          "@platforms//os:linux",
          "@platforms//os:macos",
      ])
    
    That, however, is work for follow-up patches.
    
    Many thanks to Austin Schuh (@AustinSchuh) and Greg Estren
    (@gregestren) for working on the proposal and helping a ton on this
    patch itself. Also thanks to many others who provided feedback on the
    implementation.
    
    RELNOTES: Bazel skips incompatible targets based on target platform
    and `target_compatible_with` contents. See
    https://docs.bazel.build/versions/master/platforms.html for more
    details.
    philsc authored and AustinSchuh committed Oct 24, 2020
    Configuration menu
    Copy the full SHA
    c853ee9 View commit details
    Browse the repository at this point in the history